Newsgroup: it.comp.lang.visual-basic
Titolo: [semi OT] array multidimensionali

salve
mi č venuta una curiositą... gli array multidimensinoali (ad es. a(2,3,4))
come sono organizzati in memoria?
ho provato con varptr e copymemory (copiando byte per byte), ma mentre per
gli arr bidimensionali ho capito qualche cosa, per quelli tridimensionali
non sono riuscito a capire niente...
un'ultima cosa. che voi sappiate, esiste qualche DLL bella e veloce che
"gestisca" operazioni sugli array multidimensionali? magari ache solo quelli
bidimensionali, che potrebbero considerarsi delle tabbelle con righe e
colonne... per quelli a piu dimensioni la cosa diventa difficilotta... ma
potrebbe essere utile, chesso, eliminare il contenuto della 2a dimensione
(ad es su 4 dimensioni)... oppure calcolare una media solo della 3a
dimensione...
esiste niente di gia fatto in giro ?
grazie
MarioH

 come sono organizzati in memoria?
Mi sembra di aver letto che sono comunque bidimensionali.
esempio:
array(3,3,3)
a1 a2 a3
b1 b2 b3
c1 c2 c3
e' conservato cosi'
a1 a2 a3 b1 b2 b3 c1 c2 c3
infatti non e' possibile il redim.
Ho detto stupidaggini?


Il redim e' possibile per l'ultima dimensione e solo per quella.
Questo farebbe pensare a una struttura di memoria organizzata in un array...
Ad ogni modo bisognerebbe studiare con un debugger la disposizione dei byte
per capirci qualcosa di piu'... Hyperion? Non e' che ne sai qualcosa? :PPP
Ciaotutti,
é

 é
Ehm... Naturalmente volevo dire
Ciaotutti,
*

 ha scritto

meno male,
temevo avessi il raffreddore :)

 ha scritto nel messaggio
news:9pulda$kr415$1...@ID-70152.news.dfncis.de...

A quanto ne so sono i bidimansionali viaggiano colonna per colonna, i
tridimensionali boh.
Per capirci qlcosa devi vederti la struttura SafeArray, altrimenti cosa
copymemory?
ciao,
--
V. Roccasalvo
email:
vrocca....@iname.nos_pam.com
Pregasi rimuovere nos_pam prima di scrivere

mi è venuta una curiosità... gli array multidimensinoali (ad es. a(2,3,4))



'indò sta questa SafeArray ?
PS: hai ricevuto il mio messaggio al tuo email?
MarioH

: 

Non ci crederai mai, ma... gli array multidimensionali non li ho mai 
trattati :) Vediamo, so dirti che per quelli dinamici si usano array di 
array (tranne in VB, che usa i perversi Safe Array), anzi, puntatori a 
puntatori (a puntatori a puntatori a puntatori etc.) a dati. Ad esempio 
un array bidimensionale di caratteri (array di array di caratteri, ossia 
array di stringhe) in C si può scrivere:
char argv[][]
char *argv[]
char **argv
(le parentesi quadre stanno per "array", l'asterisco per "puntatore")
Per creare array "veri" (ossia con *tutti* gli elementi contigui) 
multidimensionali di dimensioni fisse si usa un array piatto e si finge 
che sia multidimensionale. Ad esempio questa bitmap:
 11  12  13  14
 21  22  23  24
 31  32  33  34
 41  42  43  44
apparentemente un array bidimensionale di pixel, in realtà in memoria è 
fatta così:
 11  12  13  14  21  22  23  24  31  32  33  34  41  42  43  44
(anzi, così:
 41  42  43  44  31  32  33  34  21  22  23  24  11  12  13  14
perchè Windows carica le bitmap dal basso in alto. Avete presente il 
pixel in basso a sinistra? ora sapete cos'ha di tanto speciale per 
essere scelto come pixel trasparente :)
Ad esempio, se avete Paint Shop Pro, provate a salvare un'immagine in 
formato RAW senza header (ossia un vero e proprio dump binario della 
bitmap così com'è in memoria), provate a riaprirla "sbagliando" la 
larghezza (meglio se più larga dell'originale) e avrete una 
dimostrazione visiva molto chiara del concetto

 PS: hai ricevuto il mio messaggio al tuo email?
si e ti ho anche risposto
--
V. Roccasalvo
email:
vrocca....@iname.nos_pam.com
Pregasi rimuovere nos_pam prima di scrivere
-------------------- codice ----------------
Private Declare Function VarPtrArray Lib "msvbvm60" Alias "VarPtr" (Ptr() As
Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As
Any, pSrc As Any, ByVal ByteLen As Long)
Private Type SAFEARRAYBOUND
    cElements As Long 'numero elementi per ogni dimensione
    lLbound As Long 'Low Bound limite inferiore dell'array
End Type
Private Type SAFEARRAY1D 'struttura per vettori monodimensionali
    cDims As Integer                'numero dimensioni
    fFeatures As Integer            ' caratteristiche dei dati stringhe,
stringhe a lun fissa, variant ...
    cbElements As Long            'dimensione in bytes di ciascun elemento 2
per Integer 4 per Long 1 per Byte
    cLocks As Long
    pvData As Long                ' puntatore ai dati
    Bounds(0 To 0) As SAFEARRAYBOUND
End Type
Private Type SAFEARRAY2D 'struttura per vettori bidimensionali (matrici)
    cDims As Integer
    fFeatures As Integer
    cbElements As Long
    cLocks As Long
    pvData As Long
    Bounds(0 To 1) As SAFEARRAYBOUND
End Type
Private Type SAFEARRAY60D 'struttura per vettori 60-dimensionali (matrici
max di VB)
    cDims As Integer
    fFeatures As Integer
    cbElements As Long
    cLocks As Long
    pvData As Long
    Bounds(0 To 59) As SAFEARRAYBOUND
End Type
'
'   Ritorna i byte occupati da un vettore compreso il descrittore
'
'   uso bytes = ArrayMemory(VarPtrArray(nome_array))
'
Private Function ArrayMemory(ByVal arrPtr As Long) As Long
Dim sa As SAFEARRAY60D, saPtr As Long
Dim i As Long, numEls As Long, cDims As Integer
'--------- Recupera la struttura SAFEARRAY
CopyMemory saPtr, ByVal arrPtr, 4
'--------- Recupera quante sono le dimensioni del vettore/matrice
CopyMemory cDims, ByVal saPtr, Len(cDims)
'---------Copia i dati in sa
CopyMemory sa, ByVal saPtr, Len(sa) - 8 * (60 - cDims)
' --------Nota sa.pvData è un puntatore ai dati
'Calcola il numero di elementi totali
numEls = 1
For i = 0 To sa.cDims - 1
 numEls = numEls * sa.Bounds(i).cElements
Next i
'Calcola l'occupazione totale di memoria incluso il descrittore
ArrayMemory = numEls * sa.cbElements + (16 + sa.cDims * 8)
End Function


uh che be,llo..
non sapevo proprio che esistessero tutte queste strutture...
grazie
ciao
MarioH