also das war ne Nacht, seit ca. 15 Stunden bin ich ununterbrochen mit dem folgenden Problem am Rechner beschäftigt. Die Nacht ist durchgemacht und nun bin ich k.o.
Ich wunderte mich und wunderte mich denn mein Code habe ich zwar in den letzen Programmierwochen noch nie getestet, aber von der theorie müßte alles richtig sein. beim erstmaligen Start klappte aber nichts. Ja ja, jetzt denken alle "ist doch klar, man kann doch nicht wochen lang programmieren und dann klappt es gleich", aber bei mir meißt schon. Mache das oft so das ich erst nur aus dem Kopf ohne testen alles mache.
Na ja, also bin ich rann an das prüfen, aber mein Köpfle sagt mir es müßte alles richtig sein. Also rann ans testen. Nichts klappte, also die ganze Nacht mit dem "Ausschlußverfahren" verbracht und eigenartiger Weise habe ich den Fehler in einem Code gefunden der bisher immer ging.
Ich rufe AllocateMemory und ReAllocateMemory nie direkt auf, sondern eine eigene Procedure, die dafür sorgt, das der Speicher immer korrekt erstellt wird (na ja, keine NULL zurückgegeben wird).
Bitte sagt jetzt nicht, das ich keine Pointer verwenden soll, geht ja ums Prinzipt nicht ob es schon ist oder nicht.
Also Schaut euch mal die Ergebnisse des gleich folgenden Codes an.
Alle drei Aufrufe (Procedure 1 und 2 und der direkte Aufruf) Liefern unterschiedliche Ergebnisse. Eine Procedure gibt totale Fehlergebnisse aus, die zweite nur in der ersten Zeile.
Das stimmt doch was nicht !!?
Problem tritt unter Win 98/XP auf. PB4 beta2.
Code: Alles auswählen
Procedure error(w.l,s.s)
If ErrorConsole = 0
ErrorConsole = OpenConsole()
EndIf
;PrintN("error("+Str(w)+"): " )
;PrintN( s)
Debug s
EndProcedure
Procedure.l _AllocateMemory(Size.l)
Protected *MemoryID
While *MemoryID = 0
*MemoryID = AllocateMemory(Size)
If *MemoryID = 0
error(0,"Proc - _AllocateMemory() - Memory konnte nicht zur verfgung gestellt werden")
EndIf
Wend
ProcedureReturn *MemoryID
EndProcedure
Procedure.l _ReAllocateMemory(*MemoryID, Size.l)
While *MemoryID = 0
*MemoryID = ReAllocateMemory(*MemoryID, Size)
If *MemoryID = 0
error(0,"Proc - _ReAllocateMemory() - Memory konnte nicht zur verfgung gestellt werden")
EndIf
Wend
Debug "Size=" +Str(Size) + " | MemorySize()=" + Str(MemorySize(*MemoryID)) + " | *MemoryID=" + Str(*MemoryID)
PrintN( "Size=" +Str(Size) + " | MemorySize()=" + Str(MemorySize(*MemoryID)) + " | *MemoryID=" + Str(*MemoryID) )
ProcedureReturn MemoryID
EndProcedure
Procedure.l x_ReAllocateMemory(MemoryID.l, Size.l)
While MemoryID = 0
MemoryID = ReAllocateMemory(MemoryID, Size)
If MemoryID = 0
error(0,"Proc - _ReAllocateMemory() - Memory konnte nicht zur verfgung gestellt werden")
EndIf
Wend
Debug "Size=" +Str(Size) + " | MemorySize()=" + Str(MemorySize(MemoryID)) + " | *MemoryID=" + Str(MemoryID)
PrintN( "Size=" +Str(Size) + " | MemorySize()=" + Str(MemorySize(MemoryID)) + " | *MemoryID=" + Str(MemoryID) )
ProcedureReturn *MemoryID
EndProcedure
; ----------------------------------------
; ----------------------------------------
OpenConsole()
*MEM = AllocateMemory(16)
Debug "meine alte originale Procedure mit Pointer:"
PrintN("meine alte originale Procedure mit Pointer:")
For i = 1 To 5
*MEM = _ReAllocateMemory(*MEM,16+(i*16))
Next i
*MEM = AllocateMemory(16)
Debug "meine neue Procedure mit Long:"
PrintN("meine neue Procedure mit Long:")
For i = 1 To 5
*MEM = x_ReAllocateMemory(*MEM,16+(i*16))
Next i
*MEM = AllocateMemory(16)
Debug "direkt mit Pointer:"
PrintN("direkt mit Pointer:")
For i = 1 To 5
*MEM = ReAllocateMemory(*MEM,16+(i*16))
Debug "16+(i*16)=" +Str(16+(i*16)) + " | MemorySize()=" + Str(MemorySize(*MEM)) + " | *MemoryID=" + Str(*MEM)
PrintN( "16+(i*16)=" +Str(16+(i*16)) + " | MemorySize()=" + Str(MemorySize(*MEM)) + " | *MemoryID=" + Str(*MEM) )
Next i
For i = 1 To 600
Delay(100)
Next i
CloseConsole()
Ich selber vermute ja ein oder zwei Bugs, anders kann ich mir das nicht erklären
[edit]
Seit wann ist eigendlich die Beta3 draußen? Habe das noch gar nicht bemerkt. Werde die aber jetzt erstmal nicht mehr testen. Meine Augen brennen zu dolle.
Nachtrag: Habe gerade gesehen, daß es gestern Abend raus kam.
[edit2]
Es hatte sich beim erstellen einen nachvollziehbaren Codes ein Tippfehler eingeschlichen. Als Ergebniss der Richtigstellung laufen nun beide Proceduren nicht, aber warum?
Gruß
Toshy