dll에서 함수를 가져오는 문제를 이해하는 데 도움이 됩니다. - 페이지 3

 

고맙지 만 사양 할게 :-). 당신은 모든 것을 스스로 할 것입니다 :-).

단계별로 배치:

.

# 1 (테스트, 당신은 그것을 할 수 없습니다 ;-) :

C++에서 MAX_ROW = 5..10행, MAX_COL = 5..10열(임의의 숫자)이 있는 행렬을 만듭니다.

데이터로 임의 채우기를 수행합니다.

.

#2 (테스트, 할 수 없습니다 ;-) : 다음 문제를 해결하십시오.

1단계의 행렬은 1차원 형태로 표현되어야 합니다.

수식에 따라 데이터가 저장되는 size=MAX_ROW*MAX_COL의 1차원 이중 배열을 만듭니다.

for(줄 = 0 .. MAX_COL-1)

for(열 = 0 .. MAX_COL-1)

배열[줄*MAX_COL + 열] = 데이터[줄][열];

.

#3: 다음 문제를 풀다 / 함수로

행과 열의 수인 (2) 단계에서 1차원 이중 배열을 얻습니다.

이 배열의 데이터를 ap::real_2d_array 객체에 넣어야 합니다.

.

#4: ap::real_2d_array / object를 함수로 얻습니다.

1차원 이중 배열로 변환하고 행과 열의 수를 가져와야 합니다.

.

#5 (테스트, 당신은 그것을 할 수 없습니다 ;-) :

1차원 배열은 2차원 행렬로 변환해야 합니다(1단계에서와 같이).

결과 행렬을 1단계의 원래 행렬과 비교합니다.

불일치하는 경우 처리하십시오.

.

필요한 주요 기능은 기능 3과 4입니다.

1,2단계 = 교육, 다음과 같이 Mql에 데이터를 압축해야 합니다. 5단계 = 테스트입니다.

.

일반적으로 5단계 각각에 대한 기능을 만들 것입니다.

.

Mql의 특이 변환

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

 

이 특이값 분해 알고리즘이 작동하는 방식에 대한 자세한 분석에 감사드립니다. 항목 1-3이 구현되었습니다. 4번 항목에 문제가 있었습니다. 이전에 썼던 것처럼 rmatrixsvd (...) 함수를 내보내는 작업으로 여전히 작동하는 dll을 만들 수 없습니다.

원래 C++ 코드의 도입으로 인해: extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd (...), 오류가 시작됩니다... bool rmatrixsvd (...)만 컴파일하면 오류가 발생하지 않습니다. ...하지만 내 보낸 함수가 필요합니다 ... 여기에 혼미가 있습니다 ...

도와 주셔서 감사합니다.

 

4번 항목(및 기타 모든 항목)에 대해. rmatrixsvd는 그것과 아무 관련이 없습니다.

특이값 분해 알고리즘도 마찬가지입니다. 관련된 항목들입니다

Dll에서 데이터를 송수신합니다.

.

4단계에서 작성할 함수의 프로토타입 :

무효 Convert_real_2d_array_to_double(

const ap::real_2d_array & arr,

이중 * 데이터,

정수 및 줄,

정수 및 열

);

.

저것들. ap::real_2d_array에서 행, 열 및 데이터의 수를 얻는 방법을 배워야 합니다.

.

이것으로부터:

const ap::real_2d_array & arr

---->>>

이것을 얻으십시오:

이중 * 데이터,

정수 및 줄,

정수 및 열

 

시간 내주셔서 다시 한번 감사드립니다.

다시 한 번 나는 모든 항목을 매우 주의 깊게 읽었고 마침내 그것이 나에게 떠올랐던 것 같습니다 :-) 무엇을 해야 하는지.

실제로 rmatrixsvd 함수 자체는 말하자면 "일꾼"이며 내보내기를 시도할 필요가 없습니다.

그리고 당신은 제 시간에 장바구니에 상품을 넣고 배달 될 때 올바른 장소에 조심스럽게 내리면됩니다.

약속에 의해. 비유적으로 말하기. 내가 지금 당신을 올바르게 이해하고 있습니까?

저것들. 이 데이터 변환기가 C++에서 3과 4를 가리키도록 해야 하고 실제로 MQL에서 작업해야 합니다. MQL에서 선언하고 DLL에서 선언

Metatrader가 함께 작동하려면 내보내기 가능으로 선언되어야 합니다. 내 문제를 올바르게 이해하고 있습니까?

이것이 사실이고 이제 내가 당신을 이해하는 것 같으면 이것이 훨씬 낫습니다. 왜냐하면. 그런 다음 2차원 배열과 1차원 배열을 연결하는 방법을 몰랐습니다.

게다가 MQL에서는 배열을 a[ ][ ]로 선언하는 것이 불가능합니까? 저것들. 적어도 a[ ][100]으로 선언되어야 합니다. 그렇습니까? 아니면 내가 틀렸어?

그리고 이것은 매우 편리하지 않습니다. 왜냐하면. 2차원 배열의 차원이 어떻게 될지 미리 알지 못하며, 미래에는 배열에 대한 메모리를 미리 예약하는 것이 최선의 선택이 아닙니다.

이 문제는 C++에 존재하지 않습니까? 저것들. 2차원 배열은 비유적으로 말해서 "고무"가 될 수 있습니다. 사실인가요? 아니면 C++에도 약간의 뉘앙스가 있습니까?

나는 또한 Borland Builder 2009에 대해 묻고 싶었습니다. 아마도 6만큼 버그가 많지 않습니까? 그리고 원칙적으로 일할 수 있습니까?

그리고 내가 이해하는 한 일반적으로 그가 debilder 라고 말했습니다. :-) 내가 이해하는 한 Visual Studio에서 프로그래밍합니까? 그가 더 강합니까? 그리고 결함이 없습니까? 지금 최신 버전은 무엇입니까?

당신의 도움으로 문제의 본질을 이해하게 되어 기쁩니다. 이제 이걸 해보려고 합니다...

 
boysn >> :

게다가 MQL에서는 배열을 a[ ][ ]로 선언하는 것이 불가능합니까? 저것들. 적어도 a[ ][100]으로 선언되어야 합니다. 그렇습니까? 아니면 내가 틀렸어?

그리고 이것은 매우 편리하지 않습니다. 왜냐하면. 2차원 배열의 차원이 어떻게 될지 미리 알지 못하며, 미래에는 배열에 대한 메모리를 미리 예약하는 것이 최선의 선택이 아닙니다.

괜찮은! :-) 프로세스가 어딘가로 이동하게 되어 매우 기쁩니다 :-).

.

물론 Mql4에서 2차원 배열을 선언할 수 있습니다.

그리고 같은 방식으로 Dll에서 함수를 가져올 수 있습니다.

#내 라이브러리 가져오기

void showMatrix(이중 및 배열[][], int 행, int 열);

#수입

.

그러나 여기에 미묘한 차이가 있습니다. C에서 우리는 1차원 배열을 취하는 함수를 선언합니다.

행과 열의 수 void showMatrix(double *array, int rows, int cols);

배열은 1차원 배열처럼 작동하며 주소 지정은 루프로 배열됩니다.

for(줄 = 0 .. MAX_COL-1)
for(열 = 0 .. MAX_COL-1)
배열[줄*MAX_COL + 열] = 데이터[줄][열];

.

저것들. Mql은 연속 버퍼가 있는 2D 배열을 던집니다.

.

같은 갈퀴를 밟지 마십시오. 3단계와 4단계의 기능은 DLL 내부에서 사용됩니다.

행/열 수와 함께 Mql의 1차원 배열을 허용하는 Dll-ins 인터페이스 함수 내부.

그녀는 그것들을 ap::real_2d_array로 변환하고 rmatrixsvd에 전달할 것입니다.

이미 결과는 출력 버퍼에 배치되며, 행과 열의 차원은 다음과 같습니다.

정확해야 합니다.

.

물론 미리 출력 버퍼를 예약하십시오. 이것은 Mql에서 수행되어야 합니다.

치수를 알 수 없는 경우 내 의견은 수행해야 하는 작업입니다.

예를 들어 큰 차원의 1차원 배열

더블 아웃[2500];

및 출력 값에 대한 한 요소의 배열 행/열 수

이중 원시[1];

더블콜[1];

.

Visual Studio가 더 시원합니다. 특히 Visual Assist와 함께. STL이 debilder에서 어떻게 작동하는지 모르겠습니다. 유니코드 문제는 거의 100%입니다.

Win SDK 도움말은 MSDN과 일치하지 않습니다. Borland 컴파일러인 Delphi와 통합한다는 소문이 있습니다.

플러스가 긍정적이지 않은 변화를 겪었습니다.

.

그리고 기억으로 작업하는 것은 수업의 주제입니다.

 

이론적으로 모든 것이 명확한 것 같습니다. 구현을 시작하고 다음을 살펴보겠습니다 :-). "눈은 무섭지만 손은 하는구나.."

