Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-11-2008, 16:09   #1
MrModd
Senior Member
 
L'Avatar di MrModd
 
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'è?
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2008, 18:07   #2
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2008, 20:22   #3
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Quote:
Originariamente inviato da cionci Guarda i messaggi
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'è:
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;
}
EDIT:
Tutte le variabili che non sono state dichiarate o le ho omesse volontariamente, o ho sbagliato a scrivere.
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003

Ultima modifica di MrModd : 23-11-2008 alle 20:27.
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2008, 00:41   #4
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2008, 13:49   #5
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Quote:
Originariamente inviato da cionci Guarda i messaggi
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...
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003

Ultima modifica di MrModd : 24-11-2008 alle 13:52.
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2008, 15:06   #6
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2008, 16:01   #7
MrModd
Senior Member
 
L'Avatar di MrModd
 
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?
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2008, 16:28   #8
cionci
Senior Member
 
L'Avatar di cionci
 
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)
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2008, 18:35   #9
MrModd
Senior Member
 
L'Avatar di MrModd
 
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?
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003

Ultima modifica di MrModd : 24-11-2008 alle 18:39.
MrModd è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2008, 18:51   #10
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2008, 19:15   #11
MrModd
Senior Member
 
L'Avatar di MrModd
 
Iscritto dal: Apr 2007
Messaggi: 924
Quote:
Originariamente inviato da cionci Guarda i messaggi
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!
__________________
The Dark Side of The MODD
Il mio album su Flickr
Linux User #479003
MrModd è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
ESA: rilevati 40 mila asteroidi vicino a...
La batteria salva fabbriche di EQORE ott...
SpaceX Starship: iniziati i test della t...
Datacenter IA nello spazio entro 5 anni,...
Telescopio spaziale James Webb: rilevato...
Ericsson Mobility Report: nel 2025 il 5G...
PLAI DEMO DAY: si chiude il secondo cicl...
Google rilascia Nano Banana Pro: il nuov...
ChatGPT si rinnova ancora: disponibile l...
Ring lancia super sconti di Black Friday...
Black Friday 2025: 450 euro di sconto su...
Tutte le offerte Blink in un unico posto...
OpenAI e Foxconn uniscono le forze per r...
Ricarica delle auto elettriche in 3 minu...
Lucid presenta Gravity Touring, il SUV e...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:03.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v