Pointer-Array in Structure
Verfasst: 02.03.2011 23:20
Hallo!
Ich hab gerade einen etwas älteren Stack-Code ausgegraben. Relativ wenig und übersichtlich aber trotzdem überall Fehler. Folgender Code kann an der markierten Stelle nur 520 mal Push durchführen, bevor das Programm abstürtzt. Irgendwie logisch, da das Array dynamisch sein sollte und ich weder einen ReAlloc noch ein ReDim anwende, was den Grund hat, dass mein Programm gleich abstürzt, wenn ich eines von beiden in meinen Code schreibe.
Edit: Vor C-Arrays in Structs halte ich mich distanziert... die sind so komisch 
Ich hab gerade einen etwas älteren Stack-Code ausgegraben. Relativ wenig und übersichtlich aber trotzdem überall Fehler. Folgender Code kann an der markierten Stelle nur 520 mal Push durchführen, bevor das Programm abstürtzt. Irgendwie logisch, da das Array dynamisch sein sollte und ich weder einen ReAlloc noch ein ReDim anwende, was den Grund hat, dass mein Programm gleich abstürzt, wenn ich eines von beiden in meinen Code schreibe.
Code: Alles auswählen
Structure Stack
Size.i
Array *SArray(0)
EndStructure
Procedure NewStack()
Protected.Stack *this
*this = AllocateMemory(SizeOf(Stack))
*this\SArray() = AllocateMemory(SizeOf(Integer))
If (Not *this) Or (Not *this\SArray())
ProcedureReturn #False
EndIf
ProcedureReturn *this
EndProcedure
Procedure Stack_Push (*this.Stack, *Value)
*this\Size + 1
;sollte hier nicht ReDim bzw. ReAlloc rein? ich hab folgendes probiert (nicht gleichzeitig):
;ReDim *this\SArray(*this\Size)
;ReAllocateMemory(*this\SArray(),SizeOf(*this\SArray)*SizeOf(*this\Size))
*this\SArray(*this\Size) = *Value
ProcedureReturn
EndProcedure
Procedure Stack_Pop (*this.Stack)
*this\Size - 1
ProcedureReturn *this\SArray(*this\Size)
EndProcedure
Procedure Stack_Free (*this.Stack)
FreeMemory(*this) : *this = #Null
FreeArray(*this\SArray()) : *this\SArray() = #Null
ProcedureReturn
EndProcedure
;*********
Define.Stack *st = NewStack()
For i = 0 To 1000
Debug i ; gibt die Zahlen von 0 bis 519 aus, dann Absturz
Stack_Push(*st,@i)
Next i
For i = 0 To 1001
Debug PeekI(Stack_Pop(*st))
Next i
Stack_Free(*st)
