Structure und Pointer

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Structure und Pointer

Beitrag von Pure_Beginner »

Hallo Leute,

bin gerade dabei mich eingehender mit Structre und Pointer zu beschäftigen.
Bevor ich mir etwas falsch angewöhne frage ich lieber mal nach ob das so in Ordnung ist.
Besonders die Freigabe der Structure ?.

Für eure Hilfe wäre ich sehr Dankbar.


Code: Alles auswählen

EnableExplicit

Structure Bauteil
  Winkel.i
  Euros.i
  Kappen.i
  Baender.i
  Grundplatten.i
  Senkkopf.i
  Flach.i
  Zapfen.i
EndStructure


Procedure KB(*mypointer.Bauteil, Anzahl.i)
  With *mypointer
    \Euros        = 12 * Anzahl
    \Winkel       = 4  * Anzahl
    \Kappen       = 4  * Anzahl
    \Baender      = 0  * Anzahl
    \Grundplatten = 0  * Anzahl
    \Senkkopf     = 0  * Anzahl
    \Flach        = 0  * Anzahl
    \Zapfen       = 0  * Anzahl
  EndWith
EndProcedure




Procedure main () 
  Protected.Bauteil myvar
  Protected Eingabe.s, Anzahl.i
  
  Eingabe = InputRequester("Stückzahl","Bitte geben sie eine Zahl ein","")
  
  Anzahl = Val(Eingabe)
  
  KB(@myvar,Anzahl)
  
  Debug myvar\Euros
  Debug myvar\Kappen
  Debug myvar\Winkel
  
  ClearStructure(@myvar, Bauteil) 
  
  Debug myvar\Euros
  Debug myvar\Kappen
  Debug myvar\Winkel
EndProcedure

main()

Grüße
Christian
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
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: Structure und Pointer

Beitrag von ts-soft »

ClearStructure ist in Ordnung so, aber ist nicht unbedingt erforderlich, da Du nur einfache Typen verwendest, also
keine Strings, Listen, Arrays usw. Ausserdem erstellt Du die Variable ja direkt und nicht als Pointer, somit werden
die Member sowieso von PB verwaltet.
Ein setzen auf 0 würde ebenfalls reichen, aber so ist es auch korrekt und kürzer.

Gruß
Thomas
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
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: Structure und Pointer

Beitrag von Pure_Beginner »

@ts-soft

Danke Thomas für deine schnelle Antwort.

Das Thema Structure ist mir klar nur das Ansprechen über Pointer macht mir noch manchmal Sorgen, da das ja auf verschiedene Weisen erfolgen kann.
Ich denke, ich werde bei dieser Form bleiben.

Nochmals danke und ein schönes Wochenende
Christian
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
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: Structure und Pointer

Beitrag von ts-soft »

Bei der direkten Erstellung der strukturierten Variable, mußt Du eigentlich nur drauf achten, wann diese
Variable ungültig wird (Scope, Protected).
Bei dynamischer Erstellung, also mit AllocateMemory hast Du dieses Problem nicht, da muß die Strukture
aber evtl. initialisiert, gecleared oder freigegeben werden.
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
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: Structure und Pointer

Beitrag von Pure_Beginner »

@ts-soft

immer langsam Thomas, soweit bin ich noch lange nicht, verstehe leider kein Wort. :lol:
Bin halt kein Programmierer, deshalb werde ich mich erst einmal durch das heute erlernte durchwursteln und dann das Nächst in Angriff nehme.

Grüße
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
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: Structure und Pointer

Beitrag von ts-soft »

Hier die Erklärung:

Code: Alles auswählen

Procedure main ()
  Protected.Bauteil myvar ; structurierte Variable direkt erstellt!
  ; gültig bis zum endgültigem Verlassen der Procedure, also bis ProcedureReturn.
  ; Aufrufen von KB() ist kein Verlassen!
  
  Protected.Bauteil *myvar ; structurierte Variable dynamisch erstellt! (PB reserviert keinen Speicher und initialisiert nicht)
  *myvar = AllocateMemory(SizeOf(Bauteil)) ; speicher erstellt, gültig bis mit Freememory freigegeben!
  InitializeStructure(*myvar, Bauteil) ; nur erforderlich, wenn Strings, Arrays, Maps oder Listen verwendet werden.
  ClearStructure(*myvar, Bauteil ; nur erforderlich, wenn Strings, Arrays, Maps oder Listen verwendet werden.
  FreeMemory(*myvar) 
  
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
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Structure und Pointer

Beitrag von Bisonte »

Er wollte nur sagen, dass bei deiner variante die Variable die du definierst, von PB verwaltet wird. Komplett.
Allerdings ist es dann wichtig sicherzustellen, dass man sie auch erreichen kann ... z.B. in einem Modul (seit PB 5.2) usw.

also sowas

Code: Alles auswählen

Structure MeineStruktur
  EinLong.l
  EinString.s
  List EineListe.s()
EndStructure

Procedure ListenElemente(*var.MeineStruktur)
  
  If *var
    ProcedureReturn ListSize(*Var\EineListe())  
  EndIf
  
  ProcedureReturn 0
  
EndProcedure

Define Variable.MeineStruktur ; <-- hier kümmert sich PB um alles selbst.

For x = 1 To 10
  AddElement(Variable\EineListe())
  Variable\EineListe() = Str(x)
Next x

Debug ListenElemente(@Variable)
Die Zweite Variante mit dem AllocateMemory.... Da muss man sich um alles selber kümmern, hat aber den Vorteil das
es überall verfügbar ist (solange man die Adresse hat)

wie das hier :

Code: Alles auswählen

Structure MeineStruktur
  EinLong.l
  EinString.s
  List EineListe.s()
EndStructure

Procedure ListenElemente(*var.MeineStruktur)
  
  If *var
    ProcedureReturn ListSize(*Var\EineListe())  
  EndIf
  
  ProcedureReturn 0
  
EndProcedure

*Variable2.MeineStruktur = AllocateMemory(SizeOf(MeineStruktur)) ; > Hier muss man sich selbst drum kümmern

If *Variable2
  
  InitializeStructure(*Variable2, MeineStruktur) ; < Wir haben eine Liste in der Struktur
  
  For x = 1 To 10
    AddElement(*Variable2\EineListe())
    *Variable2\EineListe() = Str(x)
  Next x
  
  Debug ListenElemente(*Variable2)
  
  ClearStructure(*Variable2, MeineStruktur)
  FreeMemory(*Variable2)
  
EndIf
hab ich das so in etwa getroffen ?

Edit: Mist ... schon wieder zulange für gebraucht ;) Jaja das Alter.... :mrgreen:
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: Structure und Pointer

Beitrag von Pure_Beginner »

so halbwegs hab ich es verstanden,

aber im Moment ist es mir lieber PB ,verwaltet den Speicher :mrgreen: das ist wohl besser so.
Trotzdem danke für eure Antworten, werde mich langsam vortasten.

Grüße
Christian
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
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: Structure und Pointer

Beitrag von ts-soft »

Pure_Beginner hat geschrieben:aber im Moment ist es mir lieber PB ,verwaltet den Speicher :mrgreen: das ist wohl besser so.
Nur dran denken, beim Verlassen der Procedure wird der Pointer zu der Variable ungültig.

Code: Alles auswählen

ProcedureReturn @myvar
würde nicht funktionieren!

Genug gelernt, äh gelehrt, cu
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
Antworten