Newsgroup: it.comp.programmare
Titolo: Crisi con una funzione....

Vorrei inserire in un programma c++ una funzione che mi estragga in 
random una delle frasi inserite in un vettore multidimensionale e me lo 
metta in um vettore unidimensionale al di fuori della funzione con la 
chiamata frase(dopo); frase sarebbe il nome della funione e "dopo" 
l'array finale unidimensionale che nell'esplicitazioe delle variabili si 
chiama char dopo[30].
questo č quello che ho scritto:
char frase (char x[30])
{
     char stringa[][30] = {"volpe","cammello","coniglio","lupo"};
     int c;
     srand(c);
     char b;
     for (int i=0;i<30;i++)
         {b=stringa[c][i];
          x[i]=b;
         }
     x[30]=stringa[c][30];
}
non da errore di compilazione ma quando lo faccio girare mi dice
Segmentation fault
Che roba č? perchč?
E' una notte che ci lavoro e questa funzione l'ho scritta in 20000 modi 
diversi ma nessuno dei quali ha avuto un buon fine, mi potreste aiutare 
per favore?
grazie 1000
             Fede
Ps: se credete sia utile avere il programma intero ve lo posso spedire 
via e-mail.

 Che roba è? perchè?
Due problemi.  Anzitutto, ed e` il peggiore, quella chiamata
a 'srand' setta il seme della sequenza di numeri casuali (al
valore non inizializzato di c!) e lascia c intonsa (ad un
valore non inizializzato e quindi in generale del tutto
arbitrario).  Dubito fortemente che sia quello che tu intendi!
E` piu` probabile che tu voglia fare qualcosa del tipo:
    c = rand() % 4;
per settare c ad un valore casuale fra 0 e 3, e quindi un
valore comunque accettabile per indiciare entro "stringa".
Secondo problema, stai cercando di leggere un elemento '[30']
di stringhe dichiarate come di lunghezza 30, e poi pure di
scriverlo.  Entrambe le operazioni potrebbero causare un
segmentation fault (non probabile ma lo meriterebbero;-).
Dopo avere settato correttamente c, altro non occorre se non
    strncpy(x, stringa[c], 30);
Alex

     strncpy(x, stringa[c], 30);
Grazie per l'aiuto!
		Fede

 Non capisco perchè
Perchè se crei un array di 30 elementi, questi sono numerati
da 0 a 29.
Se cerchi quindi di accedere al numero 30, stai in realtà accedendo
di una posizione "troppo in là" e questo può provocare un
comportamento indefinito (tipicamente un segmentation fault,
ma anche dei folletti sullo schermo... :-) )
-- 
Gerolamo

 Non capisco perchè
Perchè un array x di 30 elementi va da x[0] a x[29]. x[30] non fa parte
dell'array ed il comportamento del sistema è indeterminato (potrebbe
decidere di formattarti l'hard disk :) ).
.RD.

    c = rand() & 3;
Ora che ci penso.... Se non ricordo male era sconsigliato utilizzare il
modulo N per tirare fuori un numero tra 0 ed N-1.
La maggior parte dei compilatori ha come generatore di numeri casuali un
generatore molto semplice del tipo:
   x(i) = (A*x(i-1) + C) mod K
in cui i bit meno significativi sono "un po' meno" casuali degli altri.
Dovrei riguardarmi "the art of compuer programming" di Knuth per ricordarmi
il perchè.
Magari la cosa non è importante, però un'alternativa potrebbe essere:
   c = trunc( ( (double)rand() / (double)RANDOM_MAX) * N)
Dipende da quanto "random" vuoi essere.
.RD.

> Dipende da quanto "random" vuoi essere.
beh,mi bastava un randomino, visto che sono alle prime armi mi basta che 
le cose funzionino, poi quando avro' più esperienze e avro' la 
possibilità di fare domande meno ridicole cercherò di rendere "migliore" 
l'esecuzione del programma.
Tenendo conto che di un programino abbastanza corto mi è venuto fuori un 
*exe di 500kb un giorno dovro' imparare a fare programmi più 
"riassuntivi" :-)
ciao!
			Fede


sorry per l'ortografia... lol

 Grazie per l'aiuto!
Prego!  Il C e` un linguaggio di basso livello, certo (vicino alla
macchina piu` che al programmatore), ma usando librerie (anzitutto
quelle standard del C stesso, che contengono ad esempio strncpy --
ma non solo, vedi sopra per la generazione di numeri casuali) un
poco la situazione migliora.
Alex