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:

Code: Alles auswählen

    FreeMemory(*MemoryID)
CloseFile(0)

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.