Process terminated with status -1073741819

Résolu
zakarib -  
 zakarib -
Bonjour,
j'ai besoin de votre aide svp. Voilà je suis un débutant en C j'ai voulu écrire un petit programme qui donne une approximation de Pi, mais lors de l'exécution j'ai ce message là "Process terminated with status -1073741819" alors que la compilation c'est bien passé. voilà mon code si ça peut aider: (je le message dès qu je donne le nombre de points c'est à dire à la premiere etape). merci d'avance


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

double dist(double x, double y)
{
double z=0;
z=sqrt( (x)*(x) + (y)*(y) );
return z;
}

int main(void)
{
int n=0;
int i,nb=0;
double x=0,y=0;
printf("donnez un nombre de points : ");
scanf("%d",n);
srand(time(NULL));
for (i=0;i<n;i++) {
x=rand()/(RAND_MAX + 1.0);
y=rand()/(RAND_MAX + 1.0);
if (dist(x,y)<=1) nb++;
};
printf("le nombre Pi est egale à : %lf ",4*(nb/n));
return 0;
}


A voir également:

2 réponses

KX Messages postés 19031 Statut Modérateur 3 020
 
Tu dois écrire : scanf("%d",&n);

Attention aussi à ton nb/n, car nb et n sont des entiers donc le résultat donnera toujours 0 puisque n>nb, il faudrait convertit la division en réels : 4.0*nb/n

De plus pourquoi faire rand()/(RAND_MAX+1.0) ?
Si tu veux un nombre entre 0 et 1, rand()/RAND_MAX suffit, mais attention, même remarque que pour nb/n, rand() et RAND_MAX sont des entiers, alors que tu as besoin d'une division de réels !

Remarque : ton test sqrt((x)*(x)+(y)*(y))<=1 peut se simplifier en x*x+y*y<=1, la racine carrée est totalement inutile ici !

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

int main()
{
	int i,n,nb;
	double x,y;
	
	srand(time(NULL));
	
	printf("donnez un nombre de points : ");
	scanf("%d",&n);
	
	for (i=0, nb=0; i<n; i++)
	{ 
		x = (double) rand()/RAND_MAX; 
		y = (double) rand()/RAND_MAX; 
		
		if (x*x+y*y <= 1)
			nb++;
	}
	
	printf("le nombre Pi est environ egal a : %f ",4.0*nb/n);
	
	return 0; 
} 

PS. Cette approximation de Pi est marrante, mais elle est loin d'être performante !
0
zakarib
 
merci pour les justement...
PS : oui ta raison l'approximation est peu performante mon but c'est l'écriture en C pas la recherche d'une bonne approximation, quoique on arrive à une bonne approximation avec seulment 1000 points ce qui est déjà bien :)
0
KX Messages postés 19031 Statut Modérateur 3 020
 
"on arrive à une bonne approximation avec seulment 1000 ce qui est déjà bien"
Avec n=1000 on arrive à des résultats entre 3.04 et 3.23, ce n'est pas du tout ce que j'appelle une bonne approximation. Pour information, les meilleurs algorithmes (que je connaisse) doublent le nombre de décimales exactes à chaque itération, c'est à dire que pour n=30, on connait plus de 1 milliards de chiffres après la virgule ! Alors je te laisse imaginer ce que ça donne pour n=1000, et compare avec ton algorithme ;-)
0
walidovich_85 Messages postés 698 Statut Membre 73
 
bonsoir,

je suis pas un bon programmeur en C, mais, en effet, la compilation se passe sans problème, mais quand à l'exécution, le programme se plante quand on donne l'entier n.

alors, on peut déduire que c'est une erreur programme et pas environnement.
-1
walidovich_85 Messages postés 698 Statut Membre 73
 
cependant, quand je debugge le programme, le message suivant s'est affiché (aprés assigner la valeur n):
"Warning: Une violation d'accés (erreur de segmentation) est apparue dans votre programme."

je pense que ça devrait nous aider à comprendre l'erruer
0
zakarib
 
au fait j'ai trouver où est le blm, en effet le scanf prend en argument une adresse donc il y avait bien un prolème après l'assignation de n....
0
walidovich_85 Messages postés 698 Statut Membre 73
 
scanf("%d",&&&&&&&&&&&&n);
mais, le résultat est tjrs null !!!!
0
zakarib
 
oui, en effet comme l'a signalé KX le rapport (nb/n) est de type int donc il faut forcer la conversion en double et là ça devrait marcher...
0