|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
[C++] Errore nel ricevere un char* in una funzione
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'è? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Difficile dirlo se non si vede il resto del codice.
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
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'è: Codice:
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;
}
Tutte le variabili che non sono state dichiarate o le ho omesse volontariamente, o ho sbagliato a scrivere. Ultima modifica di MrModd : 23-11-2008 alle 20:27. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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.
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
Però se nella funzione "connessione" ci metto cout << server, lui me la visualizza correttamente... Ultima modifica di MrModd : 24-11-2008 alle 13:52. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
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? |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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) |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
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? Ultima modifica di MrModd : 24-11-2008 alle 18:39. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì, ma non mi sembra una soluzione migliore rispetto a passare un buffer a file_read.
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
Grazie dell'aiuto, se avrò altri problemi con questa chiamata di funzione richiederò qui. Ciao! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:03.




















