Aide à résoudre un problème d'importation d'une fonction depuis une dll - page 4

 
Bon conseil à propos du fichier Eche. Je vais essayer de l'utiliser. Bien sûr, vous avez raison, il faut les vérifier. Je voulais juste avoir votre avis sur l'intérêt ou non d'y prêter attention, c'est-à-dire de les vérifier. Mais à en juger par la description, je pense que c'est ce dont nous avons parlé, qu'en pensez-vous ? Je ne suis pas encore très doué pour le C++ pratique, je comprends dans mon cerveau qu'il n'y a rien de globalement difficile dans l'écriture de ces convertisseurs, mais pour le moment cela me pose encore quelques difficultés, et je veux donc le résoudre le plus simplement possible, surtout s'il existe une fonction toute faite...
 

Faites confiance mais vérifiez :-). C'est vrai.

 

J'essaie de comprendre comment réaliser une implémentation en C++ Builder. D'après ce que j'ai compris, pour créer un fichier EXE, vous devez faire un appel consécutif à trois fonctions de la fonction WinMain :

ConvertData_1 (...) ;

rmatrixsvd(...) ;

ConvertData_2 (...) ;

N'est-ce pas ? Que devons-nous faire lorsque nous formons une DLL ? De la même manière ? J'ai quelques doutes... J'essaie d'utiliser un livre d'Arkhangelsky "Programming in C++ Builder"...

Mais jusqu'à présent, sans résultat...

 

Cela ne fait aucune différence que vous travailliez en Exe ou en Dll.

.

J'ai copié mon message de la page 2 de ce fil :

-----------------------------------------------------------

Vous devez déclarer une fonction comme ceci
extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)
// ici, vous passerez bien sûr le nombre de lignes et de colonnes
{
//convertit les paramètres d'entrée en ap::real_2d_array
ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1) ;
ap::real_2d_array a2 = ;
.
//calculer
ap::real_2d_array a3 ;
rmatrixsvd(a1, a2, a3) ;
.
//traduire le résultat de a3 en out
convertReal2DArrayToPDouble(a3, out) ;
.
retour ;
}

-----------------------------------------------------------

.

Quel est le rapport avec la fonction WinMain ? C'est en quelque sorte le point d'entrée du programme...

Je m'excuse bien sûr, mais comprenez-vous quelle est la fonction?

.

Soyez honnête, du 2 au 6 septembre, combien de temps avez-vous déjà consacré à cette tâche ?

Ne serait-il pas préférable de demander une consultation de 2 heures à un expert (préparation du code + explication) ?

 

Merci, je comprends maintenant... Toutes ces fonctions sont encadrées par une fonction externe, qui est celle que je vais exporter. Désolé, je me suis un peu embrouillé...

A propos du spécialiste, j'aimerais... s'il y en avait un quelque part. Mais, malheureusement, il n'y en a pas, dommage, bien sûr...

C'est le Kazakhstan... Il y a probablement de bons spécialistes à Almaty et Astana, mais je ne peux pas m'y rendre :-), à plus de 1000 km de distance.

C'est pourquoi je dois le découvrir par moi-même. Oui, j'ai déjà perdu beaucoup de temps :-). Eh bien, peu importe... Moscou n'a pas été construite en un jour. :-) Comme on dit.

 

Je ne comprends pas bien Visual Studio 2010... Est-ce que seule la version bêta est disponible maintenant ? D'après ce que j'ai compris, il n'y a pas encore de sortie ?

L'assistance visuelle est-elle fournie séparément ?

Qu'en est-il de l'avant-dernière version de Visual Studio 2008 ?

 

A proprement parler, vous en aurez assez dès 2005. Ou 2003.

Visual Assist est un utilitaire tiers.

 

Pour la tâche à accomplir, bien sûr, ces éléments sont suffisants. Mais je veux garder les choses en perspective. Je pense que cette tâche ne sera pas la dernière...

Mais Visual Studio 2009 ne semble pas se présenter, alors je vous ai demandé quelles étaient les dernières versions disponibles...

Pour étudier... ...donc étudier jusqu'au sommet... :-)

 

Enfin, quelque chose est né... :-)

