Why does not my program is not running?
Unknow via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Aug 20 14:29:14 PDT 2015
On Thursday, 20 August 2015 at 21:10:27 UTC, Steven Schveighoffer
wrote:
> 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
Thanks a lot of! Im new to D lang.
More information about the Digitalmars-d-learn
mailing list