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 :

bug mysterieux !


Sujet :

C

  1. #21
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par isoman
    ps:je compile en .cpp prcq comme je l'ai dit l'autre fois mon prof insiste sur ce point
    Alors ton code doit être du C++. Ce n'est pas le cas.

    De plus, ce n'est pas le bon forum...

    Si ton prof veut que tu écrives en C et que tu compiles en C++, change de prof de toute urgence. C'est un agent de l'ennemi...

  2. #22
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    Alors ton code doit être du C++. Ce n'est pas le cas.

    De plus, ce n'est pas le bon forum...

    Si ton prof veut que tu écrives en C et que tu compiles en C++, change de prof de toute urgence. C'est un agent de l'ennemi...
    Le probleme c'est qu'on utilise visual 6 a l'ecole et lrsq on cree un nouveau projet le fichier est automatiquement un *.cpp et il faut qu'on le renomme en .c .Je lui ait fait la remarque mais il est un peu "borné" .
    sinon est que tu a une ptite idée de la cause du probleme ?

  3. #23
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par isoman
    Le probleme c'est qu'on utilise visual 6 a l'ecole et lrsq on cree un nouveau projet le fichier est automatiquement un *.cpp et il faut qu'on le renomme en .c .Je lui ait fait la remarque mais il est un peu "borné" .
    sinon est que tu a une ptite idée de la cause du probleme ?
    Je ne sais pas. Tu as du code compilable en C à proposer ? Tu as déjà corrigé tout ce que mon compilateur a signalé ?

  4. #24
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    voila le code corrigé en C .

    code corrigé en c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    #include <assert.h>
    #define vrai 1
    #define faux 0
     
    #define chemin_fichier_section "D:\\fichier_section.txt"
    #define chemin_fichier_procede "D:\\fichier_procede.txt"
    #define chemin_fichier_article "D:\\fichier_article.txt"
    #define chemin_fichier_machine "D:\\fichier_machine.txt"
     
    typedef struct information_composant             //c pour l'arbre des procedures
    {
    	int code_composant;
    	float qte;
    	int code_section_usinage;
    	int temps_integration_composant ;
    }information_composant;
     
     
     
    typedef struct liste_composant			//ça aussi
    {
    	information_composant info_composant;
    struct 	liste_composant* svt;
    }liste_composant;
     
     
     
     typedef struct noeud_compose // noeud de l'arbre des procedures
    {
    	int code_compose;
    	liste_composant* les_composants;
    	struct noeud_compose* fg;
    	struct noeud_compose* fd;
     
     
    }noeud_compose;
    typedef noeud_compose* procede;
    // fct qui ajoute la struct composant dans la liste chainée
    void ajouter_fin_liste_composant(liste_composant** l_c,information_composant c)
    {
    	liste_composant* temp=*l_c;
     
    	if (temp==NULL)
    	{
    		(*l_c)=(liste_composant*)malloc(sizeof(liste_composant*));
    		(*l_c)->info_composant=c;
    		(*l_c)->svt=NULL;
    	}
    	else
    	{
    		while(temp->svt!=NULL)
     
    		{temp=temp->svt;}
     
    		temp->svt=(liste_composant*)malloc(sizeof(liste_composant*));
    		temp->svt->info_composant=c;
    		temp->svt->svt=NULL;
    	}
    }
    //fct qui chagre le contenu du fichier
    noeud_compose* charger_fichier_procede(FILE* fichier_procede)
    {
    	noeud_compose* procede=NULL;
    	int x,code_compose,entre=vrai;
    	liste_composant *l_c=NULL;
    	information_composant composant;
    	char test[5],valeur[35];
    	assert(fichier_procede!=NULL);
    	do//tant que x=!EOF le scan du fichier continue
     
    	{
    	    x=fscanf(fichier_procede,"%s %s",&test,&valeur); // le probleme se    
                   //situe ici lorsque le prog passe de cette instruction au if
                   //composant.code_composant change de valeur et prend 0 !!!
    		if (strcmp(test,"code")==0 && strcmp(valeur,"compose")==0)
    		{
    			x=fscanf(fichier_procede,"%s",&valeur);
    			code_compose=atoi(valeur);// conversion en valeur                  
                                                                //numerique
     
    		}
     
    		else
    		{
    			do // lecture des caracteristiques des composant tant qu'on      
                                //n'a pas atteint la fin du fichier
    			{
    				entre=faux;
     
    				if (strcmp(test,"code")==0 &&  
                                      strcmp(valeur,"composant")==0)
    				{
    					x=fscanf(fichier_procede,"%s",&valeur);
    					composant.code_composant=atoi(valeur);
     
    					entre=vrai;
     
    				strcpy(test," ");// re-initialisation de test && valeur 
    				strcpy(valeur," ");
    				}
    				if (strcmp(test,"quantite")==0)
    				{
    					composant.qte=(float)atof(valeur);
     
     
     
    				entre=vrai;
    				strcpy(test," ");
    				strcpy(valeur," ");
    				}
    				if (strcmp(test,"code")==0 &&  strcmp(valeur,"section")==0)
    				{
    					x=fscanf(fichier_procede,"%s %s  %s",&valeur,&valeur,&valeur);
    					composant.code_section_usinage=atoi(valeur);
     
     
    					entre=vrai;
     
    					strcpy(test," ");
    					strcpy(valeur," ");
    				}
    				if ( strcmp(test,"temps")==0)
    				{
    					x=fscanf(fichier_procede,"%s%s",&valeur,&valeur);
     
                        composant.temps_integration_composant=atoi(valeur);
    					entre=vrai;
    					ajouter_fin_liste_composant(&l_c,composant);
                                                                  // ajout des caracteristiques   // dans la liste
    					strcpy(test," ");					
    					strcpy(valeur," ");										 
    				}
     
    			}
    			while (entre==vrai);
    		}
     
     
     
    	}	while(x!=EOF);
     
    	return (procede);// ici procede==NULL prcq je n'ai pas encore ecrit la //fct qui ajoute la liste dans l'arbre des procedes .
    }

  5. #25
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par isoman
    voila le code corrigé en C .
    Gné ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Compiling: main.c
    main.c: In function `charger_fichier_procede':
    main.c:76: warning: char format, different type arg (arg 3)
    main.c:76: warning: char format, different type arg (arg 4)
    main.c:81: warning: char format, different type arg (arg 3)
    main.c:97: warning: char format, different type arg (arg 3)
    main.c:117: warning: char format, different type arg (arg 3)
    main.c:117: warning: char format, different type arg (arg 4)
    main.c:117: warning: char format, different type arg (arg 5)
    main.c:128: warning: char format, different type arg (arg 3)
    main.c:128: warning: char format, different type arg (arg 4)
    9 warnings
    Et il n'y a pas de main()...

    Je n'ai jamais compris pourquoi ce genre de code (ajouter_fin_liste_composant() ) était aussi compliqué. Ceci suffit, 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
    22
    23
    24
    25
    26
     
    // fct qui ajoute la struct composant dans la liste chainée
    void ajouter_fin_liste_composant (liste_composant ** l_c,
                                      information_composant c)
    {
       liste_composant *temp = malloc (sizeof *temp);
       if (temp != NULL)
       {
          temp->info_composant = c;
          temp->svt = NULL;
     
          if (*l_c == NULL)
          {
             (*l_c) = temp;
          }
          else
          {
             liste_composant *p = *l_c;
             while (p->svt != NULL)
             {
                p = p->svt;
             }
             p->svt = temp;
          }
       }
    }

  6. #26
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    yep ta fonction est plus élegante mais mon compilo ne m'affiche pas de warnings (sauf le main() );

  7. #27
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par isoman
    mais mon compilo ne m'affiche pas de warnings (sauf le main() );
    On a déjà indiqué comment configurer correctement le compilateur...

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

  8. #28
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    et on fait comment pour le compilo de visual 6 ?

  9. #29
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par isoman
    et on fait comment pour le compilo de visual 6 ?
    Dans les preferences du projet (je ne me souviens plus exactement ou), il y a une variable nommee "niveau d'avertissement", par defaut elle est a 3 (le maximum etant 4).

  10. #30
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    merci

  11. #31
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    comme je l'ai dit un peu plus haut je la valeur de composant.code_composant prends 0 juste aprés le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x=fscanf(fichier_procede,"%s %s",test,valeur);
    je me suis dit que c'est peut etre fscanf qui buggue donc j'ai regradé dans l'index et voila ce que j'ai trouvé
    The fscanf function reads data from the current position of stream into the locations given by argument (if any). Each argument must be a pointer to a variable of a type that corresponds to a type specifier in format. format controls the interpretation of the input fields and has the same form and function as the format argument for scanf; see scanf for a description of format. If copying takes place between strings that overlap, the behavior is undefined.
    . Est ce que qlqn peut m'expliquer ce que veut dire overlap et pensez vous que fscanf est la cause du bug ,est ce qu'il y a une fct qui peut la remplacer facilement car j'avoue que si je vais la remplacer par des fgets ça va eter vraiment tres embêtant?
    merci

  12. #32
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par isoman
    comme je l'ai dit un peu plus haut je la valeur de composant.code_composant prends 0 juste aprés le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x=fscanf(fichier_procede,"%s %s",test,valeur);
    je me suis dit que c'est peut etre fscanf qui buggue
    Ca dépend comment sont définis test et valeur...

    overlap, c'est quand deux pointeurs pointent sur la même zone mémoire.

    Par exemple, ceci provoque un comportement indéterminé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char s[20];
       fscanf (file, "%s%s", s, s + 10);

  13. #33
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gl
    Dans les preferences du projet (je ne me souviens plus exactement ou), il y a une variable nommee "niveau d'avertissement", par defaut elle est a 3 (le maximum etant 4).
    Ca déclenche des warnings intéressants comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char *s = malloc(123);
       s = "hello";
    Warning : "double affectation" (de mémoire, je n'ai pas touché à VC6 depuis 10 ans)

    Mais pas l'analyse des chaines passées à *printf() et *scanf()...

    Mais rien n'empêche de vérifier son code avec gcc et de le compiler avec VC6... J'ai fait ça professionnellement pendant des années. gcc en mode parano etait mon 'vérificateur de code' et ensuite le compilais avec un compilateur C plus ou moins rustique pour la cible en question.

    Evidemment, il faut écrire du code le plus portable possible, sinon, les compilateurs s'affolent...

  14. #34
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ca déclenche des warnings intéressants comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char *s = malloc(123);
       s = "hello";
    Warning : "double affectation" (de mémoire, je n'ai pas touché à VC6 depuis 10 ans)

    Mais pas l'analyse des chaines passées à *printf() et *scanf()...
    Possibe, j'avoue ne plus me souvenir des controles ajoutes lors du passage en niveau 4.
    Il est effectivement fort possible que le controle des chaines passees a *printf() et *scanf() n'en fasse pas partie, d'une maniere generale, j'ai vu peu de compilateurs faire un controle correct des parametres de 9printf() et *scanf().

    Citation Envoyé par Emmanuel Delahaye
    Mais rien n'empêche de vérifier son code avec gcc et de le compiler avec VC6...
    D'une maniere generale, il est assez interessant, quand c'est possible, de compiler un meme code avec differents compilateurs (et differents reglages des compilateurs), ca permet d'assainir considerablement le code (l'ideal restant tout de meme le passage a un outil d'analyse de code du type de PClint)

  15. #35
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par isoman
    Est ce que qlqn peut m'expliquer ce que veut dire overlap
    Overlap en anglais signifie "recouvrement"...

    Donc, comme pour des tuiles... Là ça veut dire que ,comme l'a dit Emmanuel, 2 chaînes partagent un même endroit mémoire. Ce qu'ils disent c'est

    "si 2 chaînes ont été définies comme partageant un certain espace mémoire, le fait de faire un fscanf dans une des deux donne un résultat indéfini".

  16. #36
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    ok je vais re-ecrire la fct qui buggue par quelles fonctions est ce que je peux remplacer le fscanf ?

  17. #37
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut

    j'ai enfin trouvé la source du probleme , il fallait juste augmenter la taille du tableau test !!!!!!!!!!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/08/2014, 23h38
  2. Bug new build ??
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 31/01/2003, 10h30

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