- LiTime Speicher und Akkus         
Ergebnis 1 bis 6 von 6

Thema: Varptr()

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.08.2008
    Alter
    46
    Beiträge
    15

    Varptr()

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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.
    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
    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?

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    26.08.2008
    Alter
    46
    Beiträge
    15
    habe den "Fehler" selber gefunden, wenn ich die Addr byval über gebe und nicht byref dann funktioniert es... Warum auch immer...

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    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:

    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
    Gruß

    Rolf

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    26.08.2008
    Alter
    46
    Beiträge
    15
    Das ist komisch, ich habe auch 1.11.9.0 und da funktioniert es. ohne probleme.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    38
    Beiträge
    246
    Zitat Zitat von for_ro
    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)

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von zerush
    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.

    Zitat Zitat von zerush
    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.

    Zitat Zitat von zerush
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus