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
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"

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 !


3 réponses

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 251
Modifié par nagaD.scar le 6/12/2016 à 17:31
Salut,
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
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 6/12/2016 à 19:09
Salut naga :-)

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é
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 251
Modifié par nagaD.scar le 7/12/2016 à 08:50
Voilà j avais un peu de mal à comprendre ce qu il voulait faire ... bon et j ai tendance à ne pas reprendre tout le code (j ai la libération en tête) car c'est pas mon rôle de tout reprendre mais c'est surement une mauvaise habitude ^^

Bref en tout cas il va falloir que je me remette un peu dedans, je penses avoir un peu perdu ^^ merci des precisions
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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
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
0
@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 ...
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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
'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
0
Merci beaucoup ! Ca fonctionne! :)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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;
0