Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1943 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C]Bibliothèque C à commenter

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[C]Bibliothèque C à commenter

n°692910
Azariel
Posté le 05-04-2004 à 17:11:20  profilanswer
 

Bonjour,
Dans le cadre de mon stage, j'ai pour mission de commenter une bibliothèque C qui sert dans ma boite.
Je pense ne pas avoir trop de soucis à écrire mes propres bibliothèques en C, mais décrypter le code d'une autre personne qui a fait ca comme un cochon (mal indenté, mélange majuscules/minuscules ...) c'est plus galère.
Là j'ai un soucis de compréhension :
 
struct TOTO
{
 char *a;
 char *b;
 struct TOTO *c;
} *b,*d;
 
Si je comprends bien, il définie 2 variables de type struct TOTO (b et d).
Mais :
- je croyais que dans les variables de la structure, on ne pouvait déclarer un champ qui avait la même structure que la structure principale (ici TOTO).
- de plus, un objet de la classe TOTO (ici b) a un champ qui se nomme b, j'ai juste ??
 
Merci beaucoup ... Et ce n'est que le début  :whistle:

mood
Publicité
Posté le 05-04-2004 à 17:11:20  profilanswer
 

n°692930
chrisbk
-
Posté le 05-04-2004 à 17:20:09  profilanswer
 

Non, ca signifie qu'il a cree deux types, b et d, qui sont en fait un raccourci pour "TOTO *"


Message édité par chrisbk le 05-04-2004 à 17:20:30
n°692937
Azariel
Posté le 05-04-2004 à 17:24:20  profilanswer
 

hum ok ... c'est l'équivalent de typedef struct TOTO *b

n°692958
pascal_
Posté le 05-04-2004 à 17:35:18  profilanswer
 

chrisbk a écrit :

Non, ca signifie qu'il a cree deux types, b et d, qui sont en fait un raccourci pour "TOTO *"


 
 :non: il y a pas de typedef
 
Ici, il a bien défini deux pointeurs de struct TOTO.
 

n°692962
pascal_
Posté le 05-04-2004 à 17:39:05  profilanswer
 

Azariel a écrit :


- je croyais que dans les variables de la structure, on ne pouvait déclarer un champ qui avait la même structure que la structure principale (ici TOTO).


 
Oui, tu peux pas faire :


struct TOTO  
{  
  ..
  struct TOTO t;
};


 
Sinon on aurait une struct de taille infini (TOTO qui contient TOTO qui lui-même contient un TOTO qui....)
Mais tu as le droit de faire ça :
 


struct TOTO  
{  
  ..
  struct TOTO *t;
};


 
Ici, t c'est juste un pointeur vers une struct TOTO. C'est bon parcequ'un momment tu peux y coller un NULL.
 
 
 
 

n°692966
chrisbk
-
Posté le 05-04-2004 à 17:41:34  profilanswer
 

Citation :

Ici, t c'est juste un pointeur vers une struct TOTO. C'est bon parcequ'un momment tu peux y coller un NULL.


 
N'imp. c'est juste qu'un pointeur ca fait (generalement) 4 octets et ca ne contient rien du tout.
 
(ta precedente intervention etait aussi fausse)

n°692968
pascal_
Posté le 05-04-2004 à 17:45:05  profilanswer
 

chrisbk a écrit :

Citation :

Ici, t c'est juste un pointeur vers une struct TOTO. C'est bon parcequ'un momment tu peux y coller un NULL.


 
N'imp. c'est juste qu'un pointeur ca fait (generalement) 4 octets et ca ne contient rien du tout.
 
(ta precedente intervention etait aussi fausse)


 
Si tu ne pouvais pas y mettre NULL, ça n'aurait aucun sens (je parlais en terme de signification). Bien sûr en mémoire ça roule.
 
et ma précédente intervention est vrai !

n°692969
chrisbk
-
Posté le 05-04-2004 à 17:47:27  profilanswer
 

pascal_ a écrit :


 
Si tu ne pouvais pas y mettre NULL, ça n'aurait aucun sens (je parlais en terme de signification). Bien sûr en mémoire ça roule.


 
C'est idiot.
Si  

Code :
  1. struct machin
  2. {
  3. struct machin truc;
  4. };


 
