Seite 1 von 1

Pointer-Array in Structure

Verfasst: 02.03.2011 23:20
von Mok
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.

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)
Edit: Vor C-Arrays in Structs halte ich mich distanziert... die sind so komisch :mrgreen:

Re: Pointer-Array in Structure

Verfasst: 02.03.2011 23:39
von ts-soft
Was ist die Frage?

Deine Strukture mit Array wird z.B. überhaupt nicht Initialisiert:

Code: Alles auswählen

Procedure NewStack()
  Protected.Stack *this
  *this = AllocateMemory(SizeOf(Stack))
  *this\SArray() = AllocateMemory(SizeOf(Integer))
  InitializeStructure(*this, Stack)
  If (Not *this) Or (Not *this\SArray())
    ProcedureReturn #False
  EndIf

  ProcedureReturn *this
EndProcedure
Den Rest soll jemand anders suchen :mrgreen:

Re: Pointer-Array in Structure

Verfasst: 02.03.2011 23:44
von Mok
InitializeStructure()
wasn das? :mrgreen:
*in Hilfe nachles*
Aah, ok. Bis jetzt habe ich nur sehr beschränkt mit Structs gearbeitet (Arrays, Maps und Lists überhaupt nicht und Pointer auf strukturierte "Objekte" waren eine Rarität). Da ist viel nachholbedarf :mrgreen: