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

[C++] program się kompiluje, ale zaraz potem informacja Windowsa: "Program przestał działać"

Ostatnio zmodyfikowano 2013-11-12 22:32
Autor Wiadomość
k44tajemnicza
Temat założony przez niniejszego użytkownika
[C++] program się kompiluje, ale zaraz potem informacja Windowsa: "Program przestał działać"
» 2013-11-11 22:47:02
Uprzedzam, że jestem początkującą w temacie c++ :)
Program, z którym mam problem:


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

using namespace std;

int main( int argc, char * argv[] ) {
   
    double x =* argv[ 1 ];
    double b =* argv[ 2 ];
   
    double * t = new double[( int ) x ];
   
    int j = 0;
    int * p =& j;
    double reszta;
    int * iloraz;
   
    for( int i = 0; x; ) {
        reszta = remquo( x, b, iloraz );
        t[ i ] = reszta;
        x =* iloraz;
        j++;
    }
   
    int z =* p;
   
    for( int i = z; i > 0; i-- )
         cout << t[ i - 1 ] << endl;
   
    delete[] t;
   
}

Jeśli to przeczytałeś, to dziękuję za poświęcony czas :)[/i]
P-96097
Mrovqa
» 2013-11-11 23:25:17
C/C++
double x =* argv[ 1 ];
double b =* argv[ 2 ];
1. Odwołujesz się do elementów w tablicy nie sprawdzając ile ich jest (to prawdopodobnie powoduje crasha).
2. argv jest tablicą stringów. Przy odwołaniu argv[x] otrzymujesz string, po czym pobierasz jego zerowy znak przy pomocy gwiazdki (tablice indeksujemy od zera!), a więc do zmiennej double przypisujesz kod ASCII danego znaku.

C/C++
int j = 0;
int * p =& j;

//...

int z =* p;

for( int i = z; i > 0; i-- )
     cout << t[ i - 1 ] << endl;

W między czasie nie modyfikujesz zmiennej j, na którą wskazuje wskaźnik p. Do zmiennej z później przypisujesz to, na co wskazuje owy wskaźnik, czyli 0. Warunek pętli za pierwszym razem wygląda więc tak: 0>0, a więc fałsz.

Polecam zacząć od podstaw i nie gonić do przodu, tylko cierpliwie próbować zrozumieć wszystko po kolei.
P-96099
k44tajemnicza
Temat założony przez niniejszego użytkownika
» 2013-11-12 08:50:26
Dziękuję :)

W ramach poprawki pod mainem wpisałam:
C/C++
int m1, n1;
int * m =& m1;
int * n =& n1;

int i = argc;
cout << i << endl;

if( argc >= 2 ) {
    char m2 =* argv[ 0 ];
    char n2 =* argv[ 1 ];
    double m1 = m2 - '0';
    double n1 = n2 - '0';
}

double x =* m;
int b =* n;
W kwestii j: inkrementuję go w pętli for:
C/C++
for( int i = 0; x; ) {
    reszta = remquo( x, b, iloraz );
    t[ i ] = reszta;
    x =* iloraz;
    j++;
}
P-96103
Monika90
» 2013-11-12 09:13:42
C/C++
int * iloraz;
reszta = remquo( x, b, iloraz );
iloraz to niezainicjalizowany wskaźnik, wywołanie remquo z takim wskaźnikiem wywala program.
W ogóle w nieprawidłowy sposób używasz prametrów wyjściowych (czyli 3-go parametru remquo), powinno być:
C/C++
int iloraz;
reszta = remquo( x, b, & iloraz );
Tzn, zamiast * w deklaracji powinno być & w wywołaniu.

Poza tym, warunek w pętli for jest bez sensu.
P-96104
k44tajemnicza
Temat założony przez niniejszego użytkownika
» 2013-11-12 22:32:58
Cześć, dziękuję za te uwagi:)

Co do warunku w pętli for - jeśli x jest 0, to jest fałszem, co kończy pętlę (pomysł wzięty z wykładu).
P-96159
« 1 »
  Strona 1 z 1