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 = ?

0

Faktycznie, rincewind ma racje. Zmieniałem funkcje i teraz jest tak, tylko że sie nie kompiluje bo Visual podkreśla mi rand tam gdzie jest rand()%600 = x i w rand()%600 = y. W tym miejscu chce losować wartość nie większą niż 600 i przypisać ją do zmiennej x i drugą wylosowaną do zmiennej y by wybrać losową "komórkę" tablicy mniejszą bądź równą okręgowi (sprawdzam to w ifce tam gdzie jest x2 + y2 <= r^2).

 
#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;
	static int tab[600][600];
	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

Jeśli chodzi o to miejsce to chciałem wpisać w każdą komórkę tablicy wartość 2 (białe tło).

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

Dalej w wylosowane miejsca chce wpisać albo wartość 1 jeśli wylosowana komórka jest poza okręgiem albo 0 jeśli jest w okręgu oraz na jego krawędzi. Wybaczcie moję głupie błędy i problemy z programem, dopiero zaczynam programować.

0
 
#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;
	int b=0;
	long float pi;
	int r=300;
	static int tab[600][600];
	srand((unsigned int)time(NULL));

	printf ("Podaj ilosc punktow ktore maja zostac wylosowane (nie wiecej niz 360 000):\n");
	scanf ("%d", &a);

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

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

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

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

	pi = ((4*(float)b)/(float)a);

	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);

	printf("\n\nObraz zostal wygenerowany\n\n");
	return;
}
0

Srry, jednak Wszystko działa bezbłędnie. Dziękuje wszystkim za pomoc.

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