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 :

modification non voulue de variable


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 22
    Par défaut modification non voulue de variable
    Bonjour,

    Voila, j'ai une variable "nomsdesobjets" qui est de type char*. Elle est définie correctement en début du programme par une procédure :

    appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objetsetattributs(fichM, &nomsdesobjets,&nomsdesattributs, dernierephrase);
    procedure :
    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
    void objetsetattributs(FILE*fichM, char** nomsdesobjets,char** nomsdesattributs, char* dernierephrase)
    {
     
    	char chaineTMP [Nmcl];
    	char chaine1 [Nmcl];
    	char CHAINE2 [Nmcl];
    	int iemecaractereligne=0;
    	int c;
     
    	rewind(fichM);
    	fgets(chaineTMP, sizeof chaineTMP, fichM);
    	while(strcmp(chaineTMP,dernierephrase))        // tant que l'on est pas la ligne "Name_of_dataset" 
    	{		
    		fgets(chaineTMP, sizeof chaineTMP, fichM);
    	}
    	fgets(CHAINE2, sizeof CHAINE2, fichM);
    	fgets(chaine1, sizeof chaine1, fichM);
    	*nomsdesattributs=chaine1;
    	*nomsdesobjets=CHAINE2;
     
     
     
    }
    Cette variable "nomsdesobjets" reste correctement définie jusqu'au moment ou je fais appel a une procédure "groupeetchoixgen" qui ne fait pas appel a la variable "nomsdesobjets". Mais après cette procédure, ma variable "nomsdesobjets" a quand même changé. Elle a pour valeur l'autre variable de type char* "nomsdesgroupes" qui est en parametre de la procedure "groupeetchoixgen" :

    appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    groupeetchoixgen(fichGA, &choixGEN, &alpha,&nomsdesgroupes);
    procedure :
    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
    void groupeetchoixgen(FILE* fichG, int*choixGEN, double* alpha, char** nomsdesgroupes)
    {
    	int c,iemecaractereligne=0, numerocaractere=0,numeromot=0;
     
    	char CHTMP [Nmcl];
    	double d;
     
     	fscanf(fichG, "%d",choixGEN); //recuperation de la methode de generalisation voulue
     	printf("choixGEN : %d\n", *choixGEN);
     	if(*choixGEN==1)
     	{
     		fscanf(fichG, "%lf",&d);
     		*alpha=d;
     		printf("alpha : %lf\n", *alpha);
     	}
     
     	fgets(CHTMP, sizeof CHTMP, fichG);//recupere le reste de la ligne
    	fgets(CHTMP, sizeof CHTMP, fichG);
    	*nomsdesgroupes=CHTMP;
    }


    Voyez vous pourquoi ?
    N'existe t' il pas un moyen de bloquer cette modification ?

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Tu affectes la valeur du pointeur CHAINE2 à nomdesobjets. Malheureusement pour toi CHAINE2 est une variable locale à objetsetattributs(fichM, &nomsdesobjets,&nomsdesattributs, dernierephrase);. Donc une fois cette fonction terminée nomdesobjets pointe sur n'importe quoi.

    Pour résoudre le problème il te faut copier CHAINE2 et non juste affecter son pointeur.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 22
    Par défaut
    Bonjour !

    Merci. Jai compris le probleme.
    Alors, jai voulu copier caractère par caractère directement dans nomsdesobjets. Mais j'obtiens un segmentation fault...

    Voila le programme :

    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
    void objetsetattributs(FILE*fichM, char** nomsdesobjets,char** nomsdesattributs, char* dernierephrase)
    {
     
    	char chaineTMP [Nmcl];
    	char chaine1 [Nmcl];
    	char chaine2 [Nmcl];
    	int iemecaractereligne;
    	int c,i;
     
    	rewind(fichM);
    	fgets(chaineTMP, sizeof chaineTMP, fichM);
    	while(strcmp(chaineTMP,dernierephrase))        // tant que l'on est pas la ligne "Name_of_dataset" 
    	{		
    		fgets(chaineTMP, sizeof chaineTMP, fichM);
    	}
    	fgets(chaineTMP, sizeof chaineTMP, fichM);
    	*(nomsdesobjets)=(char*) malloc (sizeof(char)*Nmcl);
     
    	iemecaractereligne=0;
    	c=chaineTMP[iemecaractereligne];
    	while(c != '\n')
    	{
                   *nomsdesobjets[iemecaractereligne]=c;
                    iemecaractereligne++;
    		c=chaineTMP[iemecaractereligne];
     
    	}
    }

  4. #4
    Expert confirmé
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (*nomsdesobjets)[iemecaractereligne]=c;

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

Discussions similaires

  1. [AC-2007] Modification enregistrement non-voulue
    Par Lyysis dans le forum IHM
    Réponses: 3
    Dernier message: 21/05/2013, 11h20
  2. Réponses: 2
    Dernier message: 11/11/2008, 12h45
  3. [d3d] modification (non voulue) d'un vertex buffer
    Par d'Oursse dans le forum DirectX
    Réponses: 5
    Dernier message: 04/01/2008, 11h00
  4. probleme d'espace non voulu entre 2 bloc
    Par piff62 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 12/04/2005, 16h07
  5. [netbeans] Modifications non prises en compte
    Par nadass dans le forum NetBeans
    Réponses: 6
    Dernier message: 07/04/2005, 13h49

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