Memory-Prob.

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Memory-Prob.

Beitrag von Deeem2031 »

Ich hab ein Prob und zwar mit dem Code:

Code: Alles auswählen

Procedure OnError()
  Protected Msg$
  
  Msg$ = "There was an error:"+Chr(13)+Chr(10)+Chr(13)+Chr(10)
  Msg$ + "Description: " + GetErrorDescription()+Chr(13)+Chr(10)
  Msg$ + "Addr: " + Str(GetErrorAddress())+Chr(13)+Chr(10)
  Msg$ + "Module: "+GetErrorModuleName()+Chr(13)+Chr(10)
  Msg$ + "LineNR: " + Str(GetErrorLineNR()+1)+Chr(13)+Chr(10)
  Msg$ + "Total number of errors: "+Str(GetErrorCounter())+Chr(13)+Chr(10)
  Error = getlasterror_()
  tmpstring.s =Space(200)
  FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM,0,Error,#LANG_NEUTRAL,@tmpstring,200,0)
  tmpstring = Trim(tmpstring)
  Msg$ + "GetLastError: "+tmpstring+Chr(13)+Chr(10)
  
  Msg$ + "Continue program ?"
  
  
  If MessageRequester("Error!",Msg$,16|#PB_MessageRequester_YesNo) = 6
    ProcedureReturn #True
  Else
    End
  EndIf
EndProcedure

OnErrorGosub(@OnError())

Buffer = AllocateMemory(1024) 
Destination = AllocateMemory(1024)
Destinationlen = 0
i = 0
Repeat
  len = 1024
  PokeS(Buffer,Space(len))
  
  ReAllocateMemory(Destination,Destinationlen + len)
  CopyMemory(Buffer,Destination+Destinationlen,len)
  Destinationlen + len
  i + 1
  Debug Str(i) +":"+ PeekS(Destination,Destinationlen)
  Delay(100)
Until 0
Für die Faulen mein Debug-Output:

Code: Alles auswählen

1: [...viele Leerzeichen...]
2:˜"ˆ
3:˜"ˆ
4:˜"ˆ
5:xˆ
6:xˆ
7:xˆ
8:xˆ
9:xˆ
10:xˆ
11:xˆ
12:xˆ
13:xˆ
14:xˆ
15:xˆ
16:xˆ
17:xˆ
18:xˆ
19:xˆ
20:xˆ
21:xˆ
22:xˆ
23:xˆ
Und dann stürzt das Proggy ab (desswegen auch die OnError-Proc) und zwar in Zeile 36 ("CopyMemory(Buffer,Destination+Destinationlen,len)").
Wär das der einzige Fehler könnte man ja sagen mein Speicher is voll, aber er hat zu dem Zeitpunkt erst 25 KB allociert (und ein AllocateMemory(100000) funzt dann noch). Außerdem stimmt ja mit dem Output etwas nicht.. woher kommt "˜"ˆ" und "xˆ" ?
Mit Stringüberlauf kanns übrigens auch nichts zu tun haben, dann müsste ja trotzdem vorher Leerzeichen debugt werden.

Ich schätze ReallocateMemory() oder CopyMemory() funktionieren nicht richtig. Vielleicht liegts aber auch an mir oder meinem Comp. Wär also nett wenn ihr euch das mal angucken würdet.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Bei mir gibt es ne Fehlermeldung:
There was an error:

Description: An attempet read or write to/from an address to which that process isn't allowed
Addr: 1943065454
Module: Main Module
LineNR: 1
Total numbers of errors: 1
GetLastError: Falscher Parameter
Der Fehler kommt, wenn er bei der Debugausgabe gerade die Zeile 23 geschrieben hat.


Für mich sieht das so aus, als ob er in einen Speicher schreiben will, der vielleicht nicht allokiert wurde. Checke mal die Adressen. (Jedenfalls passt das zur Fehlermeldung.)


Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Arg, natürlich....

ReAllocateMemory(Destination,Destinationlen + len)

->

Destination = ReAllocateMemory(Destination,Destinationlen + len)

:roll:
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Wenn das so gedacht war, ist dies evt. die Lösung :freak:

Code: Alles auswählen

Procedure OnError() 
  Protected Msg$ 
  
  Msg$ = "There was an error:"+Chr(13)+Chr(10)+Chr(13)+Chr(10) 
  Msg$ + "Description: " + GetErrorDescription()+Chr(13)+Chr(10) 
  Msg$ + "Addr: " + Str(GetErrorAddress())+Chr(13)+Chr(10) 
  Msg$ + "Module: "+GetErrorModuleName()+Chr(13)+Chr(10) 
  Msg$ + "LineNR: " + Str(GetErrorLineNR()+1)+Chr(13)+Chr(10) 
  Msg$ + "Total number of errors: "+Str(GetErrorCounter())+Chr(13)+Chr(10) 
  Error = GetLastError_() 
  tmpstring.s =Space(200) 
  FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM,0,Error,#LANG_NEUTRAL,@tmpstring,200,0) 
  tmpstring = Trim(tmpstring) 
  Msg$ + "GetLastError: "+tmpstring+Chr(13)+Chr(10) 
  
  Msg$ + "Continue program ?" 
  
  
  If MessageRequester("Error!",Msg$,16|#PB_MessageRequester_YesNo) = 6 
    ProcedureReturn #True 
  Else 
    End 
  EndIf 
EndProcedure 

OnErrorGosub(@OnError()) 

*Buffer = AllocateMemory(1024) 
*Destination = AllocateMemory(1024) 
*Destinationlen = 0 
i = 0 
Repeat 
  len = 1024 
  PokeS(*Buffer,Space(len)) 
  
  ReAllocateMemory(*Destination,*Destinationlen+len) 
  CopyMemory(*Buffer,*Destination+*Destinationlen,len) 
  *Destinationlen+*Destinationlen=len 
  i + 1 
  Debug Str(i) +":"+ PeekS(*Destination,len) 
  Delay(100) 
Until 0
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Ne, wir habens doch schon :lol:

Außerdem macht das null Unterschied ob ich da "*Buffer" oder "Buffer" hinschreib!
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten