Problème modification d'une valeur dans un pointer
Résolu/Fermé
Lolmaken
-
6 déc. 2016 à 16:51
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 - 7 déc. 2016 à 08:50
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 - 7 déc. 2016 à 08:50
A voir également:
- Problème modification d'une valeur dans un pointer
- Suivi de modification word - Guide
- Logiciel gratuit modification pdf - Guide
- Comment inserer une video dans un power point - Guide
- Mettre des points sur une carte - Guide
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
3 réponses
nagaD.scar
Messages postés
4272
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 janvier 2023
252
Modifié par nagaD.scar le 6/12/2016 à 17:31
Modifié par nagaD.scar le 6/12/2016 à 17:31
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
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
6 déc. 2016 à 17:39
6 déc. 2016 à 17:39
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 ...
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
Modifié par [Dal] le 6/12/2016 à 21:06
Modifié par [Dal] le 6/12/2016 à 21:06
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
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
Modifié par [Dal] le 6/12/2016 à 21:18
Modifié par [Dal] le 6/12/2016 à 21:18
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;
Modifié par [Dal] le 6/12/2016 à 19:09
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é
Modifié par nagaD.scar le 7/12/2016 à 08:50
Bref en tout cas il va falloir que je me remette un peu dedans, je penses avoir un peu perdu ^^ merci des precisions