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:

Stapelplatz reicht nicht
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Keks



Anmeldungsdatum: 03.11.2007
Beiträge: 156
Wohnort: Dose

BeitragVerfasst am: 11.11.2007, 20:08    Titel: Stapelplatz reicht nicht Antworten mit Zitat

Sry für die ganzen Fragen, aber was heißt denn das jetzt wieder?

Danke schonmal.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 11.11.2007, 20:09    Titel: Antworten mit Zitat

Das heißt, dass der Stack für das, was du machst, nicht groß genug ist. Könnte eine fehlerhafte oder aus anderen Gründen endlos laufende Rekursion sein oder sowas, aber da kann man nur mutmaßen, wenn du den betreffenden Quellcode nicht zeigst. zwinkern
_________________

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
RaideR



Anmeldungsdatum: 15.09.2006
Beiträge: 21

BeitragVerfasst am: 11.11.2007, 21:53    Titel: Antworten mit Zitat

hey das problem hatte ich glaub ich auch mal...
bei mir endstand das dadurch, dass ich zu oft zwischen verschiedenen SUB's gewechselt habe.
Das Problem habe ich mit
CLEAR , , 20000
behoben
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 11.11.2007, 22:25    Titel: Antworten mit Zitat

das passiert aber nur, wenn du die SUBs nicht ordnungsgemäß verlässt, z.B. so:

Code:

SUB Test
Test
END SUB
Test

Somit würde die sich immer wieder selbst aufrufen, aber der Stapelspeicher (Stack) kann das nicht verwalten. Deswegen sollte die Anzahl der verschachtelten (rekursiven) SUB- und FUNCTION-Aufrufe immer so niedrig liegen. notfalls hilft hier auch FreeBasic weiter...
_________________
» 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
Keks



Anmeldungsdatum: 03.11.2007
Beiträge: 156
Wohnort: Dose

BeitragVerfasst am: 12.11.2007, 09:18    Titel: Antworten mit Zitat

Komisch...

Code:

SUB start
  CLS
  OPEN "I", #1, "INI/INI.DAT"
    INPUT #1, version$
  CLOSE #1
  IF version$ = "1.0" THEN
    center
  ELSE
    PRINT "1: Installieren"
    PRINT "2: Hilfe aufrufen"
    PRINT "3: Beenden"
    PRINT
    INPUT "Wähle aus. ", antwortstart
    IF antwortstart = 1 THEN
      install
    ELSEIF antwortstart = 2 THEN
      hilfe
    ELSE
      beenden
    END IF
  END IF
END SUB


Bei install soll etwas logischerweise installiert werden, danach kommt man wieder zu Start. Es geht bis dahin, wo man für Installieren 1 eingibt.

Editiert durch Moderator: Code-Tags hinzugefügt zur besseren Übersicht. (A.K.)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 12.11.2007, 14:49    Titel: Antworten mit Zitat

Hallo,

vielleicht springst Du aus der Sub "install" wieder zurück ins Hauptprogramm oder rufst von dort die Sub "start" erneut auf? Es wäre jedenfalls interessant, die Sub "install" auch mal zu sehen, da der Fehler ja bei deren Aufruf auftritt.

Gruß
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Keks



Anmeldungsdatum: 03.11.2007
Beiträge: 156
Wohnort: Dose

BeitragVerfasst am: 12.11.2007, 16:29    Titel: Antworten mit Zitat

Habs mal auf "beenden" geändert, klappt aber immer noch nicht. Hier ist der Quelltext:

Code:

SUB install
  CLS
  PRINT "Installationsmenu"
  PRINT
  [Hier wird ein wenig in Dateien geschrieben]
  [Hier wird was verschlüsselt]
  CLS
  PRINT "Installation erfolgreich!"
  SLEEP 1
  beenden
END SUB
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
croco97



Anmeldungsdatum: 04.11.2005
Beiträge: 260

BeitragVerfasst am: 12.11.2007, 17:22    Titel: Antworten mit Zitat

