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...
4 Bugs


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Was gibt es da nicht zu verstehen?ts-soft hat geschrieben:@DeltaG
Verstehe ich nicht?![]()
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ß
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 (

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.

DeltaG
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Ja, nach dem Aufruf werden sie wohl auf den Stack gelegtZeHa hat geschrieben: @ ts-soft: Sicher, daß für die Parameter Speicher reserviert wird? Ich dachte die werden auf dem Stack abgelegt...
Und ich denke mal der Rückgabetyp muß auch bekannt sein.
@DeltaG
Jetzt hab ich Deine Aussage verstanden, bzw. was Du erklären wolltest

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Ä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....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.


- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
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

ist mir eigentlich egal, weil es für mich als nichts ASM-Freak uninteressant ist

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- Andre
- PureBasic Team
- Beiträge: 1765
- Registriert: 11.09.2004 16:35
- Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10 - Wohnort: Saxony / Deutscheinsiedel
- Kontaktdaten:
Habe dazu im Kapitel "Variablen" einen extra Abschnitt zur Erläuterung hinzugefügt.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!
