Funzione int e return int value

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.

Mi spiegate il perché ?

Grazie

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. :wink:

Guglielmo

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.

int simplecontroller(float input[],byte numelem)

Inoltre così la funzione è più “usabile”

Ok grazie.

Pero´ ora per usufruire del valore puntato dalla variabile output nella funzione loop() come faccio?

supponiamo che definisco un vettore

float in[4]={L,V,Ldot,flag}

poi richiamo la funzione:

out[2]=simplecontroller(in);

Avendo definito a priori la variabile out come:

float* out[2]={0,0};

Per assegnare il valore puntato da out a due variabili float definite come :

float S1;
float S2;

Devo scrivere:

S1=*out[0];
S2=*out[1];

Corretto?

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.

int simplecontroller(float input[],byte numelem)

Inoltre così la funzione è più “usabile”

Grazie. Questo l´ho capito!

f.schiano:
Cos´e´l´output verboso?

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

Grazie per la risposta.

Penso che ho trovato una soluzione piú pulita qui:
http://forum.arduino.cc/index.php?topic=42934.msg311088#msg311088

:slight_smile:

Grazie ancora