PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Varptr()



Loro
01.09.2008, 19:58
Servus alle zusammen,
ich versuche gerade ein Array an eine sub zu übergeben und habe mich für varptr() entschieden. Aber irgendwie klappt das nicht richtig.


$regfile = "m128def.dat"
$crystal = 8000000
$sim



Dim Tabelle(5) As Long

Tabelle(1) = 100
Tabelle(2) = 200
Tabelle(3) = 300
Tabelle(4) = 400
Tabelle(5) = 500


Dim Addresse As Word
Dim X As Byte

Declare Sub Array_anzeigen(addr As Word)


Aufruf:
Addresse = Varptr(tabelle(1))
Print " adresse ";
Print Addresse

Addresse = Varptr(tabelle(2))
Print " adresse ";
Print Addresse

Addresse = Varptr(tabelle(3))
Print " adresse ";
Print Addresse

Addresse = Varptr(tabelle(4))
Print " adresse ";
Print Addresse

Addresse = Varptr(tabelle(5))
Print " adresse ";
Print Addresse

Dim I As Byte
For I = 1 To 5
Print Tabelle(i)
Next I

Addresse = Varptr(tabelle(1))
Call Array_anzeigen(addresse)

Do
nop
Loop

End 'end program




Sub Array_anzeigen(addr As Word)
Local Y As Byte
Local D As Byte


Print " "
Print "Von Suboutine aus :"
For Y = 1 To 5 ' einfache Schleife
D = Inp(addr)
Print "addr ";
Print Addr
Print D
Addr = Addr + 4 ' Inhalt des Arrays anzeigen.
Print "tabelle ";
Print Tabelle(y)
Next Y

End Sub


Das was dabei raus kommt ist folgendes:
adresse 257
adresse 261
adresse 265
adresse 269
adresse 273

100
200
300
400
500



Von Suboutine aus :
addr 257
100
tabelle 100

addr 261
200
tabelle 200

addr 265
44
tabelle 300

addr 269
144
tabelle 400

addr 273
244
tabelle 500

kann mir jemand Verraten warum der 2 mal von den Richtigen Adresse liest, auch die richtigen Werte holt, aber dann die Falschen wert von den richtigen adressen?

Loro
01.09.2008, 20:34
habe den "Fehler" selber gefunden, wenn ich die Addr byval über gebe und nicht byref dann funktioniert es... Warum auch immer...

for_ro
01.09.2008, 23:17
Hallo Loro,
bei mir in 1.11.9.0 funktioniert das weder mit byval noch mit byref.
Das Problem liegt bei mir in der Funktion INP(), die nur ein Byte und keine Long-Werte zurückgibt.
Daher muss ich jedes Byte einzeln einlesen und dann entsprechend shiften.
Sieht dann so aus:


Sub Array_anzeigen(byval Addr As Word)
Local Y As Byte
Local D As Byte
Local L As Long


Print " "
Print "Von Suboutine aus :"
For Y = 1 To 5
Addr = Addr + 3 ' LSB steht in der ersten Adresse, also von hinten nach vorne einlesen
L = Inp(addr)
Shift L , Left , 8
Decr Addr
D = Inp(addr)
L = L + D
Shift L , Left , 8
Decr Addr
D = Inp(addr)
L = L + D
Shift L , Left , 8
Decr Addr
D = Inp(addr)
L = L + D
Print "addr ";
Print Addr
Print L
Addr = Addr + 4 ' Inhalt des Arrays anzeigen.
Print "tabelle ";
Print Tabelle(y)
Next Y

End Sub

Gruß

Rolf

Loro
02.09.2008, 19:35
Das ist komisch, ich habe auch 1.11.9.0 und da funktioniert es. ohne probleme.

zerush
02.09.2008, 19:48
Das Problem liegt bei mir in der Funktion INP(), die nur ein Byte und keine Long-Werte zurückgibt.


Da die AVR Controller 8-Bit Controller sind, sollte an jeder Adresse auch nur ein 8-Bit Wert stehen. Klingt logisch oder?

Wenn man gerne mit Pointern arbeitet sollte man vielleicht lieber zu C wechseln, da ist das alles doch wesentlich praktischer!

P.S.: Deshalb ergibt sich auch der Wert 44 anstatt 300 (300 - 256 = 44)

for_ro
02.09.2008, 20:53
Da die AVR Controller 8-Bit Controller sind, sollte an jeder Adresse auch nur ein 8-Bit Wert stehen. Klingt logisch oder?

Du hast vielleicht bemerkt, dass seine Adressen daher auch immer um 4 weiter gehen, da long Werte nun mal 4 Byte lang sind.


Wenn man gerne mit Pointern arbeitet sollte man vielleicht lieber zu C wechseln, da ist das alles doch wesentlich praktischer!

Ne danke, dieses Kauderwelsch tue ich mir nicht an.


P.S.: Deshalb ergibt sich auch der Wert 44 anstatt 300 (300 - 256 = 44)

Genau das steht ja oben, wird durch Wiederholung auch nicht richtiger.