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. :allright:

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