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

Salve a tutti,
Sono uno niubbo alle prese con il C e non riesco a risolvere un problema 
riguardante un vettore. Ho una funzione chiavi che prende come argomento
una int e con un ciclo for dovrebbe ripetutamente chiamare scanf() e 
assegnare il risultato a un indice del vettore chiavi[n], così:
 > void cripta(int n)
 > {
 >   int k, i, j, t = 0, chiavi[n];
 >   char temp;
 >
 >   printf("Inserire le chiavi di cifratura: ");
 >   for (k = 0; k <= n - 1; k++)
 >     scanf("%d", chiavi[k]);
 > [cut...]
 > }
GCC non dà errori di compilazione, ma quando eseguo il programma mi 
restituisce 'Segmentation fault' dopo che ha preso in input le chiavi.
GDB mi dice che l'errore è nella scanf() ma non riesco a trovarlo :(

 >     scanf("%d", chiavi[k]);
scanf("%d", &chiavi[k]);

 GDB mi dice che l'errore è nella scanf() ma non riesco a trovarlo :(
scanf vuole l'indirizzo della variabile, tu gli passi un valore.
puoi usare o
scanf("%d",chiavi+k);
oppure
scanf("%d",&(chiavi[k]));
poi una nota sullo stile, io  a
for (k = 0; k <= n - 1; k++)
preferisco
for (k = 0; k < n ; k++)
che e' piu' compatto, anche se equivalente.
(magari verro' flammato per questo ?)
ciao,
g
ciao,
g.

AlterX wrote:

&(chiavi[k])
perchè le parentesi di quadre hanno priorità maggiore dell'operatore di 
indirizzo

Giovanni Resta wrote:

Beh...è più chiaro e nello stile C :-)

Mi dà sempre lo stesso errore :(

 indirizzo
quindi proprio per questo motivo non servono.
&chiave[k] va benissimo :-)
Ciauz

 
Hai perfettamente ragione non me ne ero accorto ;)

Matic wrote:

azz è vero!

Alla fine ho risolto dichiarando il vettore come variabile globale e 
mettendo il ciclo for nella main() invece che nella funzione, grazie a 
tutti quelli che hanno risposto

 (magari verro' flammato per questo ?)
E poi se non sto dicendo una ca**ata dovrebbe andare meglio perchè forse 
fa un confronto invece che 2 (anche se non so come funziona, penso che 
forse viene ottimizzato dal compilatore, ma non saprei, e forse magari 
c'è un istruzione che fa questo confronto in una botta sola).
-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Xoen
Jabber ID : 
xo...@jabber.linux.it
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 >   int k, i, j, t = 0, chiavi[n];
Secondo me il problema e' qui, oltre che nel gcc che non ti dice che non
si puo' (potrebbe?) fare:
n non e' costante a compile-time, quindi dovrebbe darti un errore di
tale tipo, questo perche' n e' una variabile, e una dichiarazione di
'chiavi' a quella maniera e' statica: il compilatore deve sapere PRIMA
quanto spazio occupa quel vettore!
Soluzione: allocazione dinamica, usa int * chiavi = new int[n], poi
ovviamente devi cancellarlo con delete [] chiavi.
Prova e poi dimmi.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ovviamente devi cancellarlo con delete [] chiavi.
Anche qui ti confondi con il C++: l'equivalente C degli operatori new e
delete sono le funzioni malloc() e free().
--
Cingar
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

In effetti avevo pensato ad un vettore di grandezza dinamica, ma 
purtroppo non so ancora come si gestiscono, ho appena iniziato a 
programmare, vedrò di studiarmeli subito perchè mi sembrano veramente utili.
Grazie ancora a tutti :)

 delete sono le funzioni malloc() e free().
Ecco mi sembrava strano che in C ci fossero new e delete, *metodi* 
tipici della programmazione ad oggetti.


 Ti confondi con il C++
Ops... chiedo venia!! :p
Scusate, avete ragione...
