Kurpeus1
Messages postés42Date d'inscriptionlundi 16 octobre 2006StatutMembreDernière intervention21 mars 2007
-
11 nov. 2006 à 13:32
moumouteb
Messages postés192Date d'inscriptiondimanche 16 janvier 2005StatutMembreDernière intervention28 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 ?
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.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 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.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Kurpeus1
Messages postés42Date d'inscriptionlundi 16 octobre 2006StatutMembreDernière intervention21 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 *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;
}
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
moumouteb
Messages postés192Date d'inscriptiondimanche 16 janvier 2005StatutMembreDernière intervention28 février 201110 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