ArrayList multidimensionali.....in .NET visual C++

lunedì 30 luglio 2007 - 07.44

karpediemnow Profilo | Newbie

Premessa:
ho una serie di dati memorizzati in un file strutturato in questo modo

valore1.1,valore1.2,valore1.3,valore1.4
valore2.1,valore2.2,valore2.3,valore2.4
....
....
valoreN.1,valoreN.2,valoreN.3,valoreN.4

e ho la necessita di salvarmi questa struttura in memoria.
Quindi la cosa più semplide è salvarmi i dati in un vettore bidimensionale in modo che se mi serve,ad esempio, il valore valore2.4
posso richiamarlo con :

vet[1][3]

Bene...concettualmente fuinziona....ma praticamente....


StreamReader^ TR1 = File::OpenText(Application::StartupPath+"\\TR1.dat");
String^ valTR;
ArrayList^ sdTR=gcnew ArrayList();
while(valTR = TR1->ReadLine()){
sdTR->Add(valTR->Split(','));
}

e fin qui tutto ok se compilo non ho problemi e mettendo dei breakpoint la il vettore si popola correttamente.

ma quando voglio accedervi es:

MessageBox::Show(sdTR[1][3]);

errore in compilazione:
error C3915: 'System::Object' non ha una proprietà indicizzata predefinita (indicizzatore di classe)

ho provato anche a fare una cosa del genere:
nel while:
String^ tmp;
tmp=valTR->Split(',');
ArrayList^ sdTRR=gcnew ArrayList();
for(int t=0;t<tmp->Length;t++){
sdTRR->Add(tmp[t]);
}
sdTR->Add(sdTRR);

ma ho lo stesso errore

Come posso accedere direttamente ai valori della matrice???
Ciao e grazie

Brainkiller Profilo | Guru

>e fin qui tutto ok se compilo non ho problemi e mettendo dei
>breakpoint la il vettore si popola correttamente.

>errore in compilazione:

Hai appena detto che compila e non hai problemi e poco dopo incolli un errore di compilazione ? Strano no ? Puoi spiegare meglio ?

Il codice che hai indicato crea un ArrayList a una sola dimensione però. Per questo non puoi accedera al secondo elemento.

Io ti consiglio di provare così, in C# adattalo al C++:

string[,] array1 = new string[2, 20]; array1[0, 5] = "CIAO";

ossia array bidimensionale di stringhe. Volendo puoi usare anche l'ArrayList bidimensionale, crei un array di ArrayList.

ArrayList d = new ArrayList(); d.Add(new ArrayList()); d.Add(new ArrayList());

Non essendo Generic però devi fare continuamente cast per accedere agli elementi e non so quanto è conveniente. Cioè non accedi facilmente con [x][y] come potrebbe essere con l'array di stringhe sopra.
Ciao


David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

karpediemnow Profilo | Newbie

>>e fin qui tutto ok se compilo non ho problemi e mettendo dei
>>breakpoint la il vettore si popola correttamente.
>
>>errore in compilazione:
>
>Hai appena detto che compila e non hai problemi e poco dopo incolli
>un errore di compilazione ? Strano no ? Puoi spiegare meglio
>?

se popolo la matrice senza accedervi non ho nessun errore di compliazione.

appena provo ad accedevi ho l'errore.

>
>Il codice che hai indicato crea un ArrayList a una sola dimensione
>però. Per questo non puoi accedera al secondo elemento.

sei sicuro? mettendo dei breakpoint mi fa vedere una truttura a matrice....
al massimo mi fa un arrayList in cui ogni riga è un vettore di stringhe (il tipo di ritorno della plit)

>Io ti consiglio di provare così, in C# adattalo al C++:
>
>
>string[,] array1 = new string[2, 20];
>array1[0, 5] = "CIAO";

nel mio caso non so a priori la dimensione del vettore non posso fare una new string[2,20]
dovrei usre Array::Resize il che non mi sembra elegante

>l'ArrayList bidimensionale, crei un array di ArrayList.
>

[CUT]

>Non essendo Generic però devi fare continuamente cast per accedere
>agli elementi e non so quanto è conveniente. Cioè non accedi
>facilmente con [x][y] come potrebbe essere con l'array di stringhe
>sopra.

ho fatto un po di prove e ho trovato la soluzione, come dici tu devo fare il cast
StreamReader^ TR1 = File::OpenText(Application::StartupPath+"\\TR1.dat");
int cont=0;
String^ record;
ArrayList^ xx=gcnew ArrayList();
array<String^>^vetVal={};
while(record = TR1->ReadLine()){
vetVal=record->Split(',');
ArrayList^ yy=gcnew ArrayList();
for(int t=0;t<vetVal->Length;t++){
yy->Add(vetVal[t]);
}
xx->Add(yy);
}
ArrayList^ prova;
for(int d=0;d<xx->Count;d++){
prova=(ArrayList^) xx[d];
MessageBox::Show(Convert::ToString(prova[0]));
}
}
ma possibile che non ci sia un modo più semplice.....eppure i vettori bidimensionali si usano come il pane.....

Brainkiller Profilo | Guru

>sei sicuro? mettendo dei breakpoint mi fa vedere una truttura
>a matrice....

Io non vedo una matrice. ArrayList implementa l'interfaccia IList che è una lista semplice quindi un elenco di elementi quindi un array. Se poi negli elementi della Lista vai ad aggiungere altri array o arraylist allora diventa n-dimensionale. Ma di base è a 1 dimensione.

>nel mio caso non so a priori la dimensione del vettore non posso
>fare una new string[2,20]

Puoi fare anche così, in genere si dovrebbe già sapere all'inizio quanti sono gli elementi che si vanno a inserire:

int x = 5; int y=20; string[,] arr = new string[x,y];

>ma possibile che non ci sia un modo più semplice.....eppure i
>vettori bidimensionali si usano come il pane.....

Appunto, te l'ho indicato qui sopra.
Ciao


David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5