File Mapping, как сделать правильно? - страница 4

 
Andrei01:
Да, но я уже потом заметил. Можно было бы все ненужное, которое тут большинство в отдельный файл поместить чтобы зря людям не рыскать по лесу. Всякие переменные типа char и т.п. тоже не актуальны для МТ4.

Другие типы важны для экономии памяти, когда требуется много написать. МТ4 не резиновый :-))

Например для работы с ценой совсем не обязательно писать double. Можно float. В два раза память съэкономит.

Или переменные типа BOOL. Они в MQL4 по 4 байта занимают. Записать их можно в 1 байт. Тут экономия в 4 раза.

 
Zhunko:

Или переменные типа BOOL. Они в MQL4 по 4 байта занимают. Записать их можно в 1 байт. Тут экономия в 4 раза.

Библиотека эта нормальная, но думаю до ума еще не доведена до конца. Например нужно вручную следить за размерами массивов и смещениями, а когда массивов больше 3 уже возникает значительная головная боль чтобы этим хозяйством управлять потому что последующие смещения зависят от предыдущих. Хотя наверно можно это все автоматизировать внутри пространства имени и хранить служебную информацию там.
 
Andrei01:
Библиотека эта нормальная, но думаю до ума еще не доведена до конца. Например нужно вручную следить за размерами массивов и смещениями, а когда массивов больше 3 уже возникает значительная головная боль чтобы этим хозяйством управлять потому что последующие смещения зависят от предыдущих. Хотя наверно можно это все автоматизировать внутри пространства имени и хранить служебную информацию там.

Это не задача для этой библиотеки. Это задача пользователя.

Рубанок чтобы строгать, а не шурупы заворачивать. 

 
Zhunko:

Это не задача для этой библиотеки. Это задача пользователя.

Рубанок чтобы строгать, а не шурупы заворачивать. 

Вот именно, пользователю нужен рубанок, а его заставляют им еще и шурупы заворачивать. ))

Пользователь обычно хочет пользоваться массивами как общепринято, а не заниматься еще и контролем размещения массива в памяти - эта задача должна решаться на уровне библиотеки, к тому же это несложная вещь.



 

sergeev:

еще раз

pos - с какой позиции

sz - сколько байт

вот тут баг в библиотеке - для массива размера 925 работает для 924 элемента, а для массива размером 1025 уже не работает для 1024 элемента.
#property indicator_chart_window
//--------------------------------------------------------------------
#define modeOpen   0
#define modeCreate 1
#import "MemMap32.dll"
int MemOpen(string path, int size, int mode, int &err[]);
int MemWrite(int hmem, int &v[], int pos, int sz, int &err[]);
//MemWrite(hmem,data,0,SIZE,err);
int MemRead(int hmem, int &v[], int pos, int sz, int &err[]);
//MemRead(hmem,data,0,SIZE,err);
int MemGetSize(int hmem, int &err[]);
int MemSetSize(int hmem, int size, int &err[]);
void MemClose(int hmem);
#import
int err[1];
//--------------------------------------------------------------------
void mcreate(string mname, string gname, int& hmem){
   hmem=MemOpen(mname, 0, modeCreate, err);
   if(hmem <= 0 || err[0] != 0) Alert("mcreate_err:mname= "+mname);
   else{ Alert("new "+gname+"= "+hmem); GlobalVariableSet(gname,hmem); }
}// mcreate("Local\\History","hmem",hmem);
//--------------------------------------------------------------------
void mclose(string gname, int& hmem){
   MemClose(hmem); GlobalVariableSet(gname,0); hmem=0;
}// mclose("hmem",hmem);

int hmem, data[1025],w;
//--------------------------------------------------------------------
int init(){ Alert("init");

   hmem = GlobalVariableGet("hmem");
   if(hmem <= 0) mcreate("Local\\History","hmem",hmem);
   MemSetSize(hmem,4*ArraySize(data),err);
//   Alert(MemGetSize(hmem,err));
   int i = 1024;
   // Test: Write & Read 
   data[i]=23451444;
   w=MemWrite(hmem,data,0,4*ArraySize(data),err);
   Alert(w);   
   data[i]=0;
   w=MemRead(hmem,data,0,4*ArraySize(data),err);
   Alert(err[0]);
   Alert(w);   
   Alert("data= "+data[i]);
}
//--------------------------------------------------------------------
int start(){
}
//--------------------------------------------------------------------
 
Zhunko:

Для сторонников простых решений сделал бы так:

Так тоже можно (ошибки не будет):

 Это здесь.

Вот пример бага в библиотеке, ошибка записи и чтения - Bd[424]=0, Bids[424]=1;

Массив размером до 500 работает, а при 600 уже ошибка.

//--------------------------------------------------------------------
#property indicator_chart_window
//--------------------------------------------------------------------
#import "SharedMemoryMT4.dll"
bool MemoryReadIntArray(int nArea, string sPrefixArea, int nIndex, string sName,
   int nStartByte, int&  aiArray[], int nSizeArray, int nStart, int nCount);
bool MemoryWriteIntArray(int nArea, string sPrefixArea, int nIndex, string sName,
   int nStartByte, int&  aiArray[], int nSizeArray, int nStart, int nCount);
