[C]Bibliothèque C à commenter

Bibliothèque C à commenter [C] - C - Programmation

Marsh Posté le 05-04-2004 à 17:11:20    

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:

Reply

Marsh Posté le 05-04-2004 à 17:11:20   

Reply

Marsh Posté le 05-04-2004 à 17:20:09    

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
Reply

Marsh Posté le 05-04-2004 à 17:24:20    

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

Reply

Marsh Posté le 05-04-2004 à 17:35:18    

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.
 

Reply

Marsh Posté le 05-04-2004 à 17:39:05    

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.
 
 
 
 

Reply

Marsh Posté le 05-04-2004 à 17:41:34    

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)

Reply

Marsh Posté le 05-04-2004 à 17:45:05    

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 !

Reply

Marsh Posté le 05-04-2004 à 17:47:27    

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
 

Reply

Marsh Posté le 05-04-2004 à 17:49:59    

Reply

Marsh Posté le 05-04-2004 à 17:50:11    

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

Reply

Marsh Posté le 05-04-2004 à 17:50:11   

Reply

Marsh Posté le 05-04-2004 à 17:51:31    

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 ;

Reply

Marsh Posté le 05-04-2004 à 17:53:30    

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 !!!!!!!!!!
 

Reply

Marsh Posté le 05-04-2004 à 17:54:10    

Azariel a écrit :


 

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


 

Reply

Marsh Posté le 05-04-2004 à 17:54:50    

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.

Reply

Marsh Posté le 05-04-2004 à 17:54:55    

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

Reply

Marsh Posté le 05-04-2004 à 17:55:33    

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

Reply

Marsh Posté le 05-04-2004 à 17:55:56    

MDR ...  
Alala ces informaticiens ;)

Reply

Marsh Posté le 05-04-2004 à 17:56:05    

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 ?
 

Reply

Marsh Posté le 05-04-2004 à 17:56:44    

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;

Reply

Marsh Posté le 05-04-2004 à 17:57:25    

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

Reply

Marsh Posté le 05-04-2004 à 17:58:48    

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.
 

Reply

Marsh Posté le 06-04-2004 à 10:02:03    

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.

Reply

Marsh Posté le 06-04-2004 à 10:12:25    

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

Reply

Marsh Posté le 06-04-2004 à 10:14:22    

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 ?

Reply

Marsh Posté le 06-04-2004 à 10:26:55    

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

Reply

Marsh Posté le 06-04-2004 à 10:40:49    

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
Reply

Marsh Posté le 06-04-2004 à 10:43:06    

Merci !

Reply

Marsh Posté le 06-04-2004 à 10:59:15    

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
Reply

Marsh Posté le 06-04-2004 à 11:02:06    

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".

Reply

Marsh Posté le 06-04-2004 à 11:05:25    

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...
 

Reply

Marsh Posté le 06-04-2004 à 11:07:33    

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.
 
 
 
 
 
 

Reply

Marsh Posté le 07-04-2004 à 15:23:07    

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+,

Reply

Marsh Posté le 07-04-2004 à 15:24:53    

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+,

Reply

Marsh Posté le 08-04-2004 à 16:45:11    

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

Reply

Marsh Posté le 08-04-2004 à 16:46:52    

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

Reply

Marsh Posté le 08-04-2004 à 17:31:52    

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

Reply

Marsh Posté le 14-04-2004 à 09:46:27    

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:

Reply

Marsh Posté le 14-04-2004 à 10:32:12    

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 ?

Reply

Marsh Posté le 14-04-2004 à 10:45:36    

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 ?

Reply

Marsh Posté le 14-04-2004 à 10:46:38    

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...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed