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
Eu meio que escrevi algo em um arquivo h
então no cpp apenas
...
...e prefiro não lidar de forma alguma com cordas... Por que você precisa deles em uma dll??? é apenas para a beleza?
E a própria Borland recomenda o uso de char* ou char[], no estilo Metatrader, se necessário.
Acho que a forma correta de declará-lo no construtor é a seguinte (não me lembro exatamente)
extern "C" __declspec(dllexport) int __stdcall GetIntValue();
Acho correto declarar no construtor algo como isto (não me lembro exatamente)
extern "C" __declspec(dllexport) int __stdcall GetIntValue();
exatamente lá!
Muito obrigado pelas dicas! Funcionou com este exemplo após "C" int __declspec(dllexport) __stdcall GetIntValue().
Eu experimentei com funções duplas e de corda, e funcionou também. Decidi aplicar os conhecimentos que adquiri de vocês a uma tarefa prática. Mas, infelizmente... Infelizmente, eu não tive sucesso.
Se você puder, por favor me ajude mais uma vez.
Existem arquivos no projeto Bilder para criação de DLL: UHsvd.h, Usvd.cpp e outros.
O arquivo UHsvd.h tem uma função que deve ser exportada posteriormente:
bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneed,
int adicionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt);
O arquivo Usvd.cpp contém a mesma função, que deve então ser exportada:
bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneed,
int adicionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt)
{
........
}
Eu começo a construir uma DLL em Bilder nesta variante, tudo "constrói", tudo funciona, sem erros.
Se eu começar a fazer mudanças em UHsvd.h, Usvd.cpp como
rmatrixsvd(ap::real_2d_array a,
.....), depois aparecem erros de 2 a 19 com diferentes variantes, ou seja, fiz esta declaração ou no arquivo de cabeçalho ou no cpp... embora, como eu entendo, deveria estar no arquivo de cabeçalho (então existem apenas 2 erros):
[Erro BCC32] Usvd.cpp(128): E2356 Tipo de descasamento na redeclaração de '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'
[Erro BCC32] UHsvd.h(111): E2344 Declaração anterior de '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'.
Pelo que entendi, há uma discrepância... Mas eu não entendo completamente... :-(
Realmente esperando por sua ajuda e apoio...
boysn писал(а) >> {...}
Se você puder, por favor, ajude mais uma vez.
Existem arquivos no projeto Bilder para criar uma DLL: UHsvd.h, Usvd.cpp e outros.
O arquivo UHsvd.h tem uma função que deve então ser exportada:
bool rmatrixsvd(ap::real_2d_array a,
int m,
int, s.f,
int uneeded,
int vtneed,
int adicionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt); {...}
Se entendi corretamente, ap::real_1d_array é uma classe. E ap::real_1d_array & é uma referência a um objeto de classe.
Mas querida, você só pode passar o dobro de meus dados[] como parâmetros para o Dll,
que parecerá o dobro * em funções.
Se entendi corretamente, ap::real_1d_array é uma classe. E ap::real_1d_array & é referência a objeto de classe.
Mas querida, apenas o dobro de myData[] pode ser passado para o Dll como parâmetro,
que em funções parecerá o dobro *.
Concordo plenamente com você. Vou declará-lo como duplo em MQL ao importá-lo. Mas no momento estou tendo problemas para criar a DLL em si no C++ Builder 2009. Eu recebo erros ao construí-lo. Se eu não usar a declaração
externo "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) então a compilação da biblioteca em Bilder passa com sucesso sem nenhum problema. Agora, eu não sei como criar corretamente funções de declaração de exportação no projeto Bilder :-(, a fim de obter
DLL de trabalho com capacidade de exportar a função rmatrixsvd.
Concordo plenamente com você. Vou declará-lo como duplo em MQL ao importá-lo. Mas no momento estou tendo problemas para criar a própria DLL no C++ Builder 2009. Eu recebo erros ao construí-lo. Se eu não usar a declaração
externo "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) então a biblioteca se compila em Bilder com sucesso, sem problemas. Agora, eu não sei como criar corretamente as funções de declaração de exportação no projeto Bilder :-(, para obter
DLL de trabalho com capacidade de exportar a função rmatrixsvd.
Brrr. Você parece concordar comigo estranhamente.
.
Na verdade, estamos falando de escrever "adaptador" ou "ponte".
"Adaptador" do ponto de vista de que os parâmetros da função exportada
devem ser ajustados com os parâmetros que o metatrader pode passar,
ou seja, você precisa de uma função extra que passe a chamada para onde você quer que ela vá.
E "ponte" do ponto de vista de que não é necessário para a função
que o senhor declara que fará o trabalho por conta própria.
E vice versa - não é necessário chamar a função que faz o trabalho.
.
Ou seja, você precisa separar a interface e a implementação, ou seja, a implementação pode ser construída sobre classes
. e funções que estão fora do Dll que ninguém jamais conhecerá.
.
Mas vamos considerar um exemplo.
.
Você deve declarar uma função como esta:
externo "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)
// claro, você também passará aqui 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;
}
.
Aqui - é claro - a função rmatrixsvd
não é declarado como "C" ou __stdcall externo ou __declspec etc.
Porque faz parte da implementação interna e oculta.
Desculpe, infelizmente não entendi...
A partir de http://alglib.sources.ru/ eu baixei a implementação C++ (código) que eu preciso. Se você não se importa, por favor, dê uma olhada no arquivo 100KB anexo. Este algoritmo tem muitas funções auxiliares, o número total de linhas de código é algo como 3000 linhas... Eu acho que sim
Diz isso no site, ou seja, é demais, e é bastante difícil traduzi-lo para a MQL... É preciso entender o próprio algoritmo para traduzi-lo corretamente. No momento, é um pouco complicado para mim. É por isso que eu gostaria de usar o C++ Builder 2009 para fazer uma dll com este código pronto e chamar a função rmatrixsvd(...) que eu preciso da dll. Foi aí que eu fiquei perplexo... onde e como declará-lo corretamente... Com este código, sem mudar uma linha ali, a DLL é construída, sem erros. Mas assim que coloco o "C" externo bool __declspec(dllexport) __stdcall nele eu recebo erros...
Obrigado por seu tempo.