PDA

View Full Version : [VB6] Come passare un array intero


wicasa
08-07-2004, 10:45
Ad esempio io mi creo un array


dim myArray(0 to 5) as double
'assegno i valori ad alcune celle...
myArray(0)= 12.2
myArray(3)= 13.46


...ora voglio far passare l'intero array come variabile
che ne conservi i valori e il loro posto all'interno della matrice!!!

nel caso seguente viene definita una funzione che richiede tra gli altri parametri anche un array...


valore=myFunction(parm1,parm2,myArray)



...se scrivo così il compilatore mi dà errore...ho provato in mille altri modi :cry: tranne quello giusto...ovviamente!!!

Aiuto :help:
Grassie

matpez
08-07-2004, 12:08
Bhe inanzitutto un array lo puoi dichiarare semplicemente con Prova(5) e lui ti crea 6 posti (da 0 a 5)

Per passare un array come parametro:

Option Explicit

Private Sub Form_Load()

Dim ciao(5) As Double

ciao(1) = 1
ciao(3) = 2

Call ole(ciao)

End Sub

Private Sub ole(ByRef bho() As Double)

MsgBox bho(1)
MsgBox bho(2)
MsgBox bho(3)

End Sub

wicasa
08-07-2004, 13:42
grazie mille Matpez...ma nn me lo prende...:( :mad:
forse ho capito dove sbaglio, ma nn capisco come risolvere il probl...
...dunque sono costretto a rompere ulteriormente...
:(

io devo far passare ilmio array come parametro ad una funzione che già esiste...è una chiamata alle Api di un programma x intenderci, la funzione in questione richiede i seguenti parametri:

funzione(ByVal uID As Long, ByVal PropNum As Long,
ByVal PropNum 2 As Long, ByRef Doubles As Double) as integer


dove quel doubles dovrebbe essere...anzi deve essere...un vettore di 6 elementi!!!!

ma quando chiamo la funzione dalla mia sub nel seguente modo....


...
dim myarray(6) as double
...
iErr=funzione(Uid,propNum,propNum2,myArray)


mi dà errore "ByRef argument type mismatch."...ho provato con


...
dim myarray(6) as double
...
iErr=funzione(Uid,propNum,propNum2,myArray())


e idem con patate!!!:muro: :muro: :muro:

:HELP:Please

matpez
08-07-2004, 14:00
Bhe dimmi che chiamata API è ?

wicasa
08-07-2004, 14:08
Chiamata alle API di Straus7...programma di calcolo strutturale...

....la chiamata è la seguente:

call St7SetBeamSectionGeometry(1, intCount, kCircularHollow, dblSectionGeom)

dove i primi tre parametri sono quelli di cui ti ho detto prima!
...l'ultimo è un array!

GRASSIE

PS: forse ci sono vicino...:idea:...ora faccio e poi ti aggiorno...grazie ancora per l'aiuto!

a2000
08-07-2004, 14:55
e questi sono i risultati del copia-incolla ...

http://www.gdmland.it/foto/6195.jpg

wicasa
08-07-2004, 15:04
...son qua!....

allora il problema di prima l'ho risolto, misono dannato l'anima per
due giorni quando il problema era a monte, ovvero la casa madre
mi ha fornitole librerie tradotte in VB ma a quanto sembra
avevano sbagliato a passarle...spero almeno!!!
...ora ti riporto il codice del declare della funzione incriminata:


Declare Function St7SetBeamSectionGeometry& Lib
"St7API.DLL" (ByVal uID As Long, ByVal PropNum As Long,
ByVal SectionType As Long, ByRef Doubles As Double)


...questo è l'originale...
...iol'ho modificato così...


Declare Function St7SetBeamSectionGeometry& Lib
"St7API.DLL" (ByVal uID As Long, ByVal PropNum As Long,
ByVal SectionType As Long, ByRef Doubles() As Double)


...ora l'errore è sparito...ma ora mi chiedo...quel byRef mi dice cosa?...che il parametro è un riferimento ad una variabile
esistente e da definire, quindi in input?...oppure è un parametro
che la funzione mi sputa fuori?

perché questa domanda?...semplice qui il problema
è apparentementerisolto...nn mi dà errori...ma poco
dopo il programma si pianta perchè ha perso dei valori!!!
:MAD: :MAD:

a questo punto mivien da pensare una cosa, visto che ci sono
delle chiamate con radice SET per impostare dei parametri e
delle chiamate GET per avere dei parametri...queste ultime
secondo il mio punto di vista dovrebbero avere in ingresso
solo i parametri necessari al calcolo della funzione...
Es.

Declare Function St7GetBeamResult& Lib "St7API.DLL"
(ByVal uID As Long, ByVal ResultType As Long, ByVal BeamNum As Long,
ByVal MinStations As Long, ByVal ResultCase As Long,
ByRef NumStations As Long, ByRef NumColumns As Long,
ByRef BeamPos() As Double, ByRef BeamRes() As Double)

questa che è quella modificata (mancavano sempre le parentesi degli array) dal manuale se ne deduce che:

uID ,ResultType ,BeamNum ,MinStations ,ResultCase
sono parametri d'input...o almeno dovrebbero essere tali...
mentre gli altri sono valori che la funzione dovrebbe sputare fuori...

wicasa
08-07-2004, 15:06
Originariamente inviato da a2000
e questi sono i risultati del copia-incolla ...

http://www.gdmland.it/foto/6195.jpg

:D :D :D

no questi sono i risultati di un architetto pazzo...e di qualche amico ingegnere che lo ha aiutato nella sua pazzia...cercando di ca***e fuori dal boccale!

:D :D :D

matpez
08-07-2004, 15:31
SET e GET si usano per settare le proprietà in una dll

ByRef è una parametro per riferimento, cioè i dati che entrano possono essere modificati nella funzione e quando torna indietro sono cambiati

ByVal invece sono parametri per valori, per cui se entra un valore, esce sempre lo stesso, anche se dentro viene modificato

I vottori non possono essere passati per valori :D

a2000
08-07-2004, 15:37
alè!
ma qui siamo alla fiera delle vanità.

Originariamente inviato da wicasa
:D :D :D

no questi sono i risultati di un architetto pazzo...e di qualche amico ingegnere che lo ha aiutato nella sua pazzia...cercando di ca***e fuori dal boccale!

:D :D :D

sarò più esplicito: questi sono i risultati del cAPIa - incolla !

wicasa
08-07-2004, 15:37
OK grassie...ora provo a smanopolare su due parametri e poi vi faccio sapere o pure vi pregherò ancora!! :mc: :D

wicasa
08-07-2004, 15:43
Originariamente inviato da a2000
alè!
ma qui siamo alla fiera delle vanità.



sarò più esplicito: questi sono i risultati del cAPIa - incolla !

OK messaggio ricevuto!!!
...cmq la mia nn era ironia, era lasemplice verità :D :D :D ...

Il mio professore diceva sempre...
"...se nn te ghà il soramanegho xe mejio che te stia a casa!"...
(sperando che si scriva così?!)...
tradotto...se nn si ha l'arte è meglio nn cimentarsi...discutibile ma in questi casi vero!...d'altronde il controllo ultimo è sempre dato dall'esperienza mai dalla macchina!:O ....OHHHH...sono terminato x oggi!...
ciao e a presto