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 :

Question passage de pointeur sur tableau de structures


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par défaut Question passage de pointeur sur tableau de structures
    Hello, je refais du C (avec SDCC) et évidemment je perds les pédales (et la tête un peu). Si des pro du C peuvent m'aider… J'explique :

    Je crée une structure (pour un point 2D, avec son adresse dans la mémoire vidéo, pour ne pas la recalculer plus tard), je crée un tableau de cette structure (une quarantaine de « points » pour me faire un starfield basique). je fais une fonction pour créer mes 40 points et les remplir. Je lui passe le tableau sous forme de pointeur, car j'aimerais bidouiller le contenu du tableau plus tard, en dehors de cette fonction. A priori, tout semble marcher mais en réalité, si j'essaie de lire le tableau après le passage dans la fonction, les valeurs ne sont pas là. donc en gros, il n'a pas modifié le tableau (malgré le pointeur) mais sans doute une copie ?

    Bref, je mets le code (juste les bouts concernés). Si quelqu'un peut me dire où ça coince pour passer un tableau de struct en paramètre et non une copie ?
    MERCI !

    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
    15
    16
    17
    18
    19
    struct _point2D
    {
     unsigned char X;
       unsigned char Y;
     unsigned char *Adress;
    };
    struct _point2D TAB_stars[STARS_NUM];
    void Stars_Create(struct _point2D *TAB_stars_init[])
    {
     unsigned char i = 0;
     for(i = 0; i < STARS_NUM; i++)
     {
     (*TAB_stars_init[i]).X = rand() % (MAX_X+1);
     ...
         (*TAB_stars_init[i]).Adress = Mode0_Pixel_Compute_Adress((*TAB_stars_init[i]).X, (*TAB_stars_init[i]).Y,(unsigned int)0xC000);
     *(*TAB_stars_init)[i].Adress|=0b10000000;
    ...
    }
    Stars_Create(&TAB_stars);

    ici si je veux lire dans TAB_stars[x].Adress je n'ai pas les bonnes valeurs créés dans la fonction (j'ai mis un print dans la fonction et un en dehors et les valeurs ne correspondent pas... j'en déduis que ce qui est modifié dans la fonction est "resté" dans la fonction... HELP !

    ps : je travaille sur SDCC pour une machine 8 bits.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par défaut
    résolu.

    je mets la solution si jamais :
    1/ enlever les []dans la declaration de fonction
    2/ enlever les * dans la fonction...

    je mets comme résolu, je n'ai pas trouvé pour enlever la question...

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 527
    Par défaut
    Citation Envoyé par henri_b Voir le message
    1/ enlever les []dans la declaration de fonction
    2/ enlever les * dans la fonction...
    À présent que tu as fait tout cela, tu peux également supprimer le « & » dans l'appel de la fonction en bas de l'extrait…

    Il peut être intéressant de faire un petit rappel sur les tableaux en C et leur pièges, effectivement.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    À présent que tu as fait tout cela, tu peux également supprimer le « & » dans l'appel de la fonction en bas de l'extrait…

    Il peut être intéressant de faire un petit rappel sur les tableaux en C et leur pièges, effectivement.
    ce qui marche de mon coté c'est : Stars_Create(&TAB_stars[0]); et void Stars_Create(struct _point2D *TAB_stars_init) Il y a peut etre redondance dans certaines choses, mais si je change SDCC n'en veut pas...

  5. #5
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    802
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 802
    Par défaut
    Hello,

    Il n'y a vraiment aucun besoin de passer par &array[0] (peu importe le type de array):
    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
    24
    25
    26
    27
    28
    29
    #include <stdio.h>
     
    #define NELEM   10
     
    struct point {
        int x, y;
    };
     
    void FillArray(struct point array[]) {
        for(int i=0; i<NELEM; ++i) {
            array[i].x=i;
            array[i].y=i+1;
        }
    }
     
     
    void DisplayArray(struct point *array) {
        for(int i=0; i<NELEM; ++i)
            printf("%2d %2d\n", array[i].x, array[i].y);
    }
     
     
    int main(void) {
        struct point array[NELEM];
        FillArray(array);
        DisplayArray(array);
     
        return(0);
    }
    A noter que les déclarations lignes 9 et 17 sont équivalentes.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent ;)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pointeur sur tableau de structures imbriquées
    Par ToF19100 dans le forum Débuter
    Réponses: 7
    Dernier message: 08/10/2019, 14h57
  2. pointeur sur tableau dans une structure
    Par rollbich dans le forum Débuter
    Réponses: 3
    Dernier message: 02/06/2013, 23h23
  3. JNA pointeur sur tableau de structure
    Par NyTR0 x dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 30/12/2009, 18h43
  4. Pointeur sur tableau de structure
    Par Mercenary Developer dans le forum Débuter
    Réponses: 3
    Dernier message: 22/09/2008, 09h35

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