Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Złe dane w wyniku alokowania pamięci dynamicznie

Ostatnio zmodyfikowano 2016-11-25 22:16
Autor Wiadomość
Mateusz99
Temat założony przez niniejszego użytkownika
Złe dane w wyniku alokowania pamięci dynamicznie
» 2016-11-25 22:16:46
Mój problem polega na tym, że kiedy próbuje liczyć silnie przy pomocy tablicy alokowanej dynamicznie wyższe wartośći np 22! są ujemne, a drugi mój problem to zapis *(pt+1) który rzekomo jest równoważny z pt[1] nie rozumiem czemu w takim razie przy użyciu tego zapisu program kompletnie wariował i np 2! wyświetlał jako wartość w milionach.

C/C++
#include <iostream>
#include <vector>

using namespace std;

int main( int argc, const char * argv[] ) {
   
    int size;
    cout << "Wprowadz z ilu liczb chcesz obliczyc silnie: ";
    do {
        cin >> size;
        if( size > 51 ) {
            cout << "Silnia zbyt duza na typ long long." << endl;
            cout << "Wprowadz z ilu liczb chcesz obliczyc silnie: ";
            continue;
        }
    } while( size > 51 );
   
    vector < unsigned long long > silnia( size );
   
   
   
    //Wyliczenie silni
    if( size > 0 ) {
        silnia[ 0 ] = silnia[ 1 ] = 1LL;
       
        for( int i = 2; i < size; i++ ) {
            silnia[ i ] = i * silnia[ i - 1 ];
        }
        //Wypisanie
        for( int i = 0; i < size; i++ ) {
            cout << i << "! = " << silnia[ i ] << endl;
        }
    }
   
    // z alokacja dynamiczna
    cout << "Wprowadz z ilu liczb chcesz obliczyc silnie(dynamiczna alokacja): ";
    do {
        cin >> size;
        if( size > 51 ) {
            cout << "Silnia zbyt duza na typ long long." << endl;
            cout << "Wprowadz z ilu liczb chcesz obliczyc silnie: ";
            continue;
        }
    } while( size > 51 );
   
    long long * pt = new long long[ size ];
   
    if( size > 0 ) {
        pt[ 0 ] = pt[ 1 ] = 1LL;
        for( int i = 2; i < size; i++ ) {
            pt[ i ] = i * pt[ i - 1 ];
        }
        //Wypisanie
        for( int i = 0; i < size; i++ ) {
            cout << i << "! = " << pt[ i ] << endl;
        }
    }
   
    delete[] pt;
   
    return 0;
}

A tu wynik programu:
Wprowadz z ilu liczb chcesz obliczyc silnie: 51
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 14197454024290336768
22! = 17196083355034583040
23! = 8128291617894825984
24! = 10611558092380307456
25! = 7034535277573963776
26! = 16877220553537093632
27! = 12963097176472289280
28! = 12478583540742619136
29! = 11390785281054474240
30! = 9682165104862298112
31! = 4999213071378415616
32! = 12400865694432886784
33! = 3400198294675128320
34! = 4926277576697053184
35! = 6399018521010896896
36! = 9003737871877668864
37! = 1096907932701818880
38! = 4789013295250014208
39! = 2304077777655037952
40! = 18376134811363311616
41! = 15551764317513711616
42! = 7538058755741581312
43! = 10541877243825618944
44! = 2673996885588443136
45! = 9649395409222631424
46! = 1150331055211806720
47! = 17172071447535812608
48! = 12602690238498734080
49! = 8789267254022766592
50! = 15188249005818642432
Wprowadz z ilu liczb chcesz obliczyc silnie(dynamiczna alokacja): 51
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = -4249290049419214848
22! = -1250660718674968576
23! = 8128291617894825984
24! = -7835185981329244160
25! = 7034535277573963776
26! = -1569523520172457984
27! = -5483646897237262336
28! = -5968160532966932480
29! = -7055958792655077376
30! = -8764578968847253504
31! = 4999213071378415616
32! = -6045878379276664832
33! = 3400198294675128320
34! = 4926277576697053184
35! = 6399018521010896896
36! = 9003737871877668864
37! = 1096907932701818880
38! = 4789013295250014208
39! = 2304077777655037952
40! = -70609262346240000
41! = -2894979756195840000
42! = 7538058755741581312
43! = -7904866829883932672
44! = 2673996885588443136
45! = -8797348664486920192
46! = 1150331055211806720
47! = -1274672626173739008
48! = -5844053835210817536
49! = 8789267254022766592
50! = -3258495067890909184
Program ended with exit code: 0

EDIT: Użyłem climits i zauważyłem, że od któregoś momentu silnia wykracza po za zakres long long. A pozatym w vectorze użyty jest typ unsigned long long. Temat do zamknięcia.
P-154138
« 1 »
  Strona 1 z 1