Invalid memory access

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Invalid memory access

Beitrag 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$ <> ""
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Re: Invalid memory access

Beitrag 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)
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag von GreyEnt »

ok. vielen dank.
werde das alles mal anwenden.
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

ich fürchte schuld sind die Variablen xk bzw. yk die ab und zu mal null sind.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag 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$ <> ""
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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?
pb 4.51
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten