Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Einfach zurück zum Modul-Level-Code

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 12.02.2009, 19:30    Titel: Einfach zurück zum Modul-Level-Code Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 13.02.2009, 17:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 13.02.2009, 23:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 14.02.2009, 00:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 14.02.2009, 00:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 14.02.2009, 13:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 14.02.2009, 13:43    Titel: Antworten mit Zitat

Hallo!

Spaghetti-Code ohne GOTO zu produzieren ist schon schwierig, ohne dass einem der Stack überläuft. zwinkern 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 14.02.2009, 17:06    Titel: Antworten mit Zitat

Die Fehlermeldung 94 "Branching to other functions or to module-level" kann man umgehen zwinkern
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 grinsen , 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 16.02.2009, 16:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 16.02.2009, 19:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 16.02.2009, 22:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz