Bug windows avec mon programme (nivo débutant)

Signaler
Messages postés
368
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
14 mai 2010
-
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010
-
Bonjour !

Etant un gros debutant en C je m'essai à faire un programme d'amortissement tout simple.

Mais le probleme c'est que windows plante lorsque je compile, ce
plantage est intervenu apres la création d'une fonction
"mois_translate" qui traduit le nombre de mois en lettre (ex : 12 =
décembre).

J'ai cherché mais je n'ai pas trouvé mon erreur.

Pouvez vous m'aider ?



Merci



PS : mon programme est bien sur pas fini du tout.



Mon code :




/*--------------------------------------------------------------------------*/

/* Nom du programme
amor.c
*/


/* Ce programme permet de calculer un amortissement sur plusieurs années */


/*--------------------------------------------------------------------------*/





/*------------------------------*/


/* Fichiers inclus */


/*------------------------------*/


#include


#include








/*------------------------------*/


/* Définition des constantes */


/*------------------------------*/


#define MAX 12


#define OUI 1


#define NON 0


#define TOT_MOIS 12





/*------------------------------*/


/*
Variables
*/


/*------------------------------*/


char banque
;
/*Stock le nom de la
banque
*/


long
mont_pret;
/*Stock le montant du
pret
*/


int
nb_annee;
/*Stock le nombre
d'années
*/


int
deb_annee;
/*Stock le debut de
l'année
*/


int
taux_pret;
/*Stock le taux du pret en
% */


int
taux_assu;
/*Stock le taux d'assurance vie en % */


int
nb_mois;
/*Stock le nombre de
mois
*/


char nom_mois[TOT_MOIS+1];
/*Stok le nom des mois +1 car tablo */




int x,w
;
/*compteurs*/

int
cont;
/*controle */





/*------------------------------*/


/* Prototypes des fonctions */


/*------------------------------*/








void main(void);


void lecture(void);


void affiche_result(void);


int affiche_instruction(void);


int continuer(void);


char mois_translate(int);





/*------------------------------*/


/* Début du programme */


/*------------------------------*/


void main(void)


{


cont = affiche_instruction();





if(cont== OUI)


{


lecture();


affiche_result();


}


else


printf("\nProgramme interrompu par l'utilisateur ! \n\n") ;





system("PAUSE");


return 0;


}





/*------------------------------------------------------------*/

/* Fonction :
affiche_instruction()
*/


/* Objectif : Affiche le mode d'emploi du programme et */


/*
demande à l'utilisateur d'entrer 0
pour */

/*
sortir ou 1 pour
continuer
*/


/* Valeur renvoyées : NON si l'utilisateur tape 0 */


/*
OUI si l'utilisateur tape un nombre */

/*
different de
0
*/


/*------------------------------------------------------------*/


int affiche_instruction(void)


{


printf("\a\n\n");


printf("\n################################################################");


printf("\nCe programme vous permet de saisir le nombre d'année et");


printf("\nle montant d'un capital à amortir et permet ainsi de");


printf("\ncalculer et afficher un tableau d'amortissement sur x mois");


printf("\n################################################################");


printf("\n");





cont = continuer();





return(cont);


}





/*------------------------------------------------------------*/

/* Fonction :
lecture()
*/


/* Objectif : Cette fonction lit les données entrées par */


/*
l'utilisateur relatif au
pret.
*/

/* Valeurs renvoyées :
aucune
*/

/* Remarque :
aucune
*/


/*------------------------------------------------------------*/


void lecture(void)


{


printf("\a\n--------------------------------------------");


printf("\nEntrez les informations relatif au pret ");



printf("\n--------------------------------------------\n\n");






printf("\n\tEntrer le nom de la banque : ");


scanf("%s",&banque);





printf("\n\tEntrer le montant du pret : ");


scanf("%d",&mont_pret);





printf("\n\tEntrer lannée de début de l'amortissement : ");


scanf("%d",&deb_annee);





printf("\n\tAmortissement sur combien d'année ? : ");


scanf("%d",&nb_annee);





printf("\n\tEntrer le taux du pret : ");


scanf("%d",&taux_pret);





printf("\n\tEntrer le taux de l'assurance vie : ");


scanf("%d",&taux_assu);











}





