MATLAB Engine API работает вечно, если код разделен

Я пытаюсь получить доступ к MATLAB через Engine с помощью терминала MetaTrader 4
(программное обеспечение для торговли от MetaQuotes metatrader4 )

Я использую файл DLL для связи между MetaTrader и MATLAB.

В коде, если я помещу этот код в одну функцию, он сработает.

Но если я разделю его на две отдельные функции, он будет работать вечно/вылетать

#include "stdafx.h"

#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include <vector>
#include <windows.h>
#include <memory.h>

#include "engine.h"

using namespace std;

#define MT4_EXPFUNC __declspec(dllexport)

Engine  *pEng      = NULL;
mxArray *closev    = NULL;
double  *closevp   = NULL;
mxArray *getPArray = NULL;

MT4_EXPFUNC void InitEngine( int dummy )
{
    pEng = engOpen( NULL );
}

MT4_EXPFUNC void InitCloseBuffer( int size )
{
    closev = mxCreateDoubleMatrix( 1, size, mxREAL );
    if ( closev != NULL )
         closevp = mxGetPr( closev );

 // ------------------------------------------------------------------
 // the following code bugs when separated from the code above
 // and put in another function called right after this one

    engPutVariable( pEng, "closev",  closev );
    engEvalString(  pEng, "[mainNet] = PTrainInit();" );
    engEvalString(  pEng, "[hitrate, mainNet] = PTrain(mainNet, closev);" );

    engEvalString(  pEng, "outGetP = PGetPrediction(mainNet, closev)" );

    getPArray = engGetVariable( pEng, "outGetP" );

    double *p;
    if ( getPArray != NULL )
        p = mxGetPr( getPArray );

// end of the separated code
// -----------------------------------------------------------------
}

Однако мне нужно разделить обе функции,
потому что мне нужно заполнить closev значениями.

Что я делаю неправильно?

Благодарность

Джефф


person Jeff    schedule 12.01.2015    source источник


Ответы (1)


хорошо, я нашел ответ: изначально я сделал автономный проект MATLAB, который работал нормально, но closev был по столбцам, а в DLL closev по строкам.

Кроме того, заполнение closev, а затем использование второй, отдельной функции, было совершенно другим использованием внутренностей функции, чем с незаполненным closev.

Однако из-за этих двух вещей это выглядело странно с точки зрения ошибок.

Рад, что смог заставить это работать.

JfLB

person Jeff    schedule 13.01.2015