Seite 1 von 1

Memory-Prob.

Verfasst: 12.12.2004 00:16
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.

Verfasst: 12.12.2004 00:27
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

Verfasst: 12.12.2004 00:30
von Deeem2031
Arg, natürlich....

ReAllocateMemory(Destination,Destinationlen + len)

->

Destination = ReAllocateMemory(Destination,Destinationlen + len)

:roll:

Verfasst: 12.12.2004 00:33
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

Verfasst: 12.12.2004 00:42
von Deeem2031
Ne, wir habens doch schon :lol:

Außerdem macht das null Unterschied ob ich da "*Buffer" oder "Buffer" hinschreib!