est interdit, c'est parce que (comme tu l'as dit), ca fait une taille infinie.
Alors que
 

Code :
  1. struct machin
  2. {
  3. struct machin *truc;
  4. };


 
A une taille calculable (ici 4 octets) et non pas a cause de je ne sais quelle histoire de NULL, qui de toute facon n'entre meme pas en ligne de compte a compile time
 
 

pascal_ a écrit :


 
et ma précédente intervention est vrai !
 


Non. Regarde genre ici, il declare un type (certes pas pointeur mais on s'en fout) et pas une variable.
http://diwww.epfl.ch/lami/team/jel [...] ode50.html
 

n°692973
pascal_
Posté le 05-04-2004 à 17:49:59  profilanswer
 
n°692974
Azariel
Posté le 05-04-2004 à 17:50:11  profilanswer
 

Vous battez pas :)
En tout cas merci j'ai compris la nuance.

mood
Publicité
Posté le 05-04-2004 à 17:50:11  profilanswer
 

n°692976
chrisbk
-
Posté le 05-04-2004 à 17:51:31  profilanswer
 

pascal_ a écrit :


 
Oui, mais il y a un typedef  :o  
 
 


 
t'es un brin relou :o

Citation :


ou plus simplement
 
  typedef struct
  {
    char nom[LGNOM] ;
    char prenom[LGNOM] ;
    float moyenne_pratique ;
    float moyenne_theorique ;
    int age ;
  } s_etudiant ;
  ...
 
 /* déclare la variable etud de type s_etudiant */
  s_etudiant etud ;

n°692977
pascal_
Posté le 05-04-2004 à 17:53:30  profilanswer
 

chrisbk a écrit :


 
t'es un brin relou :o
 


 
C'est toi qui n'a pas lu le premier post.
 
Il n'y pas de typedef dans son code !!!!!!!!!!
 

n°692978
pascal_
Posté le 05-04-2004 à 17:54:10  profilanswer
 

Azariel a écrit :


 

Code :
  1. struct TOTO
  2. {
  3. char *a;
  4. char *b;
  5. struct TOTO *c;
  6. } *b,*d;


 

n°692980
Azariel
Posté le 05-04-2004 à 17:54:50  profilanswer
 

Je crois que ce que veut dire pascal_ c'est qu'au début de la déclaration du struct, il n'y a pas typedef ...
Donc en fait ca correspond pas tout a fait à ton cas de figure.

n°692981
chrisbk
-
Posté le 05-04-2004 à 17:54:55  profilanswer
 

pascal_ a écrit :


 
C'est toi qui n'a pas lu le premier post.
 
Il n'y pas de typedef dans son code !!!!!!!!!!
 
 



YEN A PAS NON PLSU DANS LE PUTAIN D'EXEMPLE DE MES COUILLES QUE JE VIENS DE DONNER BORDEL DE MERDAKU

n°692982
chrisbk
-
Posté le 05-04-2004 à 17:55:33  profilanswer
 

Azariel a écrit :

Je crois que ce que veut dire pascal_ c'est qu'au début de la déclaration du struct, il n'y a pas typedef ...
Donc en fait ca correspond pas tout a fait à ton cas de figure.


 
Ah ? :O
Ben qu'il le dise alors :o

n°692983
Azariel
Posté le 05-04-2004 à 17:55:56  profilanswer
 

MDR ...  
Alala ces informaticiens ;)

n°692984
pascal_
Posté le 05-04-2004 à 17:56:05  profilanswer
 

chrisbk a écrit :


 
t'es un brin relou :o

Citation :


ou plus simplement
 
  typedef struct
  {
    char nom[LGNOM] ;
    char prenom[LGNOM] ;
    float moyenne_pratique ;
    float moyenne_theorique ;
    int age ;
  } s_etudiant ;
  ...
 
 /* déclare la variable etud de type s_etudiant */
  s_etudiant etud ;




 
Et en gras c'est quoi ?
C'est pas un typedef ça ?
 

n°692986
chrisbk
-
Posté le 05-04-2004 à 17:56:44  profilanswer
 

pascal_ a écrit :


 
Et en gras c'est quoi ?
C'est pas un typedef ça ?
 
 


 
je pensais que tu causais d'un
 
typedef prout roger;

n°692988
Azariel
Posté le 05-04-2004 à 17:57:25  profilanswer
 

