Ciao a tutti, sono un po´ arrugginito con la programmazione C++ e non riesco a capire dove sbaglio.
Ho la seguente funzione:
int simplecontroller(float input[4])
{
int S1=0;
int S2=1;
int flag=0;
int output[3];
output[0] = S1;
output[1] = S2;
output[2] = flag;
return (output);
}
Pero´ ho l´errore:
"cannot convert float* to float in return"
Se invece dichiaro la funzione come :
int* simplecontroller(float input[4])
Funziona senza problemi.
Perché hai dichiarato output come un vettore e quindi nella return, non avendo indicato un elemento (che è un int), ma tutto il vettore, è ovvio che il compilatore può ritornare solo il puntatore al vettore. Quindi, correttamente, quella funzione NON ritorna un int, ma un puntatore ad un vettore di int.
output è un vettore, non una singola variabile.
O ritorni uno degli elementi di output esempio:
return (output[0]);
Oppure ritorni l’indirizzo del vettore output. Ma in questo caso la dichiarazione della funzione è int*
E comunque è sbagliato, perchè ritorni indirizzo di una variabile locale che verrà distrutta dopo la return.
Prova a mettere l’opzione verbose alla compilazione e vedrai l’avviso del compilatore (Preferenze->mostra output verboso).
Non capisco a cosa serva dichiarare gli elementi del parametro input. Il C non controlla quanti elementi passi.
Pensavo addirittura ti desse errore o warning.
Secondo me dovrebbe essere:
int simplecontroller(float input[])
e al limite passi un secondo parametro per dire quanti elementi.
nid69ita:
output è un vettore, non una singola variabile.
O ritorni uno degli elementi di output esempio:
return (output[0]);
Oppure ritorni l’indirizzo del vettore output. Ma in questo caso la dichiarazione della funzione è int*
E comunque è sbagliato, perchè ritorni indirizzo di una variabile locale che verrà distrutta dopo la return.
Prova a mettere l’opzione verbose alla compilazione e vedrai l’avviso del compilatore (Preferenze->mostra output verboso).
Non ho capito cosa intendi. Io definendo la funzione come int* e facendo il return di un vettore ho come risultato della funzione un indirizzo a un vettore giusto?
Tu pensi che questo poi non funzioni? Cioé non riusciró a estrarre, nella funzione loop, il valore puntato dalla variabile puntatore risultato della funzione?
Cos´e´l´output verboso?
nid69ita:
Non capisco a cosa serva dichiarare gli elementi del parametro input. Il C non controlla quanti elementi passi.
Pensavo addirittura ti desse errore o warning.
Secondo me dovrebbe essere:
int simplecontroller(float input[])
e al limite passi un secondo parametro per dire quanti elementi.
Quando compili non vedi tutti i passi che il compilatore fa e non tutti i warnings (avvisi, non errori ma avvisi). Attivandola vedi anche tutto quello che fa il compilatore (vedrai anche che compila vari file .c ).
f.schiano:
Non ho capito cosa intendi. Io definendo la funzione come int* e facendo il return di un vettore ho come risultato della funzione un indirizzo a un vettore giusto?
Tu pensi che questo poi non funzioni? Cioé non riusciró a estrarre, nella funzione loop, il valore puntato dalla variabile puntatore risultato della funzione?
Le variabili globali hanno vita per tutto il programma.
Le variabili locali vengono create quando entri nella funzione. Ma vengono distrutte alla sua uscita. Hanno perciò vita solo dentro la funzione.
Se in una funzione hai la creazione di una variabile x intera, questa verrà creata quando la funzione viene chiamata ma quando la funzione finisce, viene distrutta. Il puntatore a questa variabile x ha senso dentro la funzione ma all’uscita no perchè quella variabile non esiste più e punterai a un indirizzo in cui non c’e’ più nulla. (Anzi quello spazio di solito è nello stack.)
Un esempio corretto di ritorno di un puntatore all’interno di un vettore può essere la strrchr() che ricerca un carattere all’interno di un vettore di caratteri (stringa) e ti ritorna il puntatore alla cella trovata oppure 0. Ma in questo caso hai il return di un puntatore al vettore stesso, che dopo la chiamata esiste di sicuro.
char s[]="pippo";
char *ps=strchr(s,'i');
// ps==0 oppure indirizzo verso s