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 :

je n'arrive pas à affecter la valeur d'un tableau dans un tableau d'une structure


Sujet :

C

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut je n'arrive pas à affecter la valeur d'un tableau dans un tableau d'une structure
    Bonjour tout le monde,

    J'essaie de lire des données dans un fichier txt, y stocker certains éléments dans des variables et d'autres dans un tableau.

    Voici une ligne de mon fichier txt :

    504-3116894-79 Patte Louise
    Les 3 premiers chiffres sont dans une variable, les 7 suivants dans une autre et les deux dernier dans une dernière variable.

    Pour ce qui est du nom, j'aimerais le mettre dans un tableau.

    J'utilise pour faire tout ça un fscan qui lit 3 entiers et ensuite un fgets pour lire la fin de la ligne.

    Je n'ai aucun problème pour lire les entiers mais le nom du client pose problème.

    Je récupère le nom du client dans une variable tampon, je veux ensuite transférer la valeur de cette mémoire tampon mais il me donne ce message d'erreur :

    left operand must be l-value
    Voici le code de ma boucle for qui reprend le fscanf et le fgets :

    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
    for(Indice = 0; (Indice < Taille_Maximale)&&(fscanf(Fichier,"%ld-%ld-%ld",&type,&Numero,&check)==3)
    			&& (fgets(Nom,Taille_Maximale-1,Fichier)!=NULL);
    		Indice++)
    			{
     
    			//printf("Nom %ld :\n",Indice+1,Nom);
     
    				LongueurNumeroCompte(nombreType, nombreNumeroCompte, checkDigit,"Comptes.txt");
     
     
    				if((nombreType == 3)&&(nombreNumeroCompte == 7)&&(checkDigit == 2))
    				{
    					if(CheckDuDigit(type,Numero,check))
    					{
    						printf("compte numéro %ld : %ld-%ld-%ld\n",Indice+1,type,Numero,check);
    						NumeroDeCompte[Indice].check = check;
    						NumeroDeCompte[Indice].numero = Numero;
    						NumeroDeCompte[Indice].type = type;
    						NumeroDeCompte[Indice].Nom = Nom;
     
    					}
    				}
    			}
    Le problème provient de la dernière ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	NumeroDeCompte[Indice].Nom = Nom;
    Est-ce que vous comprenez pourquoi ça ne fonctionne pas ?

    Je suis débutant en C.

    Merci pour votre compréhension et pour votre aide.

    beegees

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Points : 1 111
    Points
    1 111
    Par défaut
    L'emploi de scanf() est déconseillé pour ce genre de chose.

    Il faut utiliser fgets(), qui va stocker la valeur d'une ligne dans un buffer de chaîne de caractère, puis séparer les différents constituants de cette chaîne avec les fonctions correspondantes du module string strchr(), les fonctions du module ctype isnumber(), isalpha(), et les fonctions de conversion atoi(), atof(), plutôt que scanf().
    Il faut éviter l'utilisation systématique de scanf ou de fscanf comme fonction de saisie ou de lecture je crois d'après les "pros" du langage C du forum.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, effectivement, je te conseille de faire un fgets() puis avec strchr() tu cherchers le signe "-" et avec un strncpy() tu ranges tes nombres dans un tableau. Si tu es sûr que tous tes entrées sont identiques (3 chiffres, un "-", 7 chiffres, un "-", 2 chiffres) tu n'auras pas besoin de strchr(). Enfin pour le nom, tu utilises strdup() avec un free() à la fin pour libérer la mémoire.

  4. #4
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour Kromatien et bonjour salseropom,

    Merci pour vos réponses.

    Il faut éviter l'utilisation systématique de scanf ou de fscanf comme fonction de saisie ou de lecture je crois d'après les "pros" du langage C du forum.
    Le problème est que je travaille sur mon prorgramme depuis 3 jours et j'ai pas trope envie de recommencer ce qui a déjà été fait.

    Par contre, je dois avouer que votre idée est intéressante et j'essaierai sans doute cette façon quand j'aurai fini.

    Vous n'avez donc pas de solution à mon problème

    Merci encore pour votre aide.

    beegees

  5. #5
    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
    Citation Envoyé par beegees Voir le message

    Le problème provient de la dernière ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	NumeroDeCompte[Indice].Nom = Nom;
    Est-ce que vous comprenez pourquoi ça ne fonctionne pas ?
    On sait que NumeroDeCompte est un tableau de structures dont un des champs s'appelle Nom. D'après le message d'erreur, on peut penser que ce champ est un tableau (de char). Or il est impossible d'écrire tableau = quelque chose. (Si Nom était un pointeur, le compilateur serait d'accord, mais le résultat obtenu ne serait pas celui espéré).
    je pense que tu veux copier le contenu du tableau lu par fgets dans le tableau de la structure. Pour copier une chaîne de caractères, on utilise la fonction strcpy():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(NumeroDeCompte[Indice].Nom, Nom)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour diogene,

    On sait que NumeroDeCompte est un tableau de structures dont un des champs s'appelle Nom. D'après le message d'erreur, on peut penser que ce champ est un tableau (de char). Or il est impossible d'écrire tableau = quelque chose. (Si Nom était un pointeur, le compilateur serait d'accord, mais le résultat obtenu ne serait pas celui espéré).
    je pense que tu veux copier le contenu du tableau lu par fgets dans le tableau de la structure. Pour copier une chaîne de caractères, on utilise la fonction strcpy():
    Code :
    strcpy(NumeroDeCompte[Indice].Nom, Nom)

    Je voudrais te remercier sincèrement pour cette belle analyse de mon problème et cette réponse qui me permet maintenant de comprendre ce que je n'avais pas compris.

    ça fonctione très bine avec strcpy.

    Un grand merci à toi.

    beegees

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/12/2010, 08h52
  2. Réponses: 0
    Dernier message: 20/04/2009, 11h09
  3. je n'arrive pas à récupérer la valeur de ma variable globale
    Par beegees dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/03/2009, 14h24
  4. je n'arrive pas à afficher les valeurs de $_FILES[]
    Par totoAussi dans le forum Langage
    Réponses: 5
    Dernier message: 13/03/2009, 18h07
  5. Ne pas affecter de valeur à un parametre
    Par zappy bibicy dans le forum Access
    Réponses: 3
    Dernier message: 28/08/2006, 08h03

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