DLL ProcedureReturn ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

DLL ProcedureReturn ?

Beitrag von The_Dark_Zim-.- »

Hey ho
Wie gibt man aus einer DLL mehrere Werte zurück ?
Bsp. ein Wert dafür das die Procedure erfolgreich war und dann noch ein zwei andere Werte ?

Gruß Zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
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: DLL ProcedureReturn ?

Beitrag von ts-soft »

Strukturen als pointer zurückgeben wäre eine Idee dazu :wink:

Code: Alles auswählen

Structure mystruct
  wert1.i
  wert2.i
  wert3.i
EndStructure

ProcedureDLL bla()
  Static result.mystruct
  result\wert1 = 4711
  result\wert2 = 0815
  result\wert3 = #True
  
  ProcedureReturn @result
EndProcedure


; mainprogramm
Define *value.mystruct = bla()

Debug *value\wert1
Debug *value\wert2
Debug *value\wert3
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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: DLL ProcedureReturn ?

Beitrag von DarkDragon »

ts-soft hat geschrieben:Strukturen als pointer zurückgeben wäre eine Idee dazu :wink:

Code: Alles auswählen

Structure mystruct
  wert1.i
  wert2.i
  wert3.i
EndStructure

ProcedureDLL bla()
  Static result.mystruct
  result\wert1 = 4711
  result\wert2 = 0815
  result\wert3 = #True
  
  ProcedureReturn @result
EndProcedure


; mainprogramm
Define *value.mystruct = bla()

Debug *value\wert1
Debug *value\wert2
Debug *value\wert3
Naja so würde ich das nicht machen. Immerhin kann man dann nicht 2 mal bla aufrufen um 2 verschiedene Inhalte zu bekommen, da die Adresse von result gleich bleibt bei Static. Das macht man mit *result.mystruct = AllocateMemory(SizeOf(mystruct)) üblicherweise oder durch einen Parameter. Wenn er sowieso herausfinden will ob die Operation erfolgreich war, wär das mit den Parametern sogar sinnvoll. Dann kann er ganz normal mit dem Rückgabewert einen Errorcode oder sowas ausgeben und in dem Parameter dann die Werte speichern.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: DLL ProcedureReturn ?

Beitrag von Kaeru Gaman »

nicht ganz richtig, mag sein dass die Adresse gleich bleibt, aber das juckt nicht, weil man den Inhalt beliebig anpassen kann.

"traditionell" wäre es so gelöst, im Hauptprogramm einen strukturierten Speicher zu erstellen und den von der DLL befüllen zu lassen, so wie die meisten API-Funktionen das tun.
.... das meintest du wahrscheinlich mit "Parameter" ...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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: DLL ProcedureReturn ?

Beitrag von ts-soft »

lol
warum soll ich memory allokieren, der dann jedesmal neu allokiert wird und denn dann
wahrscheinlch niemand freigibt. Mit statischen Variablen vermeide globale variablen
und der Inhalt bleibt trotzdem bis zum nächstem Aufruf der Funktion gültig, das ist
das simpelste und effektivste, ansonsten muß ich mir den Speicher als parameter
geben lassen und dort hineinpacken, was aber nicht einem procedurereturn entspricht, wie
die frage hier eben lautet!
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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: DLL ProcedureReturn ?

Beitrag von DarkDragon »

Kaeru Gaman hat geschrieben:nicht ganz richtig, mag sein dass die Adresse gleich bleibt, aber das juckt nicht, weil man den Inhalt beliebig anpassen kann.
Das ist es ja.

Code: Alles auswählen

*test1.mystruct = bla()
*test2.mystruct = bla()
Danach zeigen beide auf denselben Speicherbereich und der Inhalt ist somit gleich. Man will aber unterschiedliche Inhalte haben.


@ts-soft: exakt das ist das Problem:
Mit statischen Variablen vermeide globale variablen
und der Inhalt bleibt trotzdem bis zum nächstem Aufruf der Funktion gültig
Nur bis zum nächsten Aufruf und nicht weiter. Sowas mag doch keiner, wozu sollte man sowas gebrauchen, wenn man nichtmal 2 Inhalte parallel betrachten kann? Dann doch lieber das mit dem Parameter wie von mir und dir vorgeschlagen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: DLL ProcedureReturn ?

