Pointeur & structure

Résolu
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007 - 11 nov. 2006 à 13:32
moumouteb Messages postés 192 Date d'inscription dimanche 16 janvier 2005 Statut Membre Dernière intervention 28 février 2011 - 13 nov. 2006 à 16:38
Bonjour, j'ai un petit problème de compréhension et j'espère que vous pourrez m'aider

voici une structure :
struct ligne
{
       int  nbRaw ;
       char  zone[32];
       int codebar[64];
       char article[128];
       float pa ;
       float pv ;
       float q;
};

prototype d'une fonction :
struct ligne  *split( char* str, char c,  struct ligne *p );

déclaration et appel dans une fonction :
struct ligne entree;
struct ligne *p;
p= &entree ;

p  = split( str, ',', p );
printf("%i\n", (*p).nbRaw);  // marche bien
printf("%f\n", p->q);            // surement n'importe quoi, j'ai essayé plusieurs trucs mais j'arrive pas a afficher une valeur

et la fonction qui découpe une chaine en fonction d'un caractère :
struct ligne *split( char * str, char c, struct ligne *p  )
 {
     int ind = 0;
     char *data = str;
     while( *str ) {
         if ( *str == c ) {
             *str = '\0';
             ind++;
             switch(ind)
             {
                        case 1 : break ;
                        case 2 :
                             *p->zone = *str ;
                             break ;
                        case 3 :
                             *p->codebar = *str ;
                             break ;
                        case 4 :
                             *p->article = *str ;
                             break ;
                        case 5 :                                             // Ecriture différente entre le bleue et le vert, le compilateur
                             (*p).pa = *str ;                           // me laisse pas écrire la même chose
                             break ;
                        case 6 :
                             (*p).pv = *str ;
                             break ;
                        case 7 :
                             (*p).q = *str ;
                             break ;
                        case 8 :
                             printf("Erreur nb de colonne trop grand");
                             exit(-1);
             }
         }
         ++str ;
     }
     (*p).nbRaw = ind ;                         
     return p;
 }

donc le seul résultat correcte est le (*p).nbRaw = ind ;   qui m'affiche la bonne valeur ( celui qui indique le nombre de chaines trouvées (découpées)
Je pense que mon problème est que je n'affecte pas bien les autres variables de la structure

Je m'embrouille un peu avec les pointeurs mais je progresse :)

question subsidiaire : Héritage

ma fonction split découpe une chaine et remplie une structure. la fonction qui l'appel récupere cette structure et la traite. Ai-je bien positionné ma déclaration, ou dois je le mettre en structure global  ?

Merci