Oui mais pas dans mon exemple ...
Dsl d'en rajouter une couche :)

n°692991
pascal_
Posté le 05-04-2004 à 17:58:48  profilanswer
 

chrisbk a écrit :


 
je pensais que tu causais d'un
 
typedef prout roger;


 
j'avais compris, c'est pour ça que dans mon premier post, je te disais qu'il n'y avait pas de typedef.
Enfin, incident clos.
 

n°693224
Azariel
Posté le 06-04-2004 à 10:02:03  profilanswer
 

Il y a une nouvelle construction que je ne comprends pas :
 
void toto( titi )
char *titi[10];
{
//Suite d'instructions avec des boucles ... conditions ...  
}
 
On dirait une fonction ... mais que vient faire ce char *titi[10]; et surtout le ";" :heink:  
 
Merci.

n°693238
gilou
Modérateur
Modzilla
Posté le 06-04-2004 à 10:12:25  profilanswer
 

De toute facon, c'est chrisbk qui a raison. Cette histoire de NULL ne rime a rien.
A+,

n°693241
Azariel
Posté le 06-04-2004 à 10:14:22  profilanswer
 

Pour le pointeur de fonction et le NULL je suis d'accord.
Mais *b et *d sont bien des pointeurs vers 2 objets de structure TOTO ?

n°693249
Moktar1er
No one replies...
Posté le 06-04-2004 à 10:26:55  profilanswer
 

Azariel a écrit :

Pour le pointeur de fonction et le NULL je suis d'accord.
Mais *b et *d sont bien des pointeurs vers 2 objets de structure TOTO ?


 
non, pas des pointeurs vers 2 objets, mais 2 pointeurs vers une (ou des) instance(s) quelconque(s) de l'objet TOTO

n°693269
gilou
Modérateur
Modzilla
Posté le 06-04-2004 à 10:40:49  profilanswer
 

Azariel a écrit :

Pour le pointeur de fonction et le NULL je suis d'accord.
Mais *b et *d sont bien des pointeurs vers 2 objets de structure TOTO ?


Oui: quand tu fais ceci:  
struct A {
...
};
On déclare une type, struct A, qu'on peut utiliser, pour declarer une variable:
struct A a;
et
struct A {
...
}a;
 
est equivalent a:
struct A {
...
};
struct A a;
 
C'est juste une ecriture plus compacte pour declarer le type struct A et declarer la variable a d'un seul coup.
 
et donc,  
struct A {
...
}a, b, *c;
équivaut à:  
 
struct A {
...
};
struct A a, b, *c;
 
Il y a une subtilite:
struct {
...
}a;
Le type de la variable a est une structure sans nom. Ca permet de faire en sorte que a est la seue variable de son propre type.
 
Par contre, quand on fait:
typedef struct A {
...
}a;
on declare un type, a, comme etant un nouveau nom pour le type struct A (et ca evite de se trainer des structs partout).
On pourra alors faire plus loin:
a x;
De ce fait, on peut aussi utiliser
typedef struct {
...
}a;
a est un nouveau nom de type pour un type de structure anonyme, et de ce fait, on est oblige d'employer a pour declarer des variables de ce type.
En fait, la notation  
typedef struct A {
...
}a;  
n'est utile que si on a un ou des membres pointant sur un objet du type de la structure en cours de definition:
typedef struct A {
...
struct A *b;
...
}a;
En effet, a la declaration du membre b, a n'est pas declare, donc on ne peut l'employer, tandis que struct A est deja declare (et en cours de definition).
 
Derniere subtilité:
struct A {
...
};
on a declare un type struct A. A n'est pas un nom de type (on dit que c'est une etiquette).
typedef struct{
 
}A;  
A est un nom de type. Comme c'est pas le meme espace de nommage que celui des etiquettes, on peut faire:
 
typedef struct A {
 
} A;
d'autres preferrent la notation
typedef struct _A {
 
} A;
 
A+,


Message édité par gilou le 06-04-2004 à 10:54:16
n°693271
Azariel
Posté le 06-04-2004 à 10:43:06  profilanswer
 

Merci !

n°693302
pascal_
Posté le 06-04-2004 à 10:59:15  profilanswer
 

Azariel a écrit :

Il y a une nouvelle construction que je ne comprends pas :
 
