|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 392
|
[C] funzione che restituisce un array
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
__________________
lol wut |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 392
|
__________________
lol wut |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Aug 2006
Città: Padova
Messaggi: 5658
|
Quote:
__________________
DESKTOP: Corsair Obsidian 550D || Corsair HX520W || Intel i5 3570k || Noctua NH-U9B SE2 || Gigabyte Z77-D3H || 2x4GB DDR3 Corsair 1600MHz || Sapphire R9 270X Dual-X || Crucial M4 128GB, WD Blue 1TB || Liteon 16x || LG IPS236V FullHD || Logitech X540 NAS: QNap TS219P || APC BE550G-IT DIABLO 3: Zhoth#2214 |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 392
|
ok perfetto, andiamo per gradi. smanettando un po', sono riuscito a far funzionare il tutto se l'array da restituire viene passato come parametro:
Codice:
char *funzione(char *parametro) // oppure char parametro[]
{
return parametro;
}
int main()
{
char pippo[] = "pippo";
printf("\n risultato: %s", funzione(pippo));
}
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: Codice:
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.
__________________
lol wut Ultima modifica di xplorer87 : 15-10-2007 alle 11:16. |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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: Codice:
char* func (void)
{
char *s = (char*) malloc (6 * sizeof (char));
strcpy (s, "hello");
return s;
}
oppure Codice:
char* func (void)
{
static char var[6] = "hello";
return var;
}
Quindi come vedi, quello che è importante è come e dove viene allocato l'array di char.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 15-10-2007 alle 11:22. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 392
|
perfetto, bastava semplicemente dichiararlo static o con malloc, grazie mille
riguardo l'assegnazione ad una variabile invece?
__________________
lol wut |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Codice:
char *s; s = func ();
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 392
|
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
__________________
lol wut |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
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
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 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:24.




















