Pointer-Arithmetik für Dummys

  • Also, ich verzweifle mal wieder an C und seinen Pointern. Ich versuche eine GenChangeNotification zu kriegen, zu einem Dateisystem - Change. Da kriege ich dann ein MemHandle mit folgender Struktur:

    Wie man siehst, ist der FileLongName optional. Gibt es den nicht, ist die Struktur verkürzt und es beginnt die nächste Struktur. Das heißt die normale Pointer-arithmetik mit +1 für "um einmal die Struktur erhöhen" funzt nicht. Man müsste jetzt also je nach FCBNI_type die Menge der zu erwartenden Bytes bestimmen und dann auf einen BytePointer aufschlagen, wenn ich das richtig sehe. Aber das ist ja Wahnsinn. Geht das einfacher? (man merkt, dass das eigentlich ASM Code war - es gibt dafür im Source auch nicht ein einziges C-Beispiel...). Rainer, hast Du was zu dem Thema in Deinem Fundus...? Oder übersehe ich mal wieder was offensichtliches?

    Bye,
    MeyerK

  • Wie man siehst, ist der FileLongName optional. Gibt es den nicht, ist die Struktur verkürzt und es beginnt die nächste Struktur.

    Bist du da sicher? Ich würde den Kommentar - mehr ist es ja nicht - so interpretieren, dass man das Feld auch leer lassen kann, wenn es nicht gebraucht wird. Das Feld ist prinzipiell genau so deklariert, wie die darüber - woher soll der Compiler wissen, ob der Nutzer es braucht??? M.E. definiert typedef struct eine Struktur mit fester Größe.
    Die Pointerarithmetik +1 sollte hier gehen - falls nicht, habe ich irgend etwas fundamental falsch verstanden.

    Rainer

    P.S. Spannend finde ich auch die zweite Struktur. Das Word-Feld enthält offenbar einen near-Pointer hinter die aktuelle Liste der ~NotifiactionItems. Das finde ich sehr clever, wenn man dabei ist, die Liste aufzubauen .

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • (Note that in this batched case....)

    Es ergibt aber keinen Sinn, dass die Struktur verkürzt ist. Dann müsste irgendwo stehen, wie lang die Strukturen wirklich sind. Das steht nirgends, folglich müssen sie volle Länge haben.

    Are not present kann auch heißen "are not set" - also nicht belegt. Du sollst dich nur nicht drauf verlassen, dass da etwas vernünftiges drin steht.

    Sollte ich falsch liegen, bedeutet dass, dass du den Type aus FCBNI_type auslesen musst und die Struktur genau so lang ist, wie dieser Typ erforderliche Daten hat. Das wäre aber ein sehr kruder Programierstil, aber man könnte sich durchhangeln.

    Prüfen kannst du das vielleicht, wenn du eine solche Message empfängst, an der Größe des Feldes FCBND_end. Habe ich recht, ist der Wert immer ein Vielfaches der ~Items-Struktur Größe + 2. Ist er das nicht, hast du recht.

    Wenn du die Struktur senden willst, bleibt dir nur probieren, ob es geht oder das System abschmiert. Alternativ könntest du im Codetree suchen, wo die Struktur verarbeitet wird und sehen, ob du aus dem Code schlau wirst.

    Soviel der unausgegorenen Ideen.

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Moin!

    Um das mal zum Abschluss zu bringen... es ist tatsächlich so, dass die FileLongName Geschichte optional ist. Spart natürlich Speicher, ist aber mal wieder mehr Assembler als C - GeoWorks at its best. Falk hat mir einen Referenzcode geschrieben, mit dem ich es dann zum Laufen gekriegt habe. Aber wahrscheinlich brauche ich für das, was ich will, sowieso einen ganz anderen Ansatz. Deswegen poste ich die Funktion mal hier für future reference:

    (weil es einfach auch kein C-Sample in der Code-Base gibt...)

    Bye,
    MeyerK

  • Also doch so:

    Sollte ich falsch liegen, bedeutet dass, dass du den Type aus FCBNI_type auslesen musst und die Struktur genau so lang ist, wie dieser Typ erforderliche Daten hat.

    Wirklich, GeoWorks at its best. Wow.

    Um das Thema zu vervollständigen: Kannst du noch mal kurz beschreiben, in welchem Kontext das Problem eigentlich aufgetreten ist?

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Es geht mir eigentlich nur darum, zu erfahren, ob es in einem Folder Veränderungen gegeben hat... Leider gibt es dafür keine einfache API. Ich habe aber jetzt eine Lösung, die hinreichend zufriedenstellend funktioniert.

    Bye,
    MeyerK

  • ok, Ich habe im Hinterkopf immer noch die Idee, GeoZip mit Drag&Drop auszurüsten. Deswegen meine Frage. aber das ist eine ganz andre Situation.
    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.