Das hast de schnell raus. Deklarier ne globale Variable startcount und setz die gleich am Anfang auf null. Dann ergänze dein start-Sub:

Code:

PRINT "startcount=";startcount
startcount=startcount+1


Dann fröhliches Zählergucken...

Grüsse!

Croco
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 12.11.2007, 17:46    Titel: Antworten mit Zitat

Also: start ruft install auf, install ruft beenden auf, und dann?
Was in der SUB beenden passiert, müssen wir wieder raten. zwinkern

edit: Was soll eigentlich passieren? Soll das Programm nach der Installation wieder in die SUB start zurück? Wenn ja, dann brauchst du nicht nochmal start aufrufen, sondern einfach die SUB install beenden. Das Programm springt dann dorthin zurück, von wo aus install aufgerufen wurde.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 13.11.2007, 00:44    Titel: Antworten mit Zitat

Hallo

Du musst auf jeden Fall wieder in die Sub "start" zurückkehren, schon um den dort begonnen IF...THEN-Block auch mit dem END IF wieder zu beenden. Wenn der Stack überläuft, dann springst Du irgendwie nicht richtig zurück.

Dieser Stack oder Stapel speichert bei einer Verzweigung in eine Sub die Adresse der Programmzeile in der diese Sub aufgerufen wird, damit der Computer hinterher weiss, wohin er zurückkehren muss. Wird von da in eine weitere Sub verzweigt, merkt er sich wieder die Rückkehradresse. Diese Adressen werden also nach und nach aufeinander gestapelt, daher der Name. Am Ende einer Sub sieht der Rechner nach, welche Adresse zuoberst auf diesem Stapel liegt, springt dort hin und löscht diese Adresse. Dann kommt die nächste usw. So wird der Stapel wieder abgearbeitet und der Weg der Verzweigungen zurückverfolgt. Du kannst Dir das wie einen Stapel Karten vorstellen, auf den Du nur immer eine obendrauf lagen, ober die oberste runternehmen kannst. Kehrst Du nicht richtig zurück, sondern verzweigst immer neu, dann ist der Speicherbereich, in dem diese Adressen abgelegt werden irgendwann voll und der Stapelplatz reicht nicht mehr, weil immer neue Einträge auf den Stapel gepackt werden.

Gruß
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 13.11.2007, 12:30    Titel: Antworten mit Zitat

Unter Windows (also z.B. mit FB grinsen) ist es möglich, wenn man über einen definierten Speicherbereich hinaus auf den Speicher zugreift, diese Rücksprungadressen zu manipulieren, und so, z.b. den Rechner abstürzen zu lassen, oder Schadcode auszuführen.
grinsen
Nur mal so weils grade so passte^^
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mao



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

BeitragVerfasst am: 13.11.2007, 14:11    Titel: Antworten mit Zitat

Was sich dann Exploit nennt. Da gibts aber auch andere Möglichkeiten.
_________________
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: 13.11.2007, 19:56    Titel: Antworten mit Zitat

csde_rats hat Folgendes geschrieben:
Unter Windows (also z.B. mit FB grinsen) ist es möglich, wenn man über einen definierten Speicherbereich hinaus auf den Speicher zugreift, diese Rücksprungadressen zu manipulieren, und so, z.b. den Rechner abstürzen zu lassen, oder Schadcode auszuführen.
grinsen
Nur mal so weils grade so passte^^

@FB-Programme: Warum solltest du aufwändig eine Software schreiben, die Rücksprungadressen ihrer Unterprogrammaufrufe o.ä. manipulieren kann, um Schadcode auszuführen, wenn du ja den Schadcode auch direkt in das Programm einbauen könntest...? grinsen
_________________

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
Keks



Anmeldungsdatum: 03.11.2007
Beiträge: 156
Wohnort: Dose

BeitragVerfasst am: 14.11.2007, 18:09    Titel: Antworten mit Zitat

aso...

Ist es nicht möglich, dass der PC den Rest der Sub vergisst?
Oder gibt es eine andere Möglichkeit?
Auf jeden Fall funktioniert es bei anderen Sachen auch.

PS: Bei Beenden beendet das Programm^^
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 14.11.2007, 18:30    Titel: Antworten mit Zitat

Keks hat Folgendes geschrieben:
Ist es nicht möglich, dass der PC den Rest der Sub vergisst?

Dann würde er aber nicht das machen, wofür eine SUB gemacht ist. Das ist nun einmal das Prinzip der strukturierten Programmierung: in ein Unterprogramm springen und anschließend ohne Probleme wieder zurückkehren können.

Was du (vermutlich) versuchst, ist der Missbrauch des SUB-Aufrufs als GOTO-Ersatz. Da mag das Programm vielleicht eine Weile lang mitspielen, aber bei einigermaßen komplizierten Programmen ist der Speicherplatz sehr schnell alle.

Zitat:
Oder gibt es eine andere Möglichkeit?

Selbstverständlich - schreibe es als strukturiertes Programm. zwinkern

Du hast doch ein Hauptmenü, von dem aus du die anderen SUBs aufrufst. So weit, so gut.
Code:
SUB Hauptprogramm
  tue
    frage Tastendruck ab
    wenn "install-Taste" gedrückt wurde dann springe zur SUB install
    wenn "hilfe-Taste" gedrückt wurde dann springe zur SUB hilfe
  solange bis "Ende-Taste" gedrückt wurde
END SUB

SUB install
  führe Installation durch
END SUB ' der Rücksprung in die Hauptmenü-Schleife erfolgt automatisch!!

SUB hilfe
  gib Hilfetext aus
END SUB ' der Rücksprung in die Hauptmenü-Schleife erfolgt automatisch!!

_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



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

BeitragVerfasst am: 14.11.2007, 18:47    Titel: Antworten mit Zitat

Keks hat Folgendes geschrieben:

Auf jeden Fall funktioniert es bei anderen Sachen auch.

Ja, es mag funktionieren, allerdings nur so lange noch genug Speicher auf dem Stack ist. Und früher oder später kommt es zu 100% zu Problemen!
Für jeden Sub-Aufruf werden auf dem Stack Rücksprung-Informationen gespeichert - und die Größe des Stacks ist sehr gering im Vergleich zum verfügbaren bzw. auch im Vergleich zum im Real Mode (also mit QB) verfügbarem Speicher.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Keks



Anmeldungsdatum: 03.11.2007
Beiträge: 156
Wohnort: Dose

BeitragVerfasst am: 16.11.2007, 19:11    Titel: Antworten mit Zitat

Ich habe jetzt Statt SUBs Marken eingesetzt, geht soweit. Ich habe da nur noch ein Problem mit einer Verschlüsselung.

Code:
DIM szTrash AS STRING * 2000
DIM KeyTable(255)
LOCATE 2, 27
 COLOR 14
PRINT "INT Crypt / Decrypt V1.0"
LOCATE 3, 27
PRINT STRING$(24, "Ä")
LOCATE 12, 10
FileName$ = "INI/ADMIN.DAT"
WHILE LEN(key$) < 5
  LOCATE 14, 10
WEND
FOR i = 1 TO iKeyLen: KeyTable(i) = ASC(MID$(key$, i, 1)): NEXT i
 OPEN FileName$ FOR BINARY AS #1 LEN = 16384
 OPEN "out.$$$" FOR OUTPUT AS #2 LEN = 16384
 iKeyLen = LEN(key$): lFlen& = LOF(1)
IF INPUT$(14, 1) = "INT CRYPT PRO" + CHR$(26) THEN
 LOCATE 17, 26: COLOR 12
 PRINT FileName$; " wird entschlsselt ..."
 check$ = "E"
ELSE
 LOCATE 17, 26: COLOR 12
 PRINT FileName$; " wird verschlsselt ..."
 SEEK 1, 1: PRINT #2, "INT CRYPT PRO" + CHR$(26)
 check$ = "V"
