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 :

Erreurs compilation avec Visual Studio


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 16
    Points
    16
    Par défaut Erreurs compilation avec Visual Studio
    Bonjour.

    Tout d'abord je tiens à m'excuser si je ne poste pas au bon endroit. J'ai été voir dans la section IDE et autre mais comme je connais pas trop Visual Studio et que ça parlait de MFC de C#,... je savais pas où poster.

    Mon problème est le suivant :
    J'ai codé sous Code Blocks. Quand je compile tout marche sans aucune erreur sur Code Blocks alors que quand je met mon code dans Visual Studio j'ai des erreurs partout. Voici un court extrait d'erreurs et le code associé :

    main.c(83) error C2065: 'fichier' : undeclared identifier
    main.(84) error C2065: 'fichier' : undeclared identifier
    main.c(84) warning C4047: '==' : 'int' differs in levels of indirection from 'void *'
    main.c(91) error C2065: 'fichier' : undeclared identifier
    main.c(91) warning C4047: 'function' : 'FILE *' differs in levels of indirection from 'int'

    Code :
    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
    case 2:     // Création du graphe à partir d'un fichier
                {
                    char nomFichier [50];
                    printf("Nom du fichier contenant le graphe ?\t");
                    scanf("%s", nomFichier); avoidBuffer();
                    FILE* fichier = fopen(nomFichier, "r");
                        if (fichier == NULL)
                            {
                                printf("Code de l'erreur : %d\n", errno);
                                perror(nomFichier);
                            }
                        else
                            {
                                graphe = lireGraphe (fichier, nbSom+1);
                                fclose(fichier);
                            }
                } break;
    la ligne 83 c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FILE* fichier = fopen(nomFichier, "r");
    .

    J'ai fait une recherche sur internet pour savoir d'où venait le problème mais j'ai rien trouvé qui pouvait m'aider. J'ai vu qu'on pouvait changer les propriétés de complication en faisant : Propriété Projet -> Configuration Properties -> C/C++ -> Advanced -> Compile As : Compile as C Code (/TC)
    mais mon problème persiste. Pour info mes noms de fichiers sont en .c et pas .cpp mais je pense que ça n'a aucune influence.

    Merci à vous.
    Bonne journée.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Il est possible que VS ne permette pas de déclarer des variables n'importe où (compilateur non C99). Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case 2:     // Création du graphe à partir d'un fichier
                {
                    char nomFichier [50];
                    FILE* fichier;                printf("Nom du fichier contenant le graphe ?\t");
                    scanf("%s", nomFichier); avoidBuffer();
                    fichier = fopen(nomFichier, "r");....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 16
    Points
    16
    Par défaut
    Merci de votre aide mais le problème c'est que je dois avoir 300 erreurs...
    Toutes mes variables ne sont pas reconnues. Même des déclarations d'int...

    Pourtant dans CodeBlocks quand je fais for(int i = 0 ; ...) il me dit que j'ai pas le
    droit (en effet c'est possible en C99 mais pas en C89) donc je pense que quand je code sous Code Blocks je suis bien en C89. y'a t'il un moyen de lui faire comprendre mon code sans tout changer ?

    Votre réponse permet effectivement de compiler cette partie du code mais du coup je dois changer pleins pleins de lignes du même style.

    PS : Si je veux passer sous Visual Studio c'est parce que j'ai installé la librairie Allegro pour Visual Studio car j'arrivais pas pour Code Blocks.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 16
    Points
    16
    Par défaut
    Bon du coup j'ai fait le tour des tutoriels en anglais sur internet pour configurer Code Blocks avec Allegro 5 et apparemment ça fonctionne donc je vais continuer à utilise Code Blocks...

    Si toutefois quelqu'un sait comment remédier à mon problème avec Visual Studio je suis preneur. Bonne journée.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il y a deux choses : compiler en mode C89 strict et compiler en mode C89 souple.

    Je m'explique : CodeBlocks utilise MinGW (logiquement) qui est une version Windows du compilateur gcc. gcc a depuis très longtemps mis en place de nombreuses extensions de la norme et donc te permet de compiler certaines choses que tu ne devrais pas pouvoir compiler. C'est ce que j'appelle le mode souple.

    Il est possible d'activer un mode plus strict en rajoutant l'option -pendantic dans ton projet (ou dans les options du compilateur si tu travailles sans projet, c'est peu probable).

    De plus, tu peux être certain de demander à compiler en C89 et non en C99 en rajoutant l'option -ansi (normalement implicite) et t'assurer que -std=c99 n'est pas présente.

    Pour compiler avec Visual Studio (qui ne possède peut-être / sûrement pas les mêmes souplesses que MinGW), essaye de compiler en mode C99. Je lis sur le net que le compilateur Microsoft ne le permet pas mais que le compilateur Intel peut-être intégré dans Visual et permet de compiler en C99.

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Citation Envoyé par Twice22 Voir le message
    Merci de votre aide mais le problème c'est que je dois avoir 300 erreurs...
    Toutes mes variables ne sont pas reconnues.
    En gros, si je comprends bien, tu code en declarant des variables n'importe ou au milieu du code, et tu te plains que le compilateur fasse son boulot en te disant que tu ne respectes la norme...

    Tu me fais un peu penser aux gens qui ont des warnings et cherchent a les masquer plutot que de se dire que c'est leur code qui pose probleme...

    Sinon, pour repondre a ta question, tu peux toujours chercher comment compiler en C99, mais Visual Studio inclus Visual C++, qui comme son nom l'indique n'est pas oriente C mais C++. Et si tu avais pousse tes recherches un peu plus loin (genre avec des mots-clefs comme "visual C99" ou equivalent), tu serais vite tombe sur des discussions expliquant que non, Visual ne supporte pas le C99, mais uniquement le C89 (plus quelques trucs de ci de la).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    @gangsoleil : le problème ne vient-il pas aussi de gcc qui compile le code suivant sans erreur ni warning avec les options -Wall -Wextra -O2?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(void)
    {
       puts("Code first");
       int declare_next = 9;
       return declare_next;
    }
    Il faut rajouter -pedantic pour avoir un warning (même pas une erreur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Compilation finished with warnings:
    source.c: In function 'main':
    source.c:7:4: warning: ISO C90 forbids mixed declarations and code [-pedantic]
    Testé sur LiveWorkspace avec gcc 4.7.2.

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par Bktero Voir le message
    @gangsoleil : le problème ne vient-il pas aussi de gcc qui compile le code suivant sans erreur ni warning avec les options -Wall -Wextra -O2?
    J'ai deja remarque que GCC prend des libertes avec la norme, et egalement qu'il compile par defaut en C99 depuis quelques temps (je ne sais pas si c'est en C99 strict ou bien si c'est un melange de C89 et de C99).

    Ce qui me chagrine plus, c'est que j'ai repris ton exemple, et que la ligne de compilation suivante ne produit pas de warning :

    gcc 4.1.2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $> gcc -Wall -O2 -Wextra -std=c89 -ansi test_c99.c
    $>
    On remarquera d'ailleurs la meme "faiblesse" sur clang 3.1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $> clang -ansi -Wall -Wextra -O2 -std=c89 test_c99.c
    $>
    Edit :
    L'ajout de l'option pedantic provoque effectivement l'apparition du warning.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je suis d'accord que gcc est un peu laxiste là-dessus... J'ai fouillé un peu les options de gcc, voilà ce que j'ai trouvé

    -ansi, -std=c89 et -std=c90 sont équivalentes d'après cette page.

    Si aucune version n'est précisée, cette page stipule que gcc utilise -std=gnu90 et non -ansi comme je l'ai dit.

    Ce qui est dommage, c'est que ça ne semble très bien marché puisqu'avec -ansi ou équivalente, mon code ne devrait pas compiler. En effet, d'après cette même deuxième page :
    Use of the -std options listed above will disable these extensions where they conflict with the C standard version selected
    D'après ce que j'ai compris, je dirai que les deux commandes suivantes devraient donc générer le même warning, or seule la 2e le génère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -Wall -Wextra -ansi
    gcc -Wall -Wextra -pedantic
    Dans le 1er cas, c'est à cause de la citation précédente.
    Dans le 2e cas, cette page précise que le pedantic s'applique à la norme ISO associée à la norme GNU :
    Where the standard specified with -std represents a GNU extended dialect of C, such as `gnu90' or `gnu99', there is a corresponding base standard, the version of ISO C on which the GNU extended dialect is based.
    Comme il y a implicitement un -std=gnu90, on arrive donc en C90 == ansi C.

    Enfin, j'ai vu qu'il existe l'option -pedantic-errors pour générer des erreurs et non de simples warnings quand une extension du langage est utilisée.

Discussions similaires

  1. problème de compilation avec Visual Studio 6.0 (Win.XP)
    Par KINGINFO dans le forum SL & STL
    Réponses: 1
    Dernier message: 29/11/2008, 01h01
  2. Compilation avec Visual studio 2008
    Par belha00 dans le forum Qt
    Réponses: 7
    Dernier message: 28/08/2008, 15h10
  3. Réponses: 6
    Dernier message: 08/12/2006, 14h59
  4. Compilation avec Visual Studio 2005
    Par LordBob dans le forum MFC
    Réponses: 3
    Dernier message: 14/04/2006, 20h14

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