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 :

pointeur vers un tableau.


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut pointeur vers un tableau.
    Bonsoir.
    Malgrès le nb de sujet sur les poiteurs et les tableaux je n'arrive toujours pas a resoudre mon pb.

    Je fait un tableau dons les éléments sont de type "pig". Puis pour pouvoir travailler sur ces éléments je fait un pointeur ( p) sur le 1er élément du tableau.
    Quand je veux axéder au élément du tableau je fait un pointeur( q=p.
    Avec q j'obtien bien les bonnes donnée mais si je fait q++ je n'obtient plus du tout les réultats:


    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
     
     
    pig* initTab( ...)
    {
        .....
     
    	pig *pTabPig = &pigTab[0];
    	return pTabPig;
    }
     
    int main(void)
    {
          ....
     
    	pig *t=initTab( ...);
    	pig p=*t;
    	printf("%d %d",p.posX,p.posY);/* le résultat est bon */
    	t=t+1;
         p=*t;
    	printf("%d %d",p.posX,p.posY);/* c'est pas bon */
     
          ...
    }

    Si quelqu'un peu me donner un coup de main ca serai vraiment sympa

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Beh pourquoi tu ne renvoies pas pigTab dans ta fonction initPig ? Tu renvoies l'adresse d'une variable locale pas bien du tout,il est là ton probléme.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    pig initTab(....)
    {
     
     
         return pigTab;
    }

    ca marche ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par munck
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    pig initTab(....)
    {
     
     
         return pigTab;
    }

    ca marche ?
    Montre plutot d'ou sors pigTab...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    bien là C la methode qui crée est initialise le tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    pig initPigTabLevel( ...)
    {
    	for( i=0; i<...; i++)
    	{	
                pigTab[i]=...;
          }
     
    return ?????;
    }

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    l'idée C de pouvoir traiter les donné du tableau ultérieurement,...

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par munck
    bien là C la methode qui crée est initialise le tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    pig initPigTabLevel( ...)
    {
    	for( i=0; i<...; i++)
    	{	
                pigTab[i]=...;
          }
     
    return ?????;
    }
    Mais pigTab c'est quoi une variable automatique local à la fonction, une variable type pointeur alloué avec malloc,une variable local,une variable passée en paramètre,....

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    pigTab c'est une variable qui va me servir dans tout le programme, dons les élément sont des type "pig".

    j'ai un ensemble de "pig" a traiter par la suite, je les met dans un tableau; ce tableau C pigTab.

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par munck
    pigTab c'est une variable qui va me servir dans tout le programme, dons les élément sont des type "pig".

    j'ai un ensemble de "pig" a traiter par la suite, je les met dans un tableau; ce tableau C pigTab.
    D'accord tu ne veux pas montrer comment tu le déclares et tu ne veux pas nous dire s'il s'agit d'une variable automatique ou pas.

    Ce que tu viens de me dire je le sais déja ou du moins je le devine aisément.Tans pis.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    voila ce que j'ai pour le moment, Mais c'est faux.


    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
     
    pig initPigTabLevel( int nbLevel)
    {
    	pig *pTabPig;
    	pig pigTab[ nbPig( nbLevel, NBPIG)];
         /*	nbPig( nbLevel, NBPIG) retourn un int */
     
          for( i=0; i<NBPig; i++)
    	{	
     
     
          }		
    	pTabPig = &pigTab[0];
    	return pigTab;
    }

  11. #11
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par munck

    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
     
    pig initPigTabLevel( int nbLevel)
    {
    	pig *pTabPig;
    	pig pigTab[ nbPig( nbLevel, NBPIG)];
         /*	nbPig( nbLevel, NBPIG) retourn un int */
     
          for( i=0; i<NBPig; i++)
    	{	
     
     
          }		
    	pTabPig = &pigTab[0];
    	return pigTab;
    }

    Ton compilateur ne te dis rien ? Aucun warning aucune erreur ? Tu dis que la fonction renvoie un pig et finalement tu renvois quoi ? SI tu as besoin de travailler sur un tableau de pig dans l'appelant alors alloues dynamiquement dans ta fonction ce tableau et renvoies le pointeur vers le premier élément là tu seras sur que ton pointeur sera valide.

  12. #12
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Salut,
    On te demande où est stocké ce fichu tableau pigTab
    .. et que si c'était un tableau local à ta fonction initPigTabLevel, c'est normal que ça marche pas.

    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
     
    typedef struct {
      int a;
      int b;
    } T;
     
    T * creeTableau(void)
    {
       T tab[N];
       /* ... */
       return tab;
    }
     
    int main(void)
    {
      T * thetab;
      thetab = creeTableau();
      printf ("%d\n", thetab[0].a); /* /!\ Comportement indeterminé car thetab pointe pas sur quelquechose de valide */
      return 0;
    }
    Ce qu'il faut faire c'est soit allouer dynamiquement le tableau dans creeTableau() (et penser à le liberer), soit passer un tableau deja créé à creeTableau()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void initTableau(T * tab)
    {
       /* ... */
    }
     
    int main(void)
    {
       T tab[N];
       initTableau(tab);
     
       return 0;
    }

  13. #13
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Citation Envoyé par munck
    voila ce que j'ai pour le moment, Mais c'est faux.


    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
    pig initPigTabLevel( int nbLevel)
    {
    	pig *pTabPig;
    	pig pigTab[ nbPig( nbLevel, NBPIG)];
         /*	nbPig( nbLevel, NBPIG) retourn un int */
    	
          for( i=0; i<NBPig; i++)
    	{	
    
    
          }		
    	pTabPig = &pigTab[0];
    	return pigTab; /* /!\ considere que pigTab est supprimé ici, tu retournes l'adresse sur une zone qui n'existe plus */
    }

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    De plus ce n'est pas q++ mais q+=sizeof(pig)...

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Erreu de copier coller, l'entête de la fonction c'est bien:
    "pig * initPigTabLevel( int nbLevel)"
    désolé.

    Et effectivement c'est un tableau local à la fonction.

    Je teste les explication de "Gruik" et je vous dis ce qu'il en est.

  16. #16
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par PulkoMandy
    De plus ce n'est pas q++ mais q+=sizeof(pig)...
    q++ marche trés bien. Tu crois que q++ fait quoi il se place sur l'octet suivant ?

  17. #17
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Bof, si q est de type "pig", alors q++ fait bien pointer q sur le prochain element

    Edit : grilled

  18. #18
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par Gruik
    Bof, si q est de type "pig", alors q++ fait bien pointer q sur le prochain element

    Edit : grilled
    q est de type pig*

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    YES
    je vient de tester avec un tableau deja crée en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void initTableau(T * tab)
    {
       /* ... */
    }
    C'est bon ca marche tout comme il faut. Merci Beaucoup.
    Je vais tester en allouant dynamiquement le tableau,...

    Merci beaucoup à vous tous... je suis désolé d'avoir été aussi peu précis.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/11/2014, 00h44
  2. Réponses: 5
    Dernier message: 05/12/2011, 20h50
  3. Réponses: 3
    Dernier message: 23/06/2009, 16h40
  4. convertion pointeur vers tableau
    Par gdpasmini dans le forum C++
    Réponses: 2
    Dernier message: 30/03/2006, 00h34
  5. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43

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