Stack overflow, gdzie jest problem?

0

Witam. Piszę program do obliczania przybliżonej wartości liczby PI metodą Monte Carlo. Program ma jeszcze wykonać obraz w formacie .pgm przedstawiający tą metodę graficznie (piksele w kole czarne, piksele poza kołem szare, tło białe). Problem polega na tym, że program kompiluje sie normalnie lecz gdy go włączam Visual wyrzuca błąd że stos jest przepełniony. Niestety nie wiem gdzie jest ten problem w kodzie źródłowym.

 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "carlo.h"
#include <time.h>

void MonteCarlo ()
{
	FILE *plik;
	int a, x, y, i, p;
	int b=0;
	double pk, pi;
	int r=300;
	int tab[599][599];
	srand((unsigned int)time(NULL));

	printf ("Podaj ilosc punktow ktore maja zostac wylosowane:\n");
	scanf ("%i", &a);

	for(x=0; x<=599; x++)
	{
		for(y=0; y<=599; y++)
		{
			tab[x][y] == 2;
		}
	}

	for (i=0; i<=a; i++)
	{
		rand()%600 == x;
		rand()%600 == y;

		if((x-300)*(x-300) + (y-300)*(y-300) <= r*r)
		{
			tab[x][y] == 0;
			b++;

		}
		else
		{
			tab[x][y] == 1;
		}
	}

	p == 4*r*r;
	pk == p*(b/a);
	pi= pk/(r*r);

	printf("\nPrzyblizona wartosc liczby pi to %f\n", pi);

	plik = fopen("monte carlo.pgm","w");

	if(plik == NULL)
	{	
		printf("\n\n Blad otwarcia pliku! \n\n");
		exit(-1);
	}

	fprintf(plik, "P2\n");
	fprintf(plik,"# Comment #\n");
	fprintf(plik, "600 600\n");
	fprintf(plik, "2\n");

	for (x=0; x<=599; x++)
	{
		for (y=0; y<=599; y++) 
		{
			fprintf(plik,"%d ",tab[x][y]);
		} 
		fprintf(plik, "\n");
	}
	fclose(plik);
	return;
}
0

Odpal pod debugerem.

0

Tylko, że program od razu na starcie wywala ten błąd i debugger nie rusza.

0

A jak uruchamiasz tą funkcję? Zwyczajnie wołasz ją z maina?

0

Wywołuje ją tak:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "carlo.h"

int main()
{
	MonteCarlo ();
	system("pause");
	return 0;
}
 
0

static int tab[599][599];

0

Dzięki, teraz już nie ma błędu o stosie. Jest jakiś inny błąd, wyrzuca "The variable 'pk' is being used without being initialized."

0

Zmieniłem znak "=" przy pk na "==" i teraz ten sam błąd wychodzi mi odnośnie zmiennej pi.

1

Co to ma robić?

for(y=0; y<=599; y++)
{
    tab[x][y] == 2;
}

Albo to?

rand()%600 == x;
rand()%600 == y;

Rozumiesz różnicę między porównaniem a przypisaniem? Patrząc na to raczej nie:

p == 4*r*r; // tu powinno byc przypisanie...
pk == p*(b/a); // ...tak jak i tutaj
pi= pk/(r*r);

I tak jeszcze w wielu miejscach.

Ponadto masz wszędzie off-by-one error – tablica ma 599 wierszy i kolumn, numerowanych od 0 do 598. A tymczasem iterujesz sobie do 599 i przekraczasz zakres.

1

przy p też zmieniłeś na = ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1