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


Sujet :

C

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut manipulation de pointeur
    Bonjour,

    j'ai un tableau de pointeurs qui pointent sur des structures (cf image).

    J'ai un pointeur p_current qui pointe sur une adresse de ce tableau.

    j'aimerais parser le tableau. quand ce pointeur sera différent de NULL je dois un faire un traitement.

    Est ce que les 2algo suivants sont bons?
    le 1er consiste à parser le tableau tant que p_current est différent NULL(sachant que le p_curent du départ n'est pas NULL).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    p_temp =p_current;
     
    while (p_temp!=NULL)
    {
       if (p_temp !=NULL)
            treat(p_temp);
    p_temp++;
    }
    Pour le 2eme j'aimerais parser le tableau en commençant à l'adresse p_current
    jusqu'à revenir jusqu' à l'adresse p_curent.

    Comment dois je faire?
    Merci de votre aide.
    Images attachées Images attachées  

  2. #2
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Ton premier algo est pas tout à fait exact...
    la condition du if est toujours vrai, sinon on est déjà sorti de la boucle while !

    Si je comprends bien, dans ton premier algo, tu dois parcourir tout les pointeurs contenus dans ton tableau et pour ceux qui sont différents de NULL, tu dois exécuter un traitement, exact ?

    Et dans ton deuxième algo, tu dois parcourir ton tableau comme s'il était circulaire ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    oui c'est tout à fait ça.
    Peux tu m'aider à les faire?
    Merci

  4. #4
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Pour faire les 2 algos, tu dois avoir un pointeur sur le 1er élément du tableau.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    Je ne vois pas trop pourquoi car il faut que je parte du p_current qui peux être n'importe où.
    Tu peux me détailler le code que tu ferais?

  6. #6
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Pour calculer la borne supérieure de ton tableau et donc savoir quand t'arrêter (pour le 1er algo) et quand retourner au 1er élément (pour ton 2ième algo).

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    Tu coderais ça comment? Car je ne suis pas très à l'aise avec les pointeurs.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    p_temp =p_current;
     
    while (p_temp!=p_debut)
    {
       if (p_temp !=NULL)
            treat(p_temp);
    p_temp++;
    }

  8. #8
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    presque...

    si p_debut est un pointeur sur le 1er élément
    si p_current est pointeur sur l'élément de départ
    si N est le nombre d'éléments de ton tableau
    si type est le type d'élément contenu dans ton tableau.
    alors le code devrait ressembler à :
    p_max = p_debut + N * sizeof(type);
    for( p_temp = p_current; p_temp != p_max; ++p_temp )
    {

    }

  9. #9
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Presque...

    N = nombre d'éléments dans ton tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    p_max = p_debut + N;
    for( p_temp = p_current; p_temp != p_max; ++p_temp )
    {
       if (p_temp != NULL)
            treat(p_temp);
    }

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    et c'est pour le cas 1 ou 2?

    En gros p_debut c'est le 1er élément et p_max le denier élément.
    p_currrent va se balader entre le début et la fin? Ai je bien compris?
    Par conte comment je peux faire pointer p_debut sur le 1er element?
    Et si p_current ne pointe pas au début (ce qui peu être le cas ici) je n'aurais pas parser tout.

  11. #11
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    c'est pour le 1er algo...

    p_temp va se balader entre p_current (inclu) et p_max (exclu).

    pour le 2ième, il faut changer la condition de sortie :
    Ce n'est plus atteindre la borne max mais que p_temp soit égale à p_current une 2ième fois.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    1er cas: OK
    2eme cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //p_max = p_debut + N;
    for( p_temp = p_current; p_temp != p_temp; ++p_temp )
    {
       if (p_temp != NULL)
            treat(p_temp);
    }
    Comment je peux faire pour dire que c'est la 2ème fois?

    3ème case :et si ma condition de sortie est que lorsque qu'on parse le tableau tout est à NULL comment dois je faire?

  13. #13
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Citation Envoyé par sandball22 Voir le message
    2eme cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //p_max = p_debut + N;
    for( p_temp = p_current; p_temp != p_temp; ++p_temp )
    {
       if (p_temp != NULL)
            treat(p_temp);
    }
    Comment je peux faire pour dire que c'est la 2ème fois?
    Attention en C pas de commentaire //
    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
     
    int b_fois = 1;
    p_max = p_debut + N;
    p_temp = p_current;
    while( b_fois < 2 )
    {
       if (p_temp != NULL)
            treat(p_temp);
     
       /* on avance sans dépasser la borne max */
       if( ++p_temp == p_max )
            p_temp = p_debut;
     
       /* on compte le nombre de fois qu'on passe devant p_current */
       if( p_temp == p_current )
            ++b_fois;
    }
    [/quote]

    Citation Envoyé par sandball22 Voir le message
    3ème case :et si ma condition de sortie est que lorsque qu'on parse le tableau tout est à NULL comment dois je faire?
    tu veux dire qu'on a jamais appelé treat() ?
    Je pencherais pour un flag initialisé à 0 qu'on met à 1 quand on appelle la fonction : à la sortie de la boucle, il suffit de vérifier ce flag...

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    pour le cas 2 je vois un peu mieux maintenant.

    Pour le cas 3, ce que je veux faire c'est parser tout le temps le tableau. Et sortir une fois que tous les adresses sont a null mais en gardant le traitement quand c'est différent de null

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    On est bien d'accord que pour le N c'est p_max = p_debut + N * sizeof(type)?

  16. #16
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Citation Envoyé par sandball22 Voir le message
    On est bien d'accord que pour le N c'est p_max = p_debut + N * sizeof(type)?
    Non, c'était une erreur de ma part : p_max = p_debut + N

  17. #17
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Tu me fais faire un TD ?

    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 b_appel = 0;
     
    p_max = p_debut + N;
    p_temp = p_current;
    do
    {
       if (p_temp != NULL)
       {
            treat(p_temp);
       }
       else
       {
            ++b_appel;
       }
     
       /* on avance sans dépasser la borne max */
       if( ++p_temp == p_max )
            p_temp = p_debut;
     
       /* Raz à chaque fois qu'on passe devant p_current */
       if( p_temp == p_current )
          b_appel = 0;
    } while( b_appel < N );

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    non je ne te fais pas faire un TD. J'ai une appli à faire et je pense aller soit sur le choix 2 ou 3.
    Par contre je comprends pas trop la condition de sortie du 3"me cas.

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    En gros il faut que je sorte quadn on a fait un tour et que tous le p_temp apres incrémentation sont null

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    Conditions de sorties : il faut que le pointeur p_temp apres incrémentaion et après avoir fait un tour soit toujours null.
    dans le cas contraire (p_temp!=NULL) on fait le traitement et je continue de parser à partir de ce nouvelle position de pointeur jusqu'à avoir fait un tour entier et que tous les pointeurs soient null et ainsi de suite..
    Si quelqu'un pouvait m'aider pour cela? Merci d'avance

Discussions similaires

  1. Manipulation des pointeurs
    Par AQkinkin dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/08/2009, 10h32
  2. Erreur de manipulation de pointeur
    Par Bleys dans le forum Langage
    Réponses: 0
    Dernier message: 05/08/2008, 09h24
  3. comment manipuler le pointeur de la souris
    Par kris1 dans le forum Linux
    Réponses: 9
    Dernier message: 23/11/2007, 15h35
  4. Réponses: 60
    Dernier message: 13/02/2007, 19h53
  5. interface COM / manipulation de pointeurs
    Par slylafone dans le forum C++
    Réponses: 2
    Dernier message: 06/03/2006, 20h12

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