IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Manipulation de pointeur sur tableau dynamique


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut Manipulation de pointeur sur tableau dynamique
    Bonjour,

    J'ai beau lire des exemples et des cas similaires au mien, je patauge.

    Voila un code qui tombe en marche et son warning. J'aimerai trouver une écriture plus propre et comprendre la gravité du warning dans mon cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    int loadPlaylist(ChaisesMusicales* pJeu){
            TypeAudio *audioPtr;
            pJeu->songs = calloc(pJeu->nbSongs, sizeof(TypeAudio));
            // ...
            audioPtr = &pJeu->songs[i];
            (*audioPtr).pathFile = getPathFromElementAudioNameJeu(&pJeu->baseParams, songsNames[i]);
            // ...
    }
    // avec précédement déclaré :
     
    /// \struct TypeAudio
    typedef struct{
        char *pathFile;
    }TypeAudio;
     
    typedef struct ChaisesMusicales
    {
        TypeAudio **songs;
        // ...
    }
    ChaisesMusicales;
     
    char* getPathFromElementAudioNameJeu(TypeJeu* pJeu, const char* elementName);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chaisesMusicales.c:223:50: warning: assignment from incompatible pointer type [enabled by default]
                                             audioPtr = &pJeu->songs[i];
                                                      ^
    Auriez-vous une idée pour corriger ma syntaxe ? Merci

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    pJeu est un  ChaisesMusicales*
    pJeu->songs est un  TypeAudio **
    pJeu->songs[i] est un  TypeAudio *
    &pJeu->songs[i] est un TypeAudio **
    Or
    audioPtr est un TypeAudio *
    Et l'assignation correspond à " TypeAudio * = TypeAudio ** "
    les deux types sont différents et il n'y a pas de conversion implicite entre ces deux types.
    Surtout ne pas tenter un cast pour masquer cet avertissement : ce simple avertissement traduit pratiquement toujours une erreur fatale dans le code.

    Quant à corriger cette erreur, ne connaissant rien de ce que tu veux faire, c'est difficile.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vincenet Voir le message
    J'aimerai trouver une écriture plus propre
    Bonjour

    Déjà nomme tes structures s_xxx et tes types t_xxx. Sinon, comme le dit Diogene, &truc[i] (correspondant à truc + i) est donc forcément du même type que truc...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Jusque là j'arrive à suivre, mais le retour de fonction getPathFromElementAudioNameJeu() qui est un char * ne peut être récupéré sans plantage.
    J'essaie de décomposer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            TypeAudio *audioPtr;
            // audioPtr est un TypeAudio *
            // *audioPtr est un TypeAudio
            // (*audioPtr).pathFile est du type de pathFile soit un char *
            char * tmp;
            // tmp est un char *
     
            audioPtr = pJeu->songs[i];
            msg(DEBUG, MSG_PARCOURS, "toujours en vie");
            tmp = getPathFromElementAudioNameJeu(&pJeu->baseParams, songsNames[i]);
            msg(DEBUG, MSG_PARCOURS, "toujours en vie"); // ligne affichée
            (*audioPtr).pathFile = tmp; // y a t-il un problème ici ?
            msg(DEBUG, MSG_PARCOURS, "toujours en vie"); // ligne PAS affichée
    Aurai-je encore fait une bourde ?

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu compiles bien avec un maximum de warning?

    Ca ressemble à un pointeur nul, au pif audioPtr.

    Un crash n'intervient qu'a l'accès à la mémoire, donc sur un * ou un ->.
    pas sur une copie d'un pointeur, qui est une variable locale, propre, mais contient une adresse (possiblement valide)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par leternel Voir le message
    Ca ressemble à un pointeur nul, au pif audioPtr.
    pJeu->songs vaut 228280
    pJeu->songs[0] vaut 0
    &pJeu->songs[0] vaut 228280

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    audioPtr = pJeu->songs[i]; // pas de warning mais vaut 0 et crash
    audioPtr = &pJeu->songs[i]; // warning à la compilation mais pas de crash
    audioPtr = pJeu->songs + i*sizeof(TypeAudio); // warning à la compilation mais pas de crash

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Mais puisqu'il vaut 0, c'est qu'il faut lui donner une valeur AVANT tout ce code.

    Tu n'aurai pas oublié de charger/créer la song?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    J'ai précédemment reservé un espace pour N structures TypeAudio
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            pJeu->songs = calloc(pJeu->nbSongs, sizeof(TypeAudio));
    Je veux maintenant initialiser l'élément pathFile des structures TypeAudio...

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Donc tu as un pJeu->songs pointant sur de la mémoire (mise à 0) correspondant à nbSongs TypeAudio.

    pJeu->songs[i] est donc un TypeAudioDonc, moi, j'écrirai bien quelque chose comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    audioPtr = &(pJeu->songs[i]);
    Si ca ne marche pas sans warning ni crash, c'est que tu devrais ne pas passer par un pointeur audioPtr (cf ma signature), et que je n'ai pas vraiment saisi tout ton problème
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Et de quel type serait l'élément pJeu->songs ? TypeAudio ** ou TypeAudio * ???

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vincenet Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pJeu->songs vaut 228280
    &pJeu->songs[0] vaut 228280
    Evidemment puisque comme je l'ai dit précédemment, &pJeu->songs[i] vaut pJeu->songs + i. Donc fatalement &pJeu->songs[0] vaut pJeu->songs + 0 !!!

    Citation Envoyé par vincenet Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    audioPtr = pJeu->songs[i];
    (*audioPtr).pathFile = tmp; // y a t-il un problème ici ?
    Oui il y a un problème si audioPtr (donc si ptJeu->songs[i]) ne contient pas une adresse valide. Mis à part ça, ça s'écrit aussi audioPtr->pathFile = tmp...

    Citation Envoyé par vincenet Voir le message
    audioPtr = pJeu->songs[i]; // pas de warning mais vaut 0 et crash
    Ben voilà. Si audioPtr vaut 0 tu ne peux évidemment pas aller voir *audioPtr !!!

    Citation Envoyé par vincenet Voir le message
    J'ai précédemment reservé un espace pour N structures TypeAudio
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    pJeu->songs = calloc(pJeu->nbSongs, sizeof(TypeAudio));
    Et tu ne sais pas que calloc() met tout à 0 ???
    Fatalement ptJeu->songs[i] vaut 0 donc audioPtr vaut 0 donc aller remplir (*audioPtr).pathFile pose un sérieux problème !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Merci pour ta participation Sve@r.

    Je sais bien que calloc met à 0 et c'est volontaire car je ne souhaite pas stocker des adresses mais des données.

    Je sais maintenant lire les erreurs, mais j'ai encore un pas à faire pour les corriger... Tu n'as pas réagis à ma dernière question ?

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vincenet Voir le message
    Je sais bien que calloc met à 0 et c'est volontaire car je ne souhaite pas stocker des adresses mais des données.
    Je ne vois pas trop le rapport. Initialiser à 0 sert quel que soit l'élément que l'on veut stocker ensuite. Toutefois, quand on a des étoiles dans les types, c'est que tout de même ce sont des adresses que l'on veut stocker. Ceci dit de toute façon même une adresse est quand-même quelque part une donnée...

    Citation Envoyé par vincenet Voir le message
    Tu n'as pas réagis à ma dernière question ?
    Le type de pJeu->songs ??? Ben si la structure
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct ChaisesMusicales
    {
        TypeAudio **songs;
        // ...
    }
    n'a pas changé c'est évidemment du type du membre nommé "song" donc un TypeAudio**. Ce qui m'amène d'ailleurs à cette question à savoir pourquoi un pointeur double ? Tu veux donc gérer une matrice de TypeAudio ??? Je crois que c'est là le problème... surtout que ton calloc alloue N "TypeAudio" alors qu'il devrait allouer N "TypeAudio*" !!!

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct ChaisesMusicales
    {
        TypeAudio *songs;
        // ...
    }
     
    int loadPlaylist(ChaisesMusicales* pJeu){
            TypeAudio *audioPtr;
            pJeu->songs = calloc(pJeu->nbSongs, sizeof(TypeAudio));
            // ...
            audioPtr = &pJeu->songs[i];
            audioPtr->pathFile = getPathFromElementAudioNameJeu(&pJeu->baseParams, songsNames[i]);
            // ...
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [x86_64] Passer un pointeur sur tableau défini dans .data
    Par khazna dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 24/04/2008, 19h49
  2. [Debutant] Pointeur sur tableau
    Par Pahcixam dans le forum Débuter
    Réponses: 7
    Dernier message: 25/05/2007, 21h19
  3. Réponses: 60
    Dernier message: 13/02/2007, 19h53
  4. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  5. besoin d'aide sur tableau dynamique
    Par littlesquall dans le forum C
    Réponses: 16
    Dernier message: 02/11/2005, 02h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo