Overlay nélkül - változó byte-jai (Visual Basic)

MS Visual Basic, Visual Basic Application (Excel, Word...) tippek-trükkök, programozások.
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00
Tartózkodási hely: Szolnok

Overlay nélkül - változó byte-jai (Visual Basic)

HozzászólásSzerző: dummy » 2011. július 8. péntek, 12:58

Sziasztok!

Bascom-ban rém egyszerűen elő tudjuk állítani pl. egy single típusú változó komponenseit:

Kód: Egész kijelölése

Dim P_korr As Single
Dim P_korr_l As Byte At P_korr Overlay
Dim P_korr_m As Byte At P_korr + 1 Overlay
Dim P_korr_n As Byte At P_korr + 2 Overlay
Dim P_korr_h As Byte At P_korr + 3 Overlay


De hogyan lehet ugyanezt VB6-ban megtenni? Tudja valaki?
(Ugyanis VB6-ban nincs "overlay").

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3234
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2011. július 8. péntek, 16:15

Mivel a C++-ből nőteki magát, memoria Pointereket használnak:
http://www.codeproject.com/KB/vbscript/ ... In_VB.aspx

Vagy Hu: http://nyelvek.inf.elte.hu/leirasok/Vis ... ?chapter=3

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1023
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: SanyiSay » 2011. július 10. vasárnap, 22:11

Hát ahogy szokták mondani még a kérdést sem értem.
Viszont....

Kód: Egész kijelölése

Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

Sub XXX()
    Dim S As Long ' Single
    Dim B(4) As Byte
    S = 257 'single 123.456 'or any other value
    CopyMemory B(0), S, 4
End Sub


Remélem működik nálad is, és ezt kerested. :)

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3234
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2011. július 11. hétfő, 8:05

Szerintem inkább arra gondolt, hogy 1 singlet használ.
Aminek a 4 Byte-ire aztán külön külön is tud műveleteket elvégezni.
Ezt főleg olyankór használjuk, amikor Byte-onként jön be az adat és nem akarunk eltolásokkal kínlódni, hogy összerakjuk singlenak.

Inkább a változónak a címét kellene lekérdezni. Aztán lehet címezni mind a 4 Bytet.

A következő példában egy változó címét kérdezzük le:

Dim lngVariableAddress As Long
Dim dblMyVariable As Double
lngVariableAddress = VarPtr(dblMyVariable)

Dim P_korr As Single
Dim P_korr_l As Byte
Dim P_korr_m As Byte
Dim P_korr_n As Byte
Dim P_korr_h As Byte

lngVariableAddress = VarPtr(P_korr)
A tömb írása:
lngVariableAddress(0) = P_korr_l
lngVariableAddress(1) = P_korr_m
lngVariableAddress(2) = P_korr_n
lngVariableAddress(3) = P_korr_h
A tömb olvasása:
P_korr_l= lngVariableAddress(0)
P_korr_m= lngVariableAddress(1)
P_korr_n= lngVariableAddress(2)
P_korr_h= lngVariableAddress(3)

Mondjuk ez is csak elmélet, ki kellene próbálni!

8)

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1023
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: SanyiSay » 2011. július 11. hétfő, 8:41

Na kipróbáltam

Kód: Egész kijelölése

    CopyMemory Long, B(0), 4

Ez betölti a B() tömbbe a 4 Byte-ot

Kód: Egész kijelölése

    CopyMemory B(0), Long, 4

Ez meg B()tömböt betölti a Long tipusba.

Megy oda vissza. :)
Legalább is excelben simán.
VB6om nincs csak VBnet.
Azt nem néztem, de gondolom ott is menne.

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1023
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: SanyiSay » 2011. július 11. hétfő, 8:54

A tiédből VarPtr nem tetszik egyik VB-nek sem.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3234
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2011. július 11. hétfő, 9:44

Én csak az előző linkből olvastam:
Pointerek használata Visual Basicben

Vannak-e a Visual Basicben 'pointerek'? A válasz erre a kérdésre általában 'nem', hiszen nem látunk pointer deklarációkat vagy makrókat a Visual Basicben, mint ahogy a C/C++-ban... A helyes válasz mégis 'igen' lenne. A Visual Basic (mint általában a legtöbb programozási nyelv) használ pointereket. A különbség az, hogy a Visual Basic elrejti őket, amikor csak lehetséges, vagy más néven nevezi, hogy ne terheljen minket a formalitásokkal és a protokollokkal, amik a használatukhoz szükségesek.

A VarPtr (Variable Pointer), StrPtr (String Pointer), és ObjPtr (Object Pointer) nem dokumentált és nem támogatott funkciók, melyeket a Microsoft elérhetővé tett a Visual Basic 5.0-ás és 6.0-ás verzióiban. Ezek a funkciók (sok mással együtt) a Visual Basic.Net-ben már nem találhatók meg. Ezek a funkciók lehetővé teszik a programozónak, hogy elérje azt a memóriacímet, ahol a Visual Basic változói (pointerek) vannak, valamint azt a címet, ahol maga a valódi adat található, amire a változók mutatnak. Az oka annak, hogy ezek a funkciók olyan hasznosak, az, hogy ha ismerjük az adat memóriacímét, akkor módosíthatjuk, másolhatjuk, vagy közvetlenül át is adhatjuk, ahelyett, hogy ezt a Visual Basic tenné meg helyettünk. Ez így gyorsabbá teszi a munkát és némely esetben képessé tesz minket arra, hogy megtegyünk dolgokat, amire a Visual Basic önmagában nem képes.

A Microsoft MSDN leírása a VarPtr-ről:
Ez a funkció arra használható, hogy lekérdezzük egy változó vagy egy tömbelem címét. A változó nevét vagy a tömbelemet paraméterként veszi és visszaadja a címet. De nem szabad megfeledkezni arról, hogy a dinamikus tömböket a Visual Basic újra lefoglalhatja, ezért óvatosan kell használni a VarPtr-t a tömbelem címének lekérdezésénél. Nem használható tömbök címének lekérdezéshez.
….

Gyakorlatilag VB használó én sem vagyok!
:?

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3234
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2011. július 11. hétfő, 9:55

Ezzel a : CopyMemory B(0), Long, 4
Az a különbség, hogy létre kel hoznod 2 változót!
B(4) As Byte
S As Long ?

Míg az előzőben csak a S, kellett és tudtál, hivatkozni a Bytekre.

Ja most olvasom figyelmesebben: Visual Basic.Net-ben már nem találhatók meg.
Akkor ezért Buta a VB.net!
:cry:

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1023
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: SanyiSay » 2011. július 11. hétfő, 10:08

kapu48 írta:Ezzel a : CopyMemory B(0), Long, 4
Az a különbség, hogy létre kel hoznod 2 változót!
B(4) As Byte
S As Long ?


Meg az a rengeteg osztály, meg objektum amit létre kell, hozni hogy bármi elinduljon. Ehhez képest a 4 Byte smaku. :)
Én anno örültem hogy nincsenek pointerek a VB-ben, mert C-ben azért jól be lehetett menni a sűrűbe vele.

Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00
Tartózkodási hely: Szolnok

HozzászólásSzerző: dummy » 2011. július 11. hétfő, 18:15

Köszi mindenkinek a segítséget!


Vissza: “Visual Basic / Visual Basic Application”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 0 vendég