Seite 1 von 2

DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Verfasst: 02.05.2010 19:23
von KTX82
Bin gerade beim coden auf gleich 2 Sachen gestoßen, die ich absolut nicht nachvollziehen kann.
Im Code unten in Zeile 50 behauptet der Debugger "The Stack is no more 16 bytes aligned !" und bei Aufruf der in Zeile 50 gemeinten Procedure bricht das Programm bei DrawText ab mit der Meldung "Ungültiger Speicherzugriff (Lesefehler an der Adresse 0)". Genau diese Procedure funktioniert aber einmal einwandfrei.

Im Testprogramm wird der Text oben links im Fenster mit dieser Procedure gezeichnet. Dann auf den Button "Zum Fehler..." klicken. Jetzt wird die Procedure nochmal aufgerufen, aber mit dem seltsamen Resultat.

Wenn das ein Fehler von mir ist - Bitte auf die Finger hauen ;o)

System: Windows 7 x64, PB 4.50 Beta 3 x64


Und hier der ziemlich gekürzte Code zum reproduzieren:

Code: Alles auswählen

Enumeration
  #Image_TopBar_Main1
  #Image_TopBar_Main2
  #Gadget_TopBar_Main
  #Gadget_Main_Error
EndEnumeration

Procedure Prepare_Main(string.s)
  StartDrawing(ImageOutput(#Image_TopBar_Main2))
  DrawImage(ImageID(#Image_TopBar_Main1), 0, 0)
  DrawText(0,0,string)
  StopDrawing()
EndProcedure

CreateImage(#Image_TopBar_Main1, 800, 50)
CreateImage(#Image_TopBar_Main2, 800, 50)
StartDrawing(ImageOutput(#Image_TopBar_Main1))
Box(0, 0, 800, 50, $000000)
StopDrawing()
  
OpenWindow(0, 0, 0, 800, 600, "Test...", #PB_Window_MinimizeGadget)
ImageGadget(#Gadget_TopBar_Main, 0, 0, 800, 50, ImageID(#Image_TopBar_Main2))

Main:
Prepare_Main("Hier funktionierts noch...")
SetGadgetState(#Gadget_TopBar_Main, ImageID(#Image_TopBar_Main2))
ButtonGadget(#Gadget_Main_Error, 15, 70, 100, 20, "Zum Fehler")

action = -1
Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      action = 0
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Gadget_Main_Error
          action = 1
      EndSelect
  EndSelect
Until action > -1

Select action
  Case 0 : End
  Case 1 : Goto Fehler
EndSelect
End

Fehler:
Prepare_Main("Das geht nicht mehr ???")
SetGadgetState(#Gadget_TopBar_Main, ImageID(#Image_TopBar_Main2))

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Edit: Code -string- berichtigt.

Re: DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Verfasst: 02.05.2010 19:34
von CSHW89
also ich hab da kein fehler im debugger, ah ich seh grad du hast x64. da kann ich nicht zu sagen. aber x86 funktionierts.

ach ja in zeile 11 steht:

Code: Alles auswählen

DrawText(0,0,"Hallo funtioniert noch...")
...muss da nicht...

Code: Alles auswählen

DrawText(0,0,string)
stehen.
Denn dann ändert sich der Text.

lg kevin

Re: DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Verfasst: 02.05.2010 19:43
von freak
Select/Endselect verändert den Stack, wenn du das mit Goto verlässt gibt es ein Problem. Mit If/EndIf sollte das gehen. Unter x64 gibt es strikte Regeln was den Stack angeht. Da führt sowas gleich zu einem Crash.

Versuche einfach generell, Goto zu vermeiden. Goto ist böse :D

Re: DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Verfasst: 02.05.2010 19:47
von STARGÅTE
@Freak
Wieso habt ihr das FakeEndSelect von damals eigentlich rausgelöscht ?
Denn in 3.3 konnte mal so, leicht ein Select-Block verlassen.
Wenn Sie aus einem Select-Abschnitt zu einem anderen Programmteil außerhalb des Select springen möchten (mit dem Befehl Goto), müssen Sie FakeEndSelect benutzen, welches ein EndSelect simuliert, ohne es wirklich auszuführen. Wenn Sie es nicht benutzen, wird Ihr Programm abstürzen.

Re: DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Verfasst: 02.05.2010 20:12
von KTX82
Ich wills ja mal nicht glauben ^^
"Select" durch "If" getauscht und es klappt.
Why the hell wirkt sich das dann aber auf Drawtext aus und nicht DrawImage oder Box z.B.?

Mit diesem Resultat hab ich nicht gerechnet, da für den Otto-Normal-Verbraucher nicht ersichtlich ist, dass man Select-Abfragen nicht zwischendrin verlassen sollte.

Re: DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Verfasst: 02.05.2010 20:23
von Mok
KTX82 hat geschrieben:da für den Otto-Normal-Verbraucher nicht ersichtlich ist, dass man Select-Abfragen nicht zwischendrin verlassen sollte.
Das mag stimmen, aber es stimmt sicherlich auch, dass GoTo der abgrundböseste, bis zum Fegefeuer verdammteste Programmierer-Abschaum ist... aus der Hölle!

Re: DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Verfasst: 02.05.2010 20:30
von Kaeru Gaman
freak hat geschrieben: Goto ist böse
Bild

Re: DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Verfasst: 02.05.2010 20:35
von KTX82
Wegen Goto - ich weiß *g*, ich komm nur nich drauf wie man in einem Programm, wo es z.B. ein Hauptmenü gibt, von dem aus man zu Punkt 1, 2 oder 3 abzweigen kann, sich dann für Punkt 2 Entscheidet die Wahl haben soll zwischen Hauptmenü, Punkt 1 und 3.
Nur beispielsweise. Ist in diesem Fall Goto nicht ausnahmsweise mal aus der Hölle zu entlassen?

Re: DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Verfasst: 02.05.2010 20:37
von Mok
@KTX: Ich kenn die Situation nicht genau, aber Prozeduren sollten helfen.

Re: DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Verfasst: 02.05.2010 20:39
von Kaeru Gaman
oder Flags...