et non là tu alloues la place pour un pointeur, pas pour la structure...
et non là tu alloues la place pour un pointeur, pas pour la structure...
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
Si, pour la structure (sizeof *pointeur).
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Une petite révision s'impose. Reprends ton manuel sur le langage C.Envoyé par souviron34
Software Failure. Press left mouse button to continue.Guru Meditation #0100000C.000FE800
c'est possible (je ne suis pas au courant des dernières révisions)
Cependant je maintiens ma manière de faire...
D'abord ça marche (non négligeable en programmation), ensuite c'est conforme à C avant C99 (et peut-être même avant C90), enfin c'est plus clair..
Quelqu'un qui apprend le C apprend que * désigne un pointeur, et que calloc ou malloc alloue un certain nombre de bytes, fourni par les arguments (N, taille d'un élément).
Il définit une structure Triangle. Donc pour lui la taille d'un élément est sizeof(Triangle)...
Même si cela revient au même, philosophiquement il me semble plus clair de parler de "TAILLE DU TYPE" que de "TAILLE DE LA VARIABLE"..
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
Mais là, on parle de "TAILLE DU TYPE POINTÉ" (sizeof(*pointeur) ou sizeof *pointeur), pas de "taille de la variable"...
Et l'avantage suprême, c'est que c'est plus maintenable (un seul changement à faire si tu changes le type).
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
ben non je ne crois pas :
sizeof(*MonTriangle) est bien la taille de la variable...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 struct _Triangle *MonTriangle=NULL ; MonTriangle = calloc ( 1, sizeof *MonTriangle); /* ou */ Triangle *MonTriangle=NULL ; MonTriangle = calloc ( 1, sizeof *MonTriangle ) ;
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
???? Là, je ne suis plus du tout ?????Envoyé par souviron34
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Non, c'est la taille du type pointé par MonTriangle.Envoyé par souviron34
Donc, la taille d'une structure _Triangle.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Pour ce qui est du sizeof, il y a deux possibilités de faire :Envoyé par souviron34
sizeof VARIABLE
ou
sizeof (TYPE)
C’est au choix. Moi personnellement je préfère la première façon.
Mais bon, là n’est pas la question.
Je voulais plûtot mettre l’accent sur la façon de définir et de déclarer ta structure.
Quand tu définis une structure de la sorte :
Et que tu fais une déclaration comme cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 typedef struct _Triangle { int S1 ; int S2 ; int S3 ; struct _Triangle *next ; struct _Triangle *previous ; } Triangle;
J’espère que tu es conscient que la structure pointée par MonTriangle n’a rien a voir avec la structure définie plus haut.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 struct Triangle *MonTriangle=NULL ;
Software Failure. Press left mouse button to continue.Guru Meditation #0100000C.000FE800
Non, cela correspond à la taille de la structure pointée par la variable MonTriangle. sizeof *MonTriangle est équivalent à sizeof(struct _Triangle) tandis que sizeof(MonTriangle) est équivalent à sizeof(struct _Triangle *).Envoyé par souviron34
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
C'est sans doute une faute de frappe.Envoyé par crocodilex
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part struct _Triangle *MonTriangle=NULL ;
sont deux manières correctes de définir une variable MonTriangle de type pointeur sur structure _Triangle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Triangle *MonTriangle=NULL ;
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Ce n'est pas une faute de frappe de ma part.Envoyé par mujigka
Si tu regarde ce post :
http://www.developpez.net/forums/sho...0&postcount=19
souviron34 met bien l'accent sur cette façon d'écrire (puisque le underscore est surligné en rouge).
Software Failure. Press left mouse button to continue.Guru Meditation #0100000C.000FE800
Exact Thierry.. Moi c'était la deuxième utilisation...Envoyé par mujigka
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
C'est ce que j'avais déjà indiqué ici :Envoyé par souviron34
http://www.developpez.net/forums/sho...6&postcount=20
Software Failure. Press left mouse button to continue.Guru Meditation #0100000C.000FE800
Si tu veux être rassuré, Crocodilex, voici un exemple de code se servant de la structure ci-dessus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Triangle *Triangles = (Triangle *)NULL ; Triangle *elt = (Triangle *)NULL ; Triangle *next = (Triangle *)NULL ; ...... elt = (Triangle *) calloc (1, sizeof(Triangle) ); if ( elt == (Triangle *)NULL ) { if ( next != (Triangle *)NULL ) free (next); return ERROR ; } elt->next = (Triangle *)NULL ; if ( N_Triangles == 0 ) { Triangles = elt ; elt->previous = (Triangle *)NULL ; } else { elt->previous = next ; elt->previous->next = elt ; } elt->S1 = (i*NAligns) + j ; elt->S2 = (i*NAligns) + (j+1) ; elt->S3 = ((i-1)*NAligns) + (j+1) ; next = elt ; ......
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
Ouf....me voilà rassuré....je te remercieEnvoyé par souviron34
![]()
J'ai bien cru que tu ne savais point définir et déclarer une structure.
Juste une petite remarque sur ce bout de code. A quoi servent tout ces cast ?![]()
Software Failure. Press left mouse button to continue.Guru Meditation #0100000C.000FE800
Envoyé par crocodilex
d'abord une vieille habitude.....
Quand j'ai commencé à faire du C ...euh... il y a 18 ans ... c'était une technique recommandée (car il n'était pas garanti (et je ne reviendrais sur la discussion de l'autre fil avec les très bonnes explications d'Emmanuel) que NULL soit défini de la même manière pour tous les types).
Et je trouve que visuellement, pour quelqu'un qui devra faire de la maintenance sur le code, ça rappelle en permanence de quoi on s'occupe... Bon oui c'est inutile... Mais on se refait pas ...![]()
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
J'ai tendance également à caster NULL pour lui donner un type fort, mais dans ce cas je conseille l'utilisation d'un define :
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define NULL_TRI ((Triangle *)NULL)
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Je pense que ça c'est affaire de goût.. Personnellement je ne suis pas trop chaud pour ça pour 2 raisons :Envoyé par Médinoc
1) le cast existe ... Et comme on ne vas pas refaire des #define CAST_INT etc... ou que dans une opération mathématique on met directement le cast (style " d = a * (double)i "), je préfère garder l'homogénéité et le cast "in line"..
2) j'ai eu affaire il y a une 10 années (et d'ailleurs je vais peut-être me le recolletiner bientôt (maintenance) ) un code assez spaghetti, avec des #define func ( ) dans les .h, et ça m'a pas mal refroidi sur les define.
En gros je ne me sert des define que pour :
1) des constantes "métier" (exemple T_ZERO_KELVIN)
2) définir des zones à compiler différemment suivant les OS
3) éventuellement lors d'un gros DEBUG mettre en commentaires des zones de code.
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
En effet, le cast existe. Mais je préfère les centraliser, car si jamais on décide de changer le type d'un objet, il faut changer tous les casts.
Et ça, ce n'est pas toujours facile, surtout en où les casts ne sont pas introduits par un préfixe immanquable...
D'ailleurs, ce define est juste pour NULL (qui est une constante), pas pour une macro qui agit sur un objet.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager