Newsgroup: it.comp.lang.c++
Titolo: COME FUNZIONA? e perchè su Visual Studio non compila?

Salve a tutti,
Nessuno mi prenda per scemo, ma mesi fa iniziai un progetto, salvo
abbandonarlo per altri impegni, ma ora, dopo averlo ripreso in mano, non
riesco più a
capire COME POSSA funzionare.
In effetti, mi sono accorto di aver fatto delle cose piuttosto strane, ma
che a quel tempo dovevano essermi sembrate naturali, visto che non ho
lasciato uno stralcio di commento a riguardo.
Se tutto funzionasse per bene, probabilmente nemmeno ci avrei fatto caso, ma
questo programma, scritto con Dev C++ e MinGW32, regolarmente
funzionante con quell'ambiente, non ne vuol sapere di compilare col Visual
Studio .NET Enterprise Architect.
Per questo ho dato un'occhiata al codice ed è saltato fuori il punto oscuro
che sto per sottoporre alla vostra attenzione.
Non ho grande esperienza di programmazione C++, eppure mi risulta un poco
strana la maniera con cui tutto sembra stare (e stava!) in piedi.
Il programma utilizza una tabella implementata tramite una lista.
La lista è realizzata tramite un oggetto classe DataTable, che racchiude,
oltre ai canonici puntatori agli elementi, anche una serie di funzioni atte
al recupero di dati dalla tabella.
La tabella in sè per sè non contiene dati, ma puntatori a dati contenuti in
un archivio precaricato in memoria (un array di DataSegment, ma questa è
un'altra storia).
Ecco il codice incriminato:
---------------------------------------------
typedef char* DataSegment[10];
// DataSegment costituisce la parte 'informativa' di una riga della tabella.
// Come si vede, è un array di 10 stringhe
struct DataTableRow {
    DataSegment* info;
    DataTableRow* next;
};
// DataTableRow è una riga, che contiene un puntatore
// alla riga successiva, e - attenzione - non un oggetto
// DataSegment, ma un puntatore a quest'ultimo.
// Alla fine, è la classica implementazione di una lista.
class DataTable {
// La classe che implementa la tabella
    DataTableRow* head;
    DataTableRow* tail;
    DataTableRow* current;
// current è un puntatore 'di servizio'. permette di scorrere la tabella
// riga dopo riga, per un accesso sequenziale
    DataTableRow* previous;
    int elCur;
    int elNum;
    bool failFlag;
public:
//    [...]
    DataTable& DataTable::curGet (DataSegment&);
//    [...]
};
DataTable& DataTable::curGet (DataSegment& r) {
//    [...]
     r = *(current->info);     //     ##########
// questo è il nodo della questione!
//    [...]
}
-----------------------------------------
Mingw32 non dà alcun problema, mentre quando compilo il progetto con Visual
Studio .NET, ottengo: " '=': l'operando sinistro deve essere un I-Value ".
Nel codice effettuo chiamate a curGet() passando come argomento un
DataSegment, poi recupero tranquillamente le stringhe con l'operatore [].
Eppure mi pare tutto molto oscuro.
Vi torna?
Grazie a tutti,
B.B.
P.S. Finora ho fatto finta che chiedermi come sia possibile che mi sia
completamente dimenticato di come funzioni il programma non fosse una
domanda lecita, quando invece lo è, eccome. La risposta comunque è semplice:
il riposo estivo, purtroppo, gioca brutti scherzi.

 // questo è il nodo della questione!
Un array non può comparire a sinistra di un'operazione di assegnamento.
Il GCC ammette tale costrutto, ma si tratta di un'estensione dello 
Standard, che il VC++, legittimamente, non riconosce.
Come soluzione sbrigativa puoi semplicemnte incapsulare DataSegment in una 
classe o una struct.
Max