Newsgroup: it.comp.os.linux.development
Titolo: perche' segmentation fault???

Salve a tutti!
Il mio professore di Sistemi Operativi ha affermato che, a causa della
complessita' hardware e software, i moderni comuter sono macchine sostanzial-
mente non  deterministiche. Io non posso che essere d'accordo. Guardate
infatti questo mio problemino che mi ha fatto perdere un paio di settimane e
che oggi neppure l'assistente del prof. e' riuscito a risolvere.
Si tratta di un pezzo di un client per il gioco del bridge: riceve un vettore
di tredici interi da una coda di messaggi e poi ci fara' qualcos'altro.
Il problema e' semplicemente che non riesco a ritornare il vettore dalla
funzione specifica al main.
Ecco il main:
#include "nord.h"
main() {
	int i;
	int* vettore_mano;
	giocatore dichiarante;
	sincronizza();	//per la sincronizzazione al server
	cout << "sincronizzato\n";
 
	vettore_mano=ricevi_mano();   //non riesce a uscire da questa funzione
 
	cout << "\nricevuto vettore\n" ;  //non lo stampa!
 
	for (i=0; i<13; i++) cout << vettore_mano[i] << " ";
	exit(0);
}
Nel file nord.cpp e' specificata, fra le altre, la funzione ricevi_mano()
int* ricevi_mano(void) {
	int i ;
	messaggio j;
	static int  vettore_che_ritorna[13];
	cout << "\nsto in ricevi mano\n";
 
	for (i=0; i<13; i++) {
 
		msgrcv(nome_locale_coda_server_client, &j, sizeof(int), 1,0);
 
		vettore_che_ritorna[i]=j.j; //notate la felice scelta di nomi
		cout << "\nricevuto:" << vettore_che_ritorna[i]<< endl;
		}
	for (i=0; i<13; i++) cout << "nella funzione:"<<vettore_che_ritorna[i]
<< endl;    //questo funziona!
	return vettore_che_ritorna;      //magagna!!!!!!!
}
Se lo eseguo si sincronizza col server, riceve da lui il vettore tramite la
funzione ricevi_mano() ma poi ho un segmentation fault.
Questo e' l'output di nord:
toe@Hal9002:~/nord/nord > nord
nome_locale_coda_server_client=1
Nord dice: Ci sono tutti
sincronizzato
sto in ricevi mano
nome_locale_coda_server_client=1
ricevuto:0
[..]
ricevuto:47
ricevuto:48
nella funzione:0
nella funzione:3
[..]
nella funzione:48
Segmentation fault
toe@Hal9002:~/nord/nord >
...ultima cosa...perche' invece il programmino che ho compiltato per fare una
contro-prova funziona alla perfezione?
#include <iostream>
int* funzione() {
	static int vettore[10];
	int i;
	for (i=0;i<10;i++) vettore[i]=i;
	for (i=0;i<10;i++) cout << "nella funzione:"<<vettore[i]<<endl;
	return vettore;
}
main() {
	int i;
	int* vettore_attuale;
	vettore_attuale=funzione();
	for (i=0;i<10;i++) cout << "in main:"<<vettore_attuale[i]<<endl;
}
...COSA HA DI DIVERSO?????????????
-- 
Ciao
Salvatore 
               L'unico modo di accelerare Windows e'...a 9,8m/s^2
                Bad Penguin, la distribuzione Linux in italiano
                               ICQ# 268227566

funzione specifica al main.
Probabilmente il distruttore della classe messaggio e' bacato.
Saluti,
    Mardy

funzione specifica al main.
perchè non provi a debuggarlo con il gdb che fai prima?
cosi sei sicuro se il seg fault si verifica per colpa tua
o di un bug del sistema


...azz! E se scopro che e' un bug di sistema cosa vinco???
Il gdb l'ho usato poco, mi sapresti consigliare della documentazione adatta?


 ...azz! E se scopro che e' un bug di sistema cosa vinco???
Non conosco abbastanza il C++, ma se la definizione di static è simile a
quella del c hai già perso...l'errore è tuo.
mi son dimenticato di scrivere prima...
ed ora non ho + il tuo codice...
ciao
