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

Powiększająca się tablica, crash

Ostatnio zmodyfikowano 2016-11-08 20:23
Autor Wiadomość
Szustarol
Temat założony przez niniejszego użytkownika
Powiększająca się tablica, crash
» 2016-11-07 19:20:18
Witam!
Chciałem sobie zrobić powiększająca się tablicę, o tak:
C/C++
#include <iostream>

using namespace std;

int main() {
    int * temp, * out, siz, input;
    siz = 0;
    cout << "Podaj liczby, podanie \"nie-liczby\" zatrzyma opcje podawania" << endl;
    for(;; ) {
        cout << "Podaj liczbe:" << endl;
        cin >> input;
        if( cin.bad() || cin.fail() )
             break;
       
        for( int i = 0; i < siz; i++ ) {
            if( i == 0 ) {
                delete out;
                int * out = new int[ siz ];
            }
            *( out + i ) = *( temp + i );
        }
        delete temp;
        siz++;
        int * temp = new int[ siz ];
        for( int i = 0; i <= siz; i++ ) {
            if( i < siz ) {
                *( temp + i ) = *( out + i );
            }
            else
                 *( temp + i ) = input;
           
        }
        cin.clear();
        cin.sync();
    }
    cout << endl << endl << endl << "Nastapi teraz wypisanie podanych liczb." << endl;
    for( int i = 0; i < siz; i++ ) {
        cout << i + 1 << " element tablicy to: " << *( out + i ) << "." << endl;
    }
}
ale niestety to się crashuje, nie mogę dojść dlaczego, wszystko wygląda okej
P-153452
mateczek
» 2016-11-07 19:33:50
kasujesz zerowe tablice zanim je w ogóle utworzyłeś.
próbujesz pisać coś do jeszcze nieutworzonych tablic itp itd.

przykład:
C/C++
delete temp; //kasujesz tablice jeszcze nawet nie stworzoną
siz++;
int * temp = new int[ siz ]; //tu ją dopiero tworzysz
P-153454
Szustarol
Temat założony przez niniejszego użytkownika
» 2016-11-07 21:20:25
C/C++
#include <iostream>

using namespace std;

int main() {
    int * temp = new int;
    int * out = new int;
    int siz, input;
    siz = 0;
    cout << "Podaj liczby, podanie \"nie-liczby\" zatrzyma opcje podawania" << endl;
    for(;; ) {
        cout << "Podaj liczbe:" << endl;
        cin >> input;
        if( cin.bad() || cin.fail() )
             break;
       
        for( int i = 0; i < siz; i++ ) {
            if( i == 0 ) {
                delete out;
                int * out = new int[ siz ];
            }
            *( out + i ) = *( temp + i );
        }
        delete temp;
        siz++;
        int * temp = new int[ siz ];
        for( int i = 0; i <= siz; i++ ) {
            if( i < siz ) {
                *( temp + i ) = *( out + i );
            }
            else
                 *( temp + i ) = input;
           
        }
        cin.clear();
        cin.sync();
    }
    cout << endl << endl << endl << "Nastapi teraz wypisanie podanych liczb." << endl;
    for( int i = 0; i < siz; i++ ) {
        cout << i + 1 << " element tablicy to: " << *( out + i ) << "." << endl;
    }
}
mam teraz cos takiego, ale wszystkie wartosci sa rowne zero, dlaczego?
poza tym czy da sie skierowac pointer na nowego inta osobno?
chcialbym zamiast
int *temp = new int;
int * temp;
*temp = new int;
ale sie nie da
P-153461
Rashmistrz
» 2016-11-07 21:31:27
Nie potrafię pojąć co to się dzieje. Co tu zachodzi
i jaki wpływ ma na to przysłanianie zmiennych?
C/C++
int main() {
    int * temp, * out, siz, input;
    //...
gdzieś dalej:
C/C++
delete temp;
siz++;
int * temp = new int[ siz ];

Nie podoba mi się jedno.
Jeśli wystarczająco dobrze się wczytałem,
to tworzysz tablicę pod jeden element,
tworzysz tablicę o jeden element większą
i kopiujesz starą do nowej dodając input.
BTW. Wyciągnij pierwszy krok przed pętlę.

Według mnie to nie jest dobry sposób
na gromadzenie nieznanej liczby liczb.

OFFTOP:
Zerknij na ten swój temat. Coś dopisałem:
[fasm]Sektor nie jest wczytywany

EDIT:
chcialbym zamiast
int * temp = new int;
C/C++
int * temp;
* temp = new int;
ale sie nie da
Nie masz wyłuskiwać wskaźnika i przypisywać do jego wartości,
a tylko przypisać wskaźnik do zmiennej wskaźnikowej...
Zamiast
* temp = new int;
.
Uzyj
temp = new int;
.
P-153463
Szustarol
Temat założony przez niniejszego użytkownika
» 2016-11-07 21:44:22
Poprawiłem to co powiedziałeś z tym wyciągnięciem przed pętle, faktycznie nie pomyślałem.
Poza tym, tworzę te zmienne na początku abym mógł je usunąć bez błędu


Co do offtopu, po prostu uzyłem extended write i działa jak nigdy wcześniej :D
P-153465
carlosmay
» 2016-11-07 22:04:44
Chciałem sobie zrobić powiększająca się tablicę
Dlaczego nie std::vector<> bądź std::unique_ptr<>?
P-153466
Szustarol
Temat założony przez niniejszego użytkownika
» 2016-11-07 22:12:57
bo chce wiedziec jak to działa
P-153467
Rashmistrz
» 2016-11-07 22:14:38
Poza tym, tworzę te zmienne na początku abym mógł je usunąć bez błędu.
Ale mnie zastanawia ta podwójna deklaracja:
int * temp, * out, siz, input;
.
// potem gdzieś dalej:
int * temp = new int[ siz ];
.
// Masz dwa int * temp!
P-153468
« 1 » 2
  Strona 1 z 2 Następna strona