Bibliothèque C à commenter [C] - C - Programmation
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 *"
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 *" |
il y a pas de typedef
Ici, il a bien défini deux pointeurs de struct TOTO.
Marsh Posté le 05-04-2004 à 17:39:05
Azariel a écrit : |
Oui, tu peux pas faire :
|
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 :
|
Ici, t c'est juste un pointeur vers une struct TOTO. C'est bon parcequ'un momment tu peux y coller un NULL.
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)
Marsh Posté le 05-04-2004 à 17:45:05
chrisbk 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.
et ma précédente intervention est vrai !
Marsh Posté le 05-04-2004 à 17:47:27
pascal_ a écrit : |
C'est idiot.
Si
Code :
|
est interdit, c'est parce que (comme tu l'as dit), ca fait une taille infinie.
Alors que
Code :
|
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 : |
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
Marsh Posté le 05-04-2004 à 17:49:59
ReplyMarsh Posté le 05-04-2004 à 17:50:11
Vous battez pas
En tout cas merci j'ai compris la nuance.
Marsh Posté le 05-04-2004 à 17:51:31
pascal_ a écrit : |
t'es un brin relou
Citation : |
Marsh Posté le 05-04-2004 à 17:53:30
chrisbk a écrit : |
C'est toi qui n'a pas lu le premier post.
Il n'y pas de typedef dans son code !!!!!!!!!!
Marsh Posté le 05-04-2004 à 17:54:10
Azariel a écrit :
|
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.
Marsh Posté le 05-04-2004 à 17:54:55
pascal_ a écrit : |
YEN A PAS NON PLSU DANS LE PUTAIN D'EXEMPLE DE MES COUILLES QUE JE VIENS DE DONNER BORDEL DE MERDAKU
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 ... |
Ah ?
Ben qu'il le dise alors
Marsh Posté le 05-04-2004 à 17:56:05
chrisbk a écrit :
|
Et en gras c'est quoi ?
C'est pas un typedef ça ?
Marsh Posté le 05-04-2004 à 17:56:44
pascal_ a écrit : |
je pensais que tu causais d'un
typedef prout roger;
Marsh Posté le 05-04-2004 à 17:57:25
Oui mais pas dans mon exemple ...
Dsl d'en rajouter une couche
Marsh Posté le 05-04-2004 à 17:58:48
chrisbk a écrit : |
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.
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 ";"
Merci.
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+,
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 ?
Marsh Posté le 06-04-2004 à 10:26:55
Azariel a écrit : Pour le pointeur de fonction et le NULL je suis d'accord. |
non, pas des pointeurs vers 2 objets, mais 2 pointeurs vers une (ou des) instance(s) quelconque(s) de l'objet TOTO
Marsh Posté le 06-04-2004 à 10:40:49
Azariel a écrit : Pour le pointeur de fonction et le NULL je suis d'accord. |
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+,
Marsh Posté le 06-04-2004 à 10:59:15
Azariel a écrit : Il y a une nouvelle construction que je ne comprends pas : |
C'est l'ancienne définition de fonction du C.
En fait tu pouvais avoir ça :
Code :
|
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".
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. |
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...
Marsh Posté le 06-04-2004 à 11:07:33
Azariel a écrit : C'est bien ce que je pensais ... merci. |
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.
Marsh Posté le 07-04-2004 à 15:23:07
pascal_ a écrit : |
Pas du tout. On aurait un pointeur pas initialisé, et pointant sur n'importe quoi, et c'est tout.
A+,
Marsh Posté le 07-04-2004 à 15:24:53
Azariel a écrit : C'est bien ce que je pensais ... merci. |
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+,
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
Marsh Posté le 08-04-2004 à 16:46:52
Azariel a écrit : Nouvelle interrogation : |
non
tu rentreras systématiquement dans le premier if, donc tu vas modifier nbarg, donc nbarg != first arrivé au 2ème if
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 ?
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 :
|
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.
au fait, il dure combien de temps ton stage ? Parceque commenter du code d'un autre tout le temps .... Tu fais que ça ?
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 ?
Marsh Posté le 14-04-2004 à 10:46:38
Azariel a écrit : 5 mois ... |
bah à priori oui vu que tu as un return dans le if et un autre dans le else...
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