![]() |
DEUTSCHE VERSION |
|
![]() |
Links | | | Forums | | | Comments | | | Report news |
![]() |
Chat | | | Polls | | | Newsticker | | | Archive |
![]() |
amiga-news.de Forum > Programmierung > Stack wird immer weniger | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2005-07-21, 00:00 h MaikG Posts: 5172 User |
Ich habe einen Bildanzeiger über Datatypes Programmiert. Der einfache Original Source war von Steffen Leistner, ich habe einige Fehler korregiert. Dann habe ich halt eine Steuerung mit + und - eingebaut, eine Verzeichniss/Bildlistung etc. Nun stürzt das Programm nach dem Anzeigen von etwa 1000 Bildern ab. Normalerweise zeige ich damit Max.200 Bilder an, aber irgendwo muss da doch ein Fehler sein oder ist das Normal? Der Stack vergringert sich mit jedem Bild, bis unter 2000, dann ists vorbei. [ - Answer - Quote - Direct link - ] |
2005-07-21, 00:36 h Ralf27 Posts: 2779 User |
Das liest sich so als ob irgendwo der Speicher nicht mehr freigegeben wird und so der Stack "aufgefressen" wird. Wird auch alles freigegeben was auch angefordert worden ist? -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2005-07-21, 00:42 h DariusBrewka Posts: 899 [Banned user] |
Ich denke so einfach wird sich der Fehler nicht finden lassen, wenn der Source zugänglich ist kann dir sicherlich eher geholfen werden. Man könnte i.A. testen ob es am spezifischen Datatype liegt indem du erstmal nur ein betimmtes Datenformat wählst, sollte das z.B. bei PNG gehen aber bei Jpeg nicht, so ist irgendwas mit dem jpeg datatype nicht in Ordnung, sollten Alle Formate fehlerhat sein, dann kann das picture.datatype buggy sein oder halt dein Programm. Hast du den Fehler irgendwie eingekreist? [ - Answer - Quote - Direct link - ] |
2005-07-21, 00:47 h DariusBrewka Posts: 899 [Banned user] |
Zitat: ich denke das wird bei Stack Problemen weniger der Fall sein, es wäre eher dann der Fall wenn folgendes Konstrukt verwendet wird void ShowPicture(name) { DisplayPicture(name); name=FileRequest("gebe einen Bildnamen ein"); ShowPicture(name); } bei so etwas bekommt man früher oder Später immer Stack Probleme, aber soetwas tut man in solch einem Fall ja auch nicht. [ - Answer - Quote - Direct link - ] |
2005-07-21, 09:44 h MaikG Posts: 5172 User |
>Wird auch alles freigegeben was auch angefordert worden >ist? Jetzt mehr als vorher, ich glaube ein Fehler hab ich noch gefunden, jedoch wenn im Programm AllocVEC steht ist das doch ein Library befehl, warum wird dann der Stack vom Programm selbst weniger? >Man könnte i.A. testen ob es am spezifischen Datatype liegt indem >du erstmal nur ein betimmtes Datenformat wählst, sollte das z.B. >bei PNG gehen aber bei Jpeg nicht, so ist irgendwas mit dem jpeg >datatype nicht in Ordnung, sollten Alle Formate fehlerhat sein, >dann kann das picture.datatype buggy sein oder halt dein Programm. Sind nur ilbm Dateien. Das hier ist das einzigste was mir noch spanisch vorkommt: IF GetDTAttrsA& (dtobjekt&, workbuf&) = 3 THEN colmsize& = ((numcolors& * 3) * 4) + 8 colors32& = AllocVec& (colmsize&, MEMF_PUBLIC& OR MEMF_CLEAR&) POKEW colors32&, numcolors& CopyMem colorfield&, (colors32& + 4), (colmsize& - ![]() picdim&(PicColW%) = colors32& picdim&(PicColN%) = numcolors& tempbm& = AllocBitMap& (picdim&(PicWidth%), picdim&(PicHeight%), picdim&(PicDepth%),BMF_CLEAR&, NULL&) junk& = BltBitMap& (bitmapadr&, 0&, 0&, tempbm&, 0&, 0&, picdim&(PicWidth%), picdim&(PicHeight%), &HC0, &HFF, NULL&) WaitBlit LoadDTPic& = tempbm& END IF colors32& wird nicht wieder Freigegeben. [ - Answer - Quote - Direct link - ] |
2005-07-21, 10:34 h DariusBrewka Posts: 899 [Banned user] |
Zitat: eine Library gehört ganz einfach auch zum Program (zum Task), wenn in der Library irgendwo ein jsr/bsr seht, dann wird die Rücksprungadresse auf deinem Stack abgelegt. Der Stack wird ja auch in dem Sinne nicht weniger, der Stackpointer zeigt nur irgendwo anders hin. Nur wenn die Library etwas asyncron macht, dann hat sie dafür i.d.R ihren eigenen Stack. >Man könnte i.A. testen ob es am spezifischen Datatype liegt indem >du erstmal nur ein betimmtes Datenformat wählst, sollte das z.B. >bei PNG gehen aber bei Jpeg nicht, so ist irgendwas mit dem jpeg >datatype nicht in Ordnung, sollten Alle Formate fehlerhat sein, >dann kann das picture.datatype buggy sein oder halt dein Programm. Zitat: versuche doch einfach mal einen anderen Dateityp. Zitat: Ja das sieht so aus, dürfte für das Stack Problem aber auch nicht Verantwortlich sein, andererseits habe ich von Basic nicht so die Ahnung und es ist für mich schwer herauszulesen was du da oben genau machst und ob colors32& nicht noch irgendwo verwendet wird. [ - Answer - Quote - Direct link - ] |
2005-07-21, 11:04 h MaikG Posts: 5172 User |
Also das Freigeben mit FreeVec führte zum absturz. [ - Answer - Quote - Direct link - ] |
2005-07-21, 11:35 h thomas Posts: 7721 User |
@MaikG: Du solltest schon wissen, was du da programmierst. Z.B. hast du mit picdim&(PicColW%) = colors32& den Pointer gespeichert, vermutlich um ihn später noch zu benutzen. Wenn du den Speicher dann freigibst, stürzt er natürlich hinterher, wenn du picdim&(PicColW%) benutzt, ab. Woher weißt du denn, daß der *Stack* immer weniger wird ? Mit AmigaOS-Funktionen kriegst du jedenfalls den Stack nicht voll, denn die legen als erstes die Rücksprungadresse auf den Stack. D.h. wenn die Funktion zurückkehrt, hat der Stack den gleichen Zustand wie vorher. Wenn das nicht so wäre, würde die Funktion bei der Rückkehr abstürzen. Bei Basic könnte ich mir schon vorstellen, daß man den Stack füllen kann. Zumindest wenn es ähnlich läuft, wie bei C64-Basic, dann müßte das hier ziemlich viel Stack fressen: code:FOR I=1 to 1000 FOR J=1 to 10 GOTO hinten NEXT J hinten: NEXT I oder das hier: code:FOR I=1 to 1000 GOSUB ausgabe weiter: NEXT END ausgabe: PRINT "Hallo !" GOTO weiter Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ Dieser Beitrag wurde von thomas am 21.07.2005 um 11:42 Uhr editiert. ] [ - Answer - Quote - Direct link - ] |
2005-07-21, 11:50 h Ralf27 Posts: 2779 User |
Zitat:Ich denk mir mal das genau das hier kein Stack frisst, weil ja keine Rücksprungadresse gespeichert werden muß. goto springt ja absolut ohne rücksprungmöglichkeit a la Return. Zitat:Schon besser, das vernichtet Stack. ![]() Am schnellsten geht es wohl so: code:FOR i=1 to 1000 GOSUB Stackkiller Stackkiller: NEXT ![]() -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2005-07-21, 11:53 h Ralf27 Posts: 2779 User |
Hm, oder so:code:Das Programm ist erst fertig wenn der Stack platzt.Stackkiller: GOSUB Stackkiller ![]() ![]() ![]() -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2005-07-21, 11:55 h Holger Posts: 8116 User |
Zitat:Oder anders gefragt: @MaikG: was meinst Du mit "der Stack wird weniger?" mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2005-07-21, 11:58 h Holger Posts: 8116 User |
Zitat:Aber das Beispiel hat nichts mehr mit Basic zu tun. Das bei jeder Programmiersprache so. Ok, es gibt Ausnahmen. Bei bestimmten JIT-Optimierungsformen kommt dieses Programm niemals zurück... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2005-07-21, 11:59 h Ralf27 Posts: 2779 User |
Zitat: Ich frag mich eben auch ob man überhaupt den Stack bei MBasic überlaufen lassen kann. Der ist doch dynamisch, oder seh ich das falsch? Jedenfalls geht der erst über wenn überhaupt kein Arbeitsspeicher mehr frei ist. Allerdings frag ich mich auch wo in dem Beispiel ganz oben Stack gefressen wird. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2005-07-21, 12:02 h Ralf27 Posts: 2779 User |
Zitat: Das ist es ja eigentlich auch: Ob Basic, ASM oder vermutlich auch C. Der Grundaufbau der Sprachen ist ja gleichen und auch wenn nur die Befehle anderst geschrieben werden, der Effekt dürfte der gleiche sein. Allerdings wüßte ich auch gerne wie es die Ausnahmen machen, wenn es diese geben. Was machen die dann anderst? -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2005-07-21, 12:07 h Ralf27 Posts: 2779 User |
Ok, das gehört jetzt weniger zu diesem Thread, aber was würdet ihr von folgendem T-Shirtaufdruck halten:code:1: GOSUB 1 Sozusagen als Insiderwitz. ![]() -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2005-07-21, 12:20 h Holger Posts: 8116 User |
Zitat:Das ist eine Form der Stack-Optimierung. In modernen Programmiersprachen werden stacks in frames organisiert, die in einem Rutsch belegt und freigegeben werden. Wenn die letzte Aktion einer Funktion/Methode der Sprung in eine andere Funktion ist, wird der aktuelle Frame für das nächste Unterprogramm "recycled". Also prinzipiell nichts anderes als den Stack schon vor dem Aufruf wiederherzustellen, aber es stellt nur für Programmiersprachen, bei denen das Belegen mit einem potentiellen Overhead verbunden ist (z.B. nicht-linearer oder dynamischer Stack) eine praktische Optimierung dar. Hauptsächlich wird bei Rekursionen, also Sprünge in dasselbe Unterprogramm benutzt, das ist aber kein Muß. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2005-07-21, 12:21 h Holger Posts: 8116 User |
Zitat:Das gab's schon was besseres, ich glaube in futurama: 10 Home 20 Sweet 30 GOTO 10 mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2005-07-21, 19:08 h MaikG Posts: 5172 User |
>Du solltest schon wissen, was du da programmierst. >Z.B. hast du mit picdim&(PicColW%) = colors32& den Pointer >gespeichert, vermutlich um ihn später noch zu benutzen. >Wenn du den Speicher dann freigibst, stürzt er natürlich >hinterher, wenn du picdim&(PicColW%) benutzt, ab. Okay, das hab ich nun gesehen, wird auch wieder Freigegeben über die andere Variable. Der Grund Code zum Datatype laden kommt nicht von mir, er hatte auch einige Fehler. >Woher weißt du denn, daß der *Stack* immer weniger wird ? Scout > code: > FOR I=1 to 1000 > FOR J=1 to 10 > GOTO hinten > NEXT J > hinten: > NEXT I Ich hab ein Programm das 100000 Telefonbucheinträge Alphabetisch sortiert und noch nie abgestürzt ist... >Am schnellsten geht es wohl so: > code: > FOR i=1 to 1000 > GOSUB Stackkiller > Stackkiller: > NEXT Mh, ich gehe mit Goto aus eine "Funktion2" raus ins Hauptprogramm, dann wieder in die "Funktion2". Funktion2 ruft Funktion1 einmal auf. Kann das ein Problem sein? >Oder anders gefragt: @MaikG: was meinst Du mit "der Stack >wird weniger?" Uhrprünglich sinds 16k, dann sinds nur noch 2k und dann kommt ein absturz. >Der ist doch dynamisch, oder seh ich das falsch? Jedenfalls >geht der erst über wenn überhaupt kein Arbeitsspeicher mehr frei ist. Dynamisch, ein Teil aber wohl nicht alles. [ - Answer - Quote - Direct link - ] |
2005-07-21, 22:13 h Ralf27 Posts: 2779 User |
Zitat: Das könnte der Knackpunkt sein! Ist das wirklich ein Funktion? Dann darf man da nicht mit Goto rausspringen. Ich meine jetzt aus eine mit FUNCTION...END FUNCTION-deklariertem Unterprogramm. Da kann man aber mit EXIT FUNCTION rausspringen. So ein Goto aus so einem Unterprogramm raus könnte den Stack schon übersprudeln lassen. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2005-07-21, 23:22 h MaikG Posts: 5172 User |
Ja ich habs schon umgeschrieben der Stack bleibt jetzt konstant bei 16134. Warum mekkert MaxonBasic dann nicht, wusste das überhaupt nicht... Danke @all Weiss noch jemand ob es eine direkte Funktion gibt um den Maus Cursor auszublenden? Hab das jetzt mit einem Leeren Pointer Image gemacht, aber ob das der beste weg ist? [ - Answer - Quote - Direct link - ] |
2005-07-23, 11:31 h Holger Posts: 8116 User |
Zitat:Meines Wissens ja. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2005-07-23, 18:55 h MaikG Posts: 5172 User |
>Meines Wissens ja. kannst du mir die verraten? [ - Answer - Quote - Direct link - ] |
2005-07-23, 19:37 h DrNOP Posts: 4118 User |
Zitat:Hm - vielleicht bezog sich das ja auf Zitat:? Eine Antwort auf zwei Fragen ist irgendwie ein wenig knapp ... ![]() -- Es gibt keine Notbremse für all den technischen Humbug, mit dem wir unsere Zeit vertrödeln. [ - Answer - Quote - Direct link - ] |
2005-07-23, 21:28 h Holger Posts: 8116 User |
Zitat:Richtig. Zitat:Selbst Schuld, wer Doppelfragen stellt ![]() Ich habe gar nicht bemerkt, daß es zwei Fragen sind. Man liest doch Text immer so: Einleitung - ausführliche Problemschilderung - abschließende Frage mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Stack wird immer weniger | [ - Search - New posts - Register - Login - ] |
![]() |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2025 by amiga-news.de - all rights reserved. |
![]() |