/*------------------------------------------------------------*/

/* Fonction :
affiche_result()
*/


/* Objectif : affiche le résultat des calcules à l'écran */

/* Valeurs renvoyées :
aucunes
*/


/*------------------------------------------------------------*/


void affiche_result()


{





for (w=0; w

15 réponses

Messages postés
368
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
14 mai 2010

OUPS ! Je rectifie, le bug ne vient pas suite à la compilation mais après que la fonction "lecture" est fini sa tache.

Merci
Messages postés
202
Date d'inscription
dimanche 18 mai 2003
Statut
Membre
Dernière intervention
6 mars 2010

attention a ta variable nom_mois. tu la construit comme un tableau de
13 caractères. alors que je pense que tu veut un tableau de 13 chaine
de caractères. le mieux pour résoudre ton probleme c'est de créer un
seul tableau de 50 caractères par exemple et de copier les noms des
mois dans ton tableau avec strcpy().



Exemple :



char nom_mois[50];



char* mois_translate(int mois)

{

strcpy( nom_mois , "janvier" );

strcpy( nom_mois , "fevrier" );

... // continue pour tout les mois



return nom_mois;

}



Attention regarde bien le fonctionnement des chaines de caractères en C.


Voili,Voilou
Messages postés
202
Date d'inscription
dimanche 18 mai 2003
Statut
Membre
Dernière intervention
6 mars 2010

oups je suis allez trop vite pour te répondre il faut faire des test avant de copier le bon mois.



ex :





... // fonction mois_translate

if( mois == 1 )

strcpy( nom_mois , "janvier" );

if( mois == 2 )

strcpy( nom_mois , "fevrier" );

.. // continue comme ça pour les autres mois




Voili,Voilou
Messages postés
368
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
14 mai 2010

Bah pourquoi ca marche pas avec ma méthode? Peux tu m'expliquer ? Merci
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Quand tu veux acheter un snickers à 1 ?uro ( oui je sais c'est cher ), bé tu mets pas 10 ? dans la machine
La tu veux mettre plusieur caractere "janvier" ( 7 ici + le caractère de fin de chaine donc 8 jpense ) et donc tu veux stocker tout ça dans une variable qui peut contenir qu'un seul caractere.

Donc moi j'aurais proposé avec un switch moins lourd comme méthode.

char Buff[256];

switch(mois)
{
case 1:
strcpy( Buff, "Janvier");
break;

etc...
}

et comme dis au dessus une fonction du type char* qui renvoi un tableau de caractère et non un seul


void Aurevoir( void ); //Bonne journée
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
void Aurevoir( void ); //Bonne journée
Messages postés
202
Date d'inscription
dimanche 18 mai 2003
Statut
Membre
Dernière intervention
6 mars 2010

ton "janv" est alloue par le compilateur automatiquement. quand tu fait
mom_mois[1] = "janv" en faite tu récupère l'adresse ou est alloué la
chaine "janv". une adresse est codé sur 4 octets ton char est sur 1
octects. donc quand tu fait ça 3 octets déborde. pour l'index 1
du tableau cela va déborder sur les index 2 ,3 ,4 tu tableaux. mais
pour l'index 10 et suivant cela va déborder en dehors de ton tableaux
et donc de la mémoire non alloué par ton programme donc très souvent
erreur d'adresse = plantage.



Les chaines de caractères en C sont assez compliqué il font appel au
pointeur. donc si tu veut plus d'information ou si ce que j'ai dit
n'est pas trop clair regarde une source qui explique bien les pointeurs
et chaine de caractères


Voili,Voilou
Messages postés
28
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
13 mars 2012

Si tu veux garder ta structure tu peux faire la chose suivante :
char** nom_mois[TOT_MOIS+1][5]; /*Stok le nom des mois +1 car tablo */

- Tu met TOT_MOIS +1 parce qu'un tableau commence à 0 et que tu ne l'utilise pas puisque les mois commencent à 1.
- Tu met 5 dans les deuxième crochet parceque tu utilise 4 caractères du mois + le caractère de fin de chaine de texte qui est le code ASCII 0 ou '\0' en char (si tu reste comme ça tu peux en mettre un nombre plus grand mais ça ne sert à rien et sa bouffe de la memoire pour rien)

En fait là on vient de créer un tableau de pointeur pointant sur une chaine de caractère, une chaine de caractère étant un tableau a elle seule

Ensuite tu initialise ton tab au début du prog comme ça tu le fais qu'une fois avec
nom_mois[1]="janv";
nom_mois[2]="fevr";
nom_mois[3]="mars";
nom_mois[4]="avri";
nom_mois[5]="mai";
nom_mois[6]="juin";
nom_mois[7]="juil";
nom_mois[8]="aout";
nom_mois[9]="setp";
nom_mois[10]="octo";
nom_mois[11]="nove";
nom_mois[12]="dece";

Et ta fonction devient :
char* mois_translate(int mois)
{
return nom_mois[mois] ;
}

pour récupérer le mois tu crée une variable en char* par exemple szMois (le sz c'est pour string donc chaine de caractère finissant par zéro du moins je crois)

et tu appele ta fonction en faisant
szMois = mois_translate(3); // Par exemple

et tu récupère mars dans ta variable que tu peux afficher avec printf telle quelle avec le %s comme d'habitude.

Si tu choisi cette sol et que tu as des questions n'hésite pas

Dan34
Messages postés
368
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
14 mai 2010

Désolé j'ai commencé à essayer de programmer en php et php est carrement moins contraignant.

Donc je savais pas qu'on pouvais pas stocké une chaine de caractere dans un tableau en C.

Merci et vive worms et les snickers à 1? ;)

Messages postés
368
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
14 mai 2010

Ah tien je vien juste de voir une nouvelle réponse !

Merci dan34 pour tes explications clairs et précise !

Seul chose, j'ai tout capté à ce que tu vien de dire sauf : char** pour ces deux asteris apres char ?

Merci énorment vous etes vraiment sympa d'aider des noobs de mon genre



Messages postés
28
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
13 mars 2012

Quand on construit une variable avec un char* NomVariable, on fait un pointeur sur un char.
Lorsqu'on fait un char** NomVariable[NbLigne][NbColonne] on construit une matrice dont chaque case contient un char et si le bout de ta ligne se termine par le caractère NULL tu as construit un tableau de string ou en français de chaine de caractère (il faut prévoir 1 caractère de plus que la longueur max de ta string).
Quand on veut accéder à une ligne contenant une string de cette matrice on fait NomVariable[ligne], lorsqu'on veut accéder seulement à une des cases on fait NomVariable[ligne][colonne].

J'espère que j'ai été clair ?

@+
Dan34
Messages postés
202
Date d'inscription
dimanche 18 mai 2003
Statut
Membre
Dernière intervention
6 mars 2010

sauf que dans ta déclaration il ne faut pas mettre char**
nom_mois[TOT_MOIS+1][5]; mais char nom_mois[TOT_MOIS+1][5]. Car les
crochet qui signifie un tableau est identique a un pointeur ( donc une
étoile ).

alors qu'avec ta déclaration nom_mois aurait 4 étoiles.

Voili,Voilou
Messages postés
202
Date d'inscription
dimanche 18 mai 2003
Statut
Membre
Dernière intervention
6 mars 2010

j'ai dit des conneries, je raconte n'importe quoi c'est bien char** nom_mois[TOT_MOIS+1][5];

Voili,Voilou
Messages postés
28
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
13 mars 2012

oui c'est vrai merci de cette précision

Dan34
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonjour,



L'initialisation du tableau :



char* mois[] = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin",
"Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};



printf("%s", mois[0]) donne Janvier ...

Matt...