Ajuda a resolver um problema de importação de uma função a partir de uma dll - página 3

 

Não agradeça :-). Você mesmo fará tudo :-).

Esclareça os passos passo a passo:

.

#1 (teste um, você não precisa fazer isso ;-) :

Em C++, criar uma matriz com número de linhas MAX_ROW = 5...10, colunas MAX_COL = 5...10 (números aleatórios).

Faça um preenchimento aleatório com dados.

.

#2 (teste um, você não precisa fazer ;-) : resolver o seguinte problema:

A matriz da etapa nº 1 precisa ser representada de forma unidimensional.

criar uma matriz unidimensional de tamanho duplo=MAX_ROW*MAX_COL, onde os dados são armazenados de acordo com a fórmula

for(line = 0 ... MAX_COL-1)

for(column = 0 ... MAX_COL-1)

array[linha*MAX_COL + coluna] = dados[linha][coluna];

.

#3: resolver o seguinte problema / como uma função

Você obtém uma matriz unidimensional dupla do passo (2), o número de filas e colunas.

Você deve colocar os dados desta matriz em um objeto ap::real_2d_array

.

#4: Você recebe o ap::real_2d_array / objeto como uma função

Você tem que convertê-lo para uma matriz unidimensional dupla, obter o número de filas e colunas.

.

#5 (teste um, você não tem que fazer ;-) :

É preciso converter a matriz unidimensional para uma matriz bidimensional (como no passo 1).

Compare a matriz resultante com a matriz original da etapa 1.

Em caso de descasamento, descubra-o.

.

As principais funções que serão necessárias são as funções 3 e 4.

Etapa 1,2 = treinamento, você terá que embalar os dados em Mql desta forma, etapa 5 = teste.

.

Em geral, eu faria funções para cada uma das 5 etapas.

.

Transformação singular em Mql.

https://www.mql5.com/ru/code/7359

 

Obrigado pela discriminação detalhada de como este singular algoritmo de decomposição deve funcionar. Os itens 1-3 são implementados. O problema permanece com o ponto 4, porque ainda não sou capaz de criar uma dll funcional com função export rmatrixsvd(...), como escrevi antes,

por causa da adição de "C" bool externo __declspec(dllexport) __stdcall rmatrixsvd(...) ao código C++ original, eu recebo erros... Embora se você compilar apenas bool rmatrixsvd(...) não haja erros... mas preciso de uma função exportável... É aí que fica confuso...

Obrigado pela ajuda.

 

Em relação ao ponto 4 (e todos os outros). rmatrixsvd não tem nada a ver com isso.

Nem o singular algoritmo de decomposição. Estes itens estão relacionados a

para enviar/receber dados de/para Dll.

.

A função de protótipo para escrever por item. 4:

vazio Convert_real_2d_array_to_double(

const ap::real_2d_array & arr,

duplo * dados,

int & lines,

int & colunas

);

.

Ou seja, você precisa aprender como obter o número de linhas, colunas e dados da ap::real_2d_array.

.

A partir daí:

const ap::real_2d_array & arr

---->>>

obtê-lo:

duplo * dados,

int & lines,

int & colunas

 

Muito obrigado mais uma vez por seu tempo.

Mais uma vez li todos os posts com muito cuidado e parece que finalmente descobri :-) o que fazer.

De fato, a função rmatrixsvd em si é uma espécie de "cavalo de batalha" aqui e você não precisa tentar exportá-la,

você só precisa colocar a carga no carrinho a tempo e depois descarregála no lugar certo quando ela for entregue

ao seu destino, figurativamente falando. Estou entendendo corretamente agora?

Em outras palavras, preciso fazer esses conversores de dados (3 e 4) em C++ e trabalhar com eles em MQL, ou seja, eles devem ser declarados em MQL, e em DLL eles

ser declarado como exportável, para que a Metatrader pudesse usá-los. Eu entendo meu problema corretamente?

Se é assim, e acho que o entendo agora, é ainda melhor, porque eu não tinha certeza de como ligar os arrays 2D e 1D naquela época.

Além disso, você não pode declarar array como a[ ][ ] em MQL, pode? Isto é, a matriz deve ser declarada pelo menos como a[ ][100]. É assim? ou estou enganado?

E isto não é muito conveniente porque você não sabe de antemão qual será a dimensão de uma matriz bidimensional, enquanto reservar a memória para uma matriz com antecedência não é o melhor caminho a seguir,

Mas não existe tal problema em C++? Então, uma matriz bidimensional pode ser chamada figurativamente de "borracha". É assim? Ou há algumas sutilezas em C++ também?

Gostaria também de lhe perguntar sobre a Borland Builder 2009. Talvez não seja tão falho como o 6°? É realmente possível trabalhar com ele?

Porque Alsu disse que ele é um retardador, tanto quanto sei. :-) Mas até onde eu entendi você programa usando o Visual Studio? É mais frio? E sem falhas? Qual é a versão mais recente neste momento?

Estou feliz por ter chegado ao fundo do meu problema com sua ajuda. Agora vou tentar implementar tudo isso...

 
boysn >> :

Especialmente porque você não pode declarar array como a[ ][ ] em MQL, pode? Ou seja, você deve pelo menos declará-lo como a[ ][100]. É assim? ou estou enganado?

E isto não é muito conveniente porque você não sabe de antemão qual será a dimensão de uma matriz bidimensional, enquanto reservar a memória para uma matriz com antecedência não é o melhor caminho a seguir,

Ótimo! :-) Estou muito contente que o processo esteja se movendo em algum lugar :-).

.

É claro, você pode declarar matrizes bidimensionais em Mql4.

E da mesma forma, você pode importar funções de DLL

