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 :

Erreur de compilation C2057 : difficultés pour la résoudre


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut Erreur de compilation C2057 : difficultés pour la résoudre
    Bonjour à tous,

    je viens de récupérer les sources d'un programme qui devait marcher sous Unix. J'utilise Visual C++ 6.0. En compilant, j'obtiens l'erreur C2057 (expression constante attendue). Voilà le code qui pose problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void p3(int np)
    {
      int	y[np];    // Cette ligne là
    Je me suis donc renseigné sur C2057 Erreur compilation 2057. J'ai essayé l'exemple proposé et ai vérifié qu'il marchait bien.
    Mais quand j'ai voulu l'appliquer à mon problème ca n'a pas bien marché.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void p3(const int np)  // J'ai rajouté const sur cette ligne là
    {
      int	y[np];    // Cette ligne là
    Ca provoque toujours la même erreur.
    Enfin j'ai fait un autre essai (en fait, j'en ai fait d'autres aussi, mais par souci de ne pas allonger trop le message, je ne présente que le suivant):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void p3(int np)  
    {
     
      const int ntemp = 2; // Ceci est juste un essai pour essayer de voir d'où vient le problème
      int	y[ntemp];
    et cela m'a encore généré la même erreur !

    Bref, si vous avez des idées d'où ca peut venir, ca m'aiderait bien,
    Merci beaucoup,
    Guilhem.

  2. #2
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 271
    Points
    130 271
    Billets dans le blog
    1
    Par défaut
    En effet on ne peut pas créer un tableau dont la taille est variable de cette manière. Tes 2 premiers exemples ne peuvent pas compiler, ce n'est pas standard (même si gcc les accepte). Le 3ème est acceptable en C++, mais pas en C, les const int n'étant pas des constantes, mais des variables non modifiables.

    La solution dans ton cas est de créer dynamiquement le tableau en début de fonction et de le supprimer à la fin.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Très claire ton explication.
    Merci beaucoup, je m'en vais tester cela.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par Anomaly
    En effet on ne peut pas créer un tableau dont la taille est variable de cette manière. Tes 2 premiers exemples ne peuvent pas compiler, ce n'est pas standard (même si gcc les accepte). Le 3ème est acceptable en C++, mais pas en C, les const int n'étant pas des constantes, mais des variables non modifiables.

    La solution dans ton cas est de créer dynamiquement le tableau en début de fonction et de le supprimer à la fin.
    Mais si les Variables Length Array font parti du standard : C99...

    Visual n'est pas conforme à ce standard...

  5. #5
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 271
    Points
    130 271
    Billets dans le blog
    1
    Par défaut
    Cela se peut, je ne connais pas les détails du standard C99, je suis toujours au C89 De toute façon jusqu'à encore récemment gcc ne supportait pas totalement ce standard-là non plus.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Il me semble que les VLA sont supportés depuis pas mal de temps...

  7. #7
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 271
    Points
    130 271
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Gandalf
    Il me semble que les VLA sont supportés depuis pas mal de temps...
    En tant que extension GNU ! C'est documenté ainsi dans le manuel de gcc 2.95.3
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Merci pour les précisions. Je me suis fait un petit programme test, avec allocation dynamique du tableau (cf code ci-dessous). Il marche bien. Je vais maintenant essayer de l'intégrer dans mon projet.

    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
     
    #include <stdlib.h> // To use malloc
    #include <stdio.h> // To use printf
     
    int main() 
    {
    	int np;
    	int* y;
    	int i;
    	np = 100;
    	//int *y;
    y = (int *) malloc (np * sizeof(int));	// alloue un bloc de 100 entiers
    // y=NULL;  // Test du cas d'erreur
    if (y == NULL) 
    {        /*    l'allocation a echoue    */ 
        printf ("l'allocation a echoue\n") ;    /*    message d'erreur    */ 
        exit (0) ;                              /*    arret du programme  */ 
    } 
    /*    l'execution de ce qui suit n'a lieu que si (y != NULL)       */ 
    /*    on affecte des valeurs aux elements du tableau                  */ 
     
    for (i=0 ; i<np ; i++)    /*    boucle de 0 a n-1 (np elements)         */ 
    { 
        y[i] = i ; /*    chaque element a la valeur de l'indice */ 
    	printf ("Val : %d \n",i);
    }                    
     
    free (y); 
    printf ("Mémoire libérée \n") ;  
     
    return 1;
    }

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Ok, merci bcp Anomaly . Voilà le code intégré à mon projet et ca marche bien.
    NB : Code ci-dessous.

    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
     
    void p3(int np)
    {
    	int	j, jm;
        int* y;  // This is the pointer on the table
        y = (int *) malloc (np * sizeof(int));   // allocation of a 100 integer block
     
      // y=NULL;  // Error case check 
      if (y == NULL) 
    	{        //    Allocation failure  
        printf ("Allocation failure, program will be terminated \n") ;    // error message  
        exit (0) ;                              // Termination of the program   
    	} 
    /*    Following will be executed only if (y != NULL)       */ 
     
     // int	y[np];  
    /* This declaration cannot work with C compiler (it worked with Unix)
    	All the lines before this line are EQUIVALENT to this single one
       */
     
    (Mon traitement du tableau et autres... etc)
     
     free (y);  // Memory freed
    printf ("Memory freed \n") ;  
    }

  10. #10
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Bonjour
    Je comprends pas cette partie du code:
    Pourquoi n'y a t-il rien qui pointe vers int? Pas de variable derrière le type
    je comprends pas
    Merci à celui qui prendra le temps de m'expliquer

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Salut,

    tu veux parler de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    y = (int *) malloc (np * sizeof(int));
    ?

    En fait malloc te renvoie un pointeur. Et je le caste en int, c'est-à-dire que je le convertis en pointeur sur un int, parce que c'est le type contenu dans mon tableau.
    La conversion, c'est justement la partie de code (int *).
    Si j'avais eu un tableau de float, j'aurais fait (float *) malloc(np * sizeof(float)).

    Je ne sais pas exactement ce que malloc renvoie à la base, peut-être un pointeur sur du void, autrement dit tu peux le faire pointer sur n'importe quoi en faisant la conversion.

    J'espère que je n'ai pas raconté trop de bêtises et que tu as compris

    Guilhem.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/12/2009, 14h26
  2. Réponses: 5
    Dernier message: 22/01/2009, 17h19
  3. Réponses: 2
    Dernier message: 15/01/2008, 12h14
  4. [Free Pascal] Aide pour comprendre une erreur de compilation
    Par SimoBenz dans le forum Free Pascal
    Réponses: 7
    Dernier message: 05/12/2006, 18h43
  5. Réponses: 12
    Dernier message: 12/08/2006, 15h30

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