void toto( titi )
char *titi[10];
{
//Suite d'instructions avec des boucles ... conditions ...  
}
 
On dirait une fonction ... mais que vient faire ce char *titi[10]; et surtout le ";" :heink:  
 
Merci.


 
C'est l'ancienne définition de fonction du C.
 
En fait tu pouvais avoir ça :
 

Code :
  1. int toto( titi, tutu )
  2.     char* titi;
  3.     int tutu;
  4. {
  5. ...
  6. }
  7. // Equivalent à  
  8. int toto( char *titi, int tutu )
  9. {
  10. ...
  11. }


Message édité par pascal_ le 06-04-2004 à 10:59:55
n°693313
Azariel
Posté le 06-04-2004 à 11:02:06  profilanswer
 

C'est bien ce que je pensais ... merci.
 
Et il déclare des fonctions sans spécifier la valeur de retour ...
 
Style :
 
Fonction()
{
return (1);
}
 
Je suppose que ça aussi ça se fait, même si ce n'est pas "propre".

n°693319
pascal_
Posté le 06-04-2004 à 11:05:25  profilanswer
 

gilou a écrit :

De toute facon, c'est chrisbk qui a raison. Cette histoire de NULL ne rime a rien.
A+,


 
Oui bon d'accord...
Je me suis mal exprimé. En fait, je voulais dire que si l'on avait pas NULL, on aurait une structure TOTO qui pointe sur TOTO qui pointe sur TOTO... Et on aurait été dans le même cas. Enfin presque puisque on peut faire pointer un TOTO sur lui-même.
Bref, j'aurais effectivement jamais du en parler...
 

n°693325
pascal_
Posté le 06-04-2004 à 11:07:33  profilanswer
 

Azariel a écrit :

C'est bien ce que je pensais ... merci.
 
Et il déclare des fonctions sans spécifier la valeur de retour ...
 
Style :
 
Fonction()
{
return (1);
}
 
Je suppose que ça aussi ça se fait, même si ce n'est pas "propre".


 
En fait si tu ne spécifiais pas de type de retour, le C déduisait que la valeur de retour était un int.
PS : ça ne marche plus avec les nouvelles normes. Ca induisait trop d'erreur.
 
 
 
 
 
 

n°694701
gilou
Modérateur
Modzilla
Posté le 07-04-2004 à 15:23:07  profilanswer
 

pascal_ a écrit :


 
Oui bon d'accord...
Je me suis mal exprimé. En fait, je voulais dire que si l'on avait pas NULL, on aurait une structure TOTO qui pointe sur TOTO qui pointe sur TOTO... Et on aurait été dans le même cas. Enfin presque puisque on peut faire pointer un TOTO sur lui-même.
Bref, j'aurais effectivement jamais du en parler...
 
 

Pas du tout. On aurait un pointeur pas initialisé, et pointant sur n'importe quoi, et c'est tout.  
A+,

n°694704
gilou
Modérateur
Modzilla
Posté le 07-04-2004 à 15:24:53  profilanswer
 

Azariel a écrit :

C'est bien ce que je pensais ... merci.
 
Et il déclare des fonctions sans spécifier la valeur de retour ...
 
Style :
 
Fonction()
{
return (1);
}
 
Je suppose que ça aussi ça se fait, même si ce n'est pas "propre".

Ca se fait plus. C'est un truc de l'aube du C, quand le type de retour par defaut etait int. A proscrire absolument.
A+,

n°695648
Azariel
Posté le 08-04-2004 à 16:45:11  profilanswer
 

Nouvelle interrogation :
 
int bibparse(int argn, char **argu, char *nom)
{
 static int first=0;
 static int nbarg=0;
 char nomarg[50];
 char type;
 
 if( !first ) nbarg = argn - 1;
 if( first == nbarg ) return(0);  
 first++;
 
//Suite d'instructions ...
}
 
C'est moi qui hallucine ou de toute façon cette fonction sortira au deuxième if ?
Merci

n°695654
Moktar1er
No one replies...
Posté le 08-04-2004 à 16:46:52  profilanswer
 

Azariel a écrit :

Nouvelle interrogation :
 
