habe den "Fehler" selber gefunden, wenn ich die Addr byval über gebe und nicht byref dann funktioniert es... Warum auch immer...
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.
Das was dabei raus kommt ist folgendes:Code:$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
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?
habe den "Fehler" selber gefunden, wenn ich die Addr byval über gebe und nicht byref dann funktioniert es... Warum auch immer...
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:
GrußCode: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
Rolf
Das ist komisch, ich habe auch 1.11.9.0 und da funktioniert es. ohne probleme.
Da die AVR Controller 8-Bit Controller sind, sollte an jeder Adresse auch nur ein 8-Bit Wert stehen. Klingt logisch oder?Zitat von for_ro
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)
Du hast vielleicht bemerkt, dass seine Adressen daher auch immer um 4 weiter gehen, da long Werte nun mal 4 Byte lang sind.Zitat von zerush
Ne danke, dieses Kauderwelsch tue ich mir nicht an.Zitat von zerush
Genau das steht ja oben, wird durch Wiederholung auch nicht richtiger.Zitat von zerush
Lesezeichen