Seite 2 von 2

Verfasst: 08.04.2006 14:07
von ZeHa
Ja, eigentlich müßten sogar beide Beispiele laufen. Wenn die Procedure nicht deklariert ist, sagt das einem immerhin der Compiler. Das Gosub-Problem sagt einem niemand.

@ ts-soft: Sicher, daß für die Parameter Speicher reserviert wird? Ich dachte die werden auf dem Stack abgelegt...

Verfasst: 08.04.2006 14:14
von DeltaG
ts-soft hat geschrieben:@DeltaG
Verstehe ich nicht? :freak:
Labels werden immer gefunden, egal wo sie im Code stehen. Ist nur eine
Adresse

Proceduren müssen vorher declariert sein, da ja nicht nur eine
Speicheradresse bekannt sein muß, sondern auch Speicher für die Parameter
reserviert werden muß
Was gibt es da nicht zu verstehen?
Im ersten (Procedure-)Beispiel meldet der Kompiler einen Fehler, da er zum Zeitpunkt es Bearbeitens die Procedure 'machwas()' noch nicht kennt. Das typische Verhalten eines Einpaßkompilers. Der Ausweg dazu ist eben ein 'Declare'.
Es ist also ein Beispiel dafür, daß die Position im Quellcode darüber entscheidet, ob das Programm läuft oder nicht.
Die Ausgangsfrage war doch, ob die Position eines Befehls im Programmcode nur bei 'Gosub' im Verhältnis zu 'Return' wichtig ist in Verbindung mit der Aussage, daß mit einer Procedure solch ein Problem nicht auftritt.
Man müßte also zu 'Gosub' sagen, daß programmablauftechnisch ( :lol: ) einem 'Return' immer ein 'Gosub' vorausgehen muß, damit sich eine Rückkehradresse auf dem Stack befindet. (Daß man dieses auch mit anderen Mitteln erreichen kann ist auch klar.)
Bei einer Prozedur muß sich die Definition der Prozedur immer vor dem ersten Aufruf selbiger im Programmcode befinden, außer man benutzt ein 'Declare Procedure xxx()' vor dem ersten Aufruf. Warum der Kompiler letztendlich den Fehler meldet ist doch unerheblich. Es ging ja nur um die Positionen der Befehle.

:oops:
DeltaG

Verfasst: 08.04.2006 14:23
von ts-soft
ZeHa hat geschrieben: @ ts-soft: Sicher, daß für die Parameter Speicher reserviert wird? Ich dachte die werden auf dem Stack abgelegt...
Ja, nach dem Aufruf werden sie wohl auf den Stack gelegt
Und ich denke mal der Rückgabetyp muß auch bekannt sein.

@DeltaG
Jetzt hab ich Deine Aussage verstanden, bzw. was Du erklären wolltest :wink:

Verfasst: 08.04.2006 14:49
von 125
ts-soft hat geschrieben:Ja, nach dem Aufruf werden sie wohl auf den Stack gelegt
Und ich denke mal der Rückgabetyp muß auch bekannt sein.
Ähm, man Pusht doch erst die parameter auf den Stack und ruft dann die Procedur auf, nich umgekehrt..... Umgekehrt könnte das doch garnich gehen....

Verfasst: 08.04.2006 15:25
von ts-soft
Auf jedenfall muß er die Anzahl der Parameter kennen. Was er damit macht,
ist mir eigentlich egal, weil es für mich als nichts ASM-Freak uninteressant ist
:mrgreen:

Verfasst: 15.04.2006 17:14
von Andre
2.1 a$ und a.s sind NICHT identisch! Ein String den man also einmal a$ genannt hat kann man nicht mehr mit a.s ansprechen und umgekehrt! Eigentlich sollte sowas doch möglich sein, da die Datentypen absolut identisch sind! Die verschiedene Verhaltensweise fällt insbesondere bei Val(a) auf - Hier darf man auschließlich nur "Val(a$)" schreiben und nicht etwa "Val(a.s)" oder Val(a) selbst wenn vorher "Global a.s" festgelegt wurde. Wenns nicht zuändern ist, bitte diese Besonderheit im Handbuch explizit aufführen!
Habe dazu im Kapitel "Variablen" einen extra Abschnitt zur Erläuterung hinzugefügt. :)