END IF
FOR count& = 1 TO lFlen& STEP iKeyLen
  szIn$ = INPUT$(iKeyLen, 1)
  FOR i = 1 TO LEN(szIn$)
    PRINT #2, CHR$(ASC(MID$(szIn$, i, 1)) XOR 176 XOR KeyTable(i));
  NEXT i
  gelesen& = gelesen& + iKeyLen
  LOCATE 20, 23: COLOR 12
  PRINT "Durchgang 1:"; INT(gelesen& * 100 / lFlen&); "% abgeschlossen";
NEXT
IF check$ = "V" THEN LOCATE 23, 29: PRINT FileName$; LOF(2); "Bytes"
 FOR i = 1 TO lFlen& STEP 2000: PUT #1, i, szTrash: NEXT i
 CLOSE : KILL FileName$: NAME "out.$$$" AS FileName$
 IF check$ = "V" THEN SYSTEM
OPEN "out.$$$" FOR BINARY AS #2
OPEN FileName$ FOR BINARY AS #1
SEEK #1, 3
FL& = LOF(1)
DO
x& = x& + 4
GET #1, , i
PUT #2, , i
  LOCATE 21, 23: COLOR 12
  PRINT "Durchgang 2:"; INT(x& * 100 / FL&); "% abgeschlossen";
LOOP UNTIL EOF(1)
 CLOSE
KILL FileName$: NAME "out.$$$" AS FileName$
 OPEN FileName$ FOR INPUT AS #1
LOCATE 23, 30: PRINT FileName$; LOF(1); "Bytes"
 CLOSE
SYSTEM


Hier bleibt das Programm einfach stecken. key$ ist schon vorgegeben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 17.11.2007, 02:14    Titel: Antworten mit Zitat

Hallo Keks

Keks hat Folgendes geschrieben:
Ich habe jetzt Statt SUBs Marken eingesetzt, geht soweit.


Na ja, aber meinst Du nicht es würde Sinn machen, das mit den SUBs zu verstehen, damit Du in Zukunft nicht wieder vor diesem Problem stehst?

Aber gut, ist natürlich Deine Sache. Aber mal was Anderes - die Verschlüsselung stammt doch nicht von Dir, die hast Du irgendwo rauskopiert, oder? Ist ja prinzipiell nichts gegen zu sagen, aber man sollte dann schon verstehen, was der fremde Code macht. Wenn das Programm "stecken bleibt", könnte das an der SYSTEM-Anweisung liegen. Du kannst ja mal nachsehen, was die Hilfe des QB-Editors zu SYSTEM sagt. Ich kenne das noch aus alten GW-Basic-Tagen. Und wenn key$ vorgegeben ist, welchen Sinn hat dann die WHILE...WEND-Schleife?

Gruß
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Keks



Anmeldungsdatum: 03.11.2007
Beiträge: 156
Wohnort: Dose

BeitragVerfasst am: 19.11.2007, 09:33    Titel: Antworten mit Zitat

Da wirst du wohl recht haben^^
Das Script ist von qbasic.de oder so.

Ich weiß jetzt auch nicht, was das Script jetzt direkt macht, aber im Prinzip verstehe ich es.

WHILE WEND... Öhm ja^^
Fällt mir grade auf, key$ muss mindestens 5 Buchstaben haben, mit "test" sind das aber nur 4...

Also danke^^


PS: Das mit den SUBS habe ich verstanden.





So, ein kleines Problem gibt es noch. An einem bestimmtem PC kann Qbasic am Anfang eines Programmes eine Datei nicht mit "I" öffnen.

Was kann man dagegen machen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 20.11.2007, 03:07    Titel: Antworten mit Zitat

Keks hat Folgendes geschrieben:
So, ein kleines Problem gibt es noch. An einem bestimmtem PC kann Qbasic am Anfang eines Programmes eine Datei nicht mit "I" öffnen.

Was kann man dagegen machen?


Dafür sorgen, dass es die Datei die Du öffnen willst, auf diesem bestimmten PC auch gibt und sie im richtigen Verzeichnis steht.

Gruß
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
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 QBasic. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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