Maksymalny rozmiar wielowymiarowej tablicy intów.

Odpowiedz Nowy wątek
2011-11-26 20:18
Mariolos
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

Pozostało 580 znaków

2011-11-26 20:24
0

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


edytowany 1x, ostatnio: byku_guzio, 2011-11-26 20:24

Pozostało 580 znaków

2011-11-26 20:28
Mariolos
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?

Pozostało 580 znaków

2011-11-26 20:35
Mariolos
0

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

Pozostało 580 znaków

2011-11-26 20:43
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[...]ibs/multi_array/doc/user.html .

Pozostało 580 znaków

2011-11-28 10:58
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;
   //... 
edytowany 4x, ostatnio: adf88, 2011-11-28 11:07

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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