IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[Compilation] Problème


Sujet :

C

Vue hybride

GyZmoO [Compilation] Problème 11/04/2006, 15h21
niglo Quelles sont les premières... 11/04/2006, 15h28
fearyourself Tu as des erreurs dans ton... 11/04/2006, 16h03
GyZmoO Et bien merci pour ces... 11/04/2006, 16h09
Emmanuel Delahaye Re: [Compilation] Problème 11/04/2006, 16h15
GyZmoO Et bien en fait, je ne sais... 11/04/2006, 16h29
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut [Compilation] Problème
    Bonjour a tous, je ne suis pas une lumière en C et je rencontre un problème pour un petit projet.
    J'ai 3 fichiers :

    structures.h :
    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
    32
    33
    34
    35
    36
    37
    38
     
    #include <stdio.h>
    #include <errno.h>
    #include <stdlib.h>
     
     
    /* Un graphe ne dispose que d'un seul champ, un pointeur vers le Noeud qui sera le Noeud de "Depart" */
     
    typedef struct Graphe{
     
      Noeud *Depart;
      int Nombre_de_noeuds;
     
    }*Graphe;
     
    /* Un Noeud possede 2 tableaux d'arcs, un tableau pour les arcs entrants et un pour les arcs sortants */
    /* Grace a cela nous pourrons nous deplacer dans le graphe d'avant en arriere ou d'arriere en avant */
     
    typedef struct Noeud{
     
      char *Nom;
      char *Proprietes;
      Arc *Arcs_entrants;
      int Nombre_d_arcs_entrants;
      Arc *Arcs_sortants;
      int Nombre_d_arcs_sortants;
     
    }*Noeud;
     
    /* Un arc a un Noeud source, un Noeud destination et enfin une action elementaire */
     
    struct Arcs{
     
      Noeud *Source;
      Noeud *Destination;
      char *Action;
     
    };
    construction_graphe.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "structures.h"
     
    Graphe Creer_Graphe();
     
    Graphe Creer_Noeud(char *prop, Graphe g);
     
    Graphe Creer_Arc(char* action, Noeud source, Noeud dest, Graphe g);
    et enfin construction_graphe.c :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    #include "construction_graphe.h"
     
     
    /* Fonction : Creer_Graphe                                                               */
    /* Succes : Creation d'un nouveau Graphe                                                 */
    /* Succes : Retourne le Graphe                                                           */
    /* Echec : Retourne NULL                                                                 */
    /* Parametre(s) : Aucun(s)                                                               */ 
     
     
    Graphe Creer_Graphe(){
     
      Graphe g;
     
      g = malloc(sizeof(struct Graphe));
     
      if( g == NULL)
        {
          perror("Erreur allocation memoire du graphe \n");
          return NULL;
        }
     
      g->Nombre_de_noeuds = 0;
     
      return g;
    }
     
     
    /* Fonction : Creer_Noeud                                                                */
    /* Succes : Creation d'un nouveau noeud qui n'est pas encore raccordé au reste du graphe */
    /* Succes : Retourne le Graphe                                                           */
    /* Echec : Retourne NULL                                                                 */
    /* Parametre(s) : Une chaine de caractères représentant les diverses propriétés du Noeud */
    /* Parametre(s) : Le graphe auquel va être ajouté le Noeud                               */ 
     
    Graphe Creer_Noeud(char* prop, Graphe g){
     
      Noeud nouveau_noeud;
     
      nouveau_noeud = malloc(sizeof(struct Noeud));
     
      if(nouveau_noeud == NULL)
        {
          perror("Erreur allocation memoire du nouveau noeud \n");
          return NULL;
        }
     
      g->Nombre_de_noeuds ++;
     
      return g;
    }
     
    Graphe Creer_Arc(char* action, Noeud source, Noeud dest, Graphe g){
     
      Arc nouvel_arc;
     
      nouvel_arc = malloc(sizeof(struct Arc));
     
      if (nouvel_arc == NULL)
        {
          perror("Erreur allocation memoire du nouvel arc \n");
          return NULL;
        }
     
      *(nouvel_arc.Source) = source;
      *(nouvel_arc.Destination) = dest;
     
     
      /* MAJ de l'espace memoire nécessaire pour stocker le nouvel arc dans les noeuds */
     
      source->Arcs_sortants = realloc(source->Arcs_sortants, sizeof(struct Arc) * (source->Nombre_d_arcs_sortants + 1));
     
      if (source->Arcs_sortants == NULL)
        {
          perror("Erreur reallocation memoire du nouvel arc dans le noeud source \n");
          return NULL;
        }
     
      source->Nombre_d_arcs_sortants ++;
     
     
      dest->Arcs_entrants = realloc(dest->Arcs_entrants, sizeof(struct Arc) * (dest->Nombre_d_arcs_entrants + 1));
     
      if (dest->Arcs_entrants == NULL)
        {
          perror("Erreur reallocation memoire du nouvel arc dans le noeud dest \n");
          return NULL;
        }
     
      dest->Nombre_d_arcs_entrants ++;
     
      /* Fin de la MAJ */
     
      /* Raccordement des noeuds grace a l'arc */
     
      (source->Arcs_sortants)[source->Nombre_d_arcs_sortants] = nouvel_arc;
      (dest->Arcs_entrants)[dest->Nombre_d_arcs_entrants] = nouvel_arc;
     
      /* Fin du raccordement */
     
      return g;
    }
    Je suis sous Unix et je compile avec gcc .

    En compilant avec gcc -ansi -pedantic -Wall -Werror , j'obtiens plein plein d'erreurs et je ne vois pas d'ou elles peuvent venir...

    Excusez moi si mon problème est évident mais je connais pas trés bien le C

    Peut être que ca vient de mes include non?

    En espérant que quelqu'un puisse m'aider, merci d'avance (et désolé si le code est un peu long )

  2. #2
    Membre chevronné Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Par défaut
    Quelles sont les premières erreurs que te donne le compilo ???

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Tu as des erreurs dans ton .h, il faut définir les structures dans l'ordre...

    Exemple:

    Lorsque tu as fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct Graphe{
     
      Noeud *Depart;
      int Nombre_de_noeuds;
     
    }*Graphe;
    Comment veux-tu que la structure connaisse la structure Noeud?

    Ensuite, tu n'as pas fait le typedef de la structure Arc et tu t'en sers comme si c'était le cas. Et enfin, il faudrait choisir entre Arc et Arcs...

    Finalement, tu as une définition croisée, tu peux soit déclarer toutes les structures du fichier au début du .h, soit dire que c'est des pointeurs vers des structures (donc n'utilisant pas le nouveau nom donné avec typedef)...

    Et finalement, tes tableaux Arcs_entrants et Arcs_sortants devraient être des pointeurs de pointeurs vu comment tu t'en sers...

    Voici une version corrigée:
    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
     
    #include <stdio.h>
    #include <errno.h>
    #include <stdlib.h>
     
    typedef struct Noeud{
     
      char *Nom;
      char *Proprietes;
      struct Arc **Arcs_entrants;
      int Nombre_d_arcs_entrants;
      struct Arc **Arcs_sortants;
      int Nombre_d_arcs_sortants;
     
    }*Noeud;
     
    typedef struct Arc{
     
      struct Noeud *Source;
      struct Noeud *Destination;
      char *Action;
     
    }Arc; 
     
     
    typedef struct Graphe{
     
      Noeud *Depart;
      int Nombre_de_noeuds;
     
    }*Graphe;
    Ensuite, cela entraîne ces erreurs dans le .c:
    construction_graphe.c:37: warning: unused parameter 'prop'
    construction_graphe.c: In function 'Creer_Arc':
    construction_graphe.c:58: error: incompatible types in assignment
    construction_graphe.c:60: error: invalid operands to binary ==
    construction_graphe.c:97: error: incompatible types in assignment
    construction_graphe.c:98: error: incompatible types in assignment
    construction_graphe.c: At top level:
    construction_graphe.c:54: warning: unused parameter 'action
    L'erreur à la ligne 58:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Arc nouvel_arc;
     
      nouvel_arc = malloc(sizeof(struct Arc));
    Il faudrait peut-être que nouvel_arc soit un pointeur non?

    Si je recompile, j'obtiens ceci:
    construction_graphe.c:37: warning: unused parameter 'prop'
    construction_graphe.c: In function 'Creer_Arc':
    construction_graphe.c:66: error: request for member 'Source' in something not a structure or union
    construction_graphe.c:67: error: request for member 'Destination' in something not a structure or union
    construction_graphe.c: At top level:
    construction_graphe.c:54: warning: unused parameter 'action'
    Et à la ligne 66 et 67:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      *(nouvel_arc.Source) = source;
      *(nouvel_arc.Destination) = dest;
    Et ici, on remarque que la syntaxe qu'il faut utiliser est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      nouvel_arc->Source = source;
      nouvel_arc->Destination = dest;
    Et lorsque je recompile j'obtiens:
    construction_graphe.c:37: warning: unused parameter 'prop'
    construction_graphe.c:54: warning: unused parameter 'action'
    Qui ne sont que des warnings qui signalent le passage de paramètres inutilisés...

    Je n'ai par contre pas regarder ce que faisait le code...

    Bonne chance ,

    Jc

  4. #4
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Et bien merci pour ces réponses claires !
    C'est vrai que maintenant que vous me le faites remarquer y'a vraiment des erreurs bêtes

    En tout cas merci je m'y replonge !


    Il faudrait peut-être que nouvel_arc soit un pointeur non?
    Mon dieu j'ai honte

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [Compilation] Problème
    Citation Envoyé par GyZmoO
    Bonjour a tous, je ne suis pas une lumière en C et je rencontre un problème pour un petit projet.
    J'ai 3 fichiers :
    • Pourquoi avoir séparé les structures des prototypes ? Un header, c'est un tout qui doit comprendre les interfaces des fonctions (et éventuellement des données si on y tient) et tout ce qui est nécessaire pour les définir. (macros, constantes, types, structures)

      http://emmanuel-delahaye.developpez....ganiser_source
      http://emmanuel-delahaye.developpez.....htm#organiser
    • Dans les headers, il manque les protections anti-inclusion multiples.
    • Dans struct Graphe, on utilise Noeud alors qu'il n'a pas encore été défini... Si il faut des définitions anticipées, utiliser des définitions réduites struct <tag>; avant utilisation (ne fonctionne que sur des pointeurs évidemment)
    • Ensuite, il y a des confusions extrêmes entre ce qui est pointeur, ce qui ne l'est pas. Dans un premier temps, je conseille la transparence : Suppimmer les typedefs 'pointeurs' (retirer les '*'). Ce sera beaucoup plus clair, et on saura exactement ce qu'on fait.

  6. #6
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Pourquoi avoir séparé les structures des prototypes ? Un header, c'est un tout qui doit comprendre les interfaces des fonctions (et éventuellement des données si on y tient) et tout ce qui est nécessaire pour les définir. (macros, constantes, types, structures)
    Et bien en fait, je ne sais pas si je vais me faire comprendre, mais j'aurais voulu faire plusieurs modules (ici construction_graphe, plus tard un module pour afficher le graphe etc...) et ce que j'ai mis dans le structures.h servira a tous ces modules :o

    Est-ce mal de faire comme ça?

    J'ai regardé les liens que tu as cité, Et l'exemple du "Hello world" correspond a ce que je veux faire .

    J'espère avoir été assez clair et encore une fois merci pour l'attention que vous pouvez porter a ce sujet (c'est pour un projet pour mes études, mais avec la fac bloquée c'est pas évident d'avoir du secours ^^) .

    Et finalement, tes tableaux Arcs_entrants et Arcs_sortants devraient être des pointeurs de pointeurs vu comment tu t'en sers...
    J'ai beau réfléchir, je comprend pas pourquoi ca devrait être des pointeurs de pointeurs
    Tout ce que je veux c'est pouvoir avoir plusieurs arcs dans ce champ de la structure . (En gros avoir un tableau d'arc mais dont la taille varie...) ...

Discussions similaires

  1. Compilation : problème fichier .bib
    Par clemarch dans le forum Bibliographies - Index - Glossaires
    Réponses: 1
    Dernier message: 16/08/2007, 15h59
  2. [Compiler] Problème d'éxécutable pour un GUI
    Par nuans dans le forum MATLAB
    Réponses: 1
    Dernier message: 28/05/2007, 18h14
  3. [ECLIPSE/C++ Compilation] Problème
    Par june_cisco dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 05/04/2007, 11h13
  4. Compilation problème "is ambiguous"
    Par Shiftane dans le forum Langage
    Réponses: 6
    Dernier message: 20/10/2005, 11h00
  5. [W3C] [avoir html w3c/compilant] probléme
    Par azmodai dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/09/2005, 19h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo