Fehler im Code!



  • In jedem Objekt wird ein Pointer auf das vorherige und auf das nachfolgende Object gespeichert. Die Funktion "FB_TYPE_Before" soll als Rückgabewert den Pointer des vorherigen Objectes ausgehend vom übergebenen Parameter, dem aktuellen Object, ermitteln. Dadurch kann ich mit einer speziellen Schleife alle Objecte einer Klasse aufrufen.



  • Aehm, ja, das hast du ja schon so in etwa in den comments geschrieben und das tut der Code tatsaechlich ja scheinbar so nicht. 😉
    Ich wollte eigentlich eher ein nochmaliges tieferes Sinnieren ueber den Code von FB_TYPE_Before (Zeile fuer Zeile) anregen.



  • sry hab die frage wohl iwie falsch verstanden und wenn ich so nachdenke, kann ich dir selber nichtmehr genau sagen was der Code soll *schäm*. In type steht ja der Pointer zu einem Objekt und am Ende sollten in eax die ersten 4 Bytes sein auf die der Pointer zeigt. Ich hab mal die Zahlen die bei before rauskommen mit dem Pointer FirstObj verglichen. Die Zahl die von before zurückegeben wird ist bei mir immer genau um 48 größer.

    PS: könntest du mir vll falls vorhanden deine ICQ Nummer geben?



  • Oehm, ok. Dann solltest du dir vielleicht erst nochmal klar machen, was du da eigentlich programmiert hast. 🤡
    So macht diese Prozedur IMHO wie mehrfach angedeutet zumindest nicht viel Sinn.

    ICQ oder andere Kontaktwege werde ich nicht herausgeben. Wozu auch? Wenn du auf Probleme stoesst, die du nicht loesen kannst, poste sie hier. Dafuer ist das Forum schliesslich da.
    Nur in Ausnahmefaellen bin ich nach Anfrage in einem IRC-Chat zur Klaerung bestimmter(!) Probleme zu erreichen.



  • so gibt es mehr sinn, aber es funtz immer noch nicht:

    proc FB_TYPE_Before type:DWORD
          mov eax,[type]       ;Pointer auf das Object in eax
          mov dword eax,[eax]  ;den Inhalt(dword) von eax(=dem Object) in eax
          ret
       endp
    


  • flona schrieb:

    Die Funktion "FB_TYPE_Before" soll als Rückgabewert den Pointer des vorherigen Objectes ausgehend vom übergebenen Parameter, dem aktuellen Object, ermitteln.

    Laut "FB_TYPE_New" soll der Pointer des "vorherigen Objekts" im dritten DWORD des "aktuellen Objekts" liegen:

    proc FB_TYPE_Before type:DWORD
     mov eax,[type]
     mov eax,[eax+8]
     ret
    endp
    


  • Nein, da muss ich dir widersprechen.

    mov eax,[Class]
             mov ebx,[CurrentObj]
             mov ecx,[eax+12]
    
             mov dword [ebx],ecx 
             mov [eax+8],ecx       ;Du meinst wohl diese Zeile?
    
             mov dword [ecx],ecx
    
             mov dword [ecx+4],ebx     
             mov dword [eax+12],ebx
    

    In eax ist nämlich der Pointer auf die KLasse und nicht auf das aktuelle Objekt:
    KlassenVariable TYPE_TEST
    1. DWORD: Größe des Objektes
    2. DWORD: Pointer auf erstes Obj.
    3. DWORD: Pointer auf vorletztes Obj. <- Dahin wird geschrieben
    4. DWORD: Pointer auf letztes Obj.

    Objekt:
    1. DWORD: Pointer auf vorheriges Obj.
    2. DWORD: Pointer auf nachfolgendes Obj.
    3. DWORD: Erstes Attribut
    ...



  • Tja, ich kann beim Druebersehen so jetzt auch nicht erkennen, woran es genau hakt und habe ehrlichgesagt auch nicht grossartig Lust, deinen Code fuer dich zu debuggen. Deine Funktion sieht jetzt zumindest erstmal halbwegs sinnvoll aus.

    Also schau dir alles nochmal ganz genau an und bau halt einige Debug-Ausgaben (in der Konsole o.Ae.) ein oder benutze einen Debugger.



  • Hallo flona,

    eine andere Alternative zu Deinem Assemblercode, wo Du verzweifelt versucht, irgendwelche Datenstrukturen zu implementieren, wäre eine "höhere" Sprache zu nehmen wie C oder C++... Es gibt in C z.B. ein nützliches Konstrukt, genannt "struct". Man könnte es folgendermassen einsetzen:

    struct TYPE_TEST
    {
        uint32 nObjectSize;
        struct TYPE_TEST *pFirst;
        struct TYPE_TEST *pOneBeforeLast;
        struct TYPE_TEST *pLast;
    }
    

    Ich finde es besser, weil 1) der Compiler macht sich Gedanken, wo die Elemente im Speicher stehen und wie man auf sie am Besten und am Schnellsten zugreift, 2) die Struktur ist innerhalb von Sekunden erweiterbar, ohne viel vom bestehenden Code kaputtzumachen, 3) man muss den Code nicht wochen- (monate?) lang debuggen.

    Gruß,
    abc.w



  • Hab den Fehler gefunden, nachdem ich das ganze nochmal neu geschrieben habe 😃
    Danke für alle Antworten


Anmelden zum Antworten