Mais il y a quelques problèmes lors de la compilation, si vous spécifiez que la fonction est exportable...

Si vous le spécifiez :

1.) int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), compile sans erreurs

2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), alors il y a des erreurs :

Erreur [ILINK32] Erreur : Externe non résolu 'ap::afree(void *)' référencé à partir de \COMP-BSN/MY DOCUMENTS\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
Erreur [ILINK32] : Externe non résolu 'ap::minint(int, int)' référencé dans \COMP-BSN!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
Erreur [ILINK32] Erreur : Externe non résolu 'ap::amalloc(unsigned int, unsigned int)' référencé dans \COMP-BSN/MY DOCUMENTS!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
Erreur [ILINK32] Error : Unresolved external 'rmatrixsvd(ap::template_2d_array<double, 1>, int, int, int, int, ap::template_1d_array<double, 1>&, ap ::template_2d_array<double, 1>&, ap::template_2d_array<double, 1>&)' référencé dans \COMP-BSN\\N- MES DOCUMENTS\ !ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ

Comment cela peut-il être interprété ?

Peut-être y a-t-il une erreur dans mon code ?

Voici le code :

//---------------------------------------------------------------------------

#include <windows.h>
//inclure "H_svd_dll.h"
//---------------------------------------------------------------------------

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
retour 1 ;
}

//---------------------------------------------------------------------------
#include "stdafx.h"
#include "svd.h"
//---------------------------------------------------------------------------

int Convert_Double_To_Real_2D_Array(double inArr[], ap::real_2d_array outArr, int iRow, int iCol)
{

for(int line = 0 ; line < iRow ; line++)
for(int colonne = 0 ; colonne < iCol ; colonne++)
outArr(ligne, colonne) = inArr[ligne*iCol + colonne] ;


retour 1 ;
}

//---------------------------------------------------------------------------

int Convert_Real_1D_Array_To_Double(ap::real_1d_array inArr, double outArr[], int iRow, int iCol)
{
int minmn = ap::minint(iRow, iCol) ;
for(int i = 0 ; i < minmn ; i++)
outArr[i] = inArr(i) ;

retour 1 ;
}

//---------------------------------------------------------------------------

int Convert_Real_2D_Array_To_Double(ap::real_2d_array inArr, double outArr[], int iRow, int iCol)
{
for(int line = 0 ; line < iRow ; line++)
for(int colonne = 0 ; colonne < iCol ; colonne++)
outArr[ligne*iCol + colonne] = inArr(ligne, colonne) ;

retour 1 ;
}

//---------------------------------------------------------------------------

extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col)
//int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col)
{
ap::real_2d_array A ;
ap::real_1d_array W ;
ap::real_2d_array U ;
ap::real_2d_array VT ;
int Uneed = 2 ;
int VTneeded = 2 ;
int AdditionalMemory = 2 ;
// allouer de la mémoire pour les tableaux
int minmn = ap::minint(Row, Col) ;
A.setbounds(0, Row-1, 0, Col-1) ;
W.setbounds(0, minmn-1) ;
U.setbounds(0, Row-1, 0, Col-1) ;
VT.setbounds(0, Row-1, 0, Col-1) ;

//convertit les paramètres d'entrée de double à ap::real_2d_array
Convertir_Double_To_Real_2D_Array(inA, A, Row, Col) ;

// svd-décomposition de la matrice
rmatrixsvd(A, Row, Col, Uneeded, VTneeded, AdditionalMemory, W, U, VT) ;

// convertir le résultat de W, U, VT en out
Convertir_Real_1D_Array_To_Double(W, outW, Row, Col) ;
Convertir_Real_2D_Array_To_Double(U, outU, Row, Col) ;
Convert_Real_2D_Array_To_Double(VT, outVT, Row, Col) ;

retour 1 ;
}

 
2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), puis des erreurs se produisent :

[ILINK32 Error] Error: Unresolved external 'ap::afree(void *)' referenced from \\COMP-BSN\МОИ ДОКУМЕНТЫ\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ

Cher, si vous téléchargez des archives avec les sources, j'essaierai de les compiler et de les lier.

Et aussi - promettez-moi de me montrer l'indicateur mq4 lui-même :-).

Raison: