Maksymalny rozmiar wielowymiarowej tablicy intów.

0

Witam,
Potrzebuję stworzyć tablicę 5-wymiarową gdzie każdy wymiar ma 20 jednostek, czyli coś takiego:

 int tablica[20][20][20][20][20]

Jest to 3200000 elementów tablicy. Program wywala się już przy samym tworzeniu tak dużej tablicy.
Błąd to:
Process returned -1073741571 (0xC00000FD) execution time : 24.877 s
Press any key to continue.

Jeśli chodzi o ram to posiadam 4GB w tym prawie 3 wolnego, więc nie sądzę, żeby wina leżała po stronie sprzętu. System to win7 x64.
Jak temu zaradzić? Jeśli się nie da, to jak przechwycić błąd, żeby program się nie wykładał tylko sypnął errorem i poleciał dalej?
Pozdro
0

Nie twórz tej tablicy na stosie, stos ma ograniczenie jeżeli chodzi o rozmiar, stwórz ją dynamicznie.

0

Rzeczywiście w tym jest problem.
Nigdy nie tworzyłem nic innego dynamiczne jak tablice 2-wymiarową, której kod wyglądałby mniej więcej tak:


int **tablica = new int * [ile];
    for(int j = 0; j<ile; j++)
    {
        tablica[j] = new int [ile];
    }
 

A jak to by wyglądało dla 5 wymiarów?

0

Już poradziłem ;) dzięki za pomoc! Pozdro!

0

Tą metodą bym nie alokował tablicy o tylu wymiarach. Ogólnie bym się zastanowił, czy potrzeba aż tylu wymiarów. Jedyny powód jaki widzę to jak twoją abstrakcją jest przestrzeń pięciowymiarowa, ale i tak wtedy jest to skomplikowane. Przy alokacji to zalokuj ciągły blok pamięci dla ostatecznej wartości (o wielkości 205 intów), stwórz tablicę wskaźników do int (też przez new) o wielkości 204 i przypisz co dwudziesty wskaźnik na kolejnych pozycjach, potem stwórz tablicę o wielkości 20^3 itd. Oczywiście pamiętaj, żeby to zwolnić. Możesz także stworzyć klasę (lepsze rozwiązanie), w której przechowujesz tylko jedną tablicę o pożądanym rozmiarze, a do elementów odwołujesz się przez np. metodę at(size_t w1, size_t w2, ..., size_t w5), która też jest brzydka.

TL:DR jak nie musisz nie rób tablicy o takiej ilości wymiarów, a jak musisz to użyj boosta http://www.boost.org/doc/libs/1_48_0/libs/multi_array/doc/user.html .

1

Tablica tworzona dynamicznie (na stercie) nie musi być tablicą dynamiczną (tablicą bez określonego z góry rozmiaru).

Tobie wystarczy prosta dynamicznie utworzona tablica o statycznym rozmiarze:

typedef int Tablica[20][20][20][20][20];
Tablica &tab = *(Tablica*)(new Tablica);

int main()
{
   tab[1][2][3][4][5] = 12345;
   //... 

1 użytkowników online, w tym zalogowanych: 0, gości: 1