Page 1 of 2

dfs

Posted: 28 Mar 2013, 12:33
by kristapuciitis
Sveiki!
Vai tas ir normāli ka šāds koda gabals nokrešo, kad d ir ap 4700?

Code: Select all

#include <iostream>

void dfs(int d)
{
	if (d < 5000)
		dfs(d+1);
};

int main()
{
	dfs(0);
	return 0;
};
Man šķiet, ka šī ir pārāk maza vērtība priekš stack overflow. Ja tā ir pārāk maza vērtība, tad kur ir problēma?

Re: dfs

Posted: 28 Mar 2013, 15:34
by vecais_dumais_laacis
atkariigs no stacka :D

Re: dfs

Posted: 28 Mar 2013, 16:05
by kovacs
tīri interesei- ja tu nodod 2us int parametrus tad nokrašo 2x ātrāk? :roll:

par kādu os/kompilatoru ir runa?

ps. "nokrašo" ar tieši kādu error, btw? Man domāt stack overflow gadījumos, parasti programmas pasaka "stack overflow"...

Re: dfs

Posted: 29 Mar 2013, 16:07
by kristapuciitis
Ja padod vienu parametru, tad stack overflow ir pie 4800, bet, ja divus, tad pie 4700. Es izmantoju VC++ 2010. Nu jā, ja palaiž ar debug, tad rāda, ka ir stack overflow.

Re: dfs

Posted: 30 Mar 2013, 04:54
by Arrovs
Tā ir ļoti maza vērtība. Līdz man programma avarē tā izpilda aptuveni 2+miljonus iterāciju.
Bet varbūt VC rūpējas par to laicīgi. Neesu testējis.

Re: dfs

Posted: 02 Apr 2013, 14:17
by kovacs
moš pamēģini izrubīt optimizāciju, iespējams kompilators pārcenšas ar kaut kādām pārgudrībām.

Re: dfs

Posted: 02 Apr 2013, 17:41
by spicausis
msvc 2010 steka noklusētais izmērs ir 1 megabaits, overflows ir ok.

Re: dfs

Posted: 02 Apr 2013, 21:46
by bubu
Lai overflows notiku uz 4700 iterācijām, tad katram steka freimam būtu jābūt 1MB/4700 = ~220 baiti. Kas pat debug modē ir diezgan liela vērtība šādai dfs funkcijai.

Re: dfs

Posted: 03 Apr 2013, 00:58
by elvman
bubu wrote:Lai overflows notiku uz 4700 iterācijām, tad katram steka freimam būtu jābūt 1MB/4700 = ~220 baiti. Kas pat debug modē ir diezgan liela vērtība šādai dfs funkcijai.
Praktiski visiem kompilatoriem (ieskaitot Visual Studio) stack'a izmēru var mainīt, iespējams tas ir šis gadījums (daudz mazāks par 1MB?).

Re: dfs

Posted: 03 Apr 2013, 06:18
by bubu
Kad pēdējo reizi tu esi mainījis projekta uzstādījumos defaultā steka izmēru uz mazāku un pēc tam brīnījies, kāpēc rekursija neiet pietiekami dziļi? :)