Pointer-Array in Structure

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Pointer-Array in Structure

Beitrag 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:
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Pointer-Array in Structure

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Pointer-Array in Structure

Beitrag 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:
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Antworten