Zeiger und Procedure

Anfängerfragen zum Programmieren mit PureBasic.
VolkerSchulte
Beiträge: 2
Registriert: 01.02.2012 23:25

Zeiger und Procedure

Beitrag 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 "-----"
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Zeiger und Procedure

Beitrag von WPö »

Hallo!

Bevor jemand etwas über Deinen Quelltext sagt, sage ich etwas: Willkommen im Forum!

Gruß - WPö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
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: Zeiger und Procedure

Beitrag 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
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
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Zeiger und Procedure

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
VolkerSchulte
Beiträge: 2
Registriert: 01.02.2012 23:25

Re: Zeiger und Procedure

Beitrag von VolkerSchulte »

Hallo!

Vielen Dank für die schnelle Hilfe.

Gruß Volker. :allright:
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Zeiger und Procedure

Beitrag 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
Antworten