Beitrag von Kaeru Gaman »

nun, du solltest nicht annehmen, dass es keine Verwendung gäbe für Ergebnisse mit Verfallsdatum.

außerdem wenn wir es mal eher wörtlich nehmen, hat ts tatsächlich völlig recht.

ein ProcedureReturn packt lediglich einen Wert in EAX.
erst durch die außenliegende Zuweisung
MeineVariable = MeineFunktion( Parameter )
weist du den Inhalt von EAX einer außenliegenden Variable zu.

ts hat beschrieben, wie man einen Strukturierten Wert aus der Prozedur raus bekommt.
wenn du draußen was damit weiter machen willst, musst du ihn einer ebenso strukturierten Variablen zuweisen, wie du das mit einfachen Rückgabewerten auch tust.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: DLL ProcedureReturn ?

Beitrag von DarkDragon »

Kaeru Gaman hat geschrieben:nun, du solltest nicht annehmen, dass es keine Verwendung gäbe für Ergebnisse mit Verfallsdatum.
Tu ich auch nicht, das war nur die Antwort auf das herablassende Verhalten von ts-soft, der meine Vorschläge auch sofort als unbrauchbar abgestempelt hat.
Kaeru Gaman hat geschrieben:außerdem wenn wir es mal eher wörtlich nehmen, hat ts tatsächlich völlig recht.
Wenn ich den Speicherblock zurückgebe, hab ich auch völlig recht. Das ist prinzipiell dasselbe, nur mit parallelen Speicherblöcken. Ich glaube du vermischst meine 2 Vorschläge.

Code: Alles auswählen

Structure mystruct
  a.l
  b.i
  c.d
EndStructure

; 1. Vorschlag:
ProcedureDLL.i bla()
  Protected *result.mystruct
  
  *result = AllocateMemory(SizeOf(mystruct))
  If *result
    *result\a = 5
    *result\b = 3
    *result\c = 1.0
  EndIf
  
  ProcedureReturn *result
EndProcedure

ProcedureDLL freebla(*object.mystruct)
  If *object
    FreeMemory(*object)
  EndIf
EndProcedure

; 2. Vorschlag:
ProcedureDLL.i blaVorschlag2(*object.mystruct)
  *object\a = 5
  *object\b = 3
  *object\c = 1.0
  
  ProcedureReturn #OK
EndProcedure
Die Vorschläge waren nicht gemischt gedacht. Dadurch stimmt mein 1. Vorschlag ja auch wort wörtlich: Es gibt genauso die Adresse zu den Werten zurück wie ts-softs Vorschlag. Nur dass man es jetzt parallel behandeln kann. Bei Vorschlag 2 kann man nun auch alles parallel behandeln und man muss sich nichtmehr um die manuelle Freigabe kümmern, da man jetzt normale strukturierte Variablen verwenden kann.
Zuletzt geändert von DarkDragon am 09.04.2010 15:17, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
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: DLL ProcedureReturn ?

Beitrag von ts-soft »

Ich muß die im allgemeinen nicht vergleichen, aber wenn dann kann ich sie doch umkopieren.
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
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Re: DLL ProcedureReturn ?

Beitrag von Deluxe0321 »

Ich muss hier DarkDragon recht geben. Vorschlag 2 ist wesentlich flexibler!
Ich kann mit diesem Weg z.B auch eine Variable der Struc. prüfen und danach die Rückgabe bestimmen OHNE einen weiteren Parameter in der Procedure.

Code: Alles auswählen

ProcedureDLL.i blaVorschlag2(*object.mystruct)
  If *object\a = 5
     *object\b = 3
     *object\c = 1.0
     ProcedureReturn #True
  Endif
  ProcedureReturn #False
EndProcedure
Zuletzt geändert von Deluxe0321 am 10.04.2010 02:03, insgesamt 1-mal geändert.
Ich habe keine Lösung, aber ich bewundere das Problem.
Antworten