Segment violation (was Re: Why I could not cast string to int?)
xancorreu
xancorreu at gmail.com
Thu Feb 2 11:04:55 PST 2012
Al 02/02/12 19:30, En/na bearophile ha escrit:
> xancorreu:
>
>> I get "segment violation" error with ./factorial 400000
>> How can I resolve it?
> You are having a stack overflow. DMD currently doesn't print a good message because of this regression that is being worked on:
> http://d.puremagic.com/issues/show_bug.cgi?id=6088
>
> On Windows with DMD you increase the stack like this:
> dmd -L/STACK:100000000 -run test2.d 400000> result.txt
>
> If it goes in overflow still, increase the stack some more. But it will take a long time to compute the result even with the latest 2.058head with improved GC because the algorithm you have used to compute the factorial is very bad.
>
>
> I have rewritten your code like this:
>
> import std.stdio, std.bigint, std.conv, std.exception;
>
> BigInt recFactorial(in int n) {
> if (n == 0)
> return BigInt(1);
> else
> return BigInt(n) * recFactorial(n - 1);
> }
>
> void main(string[] args) {
> if (args.length != 2) {
> writeln("Factorial requires a number.");
> } else {
> try {
> writeln(recFactorial(to!int(args[1])));
> } catch (ConvException e) {
> writeln("Error");
> }
> }
> }
>
>
> Note the usage of ConvException, it's a very good practice to never use a generic "gotta catch them all" expression, because it leads to hiding other bugs in your code, and this is a source for troubles.
>
> Bye,
> bearophile
Thank you very much for recode this. But you "only" put a "in" in
recFactorial function argument. What this mean? **Why** this is more
efficient than mine?
For the other hand, how can increase the stack in linux?
Thanks,
Xan.
More information about the Digitalmars-d-learn
mailing list