• Hallo, habe hier noch was gefunden, das unbedingt (auch in der Profanhilfe) Erwähnung finden sollte.

    Es ist zwar jetzt nicht unbedingt ein Bug, aber man sollte es trotzdem mal wissen. :

    Zitat

    Addr(VAR)

    Hinweis: Diese Funktion kann nur die Adressen von deklarierten Variablen ermitteln

    Mein Code hierzu :

    Code
    declare a$, b%
    'a$ = " "
    Print Addr(a$)
    Print Addr(b%)
    waitkey

    Das stimmt ja nur teilweise. Während bei numerischen Variablen immer eine Adresse nach dem Deklarieren

    ermittelt werden kann, ist das bei Stringvariablen aber nicht so. Erst, wenn man ihnen einen gültigen Wert zuweist,

    kann die Adresse bestimmt werden. Das sollte man besonders bei API-Funktionen oder fremden DLLs im Hinterkopf haben.

    Warum das so ist, ist darauf zurückzuführen, daß eine numerische Variable eine feste Größe von 4 Bytes hat, während eine

    Stringvariable dynamisch ist und damit erst nach Belegung die Speicheradresse errechnet und ermittelt werden kann.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    2 Mal editiert, zuletzt von H.Brill (3. Mai 2026 um 09:00)

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress, WoltLab & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

    Wenn du Fragen hast, kannst du dich gerne jederzeit an @Maximilian Rupp wenden

    Hinweis:

  • Ja, stimmt. Üblicherweise verwendet man Bereichsvariablen für die Übergabe an APIs, die vorher auf die erforderliche Größe gedimmt werden müssen. Stringvariablen lassen sich nicht dimmen, also muß man die in der erforderlichen Größe mit Leerzeichen auffüllen und nötigenfalls dann bei Rückkehr trimmen, um überzählige Leerzeichen zu entfernen.

    Gruß Volkmar

  • Naja, ganz so unüblich scheint es ja nicht zu sein (siehe Hilfe)

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Dann noch eine Frage hinterher, was die Callback-Funktionen betrifft :

    Da wird ja LogFont& als numerische Variable übergeben und jedesmal bei Fund mit ~EnumFontFamilies an die Adresse von LogFont&

    der Fontname geschrieben. Da wird ja auch nichts von uns (Anwenderseite) vorher gedimmt.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Die Variablen werden hier ja nur als Parameter übergeben, nicht declariert. Bereitgestellt werden kann der Bereich durch die Enum-Funktion. Einen fremden Bereich können wir nicht so ohne Weiteres als Bereichsvariable anfassen, also nehmen wird den Wert als Zeiger an, der in einer Longvariablen steht. Irgendwo hat Roland das auch beschrieben, warum er Bereichsadressen in einer Logvariablen erlaubt. Wir lesen in Zeile 4 den String aus, nach dem Return in Zeile 7 oder 9 kann die Enum-Funktion den Bereich dann disposen, wir haben unseren Wert ja schon ausgelesen.

    Gruß Volkmar

  • Ja, das steht in der Rubrik Bereiche :

    Zitat

    Die Adresse einer Bereichsvariablen kann einem Pointer zugewiesen werden und umgekehrt:

    Declare Memory Bereich, Pointer Wert

    Wert = Bereich

    Bereich = Wert

    (Gefährlich! Kann zum Systemabsturz mit Datenverlust führen!)

    Aber, was mir noch nicht so recht bei der Enum-Funktion einleuchtet :

    Code
    Font$ = String$(LogFont&, 60)

    Warum wird da erst ab Offset 60 eingelesen ? Bei Offset 0 funktioniert es ja nicht.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Wohl, weil die Enumfunktion den Namen dort ablegt. Ohne da jetzt nachgesehen zu haben, vermute ich einfach mal, die Enumfunktion liefert eine Struktur zurück und der Fontname steht dann eben ab Position 60.

    Gruß Volkmar

  • Habs gerade mal nachgelesen. Genauso ist es. Da steht zuerst eine 60 Bytes lange Struktur, wo u. a. auch der Fontname drinsteht. Aber hinten dran steht der nochmals, aber mit einem Nullbyte am Ende. So ist es dann einfacher, mit Rolands Code, den Namen von dort an (Offset 60) auszulesen.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Das ist ja wirklich ein Ding. In der Tat liefert @addr(s$) 0 zurück, wenn s$ noch kein Wert zugewiesen wurde. Wenn man aber print s$ benutzt, stürzt nichts ab. XProfan scheint "Adresse=0" als Leerstring zu interpretieren. Ich dachte immer, ein String, dem noch nichts zugewiesen wurde, wäre ein gültiger Leerstring, der auch eine entsprechende Speicheradresse hat. Böse Falle!


    Wow. Es wird noch schlimmer! Jeder Leerstring hat in XProfan die Speicheradresse 0, auch wenn der Stringvariablen vorher schon etwas zugewiesen wurde! Beispiel:

    Code
    cls
    declare s$
    s$="1"
    print @addr(s$) 'ist eine gültige Speicheradresse
    s$=""
    print @addr(s$) 'ist =0 !
    waitinput

    Ich habe gerade mal nachgesehen, wie das andere Programmiersprachen machen.
    In PureBasic hat eine Stringvariable, der noch nie ein Wert zugewiesen wurde, auch die Adresse 0.
    Wenn man einen String zuweist, bekommt man (erwartungsgemäß) eine gültige Adresse.
    Wenn man danach wieder "" zuweist, bleibt die Adresse gültig. Das ist in XProfan anders.


    Wenn man in PureBasic einer Stringvariablen nur einmal "" zuweist, bekommt man sofort eine gültige Adresse.
    Wenn man XProfan einer Stringvariablen, die schon einmal etwas <>"" enthalten hat, per string @addr(s$),0="" einen Leerstring zuweist, bleibt die Adresse erhalten. Wenn man das mit einer noch nie benutzten Stringvariablen versucht, stürzt das Programm ab. Offenbar ist der Workaround mit einer Stringvariablen, die man künstlich mit Leerzeichen füllt, ziemlich gefährlich. Wenn die an irgendeiner Stelle mal ="" wird, gibt es sofort einen Absturz, wenn man das als Bereich benutzt - natürlich auch, wenn die Länge kleiner wird, als das, was man da reinschreiben will. Wenn man hingegen gleich eine Bereichsvariable benutzt, kann einem nichts passieren, weil man deren Größe voll in der Hand hat.

    7 Mal editiert, zuletzt von Jens-Arne (6. Mai 2026 um 22:03) aus folgendem Grund: Ein Beitrag von Jens-Arne mit diesem Beitrag zusammengefügt.

  • Ja, so findet man ab und an solche Ungereimtheiten. Das wäre sowas, was RGH interessieren könnte.

    Es ist halt schade, daß RGH nicht mehr antwortet. Ob er es nicht mehr kann oder will, ist eine andere Sache.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!