![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Confiança, mas verificar :-). Isso mesmo.
Estou tentando descobrir como fazer uma implementação no C++ Builder. Pelo que entendi, para fazer um arquivo EXE, é necessário fazer uma chamada consecutiva para três funções na função WinMain:
ConvertData_1 (...);
rmatrixsvd(...);
ConvertData_2 (...);
Certo? O que devemos fazer ao formar uma DLL? Da mesma forma? Eu tenho algumas dúvidas... Estou tentando usar um livro de Arkhangelsky "Programming in C++ Builder...".
Mas até agora, em vão...
Não faz diferença se você trabalha no Exe ou no Dll.
.
Copiei meu post da página 2 deste tópico:
-----------------------------------------------------------
Você deve declarar uma função como esta
externo "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)
// aqui, você naturalmente passará o número de filas e colunas
{
//converter parâmetros de entrada para ap::real_2d_array
ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);
ap::real_2d_array a2 = ;
.
//calcule
ap::real_2d_array a3;
rmatrixsvd(a1, a2, a3);
.
//traduzir o resultado de a3 para fora
convertReal2DArrayToPDouble(a3, out);
.
retornar;
}
-----------------------------------------------------------
.
O que a função WinMain tem a ver com isso? É uma espécie de ponto de entrada para o programa...
Peço desculpas, é claro, mas você entende qual é a função?
.
Seja honesto, de 2 a 6 de setembro, quanto tempo você já gastou com essa tarefa?
Não seria melhor pedir uma consulta de 2 horas a um especialista (preparação do código + explicação)?
Obrigado, agora entendi... Todas estas funções são emolduradas por uma externa, que é o que estarei exportando. Desculpe, fiquei um pouco confuso...
Sobre o especialista, eu adoraria... se houvesse um em algum lugar. Mas, infelizmente, não há nenhuma, uma pena, é claro...
Este é o Cazaquistão... Embora provavelmente existam bons especialistas em Almaty e Astana, mas não consigo chegar até eles :-), a mais de 1000 km de distância.
É por isso que eu tenho que descobrir sozinho. Sim, eu já perdi muito tempo :-). Bem, não importa ... Moscou não foi construída em um dia também. :-) Como se costuma dizer.
Não entendo bem o Visual Studio 2010... Está disponível apenas a versão Beta agora? Tanto quanto eu entendo, ainda não há liberação?
O Visual Assist vem separadamente?
E quanto ao penúltimo lançamento do Visual Studio 2008?
A rigor, a partir de 2005, você terá o suficiente. Ou 2003.
O Visual Assist é uma utilidade de terceiros.
Para a tarefa em questão, é claro, estes são suficientes. Mas eu quero mantê-lo em perspectiva. Acho que esta tarefa não será a última...
Mas o Visual Studio 2009 parece não ocorrer, por isso perguntei sobre as últimas versões disponíveis...
Para estudar... ... então estude até o topo... :-)
Finalmente nasceu algo... :-)
Mas há alguns problemas durante a compilação, se você especificar que a função é exportável...
Se você especificar:
1.) int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), compila sem erros
2) externo "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), depois há erros:
[Erro: Não resolvido 'ap::afree(void *)' externo referenciado de \COMP-BSN/MY DOCUMENTS\SVD_DLL2009.09.07\PROJETODEBUG_BUILD\U_SVD_DLL.OBJ
[Erro: Não resolvido 'ap::minint(int, int)' externo referenciado de {COMP-BSN!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJETODEBUG_BUILD\U_SVD_DLL.OBJ
[Erro: Não resolvido 'ap::amalloc(unsigned int, unsigned int)' externo referenciado de {COMP-BSN/MY DOCUMENTS!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJETODEBUG_BUILD\U_SVD_DLL.OBJ
[Erro: Não resolvido '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>&)' referenciado de {COMP-BSN}MEUS DOCUMENTOS!ALGORITMOS\\SVD\SVD_DLL\2009.09.07PROJECTO\\\VD_DBUG_BUILD\U_SVD_DLL.OBJ
Como isso pode ser interpretado?
Talvez haja algum erro no meu código?
Aqui está o código:
//---------------------------------------------------------------------------
#Incluir <janelas.h>
/incluir "H_svd_dll.h".
//---------------------------------------------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unigned long reason, void* lpReserved)
{
retornar 1;
}
//---------------------------------------------------------------------------
#incluir "stdafx.h"
#incluir "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 coluna = 0; coluna < iCol; coluna++)
outArr(linha, coluna) = inArr[linha*iCol + coluna];
retornar 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);
retornar 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 coluna = 0; coluna < iCol; coluna++)
outArr[linha*iCol + coluna] = inArr(linha, coluna);
retornar 1;
}
//---------------------------------------------------------------------------
externo "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 Uneeded = 2;
int VTneed = 2;
int AdditionalMemory = 2;
// alocar memória para arrays
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);
//converter parâmetros de entrada do dobro para ap::real_2d_array
Convert_Double_To_Real_2D_Array(inA, A, Row, Col);
// svd-decomposição da matriz
rmatrixsvd(A, Row, Row, Col, Uneed, VTneed, AdditionalMemory, W, U, VT);
// converter o resultado de W, U, VT em out
Convert_Real_1D_Array_To_Double(W, outW, Row, Col);
Convert_Real_2D_Array_To_Double(U, outU, Row, Col);
Convert_Real_2D_Array_To_Double(VT, outVT, Row, Col);
retornar 1;
}
[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
Caro, se você carregar arquivos com fontes, eu tentarei compilá-los e ligá-los.
E também - promessa de me mostrar o próprio indicador mq4 :-).