Seite 1 von 1
Structure und Pointer
Verfasst: 08.02.2014 21:23
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
Re: Structure und Pointer
Verfasst: 08.02.2014 21:37
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
Re: Structure und Pointer
Verfasst: 08.02.2014 21:45
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
Re: Structure und Pointer
Verfasst: 08.02.2014 21:53
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.
Re: Structure und Pointer
Verfasst: 08.02.2014 22:05
von Pure_Beginner
@ts-soft
immer langsam Thomas, soweit bin ich noch lange nicht, verstehe leider kein Wort.
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
Re: Structure und Pointer
Verfasst: 08.02.2014 22:26
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)
Re: Structure und Pointer
Verfasst: 08.02.2014 22:32
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....

Re: Structure und Pointer
Verfasst: 08.02.2014 22:39
von Pure_Beginner
so halbwegs hab ich es verstanden,
aber im Moment ist es mir lieber PB ,verwaltet den Speicher

das ist wohl besser so.
Trotzdem danke für eure Antworten, werde mich langsam vortasten.
Grüße
Christian
Re: Structure und Pointer
Verfasst: 08.02.2014 22:47
von ts-soft
Pure_Beginner hat geschrieben:aber im Moment ist es mir lieber PB ,verwaltet den Speicher

das ist wohl besser so.
Nur dran denken, beim Verlassen der Procedure wird der Pointer zu der Variable ungültig.
würde nicht funktionieren!
Genug gelernt, äh gelehrt, cu