begin process at 2012 05 29 13:46:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

pointeur & structure


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

pointeur & structure

samedi 11 novembre 2006 à 13:32:07 | pointeur & structure

Kurpeus1

Membre Club
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
samedi 11 novembre 2006 à 16:15:29 | Re : pointeur & structure

SAKingdom

Membre Club
Réponse acceptée !
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++ (@++)

samedi 11 novembre 2006 à 18:03:34 | Re : pointeur & structure

Arnaud16022

Membre Club
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
samedi 11 novembre 2006 à 18:35:39 | Re : pointeur & structure

SAKingdom

Membre Club
J'ai jamais compris l'utilité de faire (*struct).membre plutot que struct->membre. Ça apporte quelque chose de plus?

C++ (@++)

samedi 11 novembre 2006 à 18:53:43 | Re : pointeur & structure

Arnaud16022

Membre Club
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
dimanche 12 novembre 2006 à 12:00:26 | Re : pointeur & structure

Kurpeus1

Membre Club

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

lundi 13 novembre 2006 à 16:38:19 | Re : pointeur & structure

moumouteb

Membre Club
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 Arnaud16022. Merci beaucoup .

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


Cette discussion est classée dans : ligne, case, str, structure, struct


Répondre à ce message

Sujets en rapport avec ce message

Listes chainées !!!!! [ par flopflopp ] Bonjour je travaille tjrs sur mon éditeur de texte style vi et je voudrais vous soumettre un nouveau problème :En fait j'ai une structure ligne qui es Pb de structures, listes chainees !!! [ par flopflopp ] C encore moi , au vu de qq problème j'ai changé mes structures pour mon éditeur de texte :ma structure ligne est devenu la suivante :Code:struct ligne PILE & STRUCTURE [ par cyberice67 ] Bonjour, J'ai une bonne question spécial chauffage de neurones.... J'ai créé une structure de base appelée MesDonnees, qui contient mes données. Puis Structure de données Arbre de Huffman [ par nicloss ] Bonjour, j'ai un projet en programmation c qui consiste à coder un programme qui compresse selon l'algorithme de Huffman. J'ai bien compris le princip structure [ par logant83 ] bonjoir, enfaite voila j'aimerai pouvoir exploiter une structure mais voila j'i arrive pas. struct connect_nick { //ma structure char pseudo[1000 Comment lire un Char array ligne par ligne et le modifier? [ par fcoutel ] Bonjour!J'ai cree un char array dans un autre program qui contient des info "encryptees" static char tcl_script[] = "«¨íðéåøäí¦üã\n" "«¨Ìíåçæûüúéüíû¨ Définition de Structure [ par angelfire0808 ] Voila j'ai une petite question sur la definition des structure : struct liste         {         int valeur;     & [debutant]structure dans un arbre binaire/pointeur [ par gluff ] Bonjour,je n'arrive pas a remplir des strucutures a partir de la lecture d'un fichier.Dans le fichier sont contenus un liste de nom de personne et un copier une valeur dans une structure [ par Kurpeus1 ] Bonjour, désolé de reposer la question mais j'ai un soucis depuis plusieurs jour et je n'arrive pas a le résoudre. Il me semble pourtant que pour un d


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales