amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Stack wird immer weniger [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

21.07.2005, 00:00 Uhr

MaikG
Posts: 5172
Nutzer
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.

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 00:36 Uhr

Ralf27
Posts: 2779
Nutzer
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

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 00:42 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
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?

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 00:47 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Ralf27:
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?


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.


[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 09:44 Uhr

MaikG
Posts: 5172
Nutzer
>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& - 8)
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.

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 10:34 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
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?


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:
Sind nur ilbm Dateien.

versuche doch einfach mal einen anderen Dateityp.

Zitat:
Das hier ist das einzigste was mir noch spanisch vorkommt:

IF GetDTAttrsA& (dtobjekt&, workbuf&) = 3 THEN
....
END IF

colors32& wird nicht wieder Freigegeben.


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.


[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 11:04 Uhr

MaikG
Posts: 5172
Nutzer
Also das Freigeben mit FreeVec führte zum absturz.

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 11:35 Uhr

thomas
Posts: 7717
Nutzer
@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. ]

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 11:50 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von thomas:

code:
FOR I=1 to 1000
  FOR J=1 to 10
    GOTO hinten
  NEXT J
hinten:
NEXT I


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:
oder das hier:

code:
FOR I=1 to 1000
   GOSUB ausgabe
weiter:
NEXT
END

ausgabe:
   PRINT "Hallo !"
GOTO weiter


Schon besser, das vernichtet Stack. :)

Am schnellsten geht es wohl so:
code:
FOR i=1 to 1000
 GOSUB Stackkiller
Stackkiller:
NEXT

:smokin:
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 11:53 Uhr

Ralf27
Posts: 2779
Nutzer
Hm, oder so:
code:
Stackkiller:
 GOSUB Stackkiller

Das Programm ist erst fertig wenn der Stack platzt. :P :shock2: :D
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 11:55 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
@MaikG:
Woher weißt du denn, daß der *Stack* immer weniger wird ?

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.

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 11:58 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Hm, oder so:
code:
Stackkiller:
 GOSUB Stackkiller

Das Programm ist erst fertig wenn der Stack platzt. :P :shock2: :D
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.

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 11:59 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von thomas:
@MaikG:
Woher weißt du denn, daß der *Stack* immer weniger wird ?

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.


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

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 12:02 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Holger:
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...


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

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 12:07 Uhr

Ralf27
Posts: 2779
Nutzer
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. :D
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 12:20 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Allerdings wüßte ich auch gerne wie es die Ausnahmen machen, wenn es diese geben. Was machen die dann anderst?

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.

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 12:21 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
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. :D

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.

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 19:08 Uhr

MaikG
Posts: 5172
Nutzer
>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.

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 22:13 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
Mh, ich gehe mit Goto aus eine "Funktion2" raus ins
Hauptprogramm, dann wieder in die "Funktion2".
Funktion2 ruft Funktion1 einmal auf..


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

[ - Antworten - Zitieren - Direktlink - ]

21.07.2005, 23:22 Uhr

MaikG
Posts: 5172
Nutzer
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?

[ - Antworten - Zitieren - Direktlink - ]

23.07.2005, 11:31 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
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?

Meines Wissens ja.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

23.07.2005, 18:55 Uhr

MaikG
Posts: 5172
Nutzer
>Meines Wissens ja.

kannst du mir die verraten?

[ - Antworten - Zitieren - Direktlink - ]

23.07.2005, 19:37 Uhr

DrNOP
Posts: 4118
Nutzer
Zitat:
Original von MaikG:
>Meines Wissens ja.

kannst du mir die verraten?

Hm - vielleicht bezog sich das ja auf
Zitat:
Original von MaikG:
[...]aber ob das der beste weg ist?

?

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.

[ - Antworten - Zitieren - Direktlink - ]

23.07.2005, 21:28 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von DrNOP:
Hm - vielleicht bezog sich das ja auf
Zitat:
Original von MaikG:
[...]aber ob das der beste weg ist?


Richtig.
Zitat:
Eine Antwort auf zwei Fragen ist irgendwie ein wenig knapp ... ;)
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.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Stack wird immer weniger [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.