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 :

Est-ce possible de copier la valeur d'un champs d'une structure dans un autre champs


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 Est-ce possible de copier la valeur d'un champs d'une structure dans un autre champs
    Bonjour tout le monde,

    Est-il possible de copier la valeur d'un champ d'une structure dans le champs d'une autre structure avec strcpy ?

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(TPlanetsLunes[i].NomP,TPlanetsLune.NomP);
    Je veux donc copier la valeur qui se trouve dans TPlanetsLune.NomP dans TPlanetsLunes[i].NomP, est-ce possible ?

    Quand j'essaie, j'ai une violation de mémoire.

    Merci d'avance pour l'aide.

    beegees

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Si le champ nomP est un tableau de caractère ou un pointeur sur un tableau de caractères alloué dynamiquement dont le contenu se termine par le caractère nul de fin de chaine, strcpy() est faite pour cela.

    Peux-tu montrer le code incriminé?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    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
    Merci pour ta réponse Thierry,

    J'alloue dynamiquement une structure avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPlanetsLunes = (TPlanets*)malloc(Taille*sizeof(TPlanets));
    J'alloue ensuite le nom avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPlanetsLune.NomP = (char*)malloc((strlen(NomPl)+1)*sizeof(char));
    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
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    #include <BasicConsole.h>
     
    typedef struct {
     
    	char* NomL; //on indique ici que l'on ne sait pas combien de caractère il faut pour les différens noms de lune
    	double Rayon;
    }Lune;
     
    typedef struct
    {
    	char* NomP;
    	double RayonP;
    	Lune* TLune;  //on indique ici avec l'* qu'on ne sait pas combien de lune il y'aura
    } TPlanets;
     
     
     
     
    bool	AllocMemStructure(char* NomFichier, TPlanets*& TPlanetsLunes, int& Taille);
    bool	DiviserLigne(const char* NomFichier, const Taille,TPlanets*& TPlanetsLunes,TPlanets TPlanetsLune);
     
    void main()
    {
     
    	int Taille = 0;
     
    	TPlanets* TPlanetsLunes;//on ne sait pas encore la Taille de cette structure, c'est pourqoi
    							//on va directement à la fonction AllocMemStructures
    	TPlanets TPlanetsLune; //on crée une copie de la structure pour ne pas perdre l'adresse originale
     
     
     
     
     
    	if(!AllocMemStructure("syssol.txt",TPlanetsLunes, Taille))printf("Fichier introuvable");
    	if(!DiviserLigne("syssol.txt", Taille,TPlanetsLunes,TPlanetsLune))printf("Fichier introuvable");
     
     
     
     
    }
     
    //Fonction qui ne sert qu''à allouer de la mémoire pour la struture.
    //le nombre de fois qu'il passera dans la boucle for sera le nombre de structure que j'aurai besoin
    bool	AllocMemStructure(char* NomFichier, TPlanets*& TPlanetsLunes, int& Taille)
    {
    	char Ligne[100];
    	int i = 0;
    	FILE* Fichier = fopen(NomFichier,"rt");
     
    	if(Fichier == NULL) return false;
     
    	for(i=0; ((fgets(Ligne,100-1,Fichier))!=NULL);i++)
    	{
    		printf("%ld\t",i);
    		printf("%s\n",Ligne);
    	}
     
    	Taille = i;
     
    	//allocation de mémoire pour la structure :
     
    	printf("La taille d'un TPlanets est de %ld\n",sizeof(TPlanets));
     
    	TPlanetsLunes = (TPlanets*)malloc(Taille*sizeof(TPlanets));
     
    	fclose(Fichier);
    	return true;
    }
     
    bool	DiviserLigne(const char* NomFichier, const Taille,TPlanets*& TPlanetsLunes,TPlanets TPlanetsLune)
    {
     
    	FILE* Fichier = fopen(NomFichier,"rt");
    	char Ligne[100];
    	char Type[1];
    	char KmP[15];
    	double KmPEnDouble;
     
    	if(Fichier == NULL) return false;
     
     
     
    	char NomPl[25];
    	for(int i=0; ((i<Taille)
    			&& fscanf(Fichier,"%c",Type)
    				&& (fgets(Ligne,100-1,Fichier)!=NULL));i++)
    	{
    		printf("Ligne reçue par la fonction %c\t%s",Type,Ligne);
     
    		char* PremiereLettre = strchr(Ligne,9);
     
    	PremiereLettre = PremiereLettre + 1;
     
     
    	int j = 0;
    	char * p = NomPl;
    	while(*PremiereLettre !=9)
    	{
    		*p++ = *PremiereLettre++;
     
     
    	}
     
    	//j'incrémente d'abord *p de 1 (++) puis j'ajoute le code ASCII O
     
    	++*p = 0;
     
    	TPlanetsLune.NomP = (char*)malloc((strlen(NomPl)+1)*sizeof(char));
     
    	if (TPlanetsLune.NomP == NULL)
    		{
    			printf("\nErreur d'allocation de mémoire\n");
    			break;
    		}
     
    	if (*Type = 'P')
    	//je ne dois pas mettre d'indice car c'est la copie de la structure.
    	strcpy(TPlanetsLunes[i].NomP,NomPl);
     
     
    	PremiereLettre++;
    	strcpy(KmP,PremiereLettre);
     
     
    	PremiereLettre = strchr(KmP,0);
    	//si la lettre juste avant le EOS (0) est différent de 0 (EOS)...
    	if(*(PremiereLettre-1)!=0)
    	{
    		//...Je décrémente l'adresse de PremiereLettre
    		PremiereLettre--;
    		//Je transforme la valeur (*) se trouvant à l'adresse décrémentée par un 0 (zéro, EOS)
    		*PremiereLettre = 0;
    	}
     
    	//strtod(KmP,KmPEnDouble);	
    	sscanf(KmP,"%lf",&KmPEnDouble);
     
    	//strcpy(TPlanetsLune.RayonP,KmPEnDouble);
     
     
    	strcpy(TPlanetsLunes[i].NomP,TPlanetsLune.NomP);
    	//strcpy(TPlanetsLunes[i].RayonP,TPlanetsLune.RayonP);
     
     
     
     
     
    	}
     
     
     
     
     
     
     
     
     
     
    }
    Est-ce que cela est correct ?

    beegees

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par beegees Voir le message
    Merci pour ta réponse Thierry,

    J'alloue dynamiquement une structure avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPlanetsLunes = (TPlanets*)malloc(Taille*sizeof(TPlanets));
    J'alloue ensuite le nom avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPlanetsLune.NomP = (char*)malloc((strlen(NomPl)+1)*sizeof(char));
    Est-ce que cela est correct ?

    beegees
    Tu dois encore allouer de l'espace pour chaque TPlanetsLunes[i].NomP avant de faire la copie, non?

    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
    size_t i;
    int error = 0;
    /*...*/
    for (i = 0; i < Taille; i++)
    {
        TPlanetsLunes[i].NomP = malloc((strlen(NomPl)+1) * sizeof *TPlanetsLunes[i].NomP);
        if (TPlanetsLunes[i].NomP == NULL)
        {
            error = 1;
        }
    }
     
    if (error != 1)
    {
        /* Suite du code */
    }
    else
    {
        /* on fait le menage et on retourne un code d'erreur a la fonction 
            appelante (ou on quitte l'application)*/
    }
    Au passage, il est déconseillé de caster la valeur retournée par malloc() et sizeof (char) vaut 1 par définition. J'écrirais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPlanetsLunes = malloc(Taille * sizeof *TPlanetsLunes);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPlanetsLune.NomP = malloc((strlen(NomPl)+1) * sizeof *TPlanetsLune.NomP);
    ce qui permet de faciliter la mainenance.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    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
    Salut Thierry,

    Tu dois encore allouer de l'espace pour chaque TPlanetsLunes[i].NomP avant de faire la copie, non?
    Exactement mais comme je début avec le malloc... je fais pas à pas, mais ton rappel est important, merci.

    Au passage, il est déconseillé de caster la valeur retournée par malloc()
    Là, tu m'apprends quelque chose, on est donc pas obligé de caster ? je vais tester mais le Prof nous dit qu'on doit faire comme ça. C'est une bonne idée de me l'avoir dit, merci.

    et sizeof (char) vaut 1 par définition
    Notre Professeur nous a dit que sur certains compilateur, char ne vallait pas toujours 1, exemple sur un compilateur 16 ou 64 bits qu'en penses-tu ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPlanetsLune.NomP = malloc((strlen(NomPl)+1) * sizeof *TPlanetsLune.NomP);
    super, c'est vrai que c'est bien plus clair

    Pour ce qui est de mon problème, j'ai trouvé :

    Je devais mettre un s à TPlanetsLunes et j'ai aussi mis [i]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPlanetsLunes[i].NomP = (char*)malloc((strlen(NomPl)+1)*sizeof(char));
    donc, pour l'instant ça marche

    Merci pour tout !

    Beegees

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par beegees Voir le message
    Salut Thierry,

    Là, tu m'apprends quelque chose, on est donc pas obligé de caster ? je vais tester mais le Prof nous dit qu'on doit faire comme ça. C'est une bonne idée de me l'avoir dit, merci.
    Cette partique est pourtant déconseillée. Si ton prof te dit le contraire, tu peux toujours le référer à l'errata de l'ouvrage de référence "The C programming language, 2nd edition" de Kernighan et Ritchie que tu trouveras ici.

    Citation Envoyé par beegees Voir le message
    Notre Professeur nous a dit que sur certains compilateur, char ne vallait pas toujours 1, exemple sur un compilateur 16 ou 64 bits qu'en penses-tu ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPlanetsLune.NomP = malloc((strlen(NomPl)+1) * sizeof *TPlanetsLune.NomP);
    Un char ne fait pas toujours un octet, mais il fait TOUJOURS 1 byte. C'est dans la norme. sizeof (char) vaut 1 sur tous les compilateurs conformes

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    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
    Merci pour tes explications très intéressantes.

    Tu es un spécialiste du C ?

    As-tu dèjà lu ce livre ?

    J'aimerais l'acheter, me le conseilles-tu ?

    Merci sincèrement pour tout.

    beegees

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Je ne suis pas un spécialiste du C, mais K&R2 est une bonne référence. Kernighan et Ritchie sont les créateurs du langage. Leur ouvrage est à mon sens excellent, mais pas très pédagogique. Ce n'est d'ailleurs pas sa vocation. C'est un ouvrage de référence et il n'est pas nécessairement adapté à l'apprentissage. Le public cible n'est donc pas le débutant en programmation. Mais K&R2 est un livre incontournable pour qui veut se mettre sérieusement au C.

    J'ai personnellement commencé avec cet ouvrage (dans sa version anglaise). Contrairement à beaucoup de débutants, j'ai beaucoup aimé l'approche utilisée. L'usage des fonctions de la bibliothèque standard vient assez tard. On commence par apprendre à implanter soi-même des fonctions de saisie à base de getchar(), les fonctions de manipulation de chaines, etc. Les exercices proposés m'ont aussi beaucoup apporté. Je ne sais pas ce que vaut la traduction, mais au vu de la popularité de l'ouvrage, je ne doute pas qu'elle est à la hauteur.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/04/2014, 12h32
  2. Réponses: 38
    Dernier message: 24/04/2012, 22h09
  3. Réponses: 16
    Dernier message: 04/09/2010, 02h16
  4. Réponses: 1
    Dernier message: 27/04/2010, 20h39
  5. Est-il possible de rendre certaines valeurs d'un combox "uncliquable" ?
    Par lolymeupy dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 22/10/2008, 14h18

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