Seite 1 von 3
Invalid memory access
Verfasst: 16.12.2008 20:52
von GreyEnt
manchmal bekomme ich in diesem Code eine Fehlermeldung
Invalid memory access(read error at address 0)
die Zeile "FreeMemory(*MemoryID)" soll schuld sein.
aber was mach ich da falsch?
Gruß
Dieter
Code: Alles auswählen
If mapsichern$ <> ""
HideWindow(#Fenster_Progress,0)
SelectElement(lang(),28)
SetGadgetText(fptext,lang())
*MemoryID = AllocateMemory((xk*2+2)*yk) ; Reservieren des benötigten Speichers
z.l=*MemoryID
For b.w=1 To yk ;b = Zeile
For c.w=1 To xk ;c = Spalte
bs=feld((b-1)*xk+c)
If bs="":bs="00":EndIf
PokeS(z,bs):z+2
Next c
PokeS(z,Chr(13)):z+1
PokeS(z,Chr(10)):z+1
Next b
Debug("Schreibforgang")
Debug("Z-Wert "+Str(z))
Debug("Wertebereich SOLL "+Str((xk*2+2)*yk))
OpenFile(0,mapsichern$)
WriteData(0,*MemoryID,(xk*2+2)*yk)
CloseFile(0)
FreeMemory(*MemoryID)
DateiName$ = GetFilePart(mapsichern$)
SetWindowTitle(0, "MDV Mapedit Lite - "+ DateiName$+" "+ Str(xk)+"*"+Str(yk))
HideWindow(#Fenster_Progress,1)
Else
MessageRequester("Fehler!","Keine Gültige Datei gewählt.",#PB_MessageRequester_Ok)
EndIf ;mapsichern$ <> ""
Re: Invalid memory access
Verfasst: 16.12.2008 21:07
von Joel
GreyEnt hat geschrieben:
CloseFile(0)
FreeMemory(*MemoryID)
[/code]
Versuche mal die Datei später zu Closen! Also so:
Verfasst: 16.12.2008 21:25
von Kaeru Gaman
also, ich würde grundsätzlich erstmal das Allocate iffen...
und vielleicht mal ne MENGE debugs reinhaun, um die tatsächlichen werte zu vergleichen.
Verfasst: 16.12.2008 21:28
von Kiffi
... zusätzlich noch CreateFile() anstelle von OpenFile() verwenden und auch
dessen Rückgabewert auswerten. Anstelle der 0 als Ausgabekanal ein
#PB_Any zu verwenden ist sicherlich auch nicht verkehrt.
(behebt zwar nicht das aktuelle IMA-Problem, beugt aber dem nächsten
oder übernächsten Problem vor

)
Grüße ... Kiffi
Verfasst: 16.12.2008 22:22
von GreyEnt
ok. vielen dank.
werde das alles mal anwenden.
Verfasst: 16.12.2008 22:48
von hjbremer
ich fürchte schuld sind die Variablen xk bzw. yk die ab und zu mal null sind.
Verfasst: 16.12.2008 23:48
von GreyEnt
Ist das so wohl richtig?
Zur zeit läuft der Code wunderprächtig. Ich habe den eindruck das der Code bockt wenn ich mehrere Programme(Explorer etc.) gleichzeitig auf habe.
Aber sowas kann doch keine Kiste mit nem Gigabyte RAM aus der ruhe bringen.
Code: Alles auswählen
If mapsichern$ <> ""
HideWindow(#Fenster_Progress,0)
SelectElement(lang(),28)
SetGadgetText(fptext,lang())
*MemoryID = AllocateMemory((xk*2+2)*yk)
If *MemoryID
Else
Debug "Sichern: Konnte den angeforderten Speicher nicht reservieren!"
EndIf
z.l=*MemoryID
For b.w=1 To yk ;b = Zeile
For c.w=1 To xk ;c = Spalte
bs=feld((b-1)*xk+c)
If bs="":bs="00":EndIf
PokeS(z,bs):z+2
Next c
PokeS(z,Chr(13)):z+1
PokeS(z,Chr(10)):z+1
Next b
Debug("Z ist "+Str(z))
mapsi=CreateFile(#PB_Any,mapsichern$)
If mapsi
Else
MessageRequester("Information","Konnte Datei nicht erstellen!")
EndIf
WriteData(mapsi,*MemoryID,(xk*2+2)*yk)
FreeMemory(*MemoryID)
CloseFile(mapsi)
DateiName$ = GetFilePart(mapsichern$)
SetWindowTitle(0, "MDV Mapedit Lite - "+ DateiName$+" "+ Str(xk)+"*"+Str(yk))
HideWindow(#Fenster_Progress,1)
Else
MessageRequester("Fehler!","Keine Gültige Datei gewählt.",#PB_MessageRequester_Ok)
EndIf ;mapsichern$ <> ""
Verfasst: 16.12.2008 23:51
von gnasen
Es wird ja immer geraten zu prüfen, ob der Speicherbereich wirklich allokiert werden konnte.
Mich würde mal interessieren, ob es überhaupt bei "normalen" Buffern im allgemeinen Gebrauch von sagen wir mal 4kb oder ähnlichem passieren kann, dass kein Speicher allokiert werden kann. Soweit ich weiss schaufelt Windows doch was frei auf die Festplatte, wenns benötigt wird.
Sagen wir so, ich habe teilweise Codestellen in denen Speicher einfach allokiert werden MUSS, sonst geht das gesamte Folgeprogramm den Bach runter (bzw wird nutzlos/fehlerhaft/o.Ä.). Und wenn der kleine Bereich physisch nicht mehr hergegeben kann steht Windows theoretisch doch schon mit einem Schritt im nächsten Leben.
Kann ich mich dabei darauf verlassen (wie gesagt bei kleinen Buffern), dass der Speicher allokiert wird, oder gibts noch mehr Faktoren als die RAM Größe die das beeinflussen?
Verfasst: 16.12.2008 23:57
von Kiffi
GreyEnt hat geschrieben:Ist das so wohl richtig?
bzgl. des IMA kann ich nicht sagen, ob sich durch Deine Veränderungen was verbessert hat.
Allerdings bringt es wenig, wenn Du beispielsweise die Datei nicht erstellen
kannst, den Benutzer darüber zu informieren, Du aber dennoch versuchst
dort hineinzuschreiben.
Code: Alles auswählen
mapsi=CreateFile(#PB_Any,mapsichern$)
If mapsi
Else
MessageRequester("Information","Konnte Datei nicht erstellen!")
EndIf
WriteData(mapsi,*MemoryID,(xk*2+2)*yk)
(Das selbe natürlich auch bei AllocateMemory())
Grüße ... Kiffi
Verfasst: 17.12.2008 00:09
von Kaeru Gaman
ich würd tatsächlich zur sicherheit auch noch yk und xk gegen 0 prüfen.
und die eine zeile lautet
bs=feld((b-1)*xk+c)
bei b machst du -1, aber bei c nicht....
das führt dazu, dass du die erste spalte des arrys nicht behandelst.