CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] problème compilation programme

Vielaxxx
Vielaxxx
Niveau 3
13 avril 2021 à 01:42:58

Salut tout le monde. J'ai un problème de compilation de mes .h et mes .c, je m'explique.
J'ai 4 fichiers : machine.h et machine.c, carte.h et carte.c.
On laisse carte.h de côté car si on résout l'exemple que je vais donner on resolvera les autres de la même manière.
Dans machine.h j'écris :"typedef struct machine machine", et dans machine.c j'ecris "struct machine {.........}" et bien sûr avant j'include machine.h,jusque là tout vas très bien.
Cependant dans mon fichier carte.c je veux me servir du type machine, et quand j'include le machine.h dans carte.c, bah le type n'est pas complet, et c'est normal, puisque carte.c ne voit que le contenu du .h, et dedans le type machine bah il est vide. Si j'essaye de mettre le ty0e dans le .h j'ai d'autre problèmes, mais de toutes façons il ne faut pas implémenter de type dans les .h.
Je précise que je compile mon code avec : gcc *.c -o main
Je pense que mon problème est là, comment dire a linux de d'abord compiler machine.h et machine.c avant de faire les autre ? (sachant que j'aurais également besoin de compiler carte avant main)
De plus si j'ai 2 fichiers qui se servent des types de l'un et l'autre, comment faire ?

godrik
godrik
Niveau 30
13 avril 2021 à 01:56:38

Le compilateur ne comoile pas les .h directement, il ne compile que les .c
Les .c inclus les .h
on dirait que le .c devrait inclure les deux .h.

Donne un cas precis et un message d'erreur pour qu'on voit ce qu'il se passe.

Vielaxxx
Vielaxxx
Niveau 3
13 avril 2021 à 10:33:29

Le 13 avril 2021 à 01:56:38 :
Le compilateur ne comoile pas les .h directement, il ne compile que les .c
Les .c inclus les .h
on dirait que le .c devrait inclure les deux .h.

Donne un cas precis et un message d'erreur pour qu'on voit ce qu'il se passe.

Tout les .c include touts les .h.
Dans carte.c il me dit que les attribut de machine n'existe pas alors que dans machine.c aucun problème (normal vue qu'on y implémente le type machine).

Vielaxxx
Vielaxxx
Niveau 3
13 avril 2021 à 10:38:16

Le 13 avril 2021 à 01:56:38 :
Le compilateur ne comoile pas les .h directement, il ne compile que les .c
Les .c inclus les .h
on dirait que le .c devrait inclure les deux .h.

Donne un cas precis et un message d'erreur pour qu'on voit ce qu'il se passe.

Mais justement le problème c'est qu'il compile pas dans le bon ordre.

neytsumi
neytsumi
Niveau 12
13 avril 2021 à 10:47:47

Tu peux copier les messages d'erreur ?

Vielaxxx
Vielaxxx
Niveau 3
13 avril 2021 à 10:54:50

J'avais "expected specifier-qualifier-list before" quand j'appellais une machine, et également il me disait que m.x n'existait pas par exemple.

Vielaxxx
Vielaxxx
Niveau 3
13 avril 2021 à 11:49:30

j'ai : "carte.c:50:13: error: field ‘m’ has incomplete type
50 | machine m;
| ^
carte.c:168:28: error: parameter 1 (‘ma’) has incomplete type
168 | void ajout_machine(machine ma,carte map){"

alors que j'utilise le type machine dans carte.c de la meme maniere que dans machine.c

Vielaxxx
Vielaxxx
Niveau 3
13 avril 2021 à 11:58:43

et si j'utilise un pointeur vers machine j'ai ; "dereferencing pointer to incomplete type"

Guybrush81
Guybrush81
Niveau 10
13 avril 2021 à 12:18:20

mais de toutes façons il ne faut pas implémenter de type dans les .h.

Tu ne peux pas utiliser un type "inconnu", donc il faut le définir dans un .h (si tu veux l'utiliser dans plusieurs .c).

Vielaxxx
Vielaxxx
Niveau 3
13 avril 2021 à 12:31:55

Le 13 avril 2021 à 12:18:20 :

mais de toutes façons il ne faut pas implémenter de type dans les .h.

Tu ne peux pas utiliser un type "inconnu", donc il faut le définir dans un .h (si tu veux l'utiliser dans plusieurs .c).

il est defini dans le .h, mais implementer dans le .c

Vielaxxx
Vielaxxx
Niveau 3
13 avril 2021 à 12:32:31

je viens de creer ce post openclassroom, peut etre que ca vous parraitra plus clair : https://openclassrooms.com/forum/sujet/field-has-incomplete-type-ou-dereferencing-pointer

Message édité le 13 avril 2021 à 12:32:46 par Vielaxxx
Guybrush81
Guybrush81
Niveau 10
13 avril 2021 à 12:38:22

Pardon, je voulais dire définir struct machine dans le .h

En ne faisant que la définition de typedef struct machine machine dans le .h, tu ne peux que manipuler les pointeur du type machine* (donc tu pourrais en modifiant tes fonctions pour qu'elles utilisent des pointeur vers machine, et ajouté une fonction de création et de suppression).

Mais si tu veux faire
machine ma;
et utiliser des fonctions qui prennent en argument machine, tu es obligé d'avoir la définition de struct machine dans le .h

je viens de creer ce post openclassroom, peut etre que ca vous parraitra plus clair : https://openclassrooms.com/forum/sujet/field-has-incomplete-type-ou-dereferencing-pointer

Tu es là aussi obligé d'avoir la définition de struct machine si tu veux accéder à ses membres directement.

Sinon tu peux déclarer en plus des accesseurs (dans machine.h) et défini dans machine.c du genre
machine_getx(machine *m) { return m->x; }
etc

Message édité le 13 avril 2021 à 12:41:45 par Guybrush81
Vielaxxx
Vielaxxx
Niveau 3
13 avril 2021 à 12:56:43

Le 13 avril 2021 à 12:38:22 :
Pardon, je voulais dire définir struct machine dans le .h

En ne faisant que la définition de typedef struct machine machine dans le .h, tu ne peux que manipuler les pointeur du type machine* (donc tu pourrais en modifiant tes fonctions pour qu'elles utilisent des pointeur vers machine, et ajouté une fonction de création et de suppression).

Mais si tu veux faire
machine ma;
et utiliser des fonctions qui prennent en argument machine, tu es obligé d'avoir la définition de struct machine dans le .h

je viens de creer ce post openclassroom, peut etre que ca vous parraitra plus clair : https://openclassrooms.com/forum/sujet/field-has-incomplete-type-ou-dereferencing-pointer

Tu es là aussi obligé d'avoir la définition de struct machine si tu veux accéder à ses membres directement.

Sinon tu peux déclarer en plus des accesseurs (dans machine.h) et défini dans machine.c du genre
machine_getx(machine *m) { return m->x; }
etc

ahhhhhhh bien vuuuuue, c'est pour ca que je dois coder des fonctions getx tout ca je crois. je vais essayer merci :)

Guybrush81
Guybrush81
Niveau 10
13 avril 2021 à 14:19:38

de rien :)

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment