Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 12.02.2009, 19:30 Titel: Einfach zurück zum Modul-Level-Code |
|
|
Hallo,
ich möchte aus einer SUB möglichst einfach (am liebsten mit einer Anweisung) zurück in den Modul-Level-Code.
Zuerst hatte ich dafür GOTO marke verwendet, und marke in den MLC gepackt. Aber mitlerweile geht das nicht mehr und ich bekomme die Fehlermeldung 94 "Branching to other functions or to module-level"
Also nehmen wir mal an, ich möchte aus SUB4 direkt an den Anfang von SUB5. Dazu müsste ich irgendwie automatisch alle aufgerufenen SUBs "zurücklaufen", damit ich wieder im MLC bin.
SUB5 -> SUB6 ----------------------------
|--------------------------------------------|
MLC -> SUB1 -> SUB2 -> SUB3 -> SUB4
|--------------------------------------------|
SUB7 -> SUB8 ----------------------------
Mein Programm ist wesentlich komplexer als hier dargestellt, deswegen bräuchte ich etwas "automatisches", manuell mit "exit sub"s arbeiten kommt nicht in frage!
Es müsste doch eine Möglichkeit geben, dem Programm klarzumachen, dass es alle Aufrufe vergessen soll und mich an eine beliebiege Stelle im MLC zurücksetzen soll, meinetwegen auch an den Programmanfang. Hat jemand eine Idee? |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 13.02.2009, 17:58 Titel: |
|
|
Nein!
Deine Programmgestaltung nimmt keine Rücksicht auf die Arbeitsweise eines Prozessors.
Jeder Aufruf einer Prozedur legt einen Merkzettel (Stack ) an, der durch einen ordentlichen Rücksprung wieder abgearbeitet/abgebaut wird.
Machst du das nicht, so verstrickt er sich (du dich) in dieser Zettelwirtschaft. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 13.02.2009, 23:59 Titel: |
|
|
Ich verstehe deine Erklärung schon, aber bei früheren Versionen ging es tatsächlich noch, aus einer SUB per GOTO zurück in den MCL zu gehen - und zwar OHNE sich zu "verstricken"! Scheinbar wurden automatisch alles stacks gelöscht. Das konnte man testen, indem man nach dem Sprung im MLC ein "exit sub" reinschrieb. Dann gab es nämlich einen Fehler, weil die Sub, aus der gesprungen wurde, vergessen wurde. Ich frag mich halt nur, weshalb das in der aktuellen version nicht mehr geht. Oder liegt es möglicherweise daran, dass ich den code mit -lang fblite (notwendig für mich, da alter code) kompiliere? |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 14.02.2009, 00:15 Titel: |
|
|
ich bezweifle, dass dabei der stack geleert wurde... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 14.02.2009, 00:28 Titel: |
|
|
Da magst du Recht haben...
Ok dann stell ich die entscheidende Frage mal anders:
Kann man den stack manuell leeren und anschließend den Programmablauf im Modul-Level-Code fortsetzen lassen... quasi ein Programmneustart aber mit Erhalt sämtlicher Variablen? |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 14.02.2009, 13:17 Titel: |
|
|
Wenn du so rangehst, wär es vllt. doch sinnvoller, das Konzept zu überdenken und nochmal von vorn anzufangen. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 14.02.2009, 13:43 Titel: |
|
|
Hallo!
Spaghetti-Code ohne GOTO zu produzieren ist schon schwierig, ohne dass einem der Stack überläuft. Von daher kann ich mich da den Vorrednern nur anschließen: Strukturierte Programmierung und eine vorab erfolgte Planung des Programmaufbaus wären wohl deutlich besser. Übrigens: Obwohl viele Leute Struktogramme nicht ausstehen können, können sie für genau für solche Überlegungen meiner Meinung nach durchaus hilfreich sein.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 14.02.2009, 17:06 Titel: |
|
|
Die Fehlermeldung 94 "Branching to other functions or to module-level" kann man umgehen
Zitat: | Scheinbar wurden automatisch alles stacks gelöscht. | Nein, kann nicht automatisch gelöscht werden!
Du müsstest dir den Stackzeiger vor Aufruf der Subs merken und irgendwann wieder zurückstellen.
Das könnte hübsch kompliziert werden , daher würde ich auch ein anderes Konzept wählen.
Code: | Dim Shared x As Integer
Sub sub1
?"sub1 -> Stack belegt"
If x = 0 Then
?"sub1 -> raus"
Asm jmp raus
EndIf
?"sub1 -> sauber raus"
?"sub1 -> Stack bereinigen"
End Sub
Sub sub2
?"sub2 -> Stack belegt"
sub1
?"sub2 -> Stack bereinigen"
End Sub
Sub sub3
?"sub3 -> Stack belegt"
sub2
?"sub3 -> Stack bereinigen"
End Sub
Sub sub4
?"sub4 -> Stack belegt"
sub3
?"sub4 -> Stack bereinigen"
End Sub
x = 0
sub4
?"dies wird nicht angezeigt"
Asm raus:
?"raus -> Stack bleibt belegt"
?:?"Neuer Versuch:"
x = 1
sub4
?"suber -> Stack ist frei"
Sleep |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 16.02.2009, 16:26 Titel: |
|
|
Danke für deinen code. Eigentlich umgehst du das Problem ja auch nicht, sondern du löst es ordentlich. Ist ja im Prinzip nichts anderes, als wenn ich mit exit sub alle Sub-Aufrufe wieder bis zum MLC zurückspule, ich dachte halt bloß, es gäbe einen einfacheren Weg. |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 16.02.2009, 19:34 Titel: |
|
|
Ich weiß ja nicht, wie andere das sehen. Aber eine Lösung ist für mich ein ordentliches Design, das was volta da geboten hat ist auch bloß ein Workaround. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 16.02.2009, 22:22 Titel: |
|
|
Ja, nur ein Workaround für die Fehlermeldung!
Im ersten Durchlauf des Testprogramms wird ein Teil des Stacks nicht abgebaut.
Auch nach Beendigung des "Neuen Versuchs" bleibt dieser Stack erhalten, nur der neu aufgebaute Stack wird ordentlich abgearbeitet.
Also insgesamt ist das Problem nicht ordentlich gelöst.
Ich wollte nur zeigen, dass der Stack nicht automatisch bereinigt wird! _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|