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 :

Error: illegal use of this type as an expression


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Points : 77
    Points
    77
    Par défaut Error: illegal use of this type as an expression
    Bonjour. Je rencontre cette erreur à la compilation:
    Error : illegal use of this type as an expression.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void show_list(List* l){
    	if(l == NULL)
    		exit(EXIT_FAILURE);
    	Element* iterator = l->first; <---------ligne de l erreur
     
    	while(iterator != NULL)
    	{
    		printf("%i\t",iterator->data);
    		iterator = iterator->next;
    	}
    	printf("NULL\n");
    }
    En cherchant sur internet, j'ai trouvé qu'en faisant la déclaration de mon Element* au début de la fonction ça marche. Cad:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void show_list(List* l){
    	Element* iterator = l->first;
            if(l == NULL)
    		exit(EXIT_FAILURE);
     
    	while(iterator != NULL)
    	{
    		printf("%i\t",iterator->data);
    		iterator = iterator->next;
    	}
    	printf("NULL\n");
    }
    Je suis en train de me remettre au C et j'ai pas souvenir qu'il fallait faire les déclarations des variables au début(j'ai fait du java, smalltalk, C# entre temps et là c'est pas le cas). Du coup ça m'étonne.

    Pourriez-vous m'éclaircir là-dessus?
    Merci !

  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
    C'est parce que tu utilises un compilateur ANSI C ou C89.
    Dans ce cas la déclaration des variables doit se faire en début de bloc.
    Ce n'est plus le cas en C99
    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 régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par diogene Voir le message
    C'est parce que tu utilises un compilateur ANSI C ou C89.
    Dans ce cas la déclaration des variables doit se faire en début de bloc.
    Ce n'est plus le cas en C99
    D'accord. Alors je développe avec M. Visual C++ 2010. Je peux régler moi même le compilateur que je veux utiliser ou c'est indépendant de mon IDE?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par ncheboi Voir le message
    D'accord. Alors je développe avec M. Visual C++ 2010. Je peux régler moi même le compilateur que je veux utiliser ou c'est indépendant de mon IDE?
    A priori, oui, mais je te suggère plutôt de te discipliner à déclarer tes variables en début de bloc. Ce n'est pas plus difficile et tu écriras ainsi du code beaucoup plus portable (au moins, à travers les différents compilos).

    À noter que la nécessité de déclarer ces variables en début de bloc n'est pas une lubie des concepteurs du langage C. C'était nécessaire lorsque le programme était compilé en une passe, car il s'agissait de calculer la taille de l'espace réservé dans la pile, les instructions se référant aux variables locales à l'aide d'un offset fixe par rapport à un pointeur de base. Si une nouvelle variable était déclarée en milieu de bloc apparaissait, elle ne pouvait pas être traitée car du code pour une taille de pile donnée avait déjà commencé à être généré.

    Donc, pour mélanger code et déclarations de variables, il faut que le compilo fasse plusieurs passes. Ce n'est plus un problème aujourd'hui, certes, mais il reste beaucoup plus lisible d'avoir ces déclarations regroupées au même endroit, et de s'attendre à quoi s'en tenir.

    En plus, ça te causera moins de souci si tu passes après à des langages comme le C++. Dans ce dernier, les variables, qu'elles soient de type natif ou objet (instances de classes) peuvent officiellement être déclarées n'importe où, mais tu ne sauras pas forcément à quel moment elles seront initialisées. Et comme l'initialisation implique éventuellement l'appel d'un constructeur, ça peut provoquer des bugs assez pénibles à localiser.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    A priori, oui, mais je te suggère plutôt de te discipliner à déclarer tes variables en début de bloc. Ce n'est pas plus difficile et tu écriras ainsi du code beaucoup plus portable (au moins, à travers les différents compilos).

    À noter que la nécessité de déclarer ces variables en début de bloc n'est pas une lubie des concepteurs du langage C. C'était nécessaire lorsque le programme était compilé en une passe, car il s'agissait de calculer la taille de l'espace réservé dans la pile, les instructions se référant aux variables locales à l'aide d'un offset fixe par rapport à un pointeur de base. Si une nouvelle variable était déclarée en milieu de bloc apparaissait, elle ne pouvait pas être traitée car du code pour une taille de pile donnée avait déjà commencé à être généré.

    Donc, pour mélanger code et déclarations de variables, il faut que le compilo fasse plusieurs passes. Ce n'est plus un problème aujourd'hui, certes, mais il reste beaucoup plus lisible d'avoir ces déclarations regroupées au même endroit, et de s'attendre à quoi s'en tenir.

    En plus, ça te causera moins de souci si tu passes après à des langages comme le C++. Dans ce dernier, les variables, qu'elles soient de type natif ou objet (instances de classes) peuvent officiellement être déclarées n'importe où, mais tu ne sauras pas forcément à quel moment elles seront initialisées. Et comme l'initialisation implique éventuellement l'appel d'un constructeur, ça peut provoquer des bugs assez pénibles à localiser.
    D'acc je note. Au fait dans mon exemple, ça me rajoute une ligne de code (bon c'est pas très grave), lol.

    Element* iterator = l->first

    Il faut que je teste si l est vide d'abord du coup je dois faire la déclaration puis le test, puis l'affectation... Bref, c'est pas non plus la fin du monde... Merci pour vos explications en tout cas

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je mets l'accent sur le mot "bloc", car on ne nous apprend pas assez souvent que ça ne veut pas dire "fonction". En fait, ceci est possible:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void show_list(List* l) {
    	if(l == NULL)
    		exit(EXIT_FAILURE);
     
    	{
    		Element* iterator = l->first;
     
    		while(iterator != NULL)
    		{
    			printf("%i\t",iterator->data);
    			iterator = iterator->next;
    		}
    	}
    	printf("NULL\n");
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    A priori, oui, mais je te suggère plutôt de te discipliner à déclarer tes variables en début de bloc. Ce n'est pas plus difficile et tu écriras ainsi du code beaucoup plus portable (au moins, à travers les différents compilos).
    malgré mes recherches, je ne trouve pas comment changer le compilateur de mon VS... Auriez-vous une idée de comment faire?

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Non, désolé. La dernière fois que j'ai codé sous Windows, c'était en 2002. Bon courage.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Je n'utilise pas cet IDE, donc je ne peux pas t'aider non plus.
    Mais apparemment il ne supporte pas le C99 : http://connect.microsoft.com/VisualS...16/support-c99

    Publié par Microsoft le 28/08/2009 à 10:04
    Hello ghazel,

    Thanks for taking the time to send us your suggestion. Currently, there are no plans to implement C99 support in VS2010. Once we complete this product cycle, we will be reviewing all customer suggestions, including this one, for our future planning.

    Thanks,
    Mark Roberts
    Visual C++ Team

Discussions similaires

  1. [MySQL] Fatal error: Cannot use object of type PDOStatement as array
    Par picool dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 01/03/2012, 15h13
  2. Réponses: 3
    Dernier message: 21/01/2010, 00h24
  3. Réponses: 2
    Dernier message: 16/08/2009, 13h20
  4. [PHP 5.2] Fatal error: Cannot use object of type CPanier as array in . .
    Par Gauldo dans le forum Langage
    Réponses: 10
    Dernier message: 12/01/2009, 13h53
  5. error:invalid use of undefined type
    Par assif dans le forum C++
    Réponses: 2
    Dernier message: 25/10/2006, 21h11

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