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 :

Problème de compilation


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème de compilation
    Bonjour, je rencontre un problème lors de la compilation de mon programme. En effet, lors de la compilation des fichiers dans le terminal, le message :
    "In file included from main.c:5:0: graphe.txt:1:1: error: expected identifier or ‘(’ before numeric constant 3" revient à chaque fois. Je ne vois pas d'où vient le problème. Merci pour votre aide.

    Code du fichier graphe.txt :

    3
    1 0
    2 0
    1 1
    1 2
    2 1
    0 2


    Code du fichier graphe.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
    #ifndef GRAPHE__H__
    #define GRAPHE__H__
     
    typedef struct 
    {
    int **mat_adjacence;
    int nb_sommet;
     
    }Graphe;
     
     
    void lireFichier(FILE *fichier,char* nom_fichier, Graphe *g);
     
     
     
    #endif
    Code du fichier 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "graphe.h"
     
     
     
     
    void lireFichier(FILE *fichier,char* nom_fichier, Graphe *g)
    {
     
    int a,b;
     
    fichier = fopen(nom_fichier,"r");
     
    if(fichier == NULL)
    {
    printf("Erreur: Impossible d'ouvrir le fichier %s\n",nom_fichier);
    exit(EXIT_FAILURE);
    }
     
    // on récupère le nombre de sommets
     
    fscanf(fichier,"%d\n",&g->nb_sommet);
    printf("nombre de sommet: %d\n",g->nb_sommet);
     
    g->mat_adjacence = (int **)malloc(g->nb_sommet*sizeof(int));
     
    if(g->mat_adjacence == NULL)
    {
    printf("Erreur: Espace Mémoire insuffisant");
    exit(EXIT_FAILURE);
    }
     
     
    while( !feof(fichier))
    {
    a = 0;
    b =0;
     
    fscanf(fichier,"%d %d\n",&a,&b);
     
    g->mat_adjacence[a][b] = 1;
    }
     
     
     
    }
    Code du fichier main.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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "graphe.c"
    #include "graphe.txt"
     
     
     
    int main()
    {
     
    int choix;
     
     
     
    Graphe *g;
    g = (Graphe*)malloc(sizeof(Graphe));
    if(g == NULL)
    {
    printf("Erreur: Espace mémoire insuffisant\n");
    exit(EXIT_FAILURE);
    }
     
    FILE* fichier = fopen("graphe.txt","r");
    if(fichier == NULL)
    {
    printf("Erreur: Impossible d'ouvrir le fichier %s\n",graphe.txt);
    exit(EXIT_FAILURE);
    }
     
     
    printf("\t\tMenu\n\n");
    printf("1- Lecture du fichier\n\n");
    printf("2- Afficher la matrice d'adjacence\n\n");
    printf("3- Afficher le nombre de chemins de longueur 2\n\n");
    printf("4- Transformer la matrice d'adjacence du graphe G en une liste de successeurs\n\n");
    printf("5- Pour chaque sommet du graphe G, afficher ses successeurs en utilisant la structure de liste des successeurs.\n\n");
    printf("6- Construire  un graphe à partir des éléments saisis au clavier tout en le stockant dans un fichier.\n\n");
    printf("7- Parcours en profondeur du graphe G\n\n");
    printf("0- Quitter\n\n\n");
     
    printf("Opération choisie: ");
    choix = getchar();
    getchar();
     
    switch(choix)
    {
    case '1' :
    lireFichier(fichier ,"graphe.txt",g);
    break;
     
     
     
    case '0' :
    exit(EXIT_FAILURE);
    break;
     
    default:
    printf("Choix erroné\n");
    }
     
     
     
    fclose(fichier);
     
    return 0;
    }
    Code du fichier Makefile:
    Code Makefile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CC=gcc
    CFLAGS=-I.
    DEPS = graphe.h
    OBJ = graphe.o main.o 
     
    %.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)
     
    graphe: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS)
     
    .PHONY: clean
     
    clean:
    rm -f *.o graphe

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Quelques remarques d'ordres générales :

    Puisque tu déclares g dans le main (); tu peux te passer d'une allocation dans le tas. Un simple Graphe g; suffit.Ensuite tu passes simplement son adresse aux différentes fonctions de traitement.

    Dans la fonction void lireFichier(FILE *fichier,char* nom_fichier, Graphe *g); tu sors du programme si un problème de lecture survient. Ce n'est pas la bonne démarche. Fais en sorte que la fonction renvoie un booléen. TRUE si la lecture a réussi FALSE dans les autres cas.
    Toujours dans cette fonction tu ne fermes jamais le fichier.
    Le prototype de cette fonction attend un descripteur de fichier en premier argument. Dans la fonction tu écrases ce descripteur. Finalement cet argument ne sert à rien. Autant le déclarer dans la fonction même.
    Pour finir avec cette fonction, le nom du fichier transmis ne change pas dans la fonction. Penses à le déclarer "const". Ca donne un peu plus de robustesse à ton code.

    Dans le main (); tu ouvres une première fois le fichier, pourquoi faire ?

  3. #3
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    Tu ne peux pas inclure graphe.txt dans le main: ce n'est pas du code C
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par yellow_scarf Voir le message
    g->mat_adjacence = (int **)malloc(g->nb_sommet*sizeof(int));
    Un int ** ne peut pas contenir des int.

    Citation Envoyé par yellow_scarf Voir le message
    while( !feof(fichier))
    feof() ne sert pas à ça. Ou alors on ne s'en sert pas de cette façon. Et puis c'est quand tu veux que tu refermes ton fichier (et apparemment tu veux pas).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et puis c'est quand tu veux que tu refermes ton fichier (et apparemment tu veux pas).
    j'ai eu du mal à trouver le fclose
    mais son code est bizarre : il ouvre 2 fois le même fichier mais il ne le ferme qu'une seule fois

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Mathématicien
    Inscrit en
    Juillet 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Mathématicien

    Informations forums :
    Inscription : Juillet 2020
    Messages : 3
    Points : 7
    Points
    7
    Par défaut Solution
    Le souci provient du fait que dans le fichier main.c tu n'inclues pas "graph.h" mais "graph.txt" qui semble être un fichier texte présent dans ton projet. Il te suffit simplement de transformer (dans ton fichier main.c) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "graphe.c"
    #include "graphe.txt"
    en :
    Je t'invites à relire un petit cours sur les fichiers d'en têtes en C pour te rafraichir la mémoire !
    N'hésite pas à me contacter si tu rencontres un souci !

    PS : Tu ne peux pas utiliser la directive #include pour importer des données depuis un fichier .txt car celle-ci permet uniquement d'importer du code C

Discussions similaires

  1. problème de compilation sous visual C++
    Par fabmili dans le forum MFC
    Réponses: 4
    Dernier message: 08/02/2004, 19h52
  2. problème de compil devc++ socket
    Par stefdem dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 11/12/2003, 11h33
  3. Réponses: 1
    Dernier message: 29/10/2003, 12h16
  4. Problème de compilation de la DLL du XMLRad
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 2
    Dernier message: 16/04/2003, 16h46
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

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