bool MemoryCloseName(int nArea, string sPrefixArea, string sName);
#import
//--------------------------------------------------------------------
bool memwrite(int& A1[], int& A2[]){
   int sz1 = ArraySize(A1), sz2 = ArraySize(A2);
   MemoryWriteIntArray(0,"",-1,"MName",0,A1,sz1,0,sz1);
   bool r=MemoryWriteIntArray(0,"",-1,"MName",4*sz1,A2,sz2,0,sz2); return(r);
}// mwrite(A1,A2);
//--------------------------------------------------------------------
bool memread(int& A1[], int& A2[]){ 
   int sz1 = ArraySize(A1), sz2 = ArraySize(A2);
   MemoryReadIntArray(0,"",-1,"MName",0,A1,sz1,0,sz1);
   bool r=MemoryReadIntArray(0,"",-1,"MName",4*sz1,A2,sz2,0,sz2); return(r);
}// mread(A1,A2);
//--------------------------------------------------------------------
void mclose(){ MemoryCloseName(0,"","MName"); }
//--------------------------------------------------------------------
int start(){
}
//--------------------------------------------------------------------
int init(){ 

   mclose();
   test();
}
//--------------------------------------------------------------------
void test(){ 
      
   int mxcnt = 600;
   int Times[],Bids[];
   ArrayResize(Times,mxcnt); ArrayResize(Bids,mxcnt);
   for(int t = 0; t < mxcnt; t++){ Times[t] = 1; Bids[t] = 1; }
   memwrite(Times,Bids); 
   int Tm[],Bd[]; 
   ArrayResize(Tm,mxcnt); ArrayResize(Bd,mxcnt); 
   Alert(memread(Tm,Bd));
   for(t=0; t < mxcnt; t++){ 
      if(Tm[t] != Times[t]){ Alert("Tm["+t+"]="+Tm[t]+
         ", Times["+t+"]="+Times[t]); break; }
      if(Bd[t] != Bids[t]){ Alert("Bd["+t+"]="+Bd[t]+
         ", Bids["+t+"]="+Bids[t]); break; } 
   }
}
//--------------------------------------------------------------------
 
Andrei01:

Вот именно, пользователю нужен рубанок, а его заставляют им еще и шурупы заворачивать. ))

Пользователь обычно хочет пользоваться массивами как общепринято, а не заниматься еще и контролем размещения массива в памяти - эта задача должна решаться на уровне библиотеки, к тому же это несложная вещь.

Рекомендую, всё же, перевернуться с головы на ноги.
Andrei01:

Вот пример бага в библиотеке, ошибка записи и чтения - Bd[424]=0, Bids[424]=1;

Массив размером до 500 работает, а при 600 уже ошибка.


Посмотрю.

Так работает (скрипт):

#property show_inputs
#include <SharedMemory.mqh> // Заголовочный файл библиотеки "SharedMemory.dll".
extern int Size = 600;
//--------------------------------------------------------------------
int init()
 {
  MemoryCreateProjection(0, "", NULL, -1, "MName", 0x4000);
  Alert(MemorySize(0, "", -1, "MName"));
 }
//--------------------------------------------------------------------
void start()
 {
  test();
 }
//--------------------------------------------------------------------
int deinit()
 {
  mclose();
 }
//--------------------------------------------------------------------
bool memwrite(int& A1[], int& A2[])
 {
  int sz1 = ArraySize(A1), sz2 = ArraySize(A2);
  return(MemoryWriteIntArray(0, "", -1, "MName", 0, A1, sz1, 0, sz1) &&
         MemoryWriteIntArray(0, "", -1, "MName", 4 * sz1, A2, sz2, 0, sz2));
 }
//--------------------------------------------------------------------
bool memread(int& A1[], int& A2[])
 { 
  int sz1 = ArraySize(A1), sz2 = ArraySize(A2);
  return(MemoryReadIntArray(0, "", -1, "MName", 0, A1, sz1, 0, sz1) &&
         MemoryReadIntArray(0, "", -1, "MName", 4 * sz1, A2, sz2, 0, sz2));
 }
//--------------------------------------------------------------------
void mclose()
 {
  MemoryCloseName(0, "", "MName");
 }
//--------------------------------------------------------------------
void test()
 {
  int Times[];
  int Bids[];
  ArrayResize(Times, Size);
  ArrayInitialize(Times, 1);
  ArrayResize(Bids, Size);
  ArrayInitialize(Bids, 1);
  memwrite(Times, Bids);
  //----
  int Tm[];
  int Bd[]; 
  ArrayResize(Tm, Size);
  ArrayResize(Bd, Size); 
  Alert(memread(Tm, Bd));
  //----
  for (int t = 0; t < Size; t++)
   {
    if (Tm[t] != Times[t])
     {
      Alert("Tm[" + t + "] = " + Tm[t] + ", Times[" + t + "] = " + Times[t]);
//      break;
     }
    if (Bd[t] != Bids[t])
     {
      Alert("Bd[" + t + "] = " + Bd[t] + ", Bids[" + t + "] = " + Bids[t]);
//      break;
     } 
   }
 }
//--------------------------------------------------------------------
Но это не порядок. Исправлю.
 
Andrei01:
вот тут баг в библиотеке - для массива размера 925 работает для 924 элемента, а для массива размером 1025 уже не работает для 1024 элемента.


хотел бы узнать какой код ошибки возвращает? чтение, запись ?

есть ли проблемы с дальнейшим увеличением до 2048, 65536 элементов?
 
sergeev:

хотел бы узнать какой код ошибки возвращает? чтение, запись ?

есть ли проблемы с дальнейшим увеличением до 2048, 65536 элементов?
код ошибки ноль везде, а на второй раз уже терминал вылетает.
 
Andrei01 :

Вот пример бага в библиотеке, ошибка записи и чтения - Bd[424]=0, Bids[424]=1;

Массив размером до 500 работает, а при 600 уже ошибка.

Исправил. Выложу нескоро. Сейчас библиотека адаптируется для работы в МТ5. Если надо, в личку пришлю.
Причина обращения: