Matrici dinamiche

mercoledì 11 febbraio 2009 - 11.37

Meryotta Profilo | Newbie

sto sviluppando un piccolo programmino in visual basic 6 nel quale ho disogno di una serie di matrici ad una
dimensione.Ognuna di queste matrici mi serve per prelevare un campo di una tabella del mio database.
Faccio un esempio: ho la tabella dati preventivo in cui vi sono tutti i record di tutti i preventivi ed ho bisogno di
visualizzare in una flexgrid i record di un solo preventivo e devo salvare solo questi record anche in un' altra tabella.
Ho pensato di associare ad ogni campo una matrice. Ex: dim codicemateriale(10) as string.
Il problema è che non so mai di quanti record è formato il mio preventivo per cui ho bisogno di matrici dinamiche.
Esempio di codice:
dim numerorecordvalido as integer contatore di record validi
dim codicemateriale() as string matrice dinamica
redim codicemateriale(10)
apro database
do
cerco record valido

if numerorecordvalido>10 then
Redim codicemateriale(numerorecordvalido + 1)
end if
inserisco campo nella matrice
codicemateriale(numeroRecordValido)

numerorecordvalido= numerorecordvalido+1

while eof
chiudo database

domanda: Il programma occupa meno memoria ridimensionando ad ogni passo la matrice o mi
conviene mettere delle matrici statiche abbastanza capienti? Insomma il programma è stabile
se ridimensiono più volte le matrici o non è una corretta via di programmazione?

vi ringrazio in anticipo ciao a tutti

angelotv Profilo | Guru

Ti conviene dimensionare la matrice una volta sola leggendo dal file quanti sono i records (non ricordo a memoria quale sia l'istruzione per fare ciò...) e poi popolare la matrice.
by Angelo

Dainesi Profilo | Senior Member

Le matrici dinamiche sono il cuore di molti programmi e grazie a Dio funzionano a meraviglia. Utilizza il token Preserve per mantenere il valore degli elementi già inseriti quando ridimensioni la matrice.
Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

Jeremy Profilo | Guru


Se grazie a Dio o grazie a Bill non lo so però è vero che funziona a meraviglia.....prendi però anche in considerazione l'uso delli List(of <TipoOggetto>)

Ciao

Meryotta Profilo | Newbie

Grazie a tutti per le risposte, ma mi chiedevo: cosè il "token preserve"?

Jeremy Profilo | Guru

Il 'Token Preserve' ti permettere di mantenere invariati i dati già presenti nell'array altrimenti persi eseguendo il ReDim.

Redim Tuoarray(10) Così Reinizializzi l'array e lo redimensioni a 11 elementi

Redim Preserve Tuoarray(10) Così mantieni i dati precedentemente memorizzati e lo redimensioni a 11 elementi


Ciao.

angelotv Profilo | Guru

il token preserve non servirebbe nel caso tu volessi tener buono il consiglio che ti diedi...
by Angelo

Jeremy Profilo | Guru

Si ma non sempre è possibile conoscere a priori la dimensione della matrice.

Ciao

angelotv Profilo | Guru

o trovi un'istruzione che ti dica quante righe (e quindi quanto grande deve essere la matrice) ci sono nel tuo file o fai una redim preserve ogni record letto; secondo me questo secondo metodo è sconsigliabile; se vuoi puoi fare una redim preserve ogni 256 record (devi solo tenere un contatore...)
by Angelo

Jeremy Profilo | Guru

>o trovi un'istruzione che ti dica quante righe (e quindi quanto
>grande deve essere la matrice) ci sono nel tuo file o fai una
>redim preserve ogni record letto; secondo me questo secondo metodo
>è sconsigliabile; se vuoi puoi fare una redim preserve ogni 256
>record (devi solo tenere un contatore...)
>by Angelo

Per questo consigliai l'uso delle List(Of <TipoOggetto>)...

Ciao

angelotv Profilo | Guru

e io scrissi...

"Ti conviene dimensionare la matrice una volta sola leggendo dal file quanti sono i records (non ricordo a memoria quale sia l'istruzione per fare ciò...) e poi popolare la matrice.
by Angelo "

poi siccome l'utente mi pareva ancora incerto ho fatto un riepilogo delle possibiltà! Speriamo che adesso riesca a scrivere il suo programmino...
by Angelo

Meryotta Profilo | Newbie

Scusate se non mi sono fatta viva ma non ho avuto più tempo per studiarmi la soluzione.
Vi do' delle ulteriori informazioni: Il mio file e una tabella di access nella quale solo dei record( non so quanti e non sono fissi) devono essere messi nella matrice. La soluzione del Redim mi sembrava la più immediata ma dopo aver letto i vostri suggerimenti mi chiedo: "cosa è un list(of<tipooggetto>)?
Se devo dimensionare una volta sola la matrice mi conviene leggere 2 volte il database, una per dimensionare la matrice e una per popolarla?
Sono tutt' orecchie per ogni ulteriore suggerimento.
Grazie e non temete, anche se tardi, leggerò ogni vosto suggerimento.
Ciao

