PDA

View Full Version : [C] funzione che restituisce un array


xplorer87
13-10-2007, 15:07
ciao ragazzi, mi trovo a combattere il C, e probabilmente imbastardito dalla semplicita' di linguaggi tipo java, sto incontrando parecchie difficolta'. in primis, come costruire una funzione che restituisca un array (scendendo nel caso specifico, una stringa, quindi array di char)?

ciao e grazie

xplorer87
14-10-2007, 16:55
:mc:

andbin
14-10-2007, 17:00
ciao ragazzi, mi trovo a combattere il C, e probabilmente imbastardito dalla semplicita' di linguaggi tipo java, sto incontrando parecchie difficolta'. in primis, come costruire una funzione che restituisca un array (scendendo nel caso specifico, una stringa, quindi array di char)?La questione principale è una sola: come e dove viene allocato l'array di char??

!@ndre@!
14-10-2007, 17:07
ciao ragazzi, mi trovo a combattere il C, e probabilmente imbastardito dalla semplicita' di linguaggi tipo java, sto incontrando parecchie difficolta'. in primis, come costruire una funzione che restituisca un array (scendendo nel caso specifico, una stringa, quindi array di char)?

ciao e grazie

..ma l'array è locale alla funzione o glielo hai passato dal main??

xplorer87
15-10-2007, 10:12
ok perfetto, andiamo per gradi. smanettando un po', sono riuscito a far funzionare il tutto se l'array da restituire viene passato come parametro:


char *funzione(char *parametro) // oppure char parametro[]
{
return parametro;
}


int main()
{
char pippo[] = "pippo";

printf("\n risultato: %s", funzione(pippo));

}


mi sembra di aver capito che in c funziona cosi' se si vogliono trattare gli array: una funzione prende in ingresso sempre il puntatore al primo elemento dell'array, e quello che restituisce e' sempre un puntatore al primo indirizzo di un array. direi che la funzione lavora per riferimento, no?
quindi, funzione prende in ingresso il puntatore al primo puntatore dell'array, lo restituisce, lo uso nel printf e tutto funziona. ora se volessi assegnare il risultato di questa funzione ad un'altra variabile, come dovrei fare? provo cosi', ma a schermo ottengo solamente bit spazzatura, con tanto di messaggio di warning:


char *funzione(char *parametro)
{
return parametro;
}


int main()
{
char pippo[] = "pippo";
char topolino[5];
*topolino = funzione(pippo);
printf("\n risultato: %s", topolino);
}


D:\Documenti\Programmazione\C\lab\prova.c:: In function `main':
D:\Documenti\Programmazione\C\lab\prova.c:16: warning: assignment makes integer from pointer without a cast
:: === Build finished: 0 errors, 1 warnings ===




infine, in merito inoltre a quanto mi chiede !@ndre@!, qualcosa riesce a funzionare finche' gli array li passo per riferimento come parametri. se invece li dichiaro interni alla funzione, il compilatore mi avvisa che sto provando a returnare il puntatore ad una variabile locale... mi sembra che non si possa proprio restituire il puntatore ad una variabile interna alla funzione in C, o sbaglio? al massimo devo dichiarare quest'ultima globale, e allora non ho problemi.

andbin
15-10-2007, 10:20
se invece li dichiaro interni alla funzione, il compilatore mi avvisa che sto provando a returnare il puntatore ad una variabile locale... mi sembra che non si possa proprio restituire il puntatore ad una variabile interna alla funzione in C, o sbaglio?La questione l'ho detta io: come e dove viene allocato l'array di char.

Nei tuoi esempi sopra, i caratteri sono in un array di char inizializzato con i caratteri di una stringa "literal". Tu passi alla funzione quell'indirizzo e poi lo ritorni. Semplice e banale.

Puoi fare:
char* func (void)
{
char *s = (char*) malloc (6 * sizeof (char));
strcpy (s, "hello");

return s;
}In questo caso l'array è allocato dinamicamente.

oppure

char* func (void)
{
static char var[6] = "hello";
return var;
}E in tal caso hai una variabile di durata "fissa", che non "sparisce" quando la funzione termina (dura per tutta la vita del programma).

Quindi come vedi, quello che è importante è come e dove viene allocato l'array di char.

xplorer87
15-10-2007, 10:44
perfetto, bastava semplicemente dichiararlo static o con malloc, grazie mille :)

riguardo l'assegnazione ad una variabile invece?

andbin
15-10-2007, 10:46
riguardo l'assegnazione ad una variabile invece?char *s;
s = func ();

xplorer87
15-10-2007, 11:00
ora mi si chiariscono un sacco di idee: quindi basta dichiarare una variabile puntatore s, e poi assegnare al puntatore il risultato della funzione! io invece erroneamente dichiaravo un array (topolino), e ad assegnavo al valore di quello che un puntatore non era (*topolino), il risultato della funzione, un puntatore per l'appunto.

grazie ancora :)

recoil
16-10-2007, 09:17
l'uso di static è corretto, ma preferisco impiegarlo solo quando ho necessità di mantenere dei valori in modo "trasparente" alla funzione chiamante. una sorta di information hiding che in C++ ecc. si fa con i campi privati di una classe :D

la cosa "migliore" (dipende dai casi) credo sia quella di allocare l'array dalla funzione chiamante e passarlo come parametro in modo che venga modificato. se la dimensione non è nota a tempo di compilazione e può essere calcolata solo dalla funzione il discorso cambia, devi allocare con malloc quindi va bene che la funzione restituisca un puntatore a un array
stilisticamente non mi piace, ma spesso in C si fanno ste cose quando è necessario :D