Strona 1 z 1

c++ segmentation fault tablica czterowymiarowa

: 31 gru 2009, 15:16
autor: easymen
Witam mam problem odnośnie c++, gdy próbuje za inicjować taką tablice cztery[49][49][49][49], program się kompiluje ale gdy go uruchomię wyskakuje błąd 'segmentation fault.
Mój komp to acer 3100+ 512 ram, jeśli macie jakieś pomysły to piszcie.

Odp: c++ segmentation fault tablica czterowymiarowa

: 01 sty 2010, 04:14
autor: adrian5632
Pozostaje pytanie, jak ty tę tablicę inicjujesz i po co ci aż cztery wymiary?

Odp: c++ segmentation fault tablica czterowymiarowa

: 01 sty 2010, 12:58
autor: mikolajs
Obecnie tab[] nie jest już zwykłym wskaźnikiem tylko wbudowanym typem tablicowym, a obecnie istnieje tylko typ tab[][][], większego nie ma. Zatem musisz to zrobić dynamicznie np.:

Kod: Zaznacz cały

int**** tab4 = new int***[50];
   for (int i = 0; i < 50; i++) {
     tab4[i] = new int**[50];
     for (int j = 0; j < 50; j++) {
       tab4[i][j] = new int*[50];
       for (int k = 0; k < 50; k++) tab4[i][j][k] = new int[50];
       }
     }
Po wykorzystaniu analogicznie zwolnić pamięć!

Odp: c++ segmentation fault tablica czterowymiarowa

: 01 sty 2010, 21:01
autor: el.pescado
Taka tablica jest zbyt duża, by się mogła zmieścić na stosie. Pozostaje alokować ją na stercie, tak jak jest napisane wyżej. Można też zaalokować tablicę jednowymiarową o rozmiarze 49^4, i sprytnie obliczać indeksy.

Odp: c++ segmentation fault tablica czterowymiarowa

: 19 sty 2010, 00:54
autor: easymen
Dziękuje za podpowiedzi, mój sprzęt jest za słaby na takie triki

Odp: c++ segmentation fault tablica czterowymiarowa

: 22 sty 2010, 23:44
autor: ccl
easymen pisze:Dziękuje za podpowiedzi, mój sprzęt jest za słaby na takie triki
50^4*sizeof(int) = 6250000 * 4 = 25MB

Tyle ramu to chyba masz? ;)

Odp: c++ segmentation fault tablica czterowymiarowa

: 23 sty 2010, 02:10
autor: easymen
'ccl' bardzo trafna uwaga, z początku też to liczyłem wychodziło mi 23MB ale nadal nie wiem gdzie tkwi problem. Próbowałem znaleść maksymalny rozmiar tablicy ktora sie kompiluje i wyszło mi unsigned short int tab[45][45][45][45] ; sizeof(tab)= 8201250=8,2MB , a może w ubuntu coś trzeba zmienić?

Odp: c++ segmentation fault tablica czterowymiarowa

: 23 sty 2010, 14:45
autor: luzakwielki
easymen pisze:'ccl' bardzo trafna uwaga, z początku też to liczyłem wychodziło mi 23MB ale nadal nie wiem gdzie tkwi problem. Próbowałem znaleść maksymalny rozmiar tablicy ktora sie kompiluje i wyszło mi unsigned short int tab[45][45][45][45] ; sizeof(tab)= 8201250=8,2MB , a może w ubuntu coś trzeba zmienić?
Gdybyś zrozumiał to co napisał el.pescado to wiedziałbyś o co chodzi (lub rozróżniał stos od sterty).
W skrócie nie rób statycznej tablicy o tak dużym rozmiarze, bo się nie mieści na stosie i alokuj ją dynamicznie na stercie (tak jak pokazał Ci mikolajs - patrz od "kod", bo wcześniej gada bzdury ;p)

Odp: c++ segmentation fault tablica czterowymiarowa

: 25 sty 2010, 23:47
autor: PL_kolek
A jakby taką wielką tablicę zadeklarować globalnie zamiast w ciele funkcji to by przeszło? Bo zawsze tak robiłem z gigantycznymi tablicami i problemu nie miałem.

