В шоке от напряжности программирования на C++ - страница 5

 
Figar0 >>:

Похоже я был прав, когда подумал что это не так просто)

Обрабатывать этот массив в этой самой ДЛЛ, грубо говоря, в ДЛЛ функция в которую надо передать все цены клоузе с сотворения мира, многократно их там обработать и вернуть в советник результат просто одно double....

Я делаю так :

#import "********.dll"
..............................................
bool  InitRates( int bars,  int time[], double op[], double hi[], double lo[], double cl[], double vl[],
           	     double pnt,
           	     double bid,
	              double ask
           	     );
.............................
#import
......................................................................
int mtfCopyRates(string symb="",int prd=0, int BarsCNT=100, int from = 0)
{
int strtBn = BarsCNT+from;
int prdbcnt = iBars(symb, prd)-1;
    if((strtBn>=MAXRatesCNT)||(BarsCNT<0)||(strtBn>prdbcnt))
    {
        Print("strtBn = ",strtBn," MAXRatesCNT = ",MAXRatesCNT," prdbcnt = ",prdbcnt);
        return(-1);
    }
int bCNT    = -1;
    if(strtBn==0)
        bCNT = MathMin(MAXRatesCNT,MathMin(MAXBARSCOUNT, prdbcnt));
    else 
        bCNT = MathMin(MathMin(MAXRatesCNT,strtBn), MathMin(MAXBARSCOUNT, prdbcnt));
   
    Print(symb," mtfCopyRates():=> bCNT = ",bCNT-from," from = ",from);
    
    for(int i=bCNT-1;i>=from;i--)
    {
        time[i]  = NormalizeDouble( iTime  ( symb, prd, i ) , Digits );
        open[i]  = NormalizeDouble( iOpen  ( symb, prd, i ) , Digits );
        high[i]  = NormalizeDouble( iHigh  ( symb, prd, i ) , Digits );
        low[i]   = NormalizeDouble( iLow   ( symb, prd, i ) , Digits );
        close[i] = NormalizeDouble( iClose ( symb, prd, i ) , Digits );
        volume[i]= NormalizeDouble( iVolume( symb, prd, i ) , Digits );
    }
    i++;
    
    point_MT   = Point; 
    spread_MT  = MathAbs(Ask-Bid);
    double ask = NormalizeDouble(Ask,Digits);
    double bid = NormalizeDouble(Bid,Digits);
    bool res   = InitRates( bCNT, time, open, high, low, close, volume, point_MT, bid, ask);
    if(!res )
    {
        Print("Error Rates Initialisation !");
        return(-10);
    }
    Print("mtfCopyRates() ==> bCNT = ",bCNT," i = ",i);
    return(bCNT-i);
}//mtfCopyRates(...)
................................................
Функция возвращает либо количество скопированных данных, либо число < 0 в случае ошибки.

В длл прописываю функцию :


........... !!!!! Это часть С-шного файла

__declspec(dllexport)   bool  __stdcall InitRates(
	   int bars, 
	   unsigned int time[], 
	   double op[], 
	   double hi[], 
	   double lo[], 
	   double cl[], 
	   double vl[],
	   double pnt,
	   double bid,
	   double ask
	   )
   {
	   Bars   = bars;
	   Time   = time;
	   Open   = op;
	   High   = hi;
	   Low    = lo;
	   Close  = cl;
	   Volume = vl;
	   Point  = pnt;
	   Bid    = bid;
	   Ask    = ask;
	   spread = Ask-Bid;
	   RatesInited=true;
	   return(RatesInited);
   }

Описание пременных :

... ВНИМАНИЕ ЭТО часть С-шный ХЕДЕР ФАЙЛА !!!!!!!!!!

#ifndef EXT_VAR
#define EXT
#else
#define EXT extern
#endif
 EXT unsigned long  Bars; 
 EXT unsigned int  *Time;
 EXT double        *Open; 
 EXT double        *High; 
 EXT double        *Low; 
 EXT double        *Close;
 EXT double        *Volume;
 EXT double        *OpenInterest;
 EXT double         Point;
 EXT double         spread;
 EXT double         Ask;
 EXT double         Bid;
 EXT bool           RatesInited;
 EXT double         EmptyIndicatorsValue;

 __declspec(dllexport)   bool  __stdcall InitRates( 
	   int bars, 
	   const unsigned int time[], 
	   const double open[], 
	   const double high[], 
	   const double low[], 
	   const double close[], 
	   const double volume[], 
	   double pnt,
	   double Bid,
	   double Ask
	   );

То есть сразу всю необходимую мне инфу запихиваю в С-среду и там обрабатываю. В принципе функции написаны так, что могут быть вызваны как из МКЛ, так и вызывать друг-друга в самой длл. А там уж творите, что угодно. Все работает нормально.

Можно передавать через файлы, но через файлы дольше. 

Успехов.

 
VladislavVG писал(а) >>

Я делаю так ....

Ух.... Мне кажется исчерпывающе, прям в раздел Статьи просится. Огромное спасибо. Буду творить)...

 
Figar0 >>:

Ух.... Мне кажется исчерпывающе, прям в раздел Статьи просится. Огромное спасибо. Буду творить)...

Да, еще,я считал само собой разумеющимся, но лучше сразу укажу :

Описание самих массивов в МКЛ :

#define MAXRatesCNT 500000
static datetime  time[MAXRatesCNT];
static double    open[MAXRatesCNT],   high[MAXRatesCNT],low[MAXRatesCNT], close[MAXRatesCNT], volume[MAXRatesCNT], point_MT, spread_MT;

статик там вообще то не обязательно - они и так в хедере описаны как глобальные - просто осталось от С.

Удачи.

 

И снова появились проблемы с С++ =(

Пытаюсь написать клиент+серверную платформу. 

Естественно, сервер обязан быть многопоточным. Проблема возникает при создании нового потока:

class Server
{
   public: void Method(void *params)
           {
             //
           }
}

void main()
{
   Server* a=new Server();
   //Сначала писал так:
   _beginthread(a->Mehod,0,NULL); //Ошибка  error C3867: 'Server::AcceptIncomingSocket': function call missing argument list; use     '&Server::AcceptIncomingSocket' to create a pointer to member
   
   //Попробовал как было написано. И вышло такое:
   _beginthread(&Server::Method,0,a); // error C2664: cannot convert parameter 1 from 'void (__thiscall Server::* )(void *)' to 'void (__cdecl *)(void *)'
}

Насколько я понимаю, ошибка в том, что методы класса - __thiscall функции, а первый параметр должен быть _cdecl ф-цией?

 

Если используются сишные библиотеки то рекомендуют использовать _beginthreadex.

Так же метод класса передать не удалось ни в каком виде. В итоге забил на это и передаю указатель на обычную глабальную функцию а в неё уже вызываю нужные методы классов.

Ещё с синхронизацией доступа к общим переменным и массивам стоит быть аккуратным и почитать об этом. При деклорации общих переменных (атомарный доступ) для разных потоков использую volatileи пока проблем не наблюдал. Всё работает стабильно. (например volatile int Flag; )



 
elritmo >>:

Так же метод класса передать не удалось ни в каком виде. В итоге забил на это и передаю указатель на обычную глабальную функцию а в неё уже вызываю нужные методы классов.

Так и сделал, спасибо!

Причина обращения: