OVH Cloud OVH Cloud

Etrange comportement

6 réponses
Avatar
Triaxx
Voilà un code que j'ai déjà posté plusieurs fois ici.
J'ai essayé d'améliorer en suivant vos conseils, c'est surement encore
imparfait.
A la fin, dans le main, j'ai voulu encadré mes trois printf par des
lignes comme cela : printf ("---------------------------------------\n);
pour faire une sorte de cadre. Et bien, lorsque je lance le programme et
que je choisis 't', erreur de segmentation alors que sans ces ligens
(apparament sans aucun intéret), ça marche parfaitement.

----------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>

static int rand_increment = 1;

static int Nb_Tirages;

void Saisie (void)
{
FILE *fichier;

char tmp[2];

int i;

fichier = fopen ("tirages.dat", "a");

if(fichier == NULL)
{
printf ("ERREUR : impossible d'ouvrir le fichier.\n");
}

else
{
for(i = 0; i < 15; i++)
{
scanf ("%2s", tmp);

fputc (tmp[0], fichier);

if(tmp[1] != 0)

fputc (tmp[1], fichier);

if(i < 14)

fputc ('-', fichier);

if(i == 14)

fputc ('\n', fichier);
}

fclose (fichier);
}
}

void Lecture (int grille[])
{
FILE *fichier;

char tmp[2],
c;

int i;

Nb_Tirages = 0;

for(i = 0; i < 56; i++)
{
grille[i] = 0;
}

fichier = fopen ("tirages.dat", "r");

if(fichier == NULL)
{
printf ("ERREUR : impossible d'ouvrir le fichier.\n");
}

else
{
i = 0;

while((c = fgetc (fichier)) != EOF)
{
if(c != '-' && c != '\n')
{
tmp[i] = c;

i++;
}

else
{
i = 0;

grille[(atoi (tmp))-1]++;

tmp[0] = 0;
tmp[1] = 0;
}

if(c == '\n')
{
Nb_Tirages++;
}
}
}

fclose (fichier);
}

int Aleatoire ()
{
int rand_num;

srand (time(0) * rand_increment);

rand_num = (int) (2.0*rand()/(RAND_MAX+1.0));

rand_increment++;

return rand_num;
}

void Affichage (int grille[])
{
struct combi {
int chiffre[10];
int sortie[10];
} Combi;

int i,
j,
tmp_chiffre,
tmp_sortie,
tmp;

for(i = 0; i < 10; i++)
{
Combi.chiffre[i] = 0;
Combi.sortie[i] = 0;
}

printf ("\n");

for(i = 0; i < 10; i++)
{
tmp_sortie = 0;

for(j = 0; j < 56; j++)
{
if(grille[j] > tmp_sortie || (grille[j] == tmp_sortie && Aleatoire ()))
{
tmp_sortie = grille[j];

tmp_chiffre = j+1;
}
}

Combi.chiffre[i] = tmp_chiffre; /* A la fin de la boucle, tmp_chiffre
est le nombre le plus sortie */

Combi.sortie[i] = tmp_sortie;

grille[tmp_chiffre-1] = INT_MIN;
}

for(i = 0; i < 10; i++)
{
for(j = 0; j < 10; j++)
{
if(Combi.chiffre[j] > Combi.chiffre[i])
{
tmp = Combi.chiffre[i];

Combi.chiffre[i] = Combi.chiffre[j];

Combi.chiffre[j] = tmp;

tmp = Combi.sortie[i];

Combi.sortie[i] = Combi.sortie[j];

Combi.sortie[j] = tmp;
}
}
}

printf ("Nombre de tirages : %d\n\n", Nb_Tirages);

for(i = 0; i < 10; i++)
{
printf ("%d(%d)", Combi.chiffre[i], Combi.sortie[i]);

if(i < 9)
{
printf ("-");
}

if(i == 9)
{
printf ("\n\n");
}
}
}

void Optirage ()
{
int grille[56];

Lecture (grille);

Affichage (grille);
}

int main ()
{
char selection;

printf ("OpTirage 0.0.1 (développement)\n\n");

do
{

printf ("- Saisir un tirage (s)\n");
printf ("- Trouver le meilleur tirage (t)\n");
printf ("- Quitter (q)\n");

scanf (" %c", &selection);

switch(selection)
{
case 's' : Saisie ();
break;

case 't' : Optirage ();
break;

case 'q' : return EXIT_SUCCESS;

default : break;
}
}
while(selection != 'q');

return EXIT_SUCCESS;
}

6 réponses

Avatar
thibault volpert
Triaxx wrote:


void Lecture (int grille[])
{
FILE *fichier;



[Code sniped]

fichier = fopen ("tirages.dat", "r");

if(fichier == NULL)
{
printf ("ERREUR : impossible d'ouvrir le fichier.n");
}

else
{
i = 0;


[Code sniped]


}

fclose (fichier);
}



Peut etre une piste :

Dans la fct Lecture() tu fermes le fichier meme si
fichier==NULL.

--
Thibault Volpert

Avatar
Olivier Aumage
Triaxx writes:

void Lecture (int grille[])
{
FILE *fichier;

char tmp[2],
c;

[snip]

while((c = fgetc (fichier)) != EOF)
{
if(c != '-' && c != 'n')
[snip]
else
{
i = 0;

grille[(atoi (tmp))-1]++;

tmp[0] = 0;
tmp[1] = 0;
}
}
}


[snip]

}


La fonction 'atoi' attend une chaîne de caractères, donc une suite de
'char' terminée par un caractère nul (''). Dans l'extrait de ton
exemple ci-dessus, à la première itération, le tableau 'tmp' n'est pas
initialisé donc la chaîne ne contient probablement pas de 0 terminal.

C'est une cause possible de ton problème.

De plus, ton programme contient une faille de sécurité car tu ne
contrôle pas que la variable 'i' ne dépasse pas la capacité du tableau
'tmp'.

--
Olivier


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', thibault volpert wrote:

Dans la fct Lecture() tu fermes le fichier meme si
fichier==NULL.


C'est pas un problème.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
thibault volpert
Emmanuel Delahaye wrote:

In 'fr.comp.lang.c', thibault volpert wrote:

Dans la fct Lecture() tu fermes le fichier meme si
fichier==NULL.


C'est pas un problème.



Tu veux dire que fclose(NULL) est legal ?

Cela me semblerai logique puisque fopen()
est succeptible de renvoyer un pointeur NULL.
Cela cree un segmetation fault avec gcc
sur Linux, Du coup j'ai pris l'habitude de
ne jamais faire de fclose() si le fopen() a echoue.
J'ai pas raison ?

--
Thibault Volpert


Avatar
Éric Lévénez
Le 31/07/03 11:10, dans , « thibault
volpert » a écrit :

Emmanuel Delahaye wrote:

In 'fr.comp.lang.c', thibault volpert wrote:

Dans la fct Lecture() tu fermes le fichier meme si
fichier==NULL.


C'est pas un problème.



Tu veux dire que fclose(NULL) est legal ?


Non. Il confond avec free.

Cela me semblerai logique puisque fopen()
est succeptible de renvoyer un pointeur NULL.
Cela cree un segmetation fault avec gcc
sur Linux, Du coup j'ai pris l'habitude de
ne jamais faire de fclose() si le fopen() a echoue.
J'ai pas raison ?


Oui, totalement.

--
Éric Lévénez -- <http://www.levenez.com>
Unix is not only an OS, it's a way of life.



Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Éric Lévénez wrote:

Tu veux dire que fclose(NULL) est legal ?


Non. Il confond avec free.


Exact.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/