PDA

View Full Version : [C++] Errore nel ricevere un char* in una funzione


MrModd
23-11-2008, 16:09
Ciao, sto sempre lottando con le winsock.
Oggi ho dovuto mettere la connessione al socket in una funzione, perchè nel programma serviva troppe volte e non potevo di riscrivere tutto il codice ogni volta. Ora però ho un problema nel ricevere il nome del server:
la funzione è così definita:
int connessione(int mode, char* server, int port)
se però io gli mando un char* per il nome del server, lui in qualche modo mi altera il formato, perchè non riesce a connettersi.
Che problema c'è?

cionci
23-11-2008, 18:07
Difficile dirlo se non si vede il resto del codice.

MrModd
23-11-2008, 20:22
Difficile dirlo se non si vede il resto del codice.

Hehe, difficile mettere tutto il codice, è un po' lunghetto e ancora molto "spaghettoso"
Cerco di fare un riassunto per far vedere da dove arriva e com'è:


char* file_read(int parte, char* il_file)
{
FILE *file;
file=fopen(il_file, "r");
char buffer[1000], buffer2[1000];
fgets(buffer, 1000, file);
for (int a=strlen(buffer); a>=0; a--) if (buffer[a]=='\n') buffer[a]=NULL;
fgets(buffer2, 1000, file);
for (int a=strlen(buffer2); a>=0; a--) if (buffer2[a]=='\n') buffer2[a]=NULL;
if (parte==1) return buffer;
if (parte==2) return buffer2;
}

int connessione(int option, char *server, int porta)
{
switch (option)
{
case 1: //connessione
{
... //Tutti i comandi per la connessione (WSAStartup(...), bla bla bla)
if (inet_addr(server)==INADDR_ANY || inet_addr(server)==INADDR_NONE) //Il server è un dominio
{
conn_addr.sin_port=htons(porta);
host=gethostbyname(server);
}
else //Il server è un IPV4
{
conn_addr.sin_port=htons(porta);
indirizzo.s_addr= inet_addr(server);
host=gethostbyaddr((char *)&indirizzo,4, AF_INET);
}
case 2:
{ //Chiude il socket aperto
}
}
return 0;
}

int main();
{
file="testo.txt";
connessione(1, file_read(1, file), atoi(file_read(2, file)));
return 0;
}


EDIT:
Tutte le variabili che non sono state dichiarate o le ho omesse volontariamente, o ho sbagliato a scrivere.

cionci
24-11-2008, 00:41
E' errata file_read...non puoi ritornare l'indirizzo di una variabile automatica locale alla funzione in quanto questa viene distrutta al termine dell'esecuzione della funzione.

MrModd
24-11-2008, 13:49
E' errata file_read...non puoi ritornare l'indirizzo di una variabile automatica locale alla funzione in quanto questa viene distrutta al termine dell'esecuzione della funzione.

Quindi cosa ci metto?
Però se nella funzione "connessione" ci metto cout << server, lui me la visualizza correttamente...

cionci
24-11-2008, 15:06
Passa il buffer che deve contenere il nome del server a file_read.

void file_read(int parte, char* il_file, char * server)


Il buffer lo allochi al di fuori della chiamata e poi lo passi all'altra funzione.

MrModd
24-11-2008, 16:01
O.o Devo modificare 600 righe di codice???
Non c'è un altro tipo di variabile che la funzione "file_read" può ritornare per evitare di modificare tutto?

E poi come ho detto prima se io metto un "cout << server;" vedo che nella variabile server c'è il nome del server, ma perchè quando la vado a usare nel socket sparisce?

cionci
24-11-2008, 16:28
cout << server funziona perché quelle locazioni di memoria non sono ancora state riscritte.
Qualsiasi altra modifica è dannosa, l'unico modo per ritornare un char * è allocare dinamicamente i buffer. Però vanno anche deallocati con delete, alla fine è più lungo modificarli così.

Tra l'altro dovresti passare anche la dimensione della stringa per essere sicuri che non sia troppo piccola:

void file_read(int parte, char* il_file, char * server, const int server_size)

MrModd
24-11-2008, 18:35
E se assegno ad un buffer (char buffer[]) il valore della funzione read_file() e poi la rimando in connessione()?

EDIT:
Anzi dimmi se può funzionare così:
inglobo tutta la funzione read_file() in main(), gli faccio prelevare tutti i valori che mi interessano dal file (il server, la porta ed altri valori) e li assegno in delle variabili (es. porta [100], server[1000], ecc.).
Dici che può funzionare?

cionci
24-11-2008, 18:51
Sì, ma non mi sembra una soluzione migliore rispetto a passare un buffer a file_read.

MrModd
24-11-2008, 19:15
Sì, ma non mi sembra una soluzione migliore rispetto a passare un buffer a file_read.

Nel mio programma si, diventerebbe troppo ingarbugliato. In effetti ora ci stavo pensando, il programma legge inutilmente un sacco di volte il file quando basta leggerlo una volta sola ed assegnare tutti i valori a variabili locali. Più tardi vedrò la soluzione migliore.
Grazie dell'aiuto, se avrò altri problemi con questa chiamata di funzione richiederò qui.
Ciao!