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

[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
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 août 2012 à 12:57
En fait la réponse à la suite de la question c'est plutôt :
typedef courbe TPoint*;
ou
typedef Courbe TPoint[100];
0
[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 à 14:06
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 août 2012 à 14:08
oups..; j'ai inversé la déclaration en effet. Merci d'avoir corriger.
0
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
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
0
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
[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 ??
0
[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
Pour définir une structure tu utilises "struct", comme l'a dit Char Snipeur.

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


Dal
0
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
ma question est , à quel moment mettre typedef avant struct et à quel moment on ne le mets pas, excusez , je mets du temps à comprendre
0
[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
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.
    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
0
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
OK
[DAL] merci , pour tes infos , je vais m'excercer
0
[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
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
0
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
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
0
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
int tnbre1 = tnbre;
ne veux rien dire.
tnbre tnbre1;
est la bonne syntaxe.
0