DLL ProcedureReturn ?
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
DLL ProcedureReturn ?
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
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
- 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 ?
Strukturen als pointer zurückgeben wäre eine Idee dazu 

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: DLL ProcedureReturn ?
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.ts-soft hat geschrieben:Strukturen als pointer zurückgeben wäre eine Idee dazu
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
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.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: DLL ProcedureReturn ?
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" ...
"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.
Der Weise weiß, dass er ein Narr ist.
- 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 ?
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!
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: DLL ProcedureReturn ?
Das ist es ja.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.
Code: Alles auswählen
*test1.mystruct = bla()
*test2.mystruct = bla()
@ts-soft: exakt das ist das Problem:
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.Mit statischen Variablen vermeide globale variablen
und der Inhalt bleibt trotzdem bis zum nächstem Aufruf der Funktion gültig
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.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: DLL ProcedureReturn ?
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.
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.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: DLL ProcedureReturn ?
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:nun, du solltest nicht annehmen, dass es keine Verwendung gäbe für Ergebnisse mit Verfallsdatum.
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.Kaeru Gaman hat geschrieben:außerdem wenn wir es mal eher wörtlich nehmen, hat ts tatsächlich völlig recht.
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
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.
- 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 ?
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- Deluxe0321
- Beiträge: 336
- Registriert: 19.05.2006 00:31
- Kontaktdaten:
Re: DLL ProcedureReturn ?
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.
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.