Newsgroup: it.comp.lang.c++
Titolo: assegnazione array delucidazione

Scusate la domanda banale,
mi sono trovato questa sorpresa.
Se ho due array della stessa dimensione tipo:
int x[5],y[5]
l'assegnazione x=y copia tutti gli elementi
di y in x.
Ho fatto questa verifica(con gcc 2.95).
Ma non era errato farlo? (era necessario ad es. un ciclo for) 
E' ció che in effetti c'é scritto anche sul Lippman.
Da quando ció é possibile?
Skitch

 int x[5],y[5]
non puoi certo copierne gli elementi con una semplice assegnazione tipo
x = y
operazione tra l'altro assolutamente illegale (non copia neanche l'indirizzo
dei puntatori) essendo
x
un puntatore costante e dunque un r-value, non un l-value.
L'assegnazione sopra dovrebbe dunque darti un errore in compilazione.
Stai tranquillo quindi che C e C++ non permettono assolutamente il fenomeno
da te riportato con sorpresa.
Come possa succedere in "ambito gcc" non ne ho idea, posta magari tutto il
codice.
Un saluto,
Sergio

Infatti sono rimasto sorpreso dato che questa notizia 
mi giungeva nuova. L'ho letta in una lezione del prof.
di informatica.
Questo é il listato di test che ho fatto:
#include <iostream>
main()
{
  int x[5]={1,2,3,4,5},y[5]={6,7,8,9,10};
  x[1]=200;
  y=x;
  for(int i=0;i<5;i++)
    cout << y[i]<<",";
  cout << endl;
 
	y[2]=0;
 for(int i=0;i<5;i++)
   cout << x[i]<< ", ";
 cout << endl;
 for(int i=0;i<5;i++)
   cout << y[i]<< ",";
}
e in output ottengo:
1,200,3,4,5,		// array int y[5]
1, 200, 3, 4, 5,	// array int x[5]
1,200,0,4,5,		// array int y[5]
quindi nessun errore nemmeno dal compilatore.
skitch

 wrote in message
news:pan.2003.01.06....@yahoo.com...

E' un errore  del compilatore.
Anche col DevC++ mi da' il tuo stesso risultato mentre il Visual C++ mi dice
chiaramente:
D:\Code\Test\console\fileout.cpp(13) : error C2106: '=' : left operand must
be l-value
Ed anche il Lippman dice che non e' possibile assegnare un array a un altro
array con l'operando =.
Ovviamente l'ultima parola ce l'ha lo standard che...non ho!
Ma mi fido del Lippman che su queste cose non sbaglia.
Prova a scaricare l'ultima versione del gcc e rifai il test.
Maurus

...confermo che anche il compilatore borland NON lo compila per lo 
stesso errore del VC++


 Ma non era errato farlo?
Sì, non è previsto dallo Standard. E' una possibilità che offre il gcc, ma
è da considerarsi un'estensione. Non ricordo se esiste uno switch per
disabilitarla. GIYF.
Max

SKITCH wrote:

A me (gcc 3.2) da questo errore:
p.cpp: In function `int main()':
p.cpp:5: ISO C++ forbids assignment of arrays
make: *** [p] Error 1
Ciao,
Cecco

 un puntatore costante e dunque un r-value, non un l-value.
Una precisazione: il nome di un array non e` un puntatore, decade solamente 
al puntatore al primo elemento; e` simile ad un puntatore costante (non 
puoi applicargli l'aritmetica dei puntatori e non puoi assegnarlo), ma se 
gli applichi l'operatore sizeof ottieni la dimensione dell'array, e non la 
dimensione di un puntatore.
Ciao,
Cecco

 }
Che gcc 2.95 non e` standard lo si vede anche dal fatto che includi iostream 
e poi usi cout senza riferirti al namespace std.
Ciao,
Cecco

Max M. ha scritto:

Prova a compilare con
gcc TUE_OPZIONI -ansi
Magari aggiungi anche -pedantic, per esagerare ;-)
E ti consiglio sempre anche -W -Wall, per abilitare i warning. Ciao
-- 
Andrea Bergia - studente              Linux Registred User #281550
"The one thing we're all waiting for, is peace on Earth and an end to war,
it's a miracle we need, the miracle, the miracle, 
Peace on earth and end to war today,
That time will come one day you'll see when we can all be friends"


Non è PROPRIAMENTE una variabile puntatore (costante), ma il concetto è
quello e, sizeof a parte, lo si può tranquillamente considerare e usare come
tale (come del resto riportato in tutti i manuali di programmazione C in mio
possesso).
Saluti,
Sergio

 
Credo appunto che GCC ver3.2 rispetti
piú gli standard, ad esempio bisogna specificare
il namespace mentre con la 2.95 era sottointeso "std".
Quello che piú mi lascia perplesso é che in un corso
universitario si diano informazioni del genere,
che risultano corrette solo in un ristretto numero 
di situazioni, quando invece la portabilitá/lo standard
dovrebbe essere l'obiettivo principale.
Ciao Skitch


Già, stupirsi è normale.
Ma solo all'inizio.
Poi ci si fa l'abitudine, soprattutto se i professori ignoranti sono tanti.
Fortuna che ci sono ancora quelli bravi.
Come tutte le cose buone di questo tempo, sono pochi e resistono a stento.
Ma ci sono.
Scusate la nota forse OT,
Saluti,
Sergio