Newsgroup: it.comp.lang.c
Titolo: segmentation fault... problemi di memoria?

Ciao a tutti, sono alle prese con un problemino, forse di memoria...
Premetto che non sono un esperto di C, sono alle prime armi, ma esponiamo
tosto il problema:
io ho
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define DIMSPACE 768685
struct peptPoint {
				int coord[4];
				char desc[200];
};
[cut]
int main(int argc, char **argv)
{
	struct peptPoint space[DIMSPACE];
[cut]
diciamo che peptPoint descrive un punto di 4 coordinate e una descrizione
del punto, space e' un array di punti. Il fatto e' che io ho davvero tanti
punti (come minimo quelli in DIMSPACE ma potrebbero diventare 2-3 volte
tanti).
io compilo
$ gcc -lm findinspace.c
e quando lo lancio mi da errore di Segmentation fault.
Ho provato a togliere un po' di cose nel codice ma presto mi sono accorto
che se diminuisco DIMSPACE di un fattore circa 100 allora tutto procede bene
(per ora, sono solo all'inizio della scrittura).
E' un problema di memoria? Non ce n'e' abbastanza da allocare per space?
Come si risolve un problema del genere?
Grazie a tutti
dawe
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 	struct peptPoint space[DIMSPACE];
E' probabilmente una struttura troppo grande (158 Mega) per
essere allocata in quel modo li'.
Usa una allocazione dinamica con malloc() e risolverai tutti
i tuoi problemi (supponendo che  il tuo computer abbia piu' di 160 mega
di ram, altrimenti, anche swappando da disco, sono cavolacci.)
ciao,
g.
-- 
AIUTARE = Accrescere il numero degli ingrati
(Ambrose Bierce, Il Dizionario del Diavolo)


Grazie mille, ora funziona. La macchina ha 512 Mb di RAM. Ma come puo'
essere questo? Come mai la memoria si puo' non allocare in quel modo? Non e'
forse il modo piu' "primitivo"?


 dawe
Ciao
Matx

 Matx


 l'esecuzione a sapere che la memoria libera sia superiore?
Se malloc() ti ritorna NULL non c'e' piu' memoria. La quantita' di
memoria ancora libera puoi saperla solo attraverso le funzioni messe
a disposizione dal S.O. (che ovviamente NON fanno parte dello standard
del "C").
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 non ricordo mai>
-Wl e non -WL (la l e' minuscola)


 non ricordo mai>
Hum, sei sicuro? La gestione (tipicamente dinamica) dello stack e`
affidata all'OS. Il compilatore (linker) puo` al limite preallocare tot
spazio, e comunque non oltre i limiti fissati dal sistema operativo.
kronos:~$ ulimit -a
...
stack size            (kbytes, -s) 8192
Luca
-- 
Home: 
http://kronoz.cjb.net
"La Via prosegue senza fine."
	Bilbo Baggins - Il Signore degli Anelli - J.R.R. Tolkien

 stack size            (kbytes, -s) 8192
I limiti sotto Linux possono essere cambiati, anche se non so bene
quali ed entro quale range...
Sotto Windows
int main(void)
{
   int  idx = 0;
   char chArr[145000000];
   unsigned int arrSize = sizeof(chArr)/sizeof(chArr[0]);
   for(idx = 0; idx < (int)arrSize; idx++)
      chArr[idx] = 'A';
   return 0;
}
compila e viene eseguirlo senza problemi...
Impostando
/stack:0x8f0d180
tra le opzioni del linker. L'opzione /F del compilatore non ne ha
voluto sapere.
Non ho provato con valori superiori a 145MB (che comunque e' un
valore di tutto rispetto).
E' chiaro che tra "provare" e "fare un programma serio" con quelle
impostazioni ne corre. :-)


 quali ed entro quale range...
Si`, ma quello che volevo farti notare e` che l'opzione per il linker ha
effetto solo entro i limiti posti dall'OS, almeno sotto linux/UNIX.
Luca
-- 
Home: 
http://kronoz.cjb.net
The trouble with computers is that they do what you tell them, 
not what you want.
D. Cohen