Newsgroup: it.comp.lang.c
Titolo: segmentation fault

Ho un problema piuttosto grava che non riesco a risolvere.
La funzione che posto di seguito:
void PutA(SYSTEM *sys,int obj,int atr,value_type val)
 { (sys->matA)[obj*(sys->attributes_num)+atr]=val; }
quando la inserisco in un ciclo for con valori di atr <5 e obj
dell'ordine 10^5 mi restituisce un segmentation fault. Se inverto i
valori (atr con oject, ma ciò è errato logicamente) ilciclo funziona
correttamente.
Non capisco perchè
Qualcuno può aiutarmi?
gianluca

gianluca wrote:

probabilmente sei andato a scrivere oltre la fine del vettore
in un'area di memoria protetta
prova a mettere un printf di obj*(sys->attributes_num)+atr
prima dell'assegnazione per vedere quanto è il valore e 
verificare se è compatibile col tuo vettore
-- 
Al bugiardo occorre avere una buona memoria.
                                             - Quintiliano -


Con 629772 valori teorici da inserire nel vettore il segmentatio fault
mi compare al 369069 valore. sys->matA[] è un vettore ad int.
Scusa la domanda sciocca, ma come faccio a capire se sovrascrivo aree
di memoria protetta?.
Grazie
gianluca

 di memoria protetta?.
Il programma ti dà segmentation fault... ;-)
E.


come puntatore ad int all'interno della struttura sys

 Come hai dichiarato sys->matA[]?
come puntatore ad int (in realtà sarebbe un nuovo tipo di tipo int).
in una struttura di nome sys.
scusate la "replica", ho fatto un pò di confusione!.
Gianluca

 come puntatore ad int all'interno della struttura sys
Il puntatore viene inizializzato? Come viene inizializzato?
(inizializzare = assegnare un valore)
E.


Scusate se rispondo con molta discontinuità, ma sto lavorando ad un
progetto per "hobby".
Veniamo a noi. il puntatore viene inizializzato così:
sys->matA=NULL;
gianluca

   
Non ci poso credere!!!!!!!!!!!!!
Qualcuno risponda 
:-B

 Qualcuno risponda 
Sono temporaneamente basito. 
-- 
-riko

 :-B
Potresti essere più chiaro?
 se ho chiesto aiuto è perchè ho bisogno, se c'è un errore mi farebbe
piacere che qualcuno mi indicasse dove è (dato che è così evidente!),
senza sarcasmi!.
Se serve posto l'intera funzione di inizializzazione che, in tutti gli
altri casi (mantengo le librerie su cui lavoro da almeno 2 anni) ha
sempre fatto il suo lavoro:
SYSTEM  *InitEmptySys(void)
 { SYSTEM *sys;
   int i;
   cluster_type mask=1;
   if ((sys=(SYSTEM *)malloc(sizeof(SYSTEM)))==NULL)
     { _rerror=3; return NULL; }
   for (i=0; i<_cluster_bits; i++)
     { _mask[i]=mask;
        mask <<= 1;
     }
   sys->attributes_num=0;
   sys->objects_num=0;
   sys->description=NULL;
   sys->descr_size=0;
   sys->setAsize=0;
   sys->setOsize=0;
   sys->matA=NULL;
   sys->matD=NULL;
   sys->matX=NULL;
   sys->matXsize=0;
   return sys;
 }
La funzione InitEmptySys inizializza tutte le strtture che servono per
elaborare i dati, comprese tre matrici indicate come matA, MatD, matX.

 -riko
Bene,
appena ti sei ripreso, insieme a brix99luftballons,  la smettere di
fare gli spiritosi e, o rispondete educatamente o la smettete!

  }
devi postare il codice dove matA prende il valore di 
ritorno dalla malloc.
Alla malloc passi un valore costante, cioč un numero, oppure
una variabile ? 
sicuro di aver allocato abbastanza spazio ?
hai provato a fare una printf del parametro della malloc ?
controlli che il puntatore di ritorno dalla malloc non sia null ?
Sicuro che il seg-fault sia in quella funzione postata 
sys->matA)[obj*(sys->attributes_num)+atr]=val;
e non in una funzione immediatamente precedente o successiva ?
scusa per tutte le domande, ma per uno che non
vede il codice non č facile capire il problema.
ciao
-- 
Si puň essere piů furbo di un altro
ma non piů furbo di tutti gli altri.
                                             - La Rochefoucauld -


Il puntatore inizializzato in questa maniera non ha un valore valido, e 
non può essere utilizzato (se non per verificare il fatto che il valore 
non è valido). Per ottenere un indirizzo valido devi usare la funzione 
malloc, oppure assegnare l'indirizzo di un array statico.
E.

Ok!,
credo di avere risolto!
in effetti la malloc mi ritornava un valore null, probabilmente perchè
avevo utilizzato un tipo trattato come int e che int non era. Ho fatto
alcuni test ed i risultato sono tutti positivi.  Continuerò con
leprove ma credo che ci siamo
Grazie!
gianluca