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

Dynamiczne alokowanie tablicy dwuwymiarowej - problem z odniesieniem się do jej elementu

Ostatnio zmodyfikowano 2017-03-02 15:08
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
Dynamiczne alokowanie tablicy dwuwymiarowej - problem z odniesieniem się do jej elementu
» 2017-03-02 00:59:51
Witam, mam błahy problem, choć jednak sam nie moge go zlokalizowac.
Pierwszy raz dynamicznie alokuje tablicę dwuwymiarową i jest pewien problem, na początek kod:
C/C++
// wys = 900, szer = 1600
//bool **wsk;

Mapa( int xx = 25 )
{
    x = szer / xx;
    y = wys / xx;
    wsk = new bool *[ y ];
    for( int i = 0; i < x; i++ )
    {
        wsk[ i ] = new bool[ x ];
        wsk[ i ] = false;
    }
}

Na pewnej stronie wyczytałem, że tak ma wyglądać taka alokacja, tylko kiedy odwołam się nawet do elementu zerowego wsk[0][0] w main - błąd krytyczny. Pewnie odnoszę się do nieistniejącego elementu, ale co tu jest źle - nie wiem.
PS wydaje mi sie ze odpowiada za to alokowanie w funkcji (konstruktorze) i trzeba to zrobic na liscie inicjalizacyjnej. Tylko jak, skoro jest tam petla?
P-158441
mateczek
» 2017-03-02 05:59:10
C/C++
//wsk[ i ] = false; wsk[i]// jest tablicą

for( int k = 0; k < x; k++ ) {
    wsk[ i ][ k ] = false;
}
P-158443
pekfos
» 2017-03-02 07:56:32
C/C++
wsk = new bool *[ y ];
for( int i = 0; i < x; i++ )
{
    wsk[ i ] = new bool[ x ];
Zaalokowałeś y wskaźników, a przypisujesz x wartości.
P-158444
Monika90
» 2017-03-02 09:56:38
C/C++
wsk[ i ] = false;
Przypisanie bool do wskaźnika, tego nie da się skompilować.

Dlaczego nie alokujesz w jednym kawałku?
C/C++
new bool[ wys * szer ] { };
P-158445
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-03-02 14:42:02
@Pekfos
Racja, niedopatrzenie, dzieki :)

@Mateczek / Monika90
code blocks nie wyrzuca błędu, a kiedyś widziałem gdzieś taki zapis więc wydawało mi się, że jest dobrze, poprawie to.

@Monika90
Potrzebna mi jest dwuwymiarowa, łatwiej będzie mi się nią posługiwać :)
Będę jej używał do tworzenia mapy kafelkowej ( true  == droga, false == trawa )
oczywiście 2D dlatego jest mi potrzebna takowa tablica.

Temat zamykam:)
P-158450
mateczek
» 2017-03-02 15:08:34
Potrzebna mi jest dwuwymiarowa, łatwiej będzie

można małym kosztem napisać klasę, która symuluje tablice 2D. raczej o czymś takim wspomniała monika90. Alokujesz pamięć dla tablicy 1D a interface dopisujesz jak dla 2D

C/C++
#include<iostream>
using namespace std;
class matrix {
    int * tab = nullptr;
    int wiersze = 0, kolumny = 0;
public:
    matrix( int w, int k )
        : wiersze( w )
         , kolumny( k )
    { //konstruktor
        int rozmiar = w * k; // wiersze razy kolumny
        tab = new int[ rozmiar ]; // tablica 1D symulacja 2D
    }
   
    matrix() { } //konstruktor domyślny nic nie robi
    ~matrix() {
        if( tab ) {
            delete[] tab; // sprzątanie tablicy
            tab = nullptr;
        }
    }
   
   
    int & operator ()( int w, int k ) { // operator który  po podaniu wiersza i kolumny zwraca elemnet
        return tab[( w ) * kolumny + k ];
    }
   
    int row() { return wiersze; }
    int column() { return kolumny; }
};

// program testowy
int main() {
    matrix tablica2d( 3, 3 ); // deklaracja macierzy 3X3
    int i = 0;
   
    // zapis do macierzy
    for( int w = 0; w < tablica2d.row(); w++ ) {
        for( int k = 0; k < tablica2d.column(); k++ ) {
            tablica2d( w, k ) = i++;
        }
    }
    // wyświetlenie macierzy
    for( int w = 0; w < tablica2d.row(); w++ ) {
        for( int k = 0; k < tablica2d.column(); k++ ) {
            cout << tablica2d( w, k ) << " ";
        }
        cout << endl;
    }
}
P-158453
« 1 »
  Strona 1 z 1