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 :

SOS pour un souci d'initialisation d'un char


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 105
    Points : 53
    Points
    53
    Par défaut SOS pour un souci d'initialisation d'un char
    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct SEleve {
        char nom[50];
        }Eleve;
    int main()
    {
         Eleve elv[100];
     
         elv[0].nom = "Le_nom";
     
    }
    et voici l'erreur signalé par le compilateur:

             error: incompatible types when assigning to type 'char[50]' from type 'char *'|
    Comment faire pour initialiser ma variable nom sans problème ?
    merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Le '=' n'est utilisable que pour les types 'simples'. Par exemple pour les chaînes on utilise strcpy( elv[0].nom , "Le_nom" );

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Full Stack
    Inscrit en
    Janvier 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Madagascar

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 26
    Points : 37
    Points
    37
    Par défaut
    donc, c'est réglé? J'ai fais une petite modification dans ton code

  4. #4
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Citation Envoyé par JKane Voir le message
    donc, c'est réglé? J'ai fais une petite modification dans ton code
    Tu appelles ça une petite modification? Ca modifie entièrement la façon dans la mémoire doit être gérée...

  5. #5
    Membre du Club Avatar de no. 26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2017
    Messages : 13
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Le '=' n'est utilisable que pour les types 'simples'. Par exemple pour les chaînes on utilise strcpy( elv[0].nom , "Le_nom" );
    Pour rajouter à ce qui a été dit, il est également possible d'utiliser l'opérateur " = " lors de la déclaration d'un tableau de caractère, pour assigner une chaîne constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char unTableau[20] = "Hello world!";
    Dans le cas ici, la variable ayant déjà été déclaré, il n'est plus possible d'y assigner directement une chaîne constante à l'aide du " = ".

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 127
    Points
    15 127
    Par défaut
    Bonsoir,

    Quelque chose m'échappe, là :
    Citation Envoyé par no. 26 Voir le message
    [...] il est également possible d'utiliser l'opérateur " = " lors de la déclaration d'un tableau de caractère, pour assigner une chaîne constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char unTableau[20] = "Hello world!";
    Dans le cas ici, la variable ayant déjà été déclarée, il n'est plus possible d'y assigner directement une chaîne constante à l'aide du " = ".
    Alors, il est possible (en haut) ou il n'est plus possible (en bas) ? Il y a quand même un symbole "deux points" au bout de la première ligne, qui lie (du verbe lier, pas du verbe lire) l'exemple en code et la phrase qui l'introduit en disant que c'est possible.
    Mais la phrase du bas commence par Dans le cas ici, sous-entendu le code juste au-dessus d'elle, et dit que ce n'est plus possible, bref je ne comprends rien...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 470
    Points : 6 107
    Points
    6 107
    Par défaut
    Jipété :
    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
    #include <stdio.h>
    #include <string.h>
     
    int main()
    {
    	// Lors de la définition du tableau, on peut initialiser avec '='.
    	char unTableau[] = "Hello world!";
     
    	// Après la définition, par contre, on ne peut plus.
    //	unTableau = "Good bye!"; // Cette ligne ne compile pas.
     
    	// A la place, il faut alors écrire :
    	strcpy(unTableau, "Good bye!");
     
    	return 0;
    }
    Quand no. 26 écrivait « Dans le cas ici, la variable ayant déjà été déclaré », il parlait de SEleve::nom dans l'expression elv[0].nom.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 105
    Points : 53
    Points
    53
    Par défaut Merci!!!!
    l'utilisation de la fonction strcpy() resoud mon problème.
    merci.

  9. #9
    Membre du Club Avatar de no. 26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2017
    Messages : 13
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Bonsoir,

    Quelque chose m'échappe, là :

    ...
    Il est vrai que je me suis mal exprimé, je te remercie d'avoir mis le doigt dessus.
    Comme l'a compris et souligné Pyramidev, quand j'ai indiqué :
    Dans le cas ici, ...
    Je faisais référence au cas dans lequel se trouvait le postant.
    Ma locution pouvait effectivement porter à confusion, je ferai plus attention la prochaine fois.

  10. #10
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    À noter qu'avec un tableau déclaré membre d'un enregistrement comme c'est le cas ici, il existe une alternative à memcpy / strcpy : la copie brute par affectation.

    Code copy.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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <ctype.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    struct s {
        char a[8];
    };
     
    void dump(const struct s *e) {
        for (size_t i = 0; i < sizeof e->a; ++i) {
            const char c = e->a[i];
            if (isgraph(c))
                printf(" '%c' ", c);
            else
                printf("0x%02x ", (unsigned char)c);
        }
        puts("");
    }
     
    int main(int argc, char *argv[]) {
        // use strcpy for reference
        struct s e0;
        strcpy(e0.a, "abcd");
        e0.a[5] = 'e';
        e0.a[6] = 'f';
        printf("e0: "); dump(&e0);
     
        // struct initialization
        struct s e1 = { .a = "ZyXwVu" };
        e1.a[7] = '!';
        printf("e1: "); dump(&e1);
     
        // struct copy
        e0 = e1;
        printf("e0: "); dump(&e0);
     
        // ensure e0.a != e1.a
        e0.a[0] = 'x';
        e0.a[1] = 'y';
        e0.a[2] = 'z';
        e0.a[3] = '#';
        e0.a[4] = '1';
        e0.a[5] = '2';
        e0.a[6] = '3';
        e0.a[7] = '^';
        printf("e0: "); dump(&e0);
        printf("e1: "); dump(&e1);
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ gcc -std=c11 -pedantic -Wall -Werror copy.c
    $ ./a.out
    e0:  'a'  'b'  'c'  'd' 0x00  'e'  'f' 0x00
    e1:  'Z'  'y'  'X'  'w'  'V'  'u' 0x00  '!'
    e0:  'Z'  'y'  'X'  'w'  'V'  'u' 0x00  '!'
    e0:  'x'  'y'  'z'  '#'  '1'  '2'  '3'  '^'
    e1:  'Z'  'y'  'X'  'w'  'V'  'u' 0x00  '!'
    Contrairement à strcpy toutefois, le compilateur effectuera une copie complète de sizeof(struct s) octets.

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

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