Ograniczenia tablic wielowymiarowych
Ostatnio zmodyfikowano 2017-03-05 07:42
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ę... #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 ); 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 ); }
|
|
1 « 2 » |