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: assignment to expression with array type


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 13
    Points : 12
    Points
    12
    Par défaut error: assignment to expression with array type
    Bonjour,

    Me voilà à nouveau confronté à un problème pour lequel je ne vois pas où je me trompe.

    Si j'écris ceci en une seule ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char name[5+1] = "Annie";
    Aucune erreur de compilation.

    Si je l'écris en deux comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char name[5+1];
    name = "Annie";
    Je reçois cette erreur à la compilation :

    run.c: In function ‘main’:
    run.c:8:7: error: assignment to expression with array type
    8 | name = "Annie";
    Si je lis le message d'erreur, je serais en train d'assigner un type "array" à une expression ? Serait-ce dû au fait que le nom du tableau est en fait un pointeur vers le premier élément du tableau ? Mais alors pourquoi ça fonctionne dans le premier cas ?

    Je suis un peu perdu...

    d'avance pour vos lumières !

    Sébastien

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    C'est trivial, normal, rien d'extraordinaire du level 0 "débutant" pour les pointeurs.

    char name[5+1] = "Annie"; tu crées 1 chaine de caractères littérale en lecture seule et que tu utilises pour initialiser 1 variable lors de sa définition : voir ci-dessous ou mon lien pour de meilleures explications (*). D'ailleurs, tu n'as pas besoin de préciser la taille, le compilateur la calcule en y insérant le caractère sentinelle '\0'.
    String literal, cppreference en anglais mais attention C et C++

    char name[5+1] tu définies 1 variable de type "chaine de caractères" (tableau de caractères). Et donc pour copier 1 chaîne de caractères il faut utiliser la fonction strcpy ou strncpy dans l'entête string.h (<- 3 liens cplusplus.com en anglais)


    * : édit suite à la remarque de @Sve@r

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par foetus Voir le message
    C'est trivial, normal, rien d'extraordinaire du level 0 "débutant" pour les pointeurs.
    C'est pour ça que je poste dans la catégorie "Débuter", j'apprends, mais merci quand même pour l'explication.

  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 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par SebastienBE Voir le message
    Si j'écris ceci en une seule ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char name[5+1] = "Annie";
    Aucune erreur de compilation.

    Si je l'écris en deux comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char name[5+1];
    name = "Annie";
    Je reçois cette erreur à la compilation. Je suis un peu perdu...
    L'écriture en une ligne est un raccourci syntaxique signifiant "création et remplissage". L'écriture en deux lignes (en fait c'est la seconde ligne qui pose problème) signifie "affectation". Or on ne peut pas affecter une string à un tableau. On ne peut que "remplir" un tableau. Donc si tu veux le créer puis le remplir plus tard, tu ne peux plus utiliser le raccourci qui n'est offert que si tu fais les deux opérations ensembles. Pour le remplir il te faut travailler case par case. Fort heureusement il existe une fonction strcpy() qui fait le taf. Tu lui passes le tableau, la string et elle se charge de faire la boucle et mettre le caractère [i] de la string dans la case [i] du tableau. Et elle se charge même de mettre le '\0' qui va bien (à toi de veiller qu'il y a bien la place de l'y mettre mais on en a déjà parlé et tu sembles avoir bien pigé le truc).

    Citation Envoyé par foetus Voir le message
    C'est trivial, normal, rien d'extraordinaire du level 0 "débutant" pour les pointeurs.
    Pas d'accord avec toi. Ce souci, même si ici il met en jeu un pointeur, n'est pas un souci lié aux pointeurs mais au remplissage de tableaux. Tu aurais la même chose avec int name[5]={1, 2, 3, 4, 5} vs int name[5]; name={1, 2, 3, 4, 5} et là sans pointeur.

    Citation Envoyé par foetus Voir le message
    char name[5+1] = "Annie"; tu crées 1 chaine de caractères littérale en lecture seule.
    Absolument pas !!! Ce n'est qu'un raccourci de char name[5+1]={'A', 'n', 'n', 'i', 'e', '\0'}. Rien n'interdit ensuite de modifier le tableau comme tu le sens et écrire par exemple for (i=0; name[i] != '\0'; i++) name[i]=name[i]+1 pour avoir au final "Boojf". Le tableau a bien été modifié. Ne pas confondre char name[5+1] = "Annie" et char *name = "Annie"...
    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
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Pas d'accord avec toi. Ce souci, même si ici il met en jeu un pointeur, n'est pas un souci lié aux pointeurs mais au remplissage de tableaux. Tu aurais la même chose avec int name[5]={1, 2, 3, 4, 5} vs int name[5]; name={1, 2, 3, 4, 5} et là sans pointeur.
    Oui tu as raison : j'ai dit pointeur parce qu'on parle de tableau et de chaine de caractères littérales. Mais effectivement c'est + 1 problème de différence en C/ C++ d'initialisation (à la définition) et d'affectation (en C++ c'est le constructeur de copie et de l'opérateur =)
    Facilité du compilateur pour les types tableau et structure (Plain Old Data - POD - "complexe") il me semble, à la définition.
    Mais apparemment, que ce soit 1 tableau de caractères, d'entiers ou autres, à la définition, il y a création d'1 littéral et 1 copie (<- après chaque compilateur peut faire sa tambouille)


    Citation Envoyé par Sve@r Voir le message
    Absolument pas !!! Ce n'est qu'un raccourci de char name[5+1]={'A', 'n', 'n', 'i', 'e', '\0'}. Rien n'interdit ensuite de modifier le tableau comme tu le sens et écrire par exemple for (i=0; name[i] != '\0'; i++) name[i]=name[i]+1 pour avoir au final "Boojf". Le tableau a bien été modifié. Ne pas confondre char name[5+1] = "Annie" et char *name = "Annie"...
    Effectivement, j'ai trop voulu faire 1 phrase courte et donc en résulte 1 phrase ambigüe

    De toute façon , tes explications sont claires et c'est 1 sujet de base (comme je l'ai dit). Donc il faut savoir distinguer et maîtriser littéral tableau vs littéral pointeur, affectation vs initialisation, initialisation crochet (que l'on peut utiliser pour les initialisations d'1 structure)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci Sve@r pour ces précieuses infos !

    C'est très compréhensible et bien expliqué !

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

Discussions similaires

  1. Error converting expression to data type int.
    Par eddyphan dans le forum Développement
    Réponses: 10
    Dernier message: 02/03/2017, 16h15
  2. Réponses: 1
    Dernier message: 24/03/2011, 22h40
  3. [VB.NET]expression d'un type d'expression
    Par new_wave dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/06/2006, 21h40
  4. Réponses: 2
    Dernier message: 17/03/2006, 19h30
  5. Réponses: 9
    Dernier message: 15/02/2005, 13h26

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