Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Keks
Anmeldungsdatum: 03.11.2007 Beiträge: 156 Wohnort: Dose
|
Verfasst am: 11.11.2007, 20:08 Titel: Stapelplatz reicht nicht |
|
|
Sry für die ganzen Fragen, aber was heißt denn das jetzt wieder?
Danke schonmal. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
RaideR
Anmeldungsdatum: 15.09.2006 Beiträge: 21
|
Verfasst am: 11.11.2007, 21:53 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 11.11.2007, 22:25 Titel: |
|
|
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 |
|
 |
Keks
Anmeldungsdatum: 03.11.2007 Beiträge: 156 Wohnort: Dose
|
Verfasst am: 12.11.2007, 09:18 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 12.11.2007, 14:49 Titel: |
|
|
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 |
|
 |
Keks
Anmeldungsdatum: 03.11.2007 Beiträge: 156 Wohnort: Dose
|
Verfasst am: 12.11.2007, 16:29 Titel: |
|
|
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 |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 12.11.2007, 17:22 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 12.11.2007, 17:46 Titel: |
|
|
Also: start ruft install auf, install ruft beenden auf, und dann?
Was in der SUB beenden passiert, müssen wir wieder raten.
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.11.2007, 00:44 Titel: |
|
|
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 |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 13.11.2007, 12:30 Titel: |
|
|
Unter Windows (also z.B. mit FB ) 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.
Nur mal so weils grade so passte^^ _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 13.11.2007, 14:11 Titel: |
|
|
Was sich dann Exploit nennt. Da gibts aber auch andere Möglichkeiten. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 13.11.2007, 19:56 Titel: |
|
|
csde_rats hat Folgendes geschrieben: | Unter Windows (also z.B. mit FB ) 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.
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...?  _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Keks
Anmeldungsdatum: 03.11.2007 Beiträge: 156 Wohnort: Dose
|
Verfasst am: 14.11.2007, 18:09 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 14.11.2007, 18:30 Titel: |
|
|
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.
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 |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 14.11.2007, 18:47 Titel: |
|
|
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 |
|
 |
Keks
Anmeldungsdatum: 03.11.2007 Beiträge: 156 Wohnort: Dose
|
Verfasst am: 16.11.2007, 19:11 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 17.11.2007, 02:14 Titel: |
|
|
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 |
|
 |
Keks
Anmeldungsdatum: 03.11.2007 Beiträge: 156 Wohnort: Dose
|
Verfasst am: 19.11.2007, 09:33 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 20.11.2007, 03:07 Titel: |
|
|
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 |
|
 |
|