PDA

View Full Version : [Visual C++ .NET] Matrici


cipi
29-10-2003, 10:10
Salve,
sono sempre io... deciso a farmi del male abbandonando il buon caro vecchio linux e programmando ora in winzoz... Ma veniamo al dunque:
dovrei creare una funzione che legga da file ASCII (diciamo txt) dei valori "double" e li metta in una matrice. Facile dite? Il fatto è che il numero di colonne della matrice è fisso (una ventina) ma non so a priori il numero delle righe... Cosa mi conviene fare? Mandatemi un paio di dritte, grazie.
PS
Siccome ho appena cominciato ad adentrarmi nel mondo .NET vi pregherei di specificare non solo le funzioni ma anche le librerie a cui fare riferimento, ecc.
Avrei anche un altro problema ma... aprirò un'altra discussione!
cipi

cionci
29-10-2003, 11:21
Ma stai programmando con .Net o normale C++ liscio ?

soalle
29-10-2003, 12:47
Il file txt è una specifica / vincolo che ti è stato dato oppure hai deciso tu?

Se hai deciso tu puoi benissimo supporre che nel file è memorizzata la matrice per righe, per cui ogni riga del file contiene esattamente 20 numeri (le 20 colonne della matrice).
Il fatto che tu non sappia il numero di righe non è un problema rilevante. Tu leggi il file dall'inizio alla fine riga per riga e scopri quante righe ha.

Per leggere usi StreamReader del namespace System.IO

Per gestire il numero di righe variabili puoi usare un' ArrayList (array dinamico) del namespace System.Collections. L'ArrayList contiene a sua volta degli array (statici di 20 elementi) che rappresentano ognuno le righe... poi se proprio vuoi un array e non un array list dopo fai un ToArray() e ti spara fuori un array statico....

Ciaociao ;)

cionci
29-10-2003, 18:32
soalle...aspetta perchè in un altro post parla di MFC ;)

soalle
29-10-2003, 18:50
Già risposto... ;)

cipi
30-10-2003, 10:27
Originariamente inviato da soalle
Il file txt è una specifica / vincolo che ti è stato dato oppure hai deciso tu?

Se hai deciso tu puoi benissimo supporre che nel file è memorizzata la matrice per righe, per cui ogni riga del file contiene esattamente 20 numeri (le 20 colonne della matrice).
Il fatto che tu non sappia il numero di righe non è un problema rilevante. Tu leggi il file dall'inizio alla fine riga per riga e scopri quante righe ha.

Per leggere usi StreamReader del namespace System.IO

Per gestire il numero di righe variabili puoi usare un' ArrayList (array dinamico) del namespace System.Collections. L'ArrayList contiene a sua volta degli array (statici di 20 elementi) che rappresentano ognuno le righe... poi se proprio vuoi un array e non un array list dopo fai un ToArray() e ti spara fuori un array statico....

Ciaociao ;)

Ciao,
intanto, grazie soalle: stai diventando il mio mentore informatico!!! :ave:
Secondo: i file di ingresso inizialmente dovevano essere in excel... Il problema è nato in quanto Excel non tratta matrici con più di un 65k righe... (+ o -):nono:. Allora mi sono dato al caro vecchio txt...
Ho scelto il VC++.NET in quanto già conosco bene il C e mastico già un po' il C++: dovendo produrre il programma il prima possibile, non potevo permettermi di studiare il C# (ma lo farò appena possibile!). Ecco perchè devo capire velocissimamente come creare una interfaccia che richiami gli algoritmoni (che ho già prodotto...) Quindi, riesci a darmi un paio di dritte ancora su dove puntare l'attenzione al riguardo di MFC...?
Per quanto riguarda quanto mi hai scritto sopra... proverò e MI FARO' SENTIRE MOLTO PRESTO! E' UNA MINACCIA:::;) ;) ;)
Ciao e grazie ancora....

soalle
30-10-2003, 10:40
Becchi male.... di MFC non so niente... probabilmente il guru cionci ti potrà dire qualcosa...

Mi pare tuttavia che se scegli C++.NET + MFC tu sia costretto ad affidarti a codice unmanaged (ditemi se sbaglio)...

Per quanto riguarda la mega matrice... hai bisogno di + di 65k righe??? :eek: altrimenti considera che ci sono le classi managed e unmanaged per interfacciarsi ad excel...

cionci
30-10-2003, 11:08
Costruire un'interfaccia che richiama i tuoi algoritmi si fa abbastanza alla svelta con MFC...

Crei un nuovo progetto di tipo Dialog...vai in ResourceView...doppio click sul Dialog principale...
Selezioni una risorsa (un tasto, il form stesso, una textbox) e con il tasto destro vai su ClassWizard... In quella finestra ci sono tutti i vari messaggi che talerisorsa può generare...

Selezioni il messaggio da gestire...Add function e fai la funzione che, ad esempio, può gestire un tasto (in teoria potresti lanciarci il tuo algoritmo)...

Sempre su Class Wizard -> Member Variables puoi associare ad una variabile della tua classe principale una risorsa...
In questo modo puoi gestire l'input e l'output...
Puoi associare per valore o per oggetto...

Se assci per valore con la funzione UpdateData puoi fare in modo che i dati contenuti nelle variabili vadano a finire nella risorsa associata o viceversa...

Comunque se vuoi questo libro ti può aiutare: http://www.devpride.com/Linguaggi/C++/Tutorial/MFC_Book.zip
Ovviamente è indispensabile l'MSDN Library...

soalle
30-10-2003, 14:18
puntuale come un orologio svizzero ;) :D

cipi
31-10-2003, 14:42
:ave::ave::ave::ave::ave:

cipi
31-10-2003, 15:06
A chi interessasse, in modo molto grezzo (penso) avevo risolto così:
(...)
ifstream f1("nomefile.txt",ios::in);
(...)
do{
f1 >> value;
Y->Add(__box(value));
}while(!f1.eof);
Double YY[,]=new Double[((Y->Count)/Numero_colonne)+1,Numero_colonne+1];
int count=0;
int i=0;
do{
i++;
for(int j=1;j<=Numero_colonne;j++)
{
count++;
YY[i,j]=Convert::ToDouble(Y->get_Item(i+j-2)); // per gli indici da 1 e non da 0
}
}while(count<(Y->Count));
(...)



Ciao
PS Ogni commento è ben accetto!!!;)