DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
KTX82
Beiträge: 95
Registriert: 31.08.2004 00:11
Wohnort: Mannheim
Kontaktdaten:

DrawText, Ungültiger Speicherzugriff und Stack-Warnung

Beitrag 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.
Zuletzt geändert von KTX82 am 02.05.2010 20:13, insgesamt 2-mal geändert.
Pharmacie populaire www.viagrasansordonnancefr.com aide aux malades
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

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

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

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

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
KTX82
Beiträge: 95
Registriert: 31.08.2004 00:11
Wohnort: Mannheim
Kontaktdaten:

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

Beitrag 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.
Pharmacie populaire www.viagrasansordonnancefr.com aide aux malades
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

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

Beitrag 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!
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

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

Beitrag von Kaeru Gaman »

freak hat geschrieben: Goto ist böse
Bild
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
KTX82
Beiträge: 95
Registriert: 31.08.2004 00:11
Wohnort: Mannheim
Kontaktdaten:

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

Beitrag 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?
Pharmacie populaire www.viagrasansordonnancefr.com aide aux malades
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

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

Beitrag von Mok »

@KTX: Ich kenn die Situation nicht genau, aber Prozeduren sollten helfen.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

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

Beitrag von Kaeru Gaman »

oder Flags...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten