1. Artikel
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Paules-PC-Forum.de
  2. Forum
  3. Programmierung
  4. XProfan
  5. Anregungen und Bugreports

Merkwürdig "Proc...EndProc"

  • H.Brill
  • 6. März 2023 um 10:40
  • H.Brill
    Stammuser
    Reaktionen
    505
    Beiträge
    1.185
    • 6. März 2023 um 10:40
    • #1

    Hallo, habe da etwas merkwürdiges festgestellt :

    Code
    Cls
    Proc mytest
    Parameters Long a, b
    EndProc
    
    Print mytest(2, 15)
    waitkey

    Warum kommt da der Wert des 2. Parameters bei Print ?

    Da dürfte doch normalerweise gar nichts kommen, da es kein RETURN gibt.

    Genauso gibt das Proc ohne Return das Ergebnis aus :

    Code
    Cls
    Proc mytest
    Parameters Long a, b
    Declare Long c
    c = a * b
    EndProc
    
    Print mytest(3, 15)
    waitkey

    Da dürfte auch nichts kommen.

    Weiß jemand, warum das so ist ?

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Abifiz 6. März 2023 um 11:55

    Hat den Titel des Themas von „Merkwürdig Proc...EndProc“ zu „Merkwürdig "Proc...EndProc"“ geändert.
  • Volkmar
    Moderator
    Reaktionen
    6.995
    Beiträge
    6.929
    • 6. März 2023 um 14:04
    • #2

    Man sollte nie Werte auslesen, die man nicht vorher gespeichert hat. Jede Speicherzelle enthält immer irgendwas. In dem Falle ist es der Stack, über den ja die Parameterübergabe stattfindet.

    Gruß Volkmar

  • H.Brill
    Stammuser
    Reaktionen
    505
    Beiträge
    1.185
    • 6. März 2023 um 15:11
    • #3

    Also wahrscheinlich den da : @&(N)

    @! - @$ - @% - @&t

    Sowas mache ich sonst auch nie. Hatte es nur ausprobiert, weil mir (und anderen) im anderen Profanforum

    das jemand geschrieben hatte. Das mit dem Parameterstack leuchtet mir auch ein. Aber was ist mit dem zweiten

    Code, bei dem gerechnet wird ? Die 45 sind ja kein Parameter, sondern das Ergebnis von a * b. Oder kommt

    das auch noch auf den Stack ?

    Zitat

    @! - @$ - @% - @&t

    Der 0. Parameter ist nach Aufruf einer Prozedur/Methode der mit Return <Wert> zurückgegebene Wert.

    Also die werden immer noch gesetzt, auch ohne Parameters.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    Einmal editiert, zuletzt von H.Brill (6. März 2023 um 15:19)

  • Volkmar
    Moderator
    Reaktionen
    6.995
    Beiträge
    6.929
    • 6. März 2023 um 15:31
    • #4

    Auch lokale Variablen liegen immer auf dem Stack. Das ist ja der Trick daran, daß sie lokal sind. Beim Verlassen der Prozedur zeigt der Stack wieder auf die Stelle, wo er vor dem Aufruf war, damit ist alles weg, was innerhalb der Prozedur passiert ist. Nur eben, daß Roland hier für die Rückgabe den obersten Wert notiert, also das, was in den @! - @$ u.s.w. geliefet wird.

    Gruß Volkmar

  • H.Brill
    Stammuser
    Reaktionen
    505
    Beiträge
    1.185
    • 6. März 2023 um 17:19
    • #5

    Danke für die Erklärung.

    Solche Internas sind ja auch mal interessant.

    Beim Stack dachte ich immer an LIFO (last in first out)

    bzw. FIFO (first in first out). Also die Reihenfolge, wie

    der Stack wieder abgeräumt wird.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Volkmar
    Moderator
    Reaktionen
    6.995
    Beiträge
    6.929
    • 6. März 2023 um 17:50
    • #6

    Im Prinzip ist das auch so. Der Stack hat eine Anfangsadresse und wenn ein Wert dort abgelegt wird, zählt der 1 weiter. Wird ein Wert ausgelesen, zählt er um eins zurück. Aber das Auslesen ist ja in Wahrheit ein Kopieren, der Wert bleibt parallel dazu immer noch da. Beim Verlassen einer Prozedur wird der Stack dann auf den Anfangswert der Prozedur gesetzt. Die Speicherzellen behalten aber ihren Inhalt. Irgendwelche Lesefunktionen, die nicht wirklich definiert sind, bringen also trotzdem noch ein Ergebnis.

    Für Profan mußte da etwas gebastelt werden, weil wir da ja keinen nativen Code haben. Da dürfte immer der letzte Parameter oder wenn lokale Variablen verwendet werden, die zuletzt angelegte Variable kommen, wenn kein Return in der Prozedur ist.

    Gruß Volkmar

Windows 11

  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™