Odp: c++ segmentation fault tablica czterowymiarowa

: 26 sty 2010, 00:40
autor: mikolajs
bo wcześniej gada bzdury ;p)
To prawda :(
Ale czy faktem jest że int tab[] != int *tab, czy może tu też się mylę?
A jakby taką wielką tablicę zadeklarować globalnie zamiast w ciele funkcji to by przeszło? Bo zawsze tak robiłem z gigantycznymi tablicami i problemu nie miałem.
chyba pomoże, ale nie warto. Naprawdę lepiej alokować dynamicznie, bo nawet jeśli u Ciebie zadziała (system znajdzie na stosie pamięć o ciągłej długości równej pojemności wszystkich danych) to u kogoś innego pamięć może być trochę mniejsza. W w przypadku podanym przez mnie potrzebna jest pamięć w mniejszych porcjach.

Odp: c++ segmentation fault tablica czterowymiarowa

: 26 sty 2010, 08:31
autor: luzakwielki
mikolajs pisze:Ale czy faktem jest że int tab[] != int *tab, czy może tu też się mylę?
tab[] to wskaźnik *tab (tab jest wskaźnikiem na początek zaalokowanej pamięci), tab[5] to dla kompilatora *(tab + 5) - dlatego też dla kompilatora wszystko jedno czy napiszesz tab[5] czy 5[tab] bo dodawanie jest przemienne ;p. W C/C++ tablice to po prostu ładniej opakowane wskaźniki.
Tablica wielowymiarowa np. 2wymiarowa to po prostu *(*(tab+i)+j) - tu też możesz użyć konstrukcji typu i[tab][j] co będzie równoznaczne z tab[j] (nie można zamienić z j bo wtedy już będzie zły wynik działań na wskaźnikach).

Odp: c++ segmentation fault tablica czterowymiarowa

: 28 sty 2010, 13:40
autor: mikolajs
tab[] to wskaźnik *tab (tab jest wskaźnikiem na początek zaalokowanej pamięci), tab[5] to dla kompilatora *(tab + 5) - dlatego też dla kompilatora wszystko jedno czy napiszesz tab[5] czy 5[tab] bo dodawanie jest przemienne ;p. W C/C++ tablice to po prostu ładniej opakowane wskaźniki.
Tablica wielowymiarowa np. 2wymiarowa to po prostu *(*(tab+i)+j) - tu też możesz użyć konstrukcji typu i[tab][j] co będzie równoznaczne z tab[j] (nie można zamienić z j bo wtedy już będzie zły wynik działań na wskaźnikach).

Oczywiście wszystko się zgadza!
Jednak typ jest inny (w starszych kompilatorach był identyczny).
Przykład:

Kod: Zaznacz cały

#include <iostream>
#include <typeinfo>
using namespace std;

int main() {
    int tab[10];
    int* wsk;
    wsk = tab;
    if (typeid(tab) == typeid(wsk)) cout << "Ten sam typ" << endl; 
    else cout << "Inny typ" << endl; //mają różne id 
    cout << sizeof(tab) << "\t" << sizeof(wsk)   <<"\t"<< sizeof (*wsk) << endl; //można sprawdzić rozmiar tablicy
    return 0;
}

Odp: c++ segmentation fault tablica czterowymiarowa

: 28 sty 2010, 22:43
autor: luzakwielki
mikolajs pisze: Jednak typ jest inny (w starszych kompilatorach był identyczny).
Wszystko zależy czy pytasz się jak to wygląda dla programisty niezależnie od kompilatora, czy od strony danej wersji kompilatora danej firmy (bo jak to zaimplementują jest już niezależne od języka i nie ma jednoznacznej odpowiedzi czy dla kompilatora jest to to samo czy nie (odpowiedź jest zależna od danego kompilatora) - jednak tak czy tak jest to wskaźnik (czy go opakują w klasę (w którego skład wchodzi wskaźnik i operator[], żeby nie pisać dodatkowej obsługi osobno dla tablic) czy nie (jest to po prostu wskaźnik i [] jest tłumaczony przed kompilacją jak w kompilatorach C) dalej jest to wskaźnik na miejsce w pamięci)).