Déclarer un type en langage c ?
Résolu/Fermé
yaorens
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
-
27 août 2012 à 15:27
yaorens Messages postés 205 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 30 mai 2013 - 30 août 2012 à 11:56
yaorens Messages postés 205 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 30 mai 2013 - 30 août 2012 à 11:56
A voir également:
- Definir un type en c
- Définir google comme page d'accueil - Guide
- Clear type - Guide
- Faiblesse type psy ✓ - Forum Jeux vidéo
- Option-clic pour définir un point source à utiliser pour réparer l'image. - Forum MacOS
- Type de souris - Guide
4 réponses
[Dal]
Messages postés
6174
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 février 2024
1 083
Modifié par [Dal] le 27/08/2012 à 17:10
Modifié par [Dal] le 27/08/2012 à 17:10
A mon sens, ce que les programmeurs Pascal ont beaucoup de mal à saisir, c'est qu'en déclarant "struct point" on ne crée pas un type (contrairement au Pascal, où un "record" est nécessairement une définition de type).
En C, "struct point" crée juste une structure (dont l'étiquette est "point"), et la structure doit toujours être désignée avec le terme "struct", et non uniquement avec son étiquette, lors de la déclaration de variables ou de l'initialisation de la structure.
Ainsi, pour créer un tableau de "struct", on doit utiliser de nouveau le mot clef "struct" : "struct point ligne[100];", alors qu'on n'est plus en train de définir la structure "point", mais de l'utiliser pour définir le tableau.
En fait, comme yaorens veut "déclarer un type", ce qu'il veut probablement c'est utiliser "typedef struct", et créer un type (disons "TPoint").
Il y a des explications claires sur ce sujet (et d'autres) :
ici : http://clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node78.html
et là : http://clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node115.html
Dal
En C, "struct point" crée juste une structure (dont l'étiquette est "point"), et la structure doit toujours être désignée avec le terme "struct", et non uniquement avec son étiquette, lors de la déclaration de variables ou de l'initialisation de la structure.
Ainsi, pour créer un tableau de "struct", on doit utiliser de nouveau le mot clef "struct" : "struct point ligne[100];", alors qu'on n'est plus en train de définir la structure "point", mais de l'utiliser pour définir le tableau.
En fait, comme yaorens veut "déclarer un type", ce qu'il veut probablement c'est utiliser "typedef struct", et créer un type (disons "TPoint").
typedef struct { int : X; int : Y; } TPoint; TPoint courbe[100];
Il y a des explications claires sur ce sujet (et d'autres) :
ici : http://clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node78.html
et là : http://clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node115.html
Dal
Char Snipeur
Messages postés
9696
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 297
Modifié par Char Snipeur le 27/08/2012 à 16:29
Modifié par Char Snipeur le 27/08/2012 à 16:29
salut.
ça ressemble à du pascal ce que tu as écris.
En C, l'équivalent de l'enregistrement c'est la structure, introduite par le mot "struct". Pour plus de détail, prend un cours de C, c'est expliquer en long et en large.
Ensuite, c'est comme pour tout les tableaux en C, il suffit de mettre le nom de la structure.
La vrai soumission c'est quand les esclaves s'inquiètent du cours du coton.
Char Snipeur
ça ressemble à du pascal ce que tu as écris.
En C, l'équivalent de l'enregistrement c'est la structure, introduite par le mot "struct". Pour plus de détail, prend un cours de C, c'est expliquer en long et en large.
Ensuite, c'est comme pour tout les tableaux en C, il suffit de mettre le nom de la structure.
La vrai soumission c'est quand les esclaves s'inquiètent du cours du coton.
Char Snipeur
yaorens
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
7
27 août 2012 à 18:34
27 août 2012 à 18:34
[DAl] , merci pour tes infos ,
alors , si je comprends bien pour définir une strucutre , je fais typedef struct
un peu comme un enregistrement , mais sauf que là , je précède "struct" de typedef , c'est bien cela ??
alors , si je comprends bien pour définir une strucutre , je fais typedef struct
un peu comme un enregistrement , mais sauf que là , je précède "struct" de typedef , c'est bien cela ??
[Dal]
Messages postés
6174
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 février 2024
1 083
Modifié par [Dal] le 28/08/2012 à 13:25
Modifié par [Dal] le 28/08/2012 à 13:25
Pour définir une structure tu utilises "struct", comme l'a dit Char Snipeur.
Pour définir un type, tu utilises "typedef".
Dal
Pour définir un type, tu utilises "typedef".
Dal
yaorens
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
7
27 août 2012 à 19:03
27 août 2012 à 19:03
ma question est , à quel moment mettre typedef avant struct et à quel moment on ne le mets pas, excusez , je mets du temps à comprendre
[Dal]
Messages postés
6174
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 février 2024
1 083
28 août 2012 à 14:04
28 août 2012 à 14:04
Tu n'es pas obligé de définir un type pour utiliser une structure.
Mais ta question était intitulée "Déclarer un type en langage C" et particulièrement un type de structure, et c'est pourquoi j'ai suggéré l'utilisation de typedef.
Tu pourras définir un type pour rendre ton code plus lisible, pour donner un nom plus directement évocateur, dès lors que tu vas utiliser beaucoup de fois la structure, mettre de la sémantique dans ton code, etc. C'est une affaire de style de programmation aussi.
Voilà un exemple où on utilise une structure sans définir de type, pour créer un tableau "ligne" de pointeurs sur des structures, pouvant avoir une taille allouée dynamiquement.
On répète "struct point" autant de fois que l'on doit se référer à la structure créée.
En définissant un type de structure, on peut faire la même chose comme cela :
C'est à toi de décider ce qui est le plus clair.
Note que la syntaxe de struct est très versatile. Tu peux, ou non, affecter une étiquette, déclarer une variable dans la foulée, la précéder de typedef pour déclarer un type dans la foulée , ou utiliser typedef sur une ligne séparée pour définir un type en te référant à l'étiquette identifiant la structure,...
il n'est pas utile, par exemple, de déclarer un type, si tu ne vas utiliser la structure que pour déclarer une ou deux variables a et b.
Tu vois que tu n'as même pas besoin de nommer ta structure avec une étiquette.
Vois ton manuel préféré, et fais plusieurs exemples pour bien assimiler.
Dal
Mais ta question était intitulée "Déclarer un type en langage C" et particulièrement un type de structure, et c'est pourquoi j'ai suggéré l'utilisation de typedef.
Tu pourras définir un type pour rendre ton code plus lisible, pour donner un nom plus directement évocateur, dès lors que tu vas utiliser beaucoup de fois la structure, mettre de la sémantique dans ton code, etc. C'est une affaire de style de programmation aussi.
Voilà un exemple où on utilise une structure sans définir de type, pour créer un tableau "ligne" de pointeurs sur des structures, pouvant avoir une taille allouée dynamiquement.
struct point { int X; int Y; }; struct point *ligne[] = { NULL }; ligne[0] = malloc(sizeof(struct point) * nb_points_souhaites); if (ligne[0] != NULL) { (...)
On répète "struct point" autant de fois que l'on doit se référer à la structure créée.
En définissant un type de structure, on peut faire la même chose comme cela :
typedef struct { int X; int Y; } POINT; POINT *ligne[] = { NULL }; ligne[0] = malloc(sizeof(POINT) * nb_points_souhaites); if (ligne[0] != NULL) { (...)
C'est à toi de décider ce qui est le plus clair.
Note que la syntaxe de struct est très versatile. Tu peux, ou non, affecter une étiquette, déclarer une variable dans la foulée, la précéder de typedef pour déclarer un type dans la foulée , ou utiliser typedef sur une ligne séparée pour définir un type en te référant à l'étiquette identifiant la structure,...
il n'est pas utile, par exemple, de déclarer un type, si tu ne vas utiliser la structure que pour déclarer une ou deux variables a et b.
struct { int X; int Y; } a,b;
Tu vois que tu n'as même pas besoin de nommer ta structure avec une étiquette.
Vois ton manuel préféré, et fais plusieurs exemples pour bien assimiler.
Dal
yaorens
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
7
28 août 2012 à 15:39
28 août 2012 à 15:39
OK
[DAL] merci , pour tes infos , je vais m'excercer
[DAL] merci , pour tes infos , je vais m'excercer
[Dal]
Messages postés
6174
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 février 2024
1 083
Modifié par [Dal] le 29/08/2012 à 12:31
Modifié par [Dal] le 29/08/2012 à 12:31
le code ci-dessus est pour illustrer l'usage de typedef et de struct et n'est pas fonctionnel pour faire vraiment un tableau dynamique de ce type. Ce n'était pas ta question, mais juste au cas où quelqu'un tombe sur ce code, il faudrait probablement plutôt créer un tableau de pointeurs sur des pointeurs de POINT, puis allouer non seulement l'espace pour ce tableau, mais aussi l'espace pour chaque élément du tableau dont on mettra le pointeur dans ledit tableau.
Quelque chose comme cela serait mieux, je crois :
Il ne faudra pas oublier de libérer la mémoire allouée pour chaque POINT en faisant free(ligne[n]), puis la mémoire allouée au tableau de pointeurs lui même avec free(ligne).
Ouf !
(qui a dit que le C était facile ?)
Dal
Quelque chose comme cela serait mieux, je crois :
typedef struct { int X; int Y; } POINT; POINT **ligne; ligne = (POINT**)calloc(nb_points_souhaites, sizeof(POINT*)); if (ligne != NULL) { for (n=0; n<nb_points_souhaites; ++n) { ligne[n] = (POINT*)malloc(sizeof(POINT)); if (ligne[n] != NULL) { /* mettre une valeur à ligne[n]->X */ /* mettre une valeur à ligne[n]->Y */ (...)
Il ne faudra pas oublier de libérer la mémoire allouée pour chaque POINT en faisant free(ligne[n]), puis la mémoire allouée au tableau de pointeurs lui même avec free(ligne).
Ouf !
(qui a dit que le C était facile ?)
Dal
yaorens
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
7
30 août 2012 à 11:36
30 août 2012 à 11:36
excusez , j'ai encore quelque chose à vous demander ,
j'ai bien compris la création des types avec les enregistrements , mais si je veux par exemple déclarer un type : entier tableau[3] et que je veux que tableau2 ait la même dimension que mon deuxième tableau , comment faire ?? j'ai essayé ce code que voici , mais il ne passe pas .
bien sur je pourrai déclarer mon deuxième tableau avec une taille précise , mais je voulais apprendre à mieux maitriser les types ,
aidez moi juste pour ça , et je pourrai faire d'autres exercices tout seul.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
typedef int tnbre[3];
int tnbre1 = tnbre;
for(i=0; i<3; i++)
{
printf("veuillez entrer le nombre ");
scanf("%d",&tnbre1[i]);
}
printf("\n\n");
for(i=0; i<3; i++)
{
printf("%d"tnbre1[i]);
}
return 0;
}
merci pour votre attention
j'ai bien compris la création des types avec les enregistrements , mais si je veux par exemple déclarer un type : entier tableau[3] et que je veux que tableau2 ait la même dimension que mon deuxième tableau , comment faire ?? j'ai essayé ce code que voici , mais il ne passe pas .
bien sur je pourrai déclarer mon deuxième tableau avec une taille précise , mais je voulais apprendre à mieux maitriser les types ,
aidez moi juste pour ça , et je pourrai faire d'autres exercices tout seul.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
typedef int tnbre[3];
int tnbre1 = tnbre;
for(i=0; i<3; i++)
{
printf("veuillez entrer le nombre ");
scanf("%d",&tnbre1[i]);
}
printf("\n\n");
for(i=0; i<3; i++)
{
printf("%d"tnbre1[i]);
}
return 0;
}
merci pour votre attention
Char Snipeur
Messages postés
9696
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 297
30 août 2012 à 11:46
30 août 2012 à 11:46
int tnbre1 = tnbre;
ne veux rien dire.
tnbre tnbre1;
est la bonne syntaxe.
ne veux rien dire.
tnbre tnbre1;
est la bonne syntaxe.
29 août 2012 à 12:57
typedef courbe TPoint*;
ou
typedef Courbe TPoint[100];
Modifié par [Dal] le 29/08/2012 à 14:06
Sinon.. je vois pas où tu veux en venir, Char Snipeur. Dans ton exemple, "courbe" ou "Courbe" doivent être des types existants (de base ou créés par l'utilisateur), et tu nommes un nouveau type "TPoint", qui serait un tableau de 100 Courbes ? (et pour le premier, est-tu sûr du placement de l'astérisque ?). Ou alors, je suis complètement à côté de la plaque (ce qui est possible aussi :-D).
Bien sûr, on peut créer un type à partir d'un autre type créé par l'utilisateur.
Pour créer un type TCourbe à partir d'un type TPoint, on pourrait, il me semble, faire :
Dal
29 août 2012 à 14:08