Newsgroup: it.comp.lang.c++
Titolo: Funzione che restituisce Array...

Vorrei sapere se è possibile creare una funzione che restituisca un
array.
Tanto per prova avevo fatto una funzione banalissima tipo:
int *imposta(int *vettore)
{
	for (int i=0;i<10;i++)
		*(vettore+i)=i;
}
solo che quando la eseguo con:
vett1=imposta(vett1)
mi da un errore di complilazione: 
error C2440: '=' : cannot convert from 'int' to 'int [10]'
(vett1 è un intero di 10 elementi)
Come risolvo?
--
Icq: 32405502
Se le persone che parlano male di me, sapessero quello che dico io di loro, parlerebbero peggio.
Jim Morrison
Clicca sul link per contattarmi direttamente da icq
http://msg.mirabilis.com/scripts/contact.dll?msgto=32405502

 }
ma non manca un return vettore; ?
Pela

Mi sa che non si può assegnare un vettore ad un altro vettore:
Tipo
int pippo[10], pluto [10];
pippo = pluto;    Non ammesso
ciao
--
Luigi
http://web.tiscali.it/luigi_web
ICQ #46240443

 e Piero si incontrarono nella radura di Sherwood
(it.comp.lang.c++), dicendo:

--




mi sono dimenticato di scriverlo nel messaggio, ma c'era....



Ho provato e invece funziona... avrei scommesso il contrario...
Boh!


Boh!
E allora perché il mio codice non va?


Ho provato e invece funziona... avrei scommesso il contrario...
Non e' possibile, riprova, sarai piu' sfortunato.
--
Andrea Laforgia (mica uno qualunque...)

error C2440: '=' : cannot convert from 'int' to 'int [10]'
Quando hai un errore di compilazione e' importante
che tu fornisca un sorgente minimo ma *completo* che
possa far capire quale e' l'errore che hai commesso.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 E allora perché il mio codice non va?
Una funzione non può restituire un vettore, al massimo può modificare un
vettore che gli è stato passato come argomento. Inoltre, se la funzione
restituisce un puntatore ad una variabile interna(alla funzione), questo
puntatore sarà pericoloso perché una volta che la funzione fa fatto il suo
dovere tutte le sue variabili vengono cancellate, quindi il puntatore
restituito punterà ad un'area di memoria vuota. Se in seguito questa stessa
area venisse utilizzata dal programma per un altro dato, tale puntatore
potrebbe modificare pericolosamente i tuoi dati. Si dice "puntatore
impazzito".
Spero di essere stato chiaro.

del primo elemento pluto.
E' sbagliato.
Innanzitutto il nome di un vettore non e' affatto il
puntatore al primo elemento.
Si dice che il nome di un vettore "decade" nel puntatore al
primo elemento, ad eccezione di tre circostanze
specifiche[*].
Lo statement:
pippo = pluto ;
e' assolutamente illegale, date le dichiarazioni di questi
due vettori, perche' i nomi dei vettori sono degli lvalue
non modificabili.
-------------------------------------------------------
[*] Le tre circostanze sono:
1. quando il nome del vettore e' argomento di sizeof.
   Scrivere, difatti:
   int pippo[10] ;
   size_t dim = sizeof pippo ;
   non equivale a scrivere :
   size_t dim = sizeof (int*)  ;
   ma equivale a scrivere :
   size_t dim = 10 * sizeof(int) ;
2. quando il nome del vettore e' argomento dell'operatore
unario "address-of" indicato da &.
Il tipo restituito da &, quando applicato al nome del
vettore precedente, e' int (*)[10] e non int*.
3. quando il vettore e' un literal di inizializzazione:
  char s[] = "andrea" ;
In questo caso, "andrea" e' un vettore di 7 caratteri
(compreso lo '\0' finale) che non decade nel puntatore al
primo elemento, ma risulta essere equivalente a:
 
{ 'a', 'n', 'd', 'r', 'e', 'a', '\0' } ;


 Ho provato e invece funziona... avrei scommesso il contrario...
Non hai assegnato un vettore. Ricordati che il nome di un vettore è un
puntatore al primo elemento, quindi pippo=pluto assegna a pippo l'indirizzo
del primo elemento pluto.
Inoltre non hai due vettori, ma due nomi che indicano lo stesso vettore(cioè
due puntatori alla stessa area di memoria): se modifichi un valore a pippo,
anche il corrispettivo di pluto verrà modificato.

 Ho provato e invece funziona... avrei scommesso il contrario...
Credo che lo standard preveda che un array non puo' essere un lvalue, a meno
di essere una variabile automatica. Mi sa che il compilatore ha torto.
Ciao,
Zello


di essere una variabile automatica. 
Lo standard prevede che gli array siano lvalue non
modificabili.



così sia pippo che pluto puntano allo stesso array in memoria (è una copia
di puntatori)


No! pluto e pippo non sono puntatori.
Si tratta proprio di una copia di array! 
Non è un tipo di assegnamento previsto dallo standard (come è stato
detto), ma è un'estensione offerta da gcc.
Max

 di puntatori)
NO! Guarda che pippo e pluto sono array non puntatori.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

di puntatori)
Aridalle... li leggete i messaggi ?


 modificabili.
Insisto. Questo codice compila con VC++ e GCC.
#include <stdio.h>
void prova(int a[5])
{
 int* b;
 b=&a[3];
 a=b;
 printf("Prova: %d\n",b[0]); //stampa ovviamente 3
}
int main()
{
 int a[]={0,1,2,3,4};
 prova(a);
 return 0;
}
Ciao,
Zello


//  printf("Prova: %d\n",b[0]); //stampa ovviamente 3
printf ("Prova: %d\n",a[0]); //continua a stampare 3


}
Questo caso non fa testo.
Scrivere: 
int prova(int a[5]);
equivale a scrivere:
int prova(int *a);
quando assegni un valore ad a nella funzione, in realta' lo
assegni al puntatore copiato nello stack.
Leggi lo standard se non ne sei convinto.


printf ("Prova: %d\n",a[0]); //continua a stampare 3
Ti consiglio : K&R II versione.



... code snip
Insisti fin che vuoi, ma nel codice postato non c'e' nulla contraddica Andrea
Laforgia. Tutti gli assegnamenti che hai fatto sono assegnamenti fra puntatori
mentre Andrea (e io e altri) stiamo dicendo che non sono permessi dallo standard
assegnamenti fra array.
Deduco che non hai capito cosa e' un array e cosa e' un puntatore. Quindi
ripassati un buon reference del linguaggio.


 ripassati un buon reference del linguaggio.
Lo farò, grazie. Ci sono un sacco di lati misteriosi nel C++. Non la
differenza tra puntatori e arrays - se no perché avrei affermato
inizialmente che gli array sono lvalues non modificabili (fatto salvo
il caso di cui sopra)?
Ciao,
Zello

il caso di cui sopra)?
Non hai affermato questo, questo e' quello che ho affermato
IO, in risposta al messaggio in cui scrivevi:
"Credo che lo standard preveda che un array non puo' essere
un lvalue"
Lo ripeto: lo standard, al contrario, ammette che gli array
siano l-value non modificabili.



OK, due a zero. Mi arrendo :-)
Ciao,
Zello
