cs_MATHIS49
Messages postés368Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention14 mai 2010
-
20 mai 2005 à 14:54
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 2010
-
21 mai 2005 à 14:33
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).
mezaya
Messages postés202Date d'inscriptiondimanche 18 mai 2003StatutMembreDernière intervention 6 mars 2010 20 mai 2005 à 17:16
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.
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 20 mai 2005 à 18:01
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
mezaya
Messages postés202Date d'inscriptiondimanche 18 mai 2003StatutMembreDernière intervention 6 mars 2010 20 mai 2005 à 18:06
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
cs_dan34
Messages postés28Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention13 mars 2012 20 mai 2005 à 20:38
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
cs_dan34
Messages postés28Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention13 mars 2012 21 mai 2005 à 11:22
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].
mezaya
Messages postés202Date d'inscriptiondimanche 18 mai 2003StatutMembreDernière intervention 6 mars 2010 21 mai 2005 à 11:36
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.