On 8/20/15 4:31 PM, Unknow wrote:
module main;

import std.file;
import std.conv;

long factorial(long i){
     if (i == 0){
         return 1;
     }else{
         return(i * factorial(i-1));
     }
}

Note, this is not going to work. At 21!, long will run out of bits.

From https://en.wikipedia.org/wiki/Factorial, 100! is 9.332621544×10^157, requiring 157 *decimal* digits, not to mention the base-2 digits that would be required.


void main(string[] args){
     real *e; e = new real; *e = 0; long *integer; integer = new long;
*integer = 1;

There is no need for this, you are making pointers from everything, just declare the variables:

real e = 0;
long integer = 1;


     for(; *integer <= 100; *integer++){

And here is why you crash. *integer++ means return the value currently pointed at by integer, then increment the POINTER by one. This points at some garbage memory (on my system, it happens to be zeroed, so it didn't crash).

Not using pointers will help a lot in this code.

         *e = (*e) + (*integer / factorial(*integer));

The second portion of this calculation is INTEGER math, which means except for 1 / 1, it's going to be 0. What you want is (with new style that doesn't use pointers):

e = e + (real(integer) / factorial(integer));

The real(...) casts the result to a real before continuing.

     }
     if(exists("e") != 0)
     {
         std.file.write("e", to!string(*e));

Just want to confirm here, you are writing e only if it *already exists*?

     }else{
         //...
     }
     delete(e); delete(integer);

Without pointers, you would remove these. In addition, you do not need to delete pointers even if you did use them -- D is garbage collected.

}

-Steve

Reply via email to