6 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
11 nov. 2006 à 16:15
while( *str ) {
         if ( *str == c ) {
             *str = '\0';
             ind++;

Je ne comprend pas ici ce que tu veux faire.

Tu attend que *str egal c puis une fois le caractère trouvé, tu l'annule puis tu le stock dans la structure?

Ensuite:





case 2 :
                             *p->zone = *str ;
                             break ;
                        case 3 :
                             *p->codebar = *str ;
                             break ;
                        case 4 :
                             *p->article = *str ;
                             break ;




Tu ajoute le caractère (nulle en passent) au tableau? Mais pourquoi un tableau? Tu ne stock qu'une seul valeur par membre de la structure.

Finalement:







                            (*p).pa = *str ;
                             break ;
                        case 6 :
                             (*p).pv = *str ;
                             break ;
                        case 7 :
                             (*p).q = *str ;
                             break ;

Les membres pa pv et q sont des float. Cependant, un float fait 4 octets et un char n'en fait qu'un. Deplus, si ta valeur "float" est entré sous forme de caractère, c'est une cause perdue car "0" par exemple, qui fait un octet, est équivalent à 0x30 en hexadécimal et non 0x0. Donc tu te trouve à entrer 48 dans la structure plutot que zero.

Désolé mais je crois que tu devrais revoir certaines notions du C et essayer de bien comprendre tout les exemples donnés dans les livres ou tutoriaux concernant le sujet que tu traite et scruter ce site à la recherche de bonnes sources. C'est très efficace. C'est le meilleur conseil que je peux te donner.

Bonne continuation.





C++ (@++)<!--
3
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
11 nov. 2006 à 18:03
petit rappel toujours utile :
&var : où est ma variable ?
*pointeur : qu'y a-t-il en mémoire à la case " pointeur " ?
autement dit : *&var = qu'y a t il en mémoire à l'adresse de "var" ? -> hé bien, .... var .

quant au (*p).pa, il mérite quelques explications.
p est un pointeur vers ta structure.
quand tu écris *p, tu manipules ce vers quoi pointe p, à savoir la structure elle même.
Ce qui devrait te permettre d'écrire *p.membre; mais l'opérateur . a une priorité supérieure à *, dont le compilo lui il comprend :
*(p.membre), ce qui ICI ne veut rien dire (voir note * )
Du coup tu mets des parenthèses pour lui dire ce que tu veux faire.
comme c'est chiant à écrire, le C définit un autre opérateur.
p->membre est SRTICTEMENT equivalent à (*p).membre.
c'est juste, tu t'en rendras compte avec l'habitude, beaucoup plus clair est facile à utiliser.

En gros '->' remplace '.' quand le membre de gauche est un pointeur et non directement une structure.

* :  ça aurait un sens si p était une structure genre ma_struct p ( et non ma_struct * p_ptr ) et membre un pointeur ( genre int * membre ). Tu aurais donc  la variable pointée par membre, lui même membre de p.

C'est plus clair  ? j'ai un doute

_______________________

Omnia vincit labor improbus
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
11 nov. 2006 à 18:35
J'ai jamais compris l'utilité de faire (*struct).membre plutot que struct->membre. Ça apporte quelque chose de plus?

C++ (@++)<!--
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
11 nov. 2006 à 18:53
c'est réellement, vraiment, entièrement, totalement ( j'en rajoute ? :p ) IDENTIQUE ( syntraxiquement parlant )
maintenant, si tu préfères alourdir ton code, le rentre moins lisible, moins compréhensible, plus sujet aux bugs et erreurs de programmation ... libre à toi d'utiliser (*struct).membre .

_______________________

Omnia vincit labor improbus
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
12 nov. 2006 à 12:00
Merci a tous pour vos réponses, effectivement, c'est encore un peu fouillis, mais pour ceux qui ont pas compris ce que je cherchais a faire, voila ce à quoi je voulais arriver :

struct ligne
{
       int  nbRaw ;
       char *zone;
       char *codebar;
       char *article;
       char *pa ;
       char *pv ;
       char *q;
       char *vendor;
};

p  = split( str, ',', p );

struct ligne *split( char * str, char c, struct ligne *p  )
 {     int ind 0, nbChar 0;
     char *data = str;
 
     initStruct(p);
     while( *str ) {
        
         if ( *str == c ) {
             *str = '\0';
             ind++;
             switch(ind)
             {
                        case 1 :
                             p->zone = data ;
                             data = str+1;
                             break ;
                        case 2 :
                             p->codebar = data ;
                             data = str+1;
                             break ;
                        case 3 :
                             p->article = data ;
                             data = str+1;
                             break ;
                        case 4 :
                             p->pa = data ;
                             data = str+1;
                             break ;
                        case 5 :
                             p->pv = data ;
                             data = str+1;
                             break ;
                        case 6 :
                             printf("Erreur nb de colonne trop grand");
                             exit(-1);
             }
         }
         else
         {
             nbChar++;
         }    
         ++str ;
     }     if (ind 0) p->vendor data;
     else p->q = data;
     p->nbRaw = ind ;                         
     return p;
 }


void initStruct(struct ligne * ptr)
{
     ptr->article = NULL;
     ptr->zone = NULL;
     ptr->article = NULL;
     ptr->codebar = NULL;
     ptr->pa = NULL;
     ptr->pv = NULL;
     ptr->q = NULL;
     ptr->vendor = NULL;
}

Donc dans un fichier j'ai ca :
nomVendeur
ou
zone, codebar, article, prix achat, prix vente, quantité

Je lis le fichier par ligne, je cherche si je trouve des virgules dans cette chaine, si oui , je remplace le caractère virgule par le caractère null, du coup je "découpe" ma chaine en plein de petites chaines,  et je stock tout ca dans une structure
0
moumouteb Messages postés 192 Date d'inscription dimanche 16 janvier 2005 Statut Membre Dernière intervention 28 février 2011 10
13 nov. 2006 à 16:38
héhé on dira ce qu'on veut mais j'ai du lire une dizaine de cours sur les pointeurs et ben ça vaut pas le super résumé de [auteurdetail.aspx?ID=149953 Arnaud16022]. Merci beaucoup .

--------------------
Quand la merde vaudra de l'or les pauvres naitrons sans trou du cul. Coluche.
Mon projet : Squirrel's Cliff
0
Rejoignez-nous