#importar myLib

showMatrix(double & array[][], int filas, int cols);

#importar

.

Mas há uma nuança aqui: em C, declaramos uma função que aceita uma matriz unidimensional,

o número de linhas e colunas vazias mostramMatrix(duplo *array, int filas, int cols);

E a matriz funciona como uma matriz unidimensional, endereçada na qual está disposta em um loop:

for(line = 0 ... MAX_COL-1)
for(column = 0 ... MAX_COL-1)
array[linha*MAX_COL + coluna] = dados[linha][coluna];

.

Ou seja, a Mql lança uma matriz bidimensional com um buffer contínuo.

.

Basta não pisar no mesmo ancinho - funções dos passos 3 e 4 são usadas dentro de seu Dll,

dentro da função de interface do Dll-ine, que tomará as matrizes unidimensionais com número de filas/colunas da Mql.

Ele irá convertê-los para ap::real_2d_array, passe para rmatrixsvd

e coloca o resultado no buffer de saída, que deve ter a linha e a coluna corretas

deve estar correto.

.

O buffer de saída deve ser reservado com antecedência, é claro - isso deve ser feito em Mql.

Se você não conhece as dimensões, minha opinião é que você deve fazer

uma matriz unidimensional de alta dimensionalidade, por exemplo

dobrar[2500];

e uma matriz de um elemento para os valores de saída das linhas/colunas

linhas duplas[1];

cols duplos[1];

.

O Visual Studio é mais legal. Especialmente com a Assistência Visual. Não sei como funciona a STL na Debuilder. Há quase 100% de problemas com o Unicode.

A ajuda de Win SDK não se compara com a MSDN. Há rumores de que para integrar com delphi o compilador Borland

para as vantagens sofreu mudanças não-positivas.

.

E trabalhar com memória é um tópico para uma classe.

 

Tudo parece estar teoricamente claro, vou começar com a implementação, e depois veremos :-). "Os olhos estão com medo, mas as mãos fazem o trabalho..."

Mais uma vez, obrigado pela valiosa orientação. Gostaria muito de implementar este algoritmo... Como de costume, a idéia já está distante estrategicamente, mas taticamente e praticamente

Eu tenho que alcançá-lo. Espero ser capaz de fazer isso. Se eu tiver alguma dúvida, por favor, não hesite em me ajudar com conselhos. Obrigado!

 

Gostaria de esclarecer mais uma vez sobre a dimensionalidade das matrizes dinâmicas.

Na MQL, uma matriz unidimensional pode ser definida como array[ ], e então quando o programa conhece a dimensão N da matriz,

você pode usar a função ArrayResize(array, N). Uma matriz bidimensional só pode ser definida como array[ ][100], ou seja, a segunda dimensionalidade

deve ser conhecido da mesma forma, e se você não souber, você deve tirar o máximo proveito para que seja suficiente em qualquer caso. Você pode definir em MQL

O compilador não se queixará disso, mas a função ArrayResize define um novo tamanho na primeira dimensão da matriz ,

Não existe tal função na MQL para a segunda dimensão. Se você definir uma matriz bidimensional[N][M], o compilador retornará um erro dizendo

um número inteiro, ou seja, a dimensionalidade deve ser definida de antemão, pelo menos a segunda dimensão da matriz.

É o mesmo em C++? Não há como fugir disso, não é mesmo? Mais uma vez, eu gostaria de esclarecer.

A decomposição individual utiliza a biblioteca AP para C++ (descrição em arquivo anexo). Há nele algumas funções que, tanto quanto entendi, resolvem

problemas da primeira e segunda dimensão dinâmica das arrays. Posso usá-los em meu caso dentro da DLL ao escrever conversores de dados?

void setbounds(int iLow1, int iHigh1, int iLow2, int iHigh2)
Atribuir memória para a matriz. Isto elimina o conteúdo da matriz antiga e libera a memória alocada para ela, depois aloca uma nova área de memória separada com o tamanho de (iHigh1-iLow1+1)*(iHigh2-iLow2+1) elementos.
A numeração dos elementos de uma nova matriz pela primeira dimensão começa com iLow1 e termina com iHigh1, o mesmo para a segunda dimensão.
O conteúdo da nova matriz não está definido.

Há também a seguinte função:

void setcontent(int iLow1, int iHigh1, int iLow2, int iHigh2, const T *pContent)
O método é similar ao método setbounds() com a exceção de que o conteúdo da matriz pContent[] é copiado para ela após a alocação de memória.
A matriz pContent contém uma matriz bidimensional escrita linha por linha, ou seja, o elemento [iLow1, iLow2] vai primeiro, depois [iLow1, iLow2+1], etc.

Se entendi corretamente, esta é exatamente a função que preciso, ou seja, faz uma matriz bidimensional a partir de uma unidimensional, ou seja, é essencialmente um conversor.

Eu acertei?

 

Biblioteca AP para C++

 
Biblioteca AP para C++
Arquivos anexados:
 

MQL : em uma dimensão, mudamos a dimensão como queremos, sim. Depois recebemos tudo por índices (linha * MAX_COL + col).

Em bidimensional, a 2ª dimensão é fixa. Ou seja, não podemos ler elementos da matriz [15][32] da matriz a[100][100].

.

E sugiro que você verifique como a biblioteca AP funciona.

Não pare no Dll. Escreva um exe, é mais fácil de executar e debugar.

Inserir uma impressão de debug.

Conselhos que eu certamente posso dar - mas para conselhos, você precisa testá-los -

escrever código de teste.

.

Quanto ao conteúdo da matriz e das variáveis - não importa onde -

é melhor fazer deles uma regra para inicializá-los forçosamente, de forma rígida.