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
» 2016-11-07 22:26:39
ale przeciez jeden usuwam wczesniej delete temp
P-153469
mateczek
» 2016-11-07 23:41:40
kod raczej do przepisania na nowo.
C/C++
//tworzenie tablicy
int * tab = new[ rozmiar ];
//kasowanie tablicy
delete[] tab;
//dla pewności po skasowaniu zawsze można użyć
tab = nullptr; //samo delete zwalnia pamięć ale wskaźnik jest żywy

Jak chcesz używać, to dołączę się do poprzedników i  polecam std::vector.
Jak chcesz napisać, to coś na wzór vectora. Czyli minimum klasa, a najlepiej szablon

C/C++
#include <iostream>

class mTablica {
    int rozmiar; //rozmiar zaalokowanej pamięci(wielokrotność "base")
    int indexZapelneienia; //ile elementów jest w tablicy
    int * tab;
    int base = 10; //zaraz po utworzeniu tablica będzie miała base=10 elementów. Realokacja o kolejne 10 elementów nastąpi gdy będziemy chcieli zapisać 11 element
public:
    mTablica() {
        tab = new int[ base ];
        rozmiar = base;
        indexZapelneienia = 0;
    }
    ~mTablica() {
        delete[] tab;
    }
    //funkcje do komunikacji z klasą
    void pusback( int element ); //dodajemy element
    int & operator []( int index ); //zmieniamy lub odczytujemy element o znanym indexie - przeładowany operator
    int size() { return indexZapelneienia; } //funkcja zwraca rozmiar(zajętość, liczbę elementów) tablicy
   
};

//odkładanie elementu do tablicy
void mTablica::pusback( int element ) {
    if( indexZapelneienia >= rozmiar ) {
        //gdy rozmiar tablicy przekroczony zwiększam go o 10 elementów (realokacja)
        int * temp = new int[ rozmiar + base ];
        //kopiuje starą tablice do nowej
        for( int i = 0; i < rozmiar; i++ ) {
            temp[ i ] = tab[ i ];
        }
        //kasuje poprzednią
        delete[] tab;
        //aktualizuje wskaźnik
        tab = temp;
        //zwiększam rozmiar o base
        rozmiar = rozmiar + base;
    }
    //odkładam element
    tab[ indexZapelneienia++ ] = element;
}

int & mTablica::operator []( int index ) {
    return tab[ index ];
}


using namespace std;

int main()
{
    mTablica tab; // na początek tablica ma zaalokowaną pamięć na 10 elementów
    for( int i = 0; i < 35; i++ ) {
        tab.pusback( i ); //tablica się poszerzy 3 razy
    }
    tab[ 25 ] = 333; // mała wstawka
    //wyświetlam całą tablicę
    for( int i = 0; i < tab.size(); i++ ) {
        cout << tab[ i ] << " ";
    }
   
}
P-153471
DejaVu
» 2016-11-08 09:02:22
C/C++
for( int i = 0; i <= siz; i++ )
Wychodzisz poza zakres tablicy.
P-153475
pekfos
» 2016-11-08 10:18:24
C/C++
int * out = new int;
new int[1] to nie to samo co new int. Nie możesz mieszać delete z delete[].
P-153477
Szustarol
Temat założony przez niniejszego użytkownika
» 2016-11-08 19:48:07
DejaVu i pekfos, dzięki, teraz już działa
C/C++
#include <iostream>

using namespace std;

int main() {
    int * temp, * out, siz, input;
    temp = new int[ 1 ];
    out = new int[ 1 ];
    siz = 0;
    cout << "Podaj liczby, podanie \"nie-liczby\" zatrzyma opcje podawania" << endl;
    for(;; ) {
        cout << "Podaj liczbe:" << endl;
        cin >> input;
        for( int i = 0; i < siz; i++ ) {
            if( i == 0 ) {
                delete[] out;
                int * out = new int[ siz ];
            }
            *( out + i ) = *( temp + i );
        }
        if( cin.bad() || cin.fail() )
             break;
       
        delete[] temp;
        siz++;
        int * temp = new int[ siz ];
        for( int i = 0; i < siz; i++ ) {
            if( i < siz - 1 ) {
                *( 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;
    }
}
P-153487
mateczek
» 2016-11-08 20:23:50
trochę Ci skróciłem kod
C/C++
#include <iostream>
using namespace std;
int main() {
    int siz = 0, input;
    int * tablica = new int[ siz ];
    cout << "Podaj liczby, podanie \"nie-liczby\" zatrzyma opcje podawania" << endl;
    while( cin >> input ) {
        cout << "Podaj liczbe:" << endl;
        int * temp = new int[ siz + 1 ]; // deklaracja tablicy o jeden więcej
        for( int i = 0; i < siz; i++ ) { // pętla kopiująca
            temp[ i ] = tablica[ i ];
        }
        temp[ siz++ ] = input; //zapisanie dodatkowego elementu
        delete[] tablica; //skasowanie starej alokacji
        tablica = temp; //podmiana wskaźników
    }
    cout << endl << endl << endl << "Nastapi teraz wypisanie podanych liczb." << endl;
    for( int i = 0; i < siz; i++ ) {
        cout << i + 1 << " element tablicy to: " << tablica[ i ] << "." << endl;
    }
}

//albo tak
C/C++
#include <iostream>
using namespace std;
int main() {
    int siz = 0, input;
    int * tablica = nullptr;
    cout << "Podaj liczby, podanie \"nie-liczby\" zatrzyma opcje podawania" << endl;
    while( cin >> input ) {
        cout << "Podaj liczbe:" << endl;
        int * temp = new int[ siz + 1 ];
        for( int i = 0; i < siz; i++ ) {
            temp[ i ] = tablica[ i ];
        }
        temp[ siz++ ] = input;
        if( tablica ) delete[] tablica; // jeśli wskaźnik zerem nie kasuj Bo nie jestem pewny czy można użyć delete na nulptr?? Choć bez "ifa" również działa
       
        tablica = temp;
    }
    cout << endl << endl << endl << "Nastapi teraz wypisanie podanych liczb." << endl;
    for( int i = 0; i < siz; i++ ) {
        cout << i + 1 << " element tablicy to: " << tablica[ i ] << "." << endl;
    }
}
P-153488
1 « 2 »
Poprzednia strona Strona 2 z 2