Strona 1 z 1
Ograniczenie pamięci podczas uruchamiania programu
: 14 gru 2010, 21:40
autor: wojtusp7
Witam
Mam taki problem i nie mogę znaleźć rozwiązania.
Napisałem pewien problem, mniejsza z tym jaki

I została zadeklarowana spora tablica i kompiluje się, a przy uruchomieniu segmentation fault.
Z tego wnioskuję, że system nakłada pewne ograniczenie pamięci i jak je nieco zwiększyć?
P.S. Program na pewno dobry, ponieważ dobrze działa z mniejszą tablicą.
I odpada użycie dynamicznych tablic
Z góry dziękuję

Odp: Ograniczenie pamięci
: 14 gru 2010, 22:03
autor: norvoles
Segmentation fault zwykle oznacza, że próbujesz dobrać się do jakiegoś obszaru pamięci, do którego nie masz dostępu.
I odpada użycie dynamicznych tablic
A to czemu? Wydaje mi się, że do tworzenia dużych tablic, to właśnie te dynamiczne są wskazane.
Jeśli możesz, pokaż kod.
Edit:
Z tego wnioskuję, że system nakłada pewne ograniczenie pamięci i jak je nieco zwiększyć?
Segfault pojawia się też jak odnosisz się do adresu w pamięci, który fizycznie nie istnieje, więc tablica może być zwyczajnie za duża
@down
Racja, racja

Odp: Ograniczenie pamięci
: 14 gru 2010, 22:08
autor: ethanak
norvoles pisze: tablica może być zwyczajnie za duża

Raczej za mała
Odp: Ograniczenie pamięci
: 14 gru 2010, 22:17
autor: wojtusp7
W kodzie nie ma nic ciekawego, działa dla mniejszych tablic, ale mogę pokazać

postac tab[2000000];
int zestawy;
scanf("%d",&zestawy);
for(int i=1;i<=zestawy;i++)
{
int s,n;
scanf("%d %d",&n,&s);
for(int q=0;q<n;q++)
scanf("%s %d",tab[q].imie,&tab[q].naturalna);
}
Odp: Ograniczenie pamięci podczas uruchamiania programu
: 15 gru 2010, 00:10
autor: borzole
To ma podobno coś wspólnego ze stosem i ograniczeniami nałożonymi przez sam kompilator. Można to obejść na kilka sposobów
* pisząc
static przed deklaracją
* deklarując wskaźnik i do niego dopiero przypisując tablicę (używa się tak samo)
* <vector>
przykładzik
Kod: Zaznacz cały
#include <iostream>
#include <vector>
using namespace std;
int main(void){
const int x = 20000000;
static int a[x];
int *p = new int[x];
cout << "x " << x << endl;
p[x]=0;
cout << "p " << p[x] << endl;
vector<int> v;
for (int i = 0; i < x; i++){
try{ v.push_back(0); }
catch (...){
cout << v.size() << endl;
return 1;
}
}
cout << "v " << v.size() << endl;
return 0;
}
Odp: Ograniczenie pamięci podczas uruchamiania programu
: 15 gru 2010, 00:27
autor: wojtusp7
Serdecznie dziękuję pomogło static, chociaż nie wiem dlaczego

Odp: Ograniczenie pamięci podczas uruchamiania programu
: 15 gru 2010, 10:44
autor: borzole
Jak już wspomniałem, to ma coś wspólnego ze stosem

Słówko
static sprawia, że tablica będzie traktowana jak globalna (w sensie zapisu w pamięci), a na zmienne globalne nie ma ograniczeń tzn. można poza
main() zadeklarować sporą tablicę:
to dopiero rozkminka co
W google wpisz
c++ static 'stack frame'
Kiedy wywoływana jest funkcja, wówczas przenoszona jest ona do obszaru pamięci 'ramka stosu' (?) gdzie ma się pomieścić adres funkcji, wskaźnik na wywołującą funkcję (rodzica) i lokalne zmienne. Jeśli deklarujesz zwykłą tablicę to jej rozmiar zapycha przydzieloną dla funkcji pamięć. Jeśli użyjesz wskaźnika, to zamiast ogromnej tablicy będzie malutki, kilku bajtowy adres. Natomiast słówko static ozn. istnienie tylko jednego egzemplarza tej tablicy w całym programie, więc pewnie też jest używany tylko adres.
Odp: Ograniczenie pamięci podczas uruchamiania programu
: 15 gru 2010, 17:28
autor: wojtusp7
Dzięki, jako globalna tez działa.
Odp: Ograniczenie pamięci podczas uruchamiania programu
: 15 gru 2010, 18:29
autor: Hauleth
Na globalne są też ograniczenia, ale większe. Na malloc/new też jest, ale tylko 1: ilość pamięci w systemie.
Odp: Ograniczenie pamięci podczas uruchamiania programu
: 15 gru 2010, 19:44
autor: borzole
Jest jeszcze limit dla procesu narzucony przez system: ulimit/pam (coś jeszcze?).