Problème modification d'une valeur dans un pointer
Résolu
Lolmaken
-
nagaD.scar Messages postés 4272 Date d'inscription Statut Membre Dernière intervention -
nagaD.scar Messages postés 4272 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un problème lors de la modification de mon pointer.
Dans mon cas les informations sont bien modifiées mais n'insèrent pas la valeur désiré. Le code insére un "@" au lieu d'un "5"
J'ai aussi tester :
Mais le compilateur m'informe d'un "core dumped".
Cela fait 2 jours que je cherche, je commence à désespérer :(
Merci d'avance !
J'ai un problème lors de la modification de mon pointer.
Dans mon cas les informations sont bien modifiées mais n'insèrent pas la valeur désiré. Le code insére un "@" au lieu d'un "5"
const char* coureur[22][18]; // 22 coureurs contenant 18 informations
int main(){
coureur[0][10]="f";
effectuerEssai();
printf("%s", coureur[0][10]);
}
void effectuerEssai(){
int tour[3];
int tour[2]=5;
sprintf(&coureur[0][10], "%d", tour[2]); //Problème
}
J'ai aussi tester :
sprintf(*coureur[0][10], "%d", tour[2]);
sprintf(coureur[0][10], "%d", tour[2]);
Mais le compilateur m'informe d'un "core dumped".
Cela fait 2 jours que je cherche, je commence à désespérer :(
Merci d'avance !
A voir également:
- Problème modification d'une valeur dans un pointer
- Suivi de modification word - Guide
- Comment inserer une video dans un power point - Guide
- Logiciel gratuit modification pdf - Guide
- Mettre des points sur une carte - Guide
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
3 réponses
Salut,
Un peu rouillé donc reprennez moi si je me plante, mais plusieurs remarques:
ca n 'a aucuns sens=> tu déclare deux tableau du même nom et tu assigne une valeur à la déclaration du tableau ... ???
pas de &, l assignation (et alloc) est implicite
J ai un doute sur le const aussi mais bon
essaye:
Ca doit fonctionner mais bon..
naga
Un peu rouillé donc reprennez moi si je me plante, mais plusieurs remarques:
int tour[3]; int tour[2]=5;
ca n 'a aucuns sens=> tu déclare deux tableau du même nom et tu assigne une valeur à la déclaration du tableau ... ???
sprintf(&coureur[0][10], "%d", tour[2]);
pas de &, l assignation (et alloc) est implicite
J ai un doute sur le const aussi mais bon
essaye:
char* coureur[22][18]; // 22 coureurs contenant 18 informations void effectuerEssai(){ int tour[3]; tour[2]=5; sprintf(coureur[0][10], "%d", tour[2]); } int main(){ char a = 'f'; coureur[0][10]=&a;//->on assigne pas direct une valeur à un pointeur, faut allouer le tout printf("%s", coureur[0][10]); effectuerEssai(); printf("%s", coureur[0][10]); }
Ca doit fonctionner mais bon..
naga
Salut Lolmaken,
Cela n'est pas le compilateur qui fait un "core dump" (sauf si tu as réussi à crasher le compilateur), mais l'exécutable.
En parlant du compilateur, il te donne un grand nombre d'indications si tu regardes les warnings, sur ton code.
Avant d'aller dans le détail, peux-tu préciser stp, qu'est-ce que tu veux mettre dans ton tableau
Dal
Cela n'est pas le compilateur qui fait un "core dump" (sauf si tu as réussi à crasher le compilateur), mais l'exécutable.
En parlant du compilateur, il te donne un grand nombre d'indications si tu regardes les warnings, sur ton code.
Avant d'aller dans le détail, peux-tu préciser stp, qu'est-ce que tu veux mettre dans ton tableau
coureur[22][18]comme "information", est-ce simplement un caractère, et si oui, la raison pour laquelle tu ne déclares pas ta structure de données
char coureur[22][18]?
Dal
@DAL merci de ta réponse, c'est pas un char que je veux ajouter au pointeur mais un int. Effectivement c'est l'exécutable qui affiche l'erreur. Je sais que c'est un problème au niveau de la mémoire. Donc je cherche un moyen de le faire fonctionner correctement ...
indépendamment des erreurs dans ton code :
- tu ne stockes initialement que la lettre f dans ton exemple...
- ensuite tu transformes ton int (un int qui vaut 5) avec sprintf ce qui a pour effet de le transformer (en chaîne en l'occurrence)
donc tu ne stockes jamais un int dans ton tableau, d'ailleurs son type n'est pas prévu pour
si tu veux juste stocker un char, qui soit une lettre
donne :
cet exemple reprend l'esprit de ton code et de ta fonction, cependant, un programmeur C devrait éviter de créer une variable globale et ferait autrement, en changeant le prototype de la fonction effectuerEssai()
Dal
- tu ne stockes initialement que la lettre f dans ton exemple...
- ensuite tu transformes ton int (un int qui vaut 5) avec sprintf ce qui a pour effet de le transformer (en chaîne en l'occurrence)
donc tu ne stockes jamais un int dans ton tableau, d'ailleurs son type n'est pas prévu pour
si tu veux juste stocker un char, qui soit une lettre
'f'ou un chiffre
'5', on pourrait faire comme cela :
#include <stdio.h> char coureur[22][18]; // 22 coureurs contenant 18 informations sous forme d'un char void effectuerEssai(void) { int tour[3]; tour[2]=5; coureur[0][10] = '0' + tour[2]; } int main(void) { coureur[0][10] = 'f'; effectuerEssai(); printf("%c\n", coureur[0][10]); return 0; }
donne :
$ gcc -Wall -g lolmaken.c
$ ./a.out
5
cet exemple reprend l'esprit de ton code et de ta fonction, cependant, un programmeur C devrait éviter de créer une variable globale et ferait autrement, en changeant le prototype de la fonction effectuerEssai()
Dal
quelques indications :
/* ceci est un char (note les apostrophes) */ char c1 = 'a'; /* ceci aussi est un char (note les apostrophes) */ char c2 = '0'; /* les char sont des types entiers, or leur valeur entière * correspond à la valeur ASCII du caractère * du coup, on peut faire des opérations dessus */ c1++; /* maintenant c1 contient 'b' */ c2++; /* maintenant C2 contient '1' */ /* on peut convertir un chiffre en char avec * ces mêmes propriétés */ char c3 = '0' + 5; /* c3 vaut le code ASCII de 0 auquel on ajoute le chiffre 5 et donc c3 contient le char '5' */ /* voilà une chaîne (note les guillemets) */ char st[255] = "Hello world"; /* voilà un entier (absence d'apostrophes ou de guillemets) */ int n = 5;
comme coureur est une variable globale, le compilateur va l'initialiser à 0, et donc chaque pointeur sur char contenu dans le tableau pointera sur l'adresse 0 .. ce qui est un peu gênant ;-)
pour que ton code fonctionne, il faudrait allouer avec malloc un byte pour chaque char à stocker, et initialiser le pointeur sur char avec l'adresse retournée par malloc (qu'il faudra libérer avec free)
en termes de choix de structure de données, et de choix de conception (et accessoirement de performances), on marche sur la tête à moins d'avoir une très bonne raison de faire comme cela
si tout ce qu'on veut stocker c'est un char, il suffit de faire un tableau bidimensionnel de char, et c'est tout
si on veut stocker des chaînes de caractères alors la déclaration comme tu la proposes (sans const, autrement on n'est pas sensé modifier le contenu...) se justifie, et il faudra passer par les malloc/free aussi, bien sûr, et allouer la mémoire nécessaire au stockage de chaque chaîne
bref, la première question est bien de savoir qu'est-ce que Lolmaken veut stocker, en réalité
Bref en tout cas il va falloir que je me remette un peu dedans, je penses avoir un peu perdu ^^ merci des precisions