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

Ograniczenia tablic wielowymiarowych

Ostatnio zmodyfikowano 2017-03-05 07:42
Autor Wiadomość
mokrowski
» 2017-03-05 07:42:35
@Rainbow, to co zrobiłeś to:
1. Alokowałeś tablicę w przestrzeni zmiennych automatycznych które to system operacyjny umieszcza w ramce stosu. Ramka stosu w każdym z systemów ma ograniczenie (o ile pamiętam ale proszę mnie poprawić bo nie mam teraz jak sprawdzić w systemie ...2MB dla MS WIndows, 8192KB dla GNU/Linux). Jeśli przekroczysz tę granicę, program ma niezdefiniowane zachowanie.
2. Użyłeś tablic VLA (ang. Variable-length array) które są właściwością C99 i przez kompilator są wspierane "z grzeczności" ale są poza standardem C++
3. Zrobiłeś błąd zakresu (o czym napisali poprzednicy)
4. Używasz int do zakresów. Powiedz mi ... będziesz miał indeksy ujemne? Lepiej użyć size_t. Stosowanie int'a tu to (bardzo liberalnie podchodząc) "przedwczesna optymalizacja" :-)

Jeśli chcesz mieć duże tablice, zrób jak radził @mateczek. Dodaj jedynie dealokację (free) bo w jego kodzie tego nie ma.

Tu masz jakąś (bardzo szkolną) wprawkę...
C/C++
#include <iostream>
#include <random>

int ** allocate2DTable( size_t width, size_t height ) {
    int ** table = new int *[ height ];
    for( size_t row = 0; row < height; ++row ) {
        table[ row ] = new int[ width ];
    }
    return table;
}

void deallocate2DTable( int ** table, size_t height ) {
    for( size_t row = 0; row < height; ++row ) {
        delete[] table[ row ];
    }
    delete[] table;
}

void show2DTable( int ** table, size_t width, size_t height ) {
    for( size_t row = 0; row < height; ++row ) {
        std::cout << "row " << row << ": ";
        for( size_t col = 0; col < width; ++col ) {
            std::cout << table[ row ][ col ] << ' ';
        }
        std::cout << '\n';
    }
}

void fill2DTable( int ** table, size_t width, size_t height ) {
    std::random_device randDevice;
    std::default_random_engine randEngine( randDevice() );
    std::uniform_int_distribution < int > uniDist( 0, 9 ); // Liczby z zakresu 0-9
    for( size_t row = 0; row < height; ++row ) {
        for( size_t col = 0; col < width; ++col ) {
            table[ row ][ col ] = uniDist( randEngine );
        }
    }
}

int main() {
    const size_t tableWidth = 20;
    const size_t tableHeight = 15;
    int ** table = allocate2DTable( tableWidth, tableHeight );
    fill2DTable( table, tableWidth, tableHeight );
    show2DTable( table, tableWidth, tableHeight );
    deallocate2DTable( table, tableHeight );
}
P-158580
1 « 2 »
Poprzednia strona Strona 2 z 2