Jeremy Profilo | Guru

>"cosa è un list(of<tipooggetto>)?
La list(of <tipooggetto>) è, appunto, una collection di oggetti al quale puoi aggiungere dinamicamente quanti oggetti ti servono per poi sfruttare tutte le funzionalità di una collection.(per oggetti si intende qualsiasi cosa che sia string,Classi,Form,Controlli)
Nel tuo caso potrebbe servirti una List(of String).

>Se devo dimensionare una volta sola la matrice mi conviene leggere
>2 volte il database, una per dimensionare la matrice e una per
>popolarla?
Dipende dalla modalità di lettura del Database .. se connessa o disconnessa(ma comunque non è detto)

>Sono tutt' orecchie per ogni ulteriore suggerimento.
Per l'appunto....

Private list as new List(of String) Private sub blablabla list.Add("TuoValore") dim QuantiValoriCiSono? as integer = list.count End Sub

In quanto al consiglio di angelo, credo che lui intendesse dire di REDIMensionare una volta sola la tua matrice.
Quindi:

Private arr() as string Private sub blablabla Redim arr(QuantiRecordCiSono) End Sub

Ma anche in questo modo 'scadono' un pò le performance, in quanto l'allocazione della memoria è frammentata.
Facci sapere...
Ciao

Dainesi Profilo | Senior Member

Ma stai usando Visual Basic 6.0 o la versione .NET ?
Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

Jeremy Profilo | Guru

Oooops .... non mi ero accorto.

Dainesi Profilo | Senior Member

Infatti. Mi son reso conto che stavamo affrontando lo stesso problema ma con due arsenali diversi. Sarà meglio che Maryotta ce lo dica.


Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

angelotv Profilo | Guru

ve lo dico io!


Meryotta Profilo | Newbie
25 messaggi | Data Invio: mer 11 feb 2009 - 11.37
sto sviluppando un piccolo programmino in visual basic 6 nel quale ho disogno di una serie di matrici ad una
dimensione.
by Angelo

Dainesi Profilo | Senior Member

Già! Quando i thread si allungano ci si dimentica della prima frase .

Quindi torniamo con Redim, Preserve e token vari ....



Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

angelotv Profilo | Guru

Comunque io resto dell'idea che la cosa migliore sia fare una redim unica.
by Angelo

Dainesi Profilo | Senior Member

>...Se devo dimensionare una volta sola la matrice mi conviene leggere
>2 volte il database, una per dimensionare la matrice e una per
>popolarla?

Una prima volta puoi fare una query di aggregazione che ritorna il numero dei record, mentre la seconda è una query di tipo SELECT che ritorna i record veri e propri.
Risparmi risorse, tempo e ridimensioni la matrice subito senza eseguire un redim ad ogni nuovo record letto.


.
Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

angelotv Profilo | Guru

Perfetto.
by Angelo

Dainesi Profilo | Senior Member

Mi fa piacere che siamo d'accordo ... ma ci deve leggere Maryotta !! Se no io e te andiamo ad un sabba di stregoni a scambiarci esperienze



.
Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

Meryotta Profilo | Newbie

>>...Se devo dimensionare una volta sola la matrice mi conviene leggere
>>2 volte il database, una per dimensionare la matrice e una per
>>popolarla?
>
>Una prima volta puoi fare una query di aggregazione che ritorna
>il numero dei record, mentre la seconda è una query di tipo SELECT
>che ritorna i record veri e propri.
>Risparmi risorse, tempo e ridimensioni la matrice subito senza
>eseguire un redim ad ogni nuovo record letto.
>
>
>.
>Autore del libro sul FOREX, MetaTrader e creazione dei trading
>system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872


Ok, allora seguirò questa strada e vi farò sapere a quali risultati sono giunta. Vi ringrazio (tutti) per l'aiuto che mi state fornendo, purtroppo non ho moltissimo tempo per leggere i vostri post e rispondervi velocemente e quindi provare il programma ma appena ho qualche minuto corro a leggervi. Vi farò sapere come sta procedendo. Grazie Grazie Grazie!!!

Meryotta Profilo | Newbie

Funziona!!! Ho seguito la strada delle query di aggregazione e di select così ho dimensionato una sola volta le mie matrici! Grazie a tutti per l'aiuto che mi avete fornito!!

Dainesi Profilo | Senior Member

Ottimo ! Siamo serviti !


.
Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872
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