Déclarer un type en langage c ?

Résolu/Fermé
Signaler
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
-
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
-
Bonjour,

je voudrais savoir comment déclarer un type , du genre:
Type
Point=enregistrement
X : entier ;
Y : entier ;
FinEnregistrement

et ensuite comment assigner un tableau à un type , du genre :
Courbe : tableau[1..100] de point ;

je voudrais savoir comment traduire cela en langage c.
merci de votre attention .

4 réponses

Messages postés
5677
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 décembre 2021
955
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").

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
4
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 321
En fait la réponse à la suite de la question c'est plutôt :
typedef courbe TPoint*;
ou
typedef Courbe TPoint[100];
Messages postés
5677
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 décembre 2021
955
Hmmfff... il y a des ":" qui trainent dans la définition de la structure ci-dessus :-( il faut les retirer pour que cela compile, bien sûr - pascal a encore frappé).

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 :

    typedef struct 
    { 
        int X; 
        int Y; 
    } TPoint;                       /* définition d'un type TPoint,  
                                       étant un type structure */ 

    typedef TPoint TCourbe[100];    /* définition d'un type TCourbe,  
                                       étant un tableau à longueur fixe  
                                       de 100 TPoints */ 

    TCourbe courbe1,courbe2;        /* déclaration de deux tableaux  
                                       de 100 TPpoints */ 

    courbe1[0].X = 10; 
    courbe1[0].Y = 20; 

    courbe2[0].X = 30; 
    courbe2[0].Y = 40;

Dal
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 321
oups..; j'ai inversé la déclaration en effet. Merci d'avoir corriger.
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 321
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
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
7
[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 ??
Messages postés
5677
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 décembre 2021
955
Pour définir une structure tu utilises "struct", comme l'a dit Char Snipeur.

Pour définir un type, tu utilises "typedef".


Dal
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
7
ma question est , à quel moment mettre typedef avant struct et à quel moment on ne le mets pas, excusez , je mets du temps à comprendre
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
7
OK
[DAL] merci , pour tes infos , je vais m'excercer
Messages postés
5677
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 décembre 2021
955
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 :

    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
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
7
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
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 321
int tnbre1 = tnbre;
ne veux rien dire.
tnbre tnbre1;
est la bonne syntaxe.
Messages postés
205
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
7
merci énormement l'ami , tu m'arrache une épine du pieds , je cerne mieux maintenant , passe une bonne journée , et encore merci