int bibparse(int argn, char **argu, char *nom)
{
 static int first=0;
 static int nbarg=0;
 char nomarg[50];
 char type;
 
 if( !first ) nbarg = argn - 1;
 if( first == nbarg ) return(0);  
 first++;
 
//Suite d'instructions ...
}
 
C'est moi qui hallucine ou de toute façon cette fonction sortira au deuxième if ?
Merci


 
non
tu rentreras systématiquement dans le premier if, donc tu vas modifier nbarg, donc nbarg != first arrivé au 2ème if

n°695762
Azariel
Posté le 08-04-2004 à 17:31:52  profilanswer
 

Oups j'avais zappé le "!".
Merci

n°698872
Azariel
Posté le 14-04-2004 à 09:46:27  profilanswer
 

char *GE_getenv(char *nom)
{
 char *ZZ;
 /* return( (char *) getenv( nom )); */
 //ZZ contient la variable d'environnement associee a nom
 ZZ = (char *)getenv(nom);  
 
 //Si le premier element de la chaine est different de 0
 if( (char *)ZZ != (char *) 0 )
 {
  if( strchr( ZZ , '`' ) ) //Recherche la premiere occurence de '
  {
   ConvertQuote( ZZ );
  }
  return( (char *)ZZ );
 }
 
 else
 {
  return('\000');
 }
 
 if( ZZ != (char *)0 )
 {
  return( (char *) ZZ );
 }
 else
 {
  char getproftmp[256];
  getproftmp[0] = '\000';
  ZZ = (char *)0;
  if( GetProfileString("CORDIS","ENV","FICHIER",nom,getproftmp,0) )
  {
   ZZ = (char *)malloc( 1 + strlen(getproftmp) );
   strcpy( ZZ , getproftmp );
   MY_putenv( nom , getproftmp ) ;
   return( ZZ );
  }
  else
  {
   return( (char *)0 );
  }
 }
}
 
Autre interrogation ... je ne comprends pas à quoi sert le deuxième if ... vu que le premier termine la fonction. Ou alors j'ai encore loupé quelque chose ? :heink:

n°698909
pascal_
Posté le 14-04-2004 à 10:32:12  profilanswer
 

Si tu as bien recopié la fonction, effectivement, elle ne passe jamais par la ligne if( ZZ != (char *)0 ) et les suivantes (peut-être as-tu même un warning à la compilation?)
 
Par contre :

Code :
  1. //Si le premier element de la chaine est different de 0  
  2. if( (char *)ZZ != (char *) 0 )


 
le commentaire est faux. Ici le test porte sur le pointeur ZZ et pas son contenu. Il teste si le pointeur est NULL ou pas.
 
[:meganne] au fait, il dure combien de temps ton stage ? Parceque commenter du code d'un autre tout le temps  [:w3c compliant].... Tu fais que ça ?

n°698919
Azariel
Posté le 14-04-2004 à 10:45:36  profilanswer
 

5 mois ...  
Non je pense que le commentaire du code va me prendre encore une semaine ... après je suis censée programmer par moi même.
 
Ouaip les commentaires sont pas exacts ... faut que je les reprennes ...
Mais cette fonction se terminera de toute façon après le premier if non ?

n°698920
Moktar1er
No one replies...
Posté le 14-04-2004 à 10:46:38  profilanswer
 

Azariel a écrit :

5 mois ...  
Non je pense que le commentaire du code va me prendre encore une semaine ... après je suis censée programmer par moi même.
 
Ouaip les commentaires sont pas exacts ... faut que je les reprennes ...
Mais cette fonction se terminera de toute façon après le premier if non ?


 
bah à priori oui vu que tu as un return dans le if et un autre dans le else...

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C]Bibliothèque C à commenter

 

Sujets relatifs
Bibliotheque pour traitement d'imagecommenter un source qui affiche une image BMP à l'écran
Commenter griser/dégriser un bouton de Formulaire ?conception des bibliothèque (#include)personnelle en langage C
Quelle bibliothèque FTP pour JAVA utilisez-vous ?PHP&Mysql : problème de retour à la ligne (bibliothèque JS Overblib)
Recherche bibliothèque java de visualisation de statsRecherche bibliothèque: Encoder MPEG-1
gestion de la mémoire cache, une bibliotheque existe ?[VC6] Pb d'install de la bibliothéque Boost
Plus de sujets relatifs à : [C]Bibliothèque C à commenter


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR