Seite 1 von 1
Zeiger und Procedure
Verfasst: 01.02.2012 23:42
von VolkerSchulte
Hallo zusammen,
ist der unten aufgeführte Code erlaubt?
Wie ist es mit dem Aufruf "Message(*daten)"?
Gruß Volker
Code: Alles auswählen
Structure MESSDATEN
NiedrigerWert.i
HoherWert.i
EndStructure
Procedure.i LadeMessdaten()
Static daten.MESSDATEN
daten\NiedrigerWert = 2
daten\HoherWert = 98
ProcedureReturn @daten
EndProcedure
Procedure Message(*daten.MESSDATEN)
If 45 < *daten\HoherWert
MessageRequester("Information", "Endwert ist zu klein. Klassenbreite erhöhen.", #PB_MessageRequester_Ok)
EndIf
Debug *daten\HoherWert
EndProcedure
*daten.MESSDATEN = LadeMessdaten()
Message(*daten)
Debug *daten\NiedrigerWert
Debug *daten\HoherWert
Debug "-----"
Re: Zeiger und Procedure
Verfasst: 02.02.2012 00:00
von WPö
Hallo!
Bevor jemand etwas über Deinen Quelltext sagt, sage ich etwas: Willkommen im Forum!
Gruß - WPö
Re: Zeiger und Procedure
Verfasst: 02.02.2012 00:01
von ts-soft
Willkommen im Forum!
Alles korrekt, aber es könnte besser sein, einen Memory zu nutzen, den kannst / solltest Du dann selbst freigeben:
Code: Alles auswählen
EnableExplicit
Structure MESSDATEN
NiedrigerWert.i
HoherWert.i
EndStructure
Procedure.i LadeMessdaten()
Protected *daten.MESSDATEN = AllocateMemory(SizeOf(MESSDATEN))
If *daten
*daten\NiedrigerWert = 2
*daten\HoherWert = 98
EndIf
ProcedureReturn *daten
EndProcedure
Procedure Message(*daten.MESSDATEN)
If 45 < *daten\HoherWert
MessageRequester("Information", "Endwert ist zu klein. Klassenbreite erhöhen.", #PB_MessageRequester_Ok)
EndIf
Debug *daten\HoherWert
EndProcedure
Define *daten.MESSDATEN = LadeMessdaten()
Message(*daten)
Debug *daten\NiedrigerWert
Debug *daten\HoherWert
Debug "-----"
ClearStructure(*daten, MESSDATEN) ; nur erforderlich, wenn Strings, Listen o. ä. in der Structure
FreeMemory(*daten)
Gruß
Thomas
Re: Zeiger und Procedure
Verfasst: 02.02.2012 00:04
von STARGÅTE
Da daten.MESSDATEN mit Static definiert wurde, ist die Variable auch nach dem Verlassen der Prozedur gültig und somit auch der zurückgegebene Zeiger auf diese Variable.
Somit ja, der Code ist so "erlaubt", also lauffähig.
Auch Message(*daten) ist ok, da es ja dort dann nur ein Zeiger ist, zu einer Variable die ja noch gültig ist.
Der Weg über AllocateMemory ist nicht empfehlenswert, da du dann irgendwo wieder freigeben musst.
Es ist nur dann nötig, wenn du meherere mögliche Ergebnisse haben möchtest und verwalten willst.
Denn in deinem Code kann es immer nur einen Inhalt für daten.MESSDATEN geben
Re: Zeiger und Procedure
Verfasst: 02.02.2012 00:35
von VolkerSchulte
Hallo!
Vielen Dank für die schnelle Hilfe.
Gruß Volker.

Re: Zeiger und Procedure
Verfasst: 02.02.2012 07:35
von Nino
Ich würde hier normalerwese weder
Static noch
AllocateMemory() benuzen, sondern es so machen:
Code: Alles auswählen
Structure MESSDATEN
NiedrigerWert.i
HoherWert.i
EndStructure
Procedure LadeMessdaten(*daten.MESSDATEN)
*daten\NiedrigerWert = 2
*daten\HoherWert = 98
EndProcedure
Procedure Message(*daten.MESSDATEN)
If 45 < *daten\HoherWert
MessageRequester("Information", "Endwert ist zu klein. Klassenbreite erhöhen.")
EndIf
Debug *daten\HoherWert
EndProcedure
Define daten.MESSDATEN
LadeMessdaten(@daten)
Message(@daten)
Debug daten\NiedrigerWert
Debug daten\HoherWert
Debug "-----"
Grüße, Nino