귀하의 소중한 팁에 다시 한 번 감사드립니다. 나는이 알고리즘을 구현하고 싶습니다 ... 그렇지 않으면 평소와 같이 아이디어가 이미 전략적으로 멀리 갔지만 전술적으로나 실질적으로

그녀를 쫓아야 합니다. 모든 것이 잘되기를 바랍니다. 질문이 있으면 조언을 도와주는 예의를 거부하지 않습니다. 덕분에!

 

동적 배열의 차원에 대해 다시 한 번 명확히 하고 싶습니다.

MQL에서 1차원 배열은 array[ ]로 정의할 수 있으며, 프로그램에서 배열 차원 N을 알면,

그런 다음 ArrayResize (배열, N) 함수를 사용합니다. 2차원 배열은 array[ ][100]로만 정의할 수 있습니다. 두 번째 차원

어쨌든, 확실히 알아야 하고, 모르면 최대로 가져가서 어떤 경우에도 충분합니다. MQL에서 다음을 정의할 수 있습니다.

2차원 배열 array[ ][ ], 컴파일러는 이에 대해 불평하지 않지만 ArrayResize 함수는 배열의 첫 번째 차원에서 새 크기를 설정합니다.

두 번째 차원에 대한 MQL에는 그러한 기능이 없습니다. 2차원 배열 배열[N][M]을 정의하면 컴파일러에서 이에 대한 오류가 발생합니다.

정수, 즉 차원은 적어도 배열의 두 번째 차원에서 미리 정의되어야 합니다.

C++에서도? 여기에서 벗어날 수 있는 곳이 있습니까? 다시 한 번 명확히 하고 싶습니다.

특이 분해는 C++용 AP 라이브러리를 사용합니다(첨부 파일에 설명). 내가 이해하는 한 결정적인 몇 가지 기능이 있습니다.

배열의 동적 1차원 및 2차원 문제. 데이터 변환기를 작성할 때 DLL 내부의 경우에 사용할 수 있습니까?

무효 setbounds( int iLow1, int iHigh1, int iLow2, int iHigh2)
어레이에 대한 메모리를 할당합니다. 동시에 배열의 기존 내용을 삭제하고 할당된 메모리를 해제한 다음 (iHigh1-iLow1+1)*(iHigh2-iLow2+1) 요소 크기의 별도 메모리 영역을 다시 할당합니다. 할당됨.
첫 번째 차원에 의한 새 배열의 요소 번호 매기기는 두 번째 차원과 유사하게 iLow1에서 시작하여 iHigh1로 끝납니다.
새 배열의 내용이 정의되지 않았습니다.

그리고 다음과 같은 기능도 있습니다.

무효 setcontent( int iLow1, int iHigh1, int iLow2, int iHigh2, const T *pContent)
이 메서드는 메모리가 할당된 후 pContent[] 배열의 내용이 메모리에 복사된다는 점을 제외하면 setbounds() 메서드와 유사합니다.
pContent 배열은 한 줄씩 쓰여진 2차원 배열을 포함합니다. 요소 [iLow1, iLow2]가 먼저 오고 그 다음 [iLow1, iLow2+1] 등입니다.

내가 올바르게 이해했다면 이것은 정확히 내가 필요한 기능입니다. 1차원 배열에서 2차원 배열을 만듭니다. 기본적으로 변환기입니다.

제가 제대로 이해한건가요?

 

C++용 AP 라이브러리

 
C++용 AP 라이브러리
파일:
 

MQL : 1차원에서 우리는 우리가 원하는 대로 변합니다. 그렇습니다. 그런 다음 인덱스(line * MAX_COL + col)로 모든 것을 얻습니다.

2D에서는 2차원이 고정되어 있습니다. 저것들. 배열 a[100][100]의 행렬 [15][32] 요소는 더 이상 계산되지 않습니다.

.

그리고 AP 라이브러리의 기능은 어떻게 작동하는지 확인하는 것이 좋습니다.

DLL에서 멈추지 마십시오. Exe를 작성하면 실행 및 디버그가 더 쉽습니다.

디버그 인쇄 (디버그 인쇄)를 삽입합니다.

물론 조언을 해줄 수는 있지만 조언을 위해서는 좋은 방법으로 확인이 필요합니다-

테스트 코드를 작성합니다.

.

그리고 배열과 변수의 내용에 대해서는 어디에서-

강제로, 엄격하게 초기화하는 것을 원칙으로 하는 것이 좋습니다.

사유: