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 :

L'expression doit être une valeur modifiable


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2021
    Messages : 3
    Par défaut L'expression doit être une valeur modifiable
    Bonjour à tous,

    voilà 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
    14
    15
    16
    17
    18
    struct ARTICLE {
            char CodeFabriquant[6];
            char CodeArticle[6];
            char Nom[30];
            int Rayon;
            double Prix;
            int stock;
    };
     
    typedef struct ARTICLE article;
     
    int main() {
            FILE* pf;
            article produit;
            article article_vide;
            article_vide.Nom = "Article Inconnu";
            return 0;
    }
    Visual Studio m'indique à cette dernière ligne que "L'expression doit être une valeur modifiable", mais je ne vois pas du tout où est mon erreur. (bien sur, j'ai mis les tabulations mais elles ne s'affichent pas ici)

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

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 213
    Par défaut
    1. ajoute les balise code , et /code pour la lisibilité (ton pb de tabulation )

    ensuite, tu dois reproduire l'erreur en simplifiant ton programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
            char Nom[30];
            Nom = "Article Inconnu";
            return 0;
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2021
    Messages : 3
    Par défaut
    Merci pour votre réponse. En effet, l'erreur persiste avec ce code là (vu que c'est le même). Je ne vois toujours pas. Même en mettant {'A', 'r', ... , 'u'} à la place de "Article Inconnu" ça ne marche toujours pas...

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2021
    Messages : 3
    Par défaut
    C'est d'autant plus étonnant qu'en écrivant ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main() {
            FILE* pf;
            article produit;
            article article_vide = { "", "", "Article inconnu" };
            return 0;
    }
    le programme fonctionne..!

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 753
    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 753
    Par défaut
    Parce qu'en C, tu n'as pas la notion d'objets et donc tu n'as pas tous les opérateurs de copie
    Et pour aller plus loin, la notion de chaîne de caractères en C n'existe pas vraiment c'est 1 tableau de caractères ASCII terminé par la sentinelle '\0'.

    Si cela fonctionne, c'est lors de la définition de ta variable avec 1 initialisation (attention, ces chaînes de caractères sont en lecture seulement, RODATA lien wiki en français)

    Il faut que tu utilises soit strcpy/ strncpy/ autres versions non portable soit memmove (essentiellement pour 1 chaîne non ASCII) (<- 3 liens cplusplus.com en anglais)

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    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 814
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Aguelord Voir le message
    C'est d'autant plus étonnant qu'en écrivant ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main() {
            FILE* pf;
            article produit;
            article article_vide = { "", "", "Article inconnu" };
            return 0;
    }
    le programme fonctionne..!
    Si tu écris char *nom="toto" ça fonctionne. Si tu écris char *nom; nom="toto" ça va aussi. Si tu écris char nom[10]="toto" là aussi ça va. Mais écrire char nom[10]; nom="toto" là ça ne marche plus.
    Il te faut apprendre ce qu'est un tableau, comment on le remplit, ce qu'est un pointeur et la différence entre tableau et pointeur.

    Citation Envoyé par foetus Voir le message
    memmove (essentiellement pour 1 chaîne non ASCII)
    Là je ne suis pas d'accord. La notion de chaine ne se définit pas par l'encodage de ses caractères mais par la présence d'un '\0'. Bien qu'utilisable pour copier aussi une string, le but premier de memmove est de copier une zone mémoire quelconque donc qui n'est pas forcéement balisée par ce '\0'. Et inversement, strcpy peut copier toute chaine (ascii/pas ascii).
    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]

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 753
    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 753
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Là je ne suis pas d'accord. La notion de chaine ne se définit pas par l'encodage de ses caractères mais par la présence d'un '\0'. Bien qu'utilisable pour copier aussi une string, le but premier de memmove est de copier une zone mémoire quelconque donc qui n'est pas forcéement balisée par ce '\0'. Et inversement, strcpy peut copier toute chaine (ascii/pas ascii).
    Tu as raison c'est plus pour le côté "logique" du truc.
    Dans la bibliothèque standard C, tu as 1 ensemble de fonctions commençant par str, et qui traitent les chaînes de caractères ASCII de type char/ terminée par la sentinelle '\0'.
    Lorsque tu travailles avec des chaînes de caractères MBCS/ Unicode, le type devient unsigned char et même si certaines fonctions str travaillent en "binaire" (et donc sont compatibles), ce n'est plus forcément la même logique.

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

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 213
    Par défaut
    Citation Envoyé par Aguelord Voir le message
    En effet, l'erreur persiste avec ce code là (vu que c'est le même). Je ne vois toujours pas.
    regarde l’alimentation des string/tableau de char en c

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/04/2010, 23h05
  2. Réponses: 3
    Dernier message: 20/05/2009, 13h33
  3. Expression pour récupérer une valeur?
    Par elwario91 dans le forum C
    Réponses: 2
    Dernier message: 25/03/2008, 13h23
  4. Process qui doit retourner une valeur
    Par Steff2 dans le forum Delphi
    Réponses: 5
    Dernier message: 06/09/2007, 03h57
  5. Réponses: 5
    Dernier message: 28/10/2006, 14h50

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