Récupérer une valeur Double retournée par une DLL

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Récupérer une valeur Double retournée par une DLL

Message par falsam »

C'est une question qui a été supprimé de cette section mais qui mérite au moins une réponse. :wink:

■ Code de création de la DLL (MaDll.dll)

Code : Tout sélectionner

ProcedureDLL.d test()
  net.d = 2.10
  ProcedureReturn net
EndProcedure
La création de la DLL s'accompagne de la lib associée

■ Code de récupération de la valeur retournée par la fonction test()

Code : Tout sélectionner

Import "MaDll.lib"
  test.d() ;<- Noter le d comme ....
EndImport

Debug StrD(test(), 2)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Récupérer une valeur Double retournée par une DLL

Message par Ollivier »

Bonjour Falsam,

j'ai vu "DLL" dans le titre, et là je vois Import: EndImport donc je risque de répondre à côté de la plaque.

Pour les DLLs, "Prototype" permet de retrouver un Double.

Pour les LIBs, j'avoue ne pas utiliser ce type de fichier...

Pour les DLLs, comme pour les LIBs, si un entier est retournable (et donc récupérable), tu peux suivre une technique que j'ai apprise avec Gnozal (c'est par les pointeurs) :

Code : Tout sélectionner

ProcedureDLL.I MyProc()
   Define.Double x
   x\D = 37.5
   ProcedureReturn x
EndProcedure

Code : Tout sélectionner

Define.Double *x
*x = MyProc()
Debug StrD(*x\D)
De cette manière, on est plutôt tenté d' "injecter" un pointeur :

Code : Tout sélectionner

ProcedureDLL.I MyProc(*x.Double)
   *x\D = 37.5
EndProcedure

Code : Tout sélectionner

Define.Double x
MyProc(x)
Debug StrD(x\D)
(J'ajouterai que le rôle de "Prototype", s'apparente à ça : utiliser les pointeurs en interne et permettre une syntaxe "normale" des variables. )

Et d'une tentation à l'autre, les structures semblent alors faciliter la tâche.

Code : Tout sélectionner

Structure MyStruc
   a.Double
EndStructure

ProcedureDLL.I MyProc(*x.MyStruc)
   *x\A = 37.5
EndProcedure

Code : Tout sélectionner

Structure MyStruc
   a.Double
EndStructure

Define.MyStruc x
MyProc(x)
Debug StrD(x\A)
Ainsi seul un entier sert de clé (par adressage), ce qui convient notamment aux threads qui n'acceptent que ça.

Aussi, dans la pratique, cela occulte les doutes sur le support des types exotiques (chaînes, flottants, etc...) car cela élude la problématique à la seule taille d'adressage : est-ce en 32 bits ou bien en 64 bits ?
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Récupérer une valeur Double retournée par une DLL

Message par Fig »

J'ai eu ma réponse dans le; forum anglais donc j'ai viré ma question ici...
Je crois que je me confronte plusieurs fois à la même interrogation tant j'utilise peu des Dll en Pb.

C'est une Dll pour faire des réseaux de neurones artificielles.
Je posterai ça pour les curieux.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre