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

 

ваш код

#define SIZE 12 
   data[0]=1234999999; data[1]=-5678; data[3]=23451444; // а где data[2]??
   MemWrite(hmem,data,HEAD,SIZE,err);
   data[0]=0; data[1]=0; data[3]=0;  // а где data[2]??
   MemRead(hmem,data,HEAD,SIZE,err); // тут вы читаете 12 байт (3 числа)
   Alert("data[1]= "+data[3]); // но выводите четвертое
 
Zhunko:

Чтобы проверить надо его прочитать. Разве есть другой способ?

Вот запись 2-х массивов:

Всё же, проще в тестовый скрипт с примерами заглянуть. 

Спасибо, 2 массива работают! Скрипт смотрел, но не увидел там что нужно ставить этот множитель 4 на размер первого массива чтобы можно было задать новый массив.

Мне достаточно узнать что область под массив выделена, например после его записи туда. Пробовал также функцию MemoryIndexByName(), но она тоже не работает.

Разве нет никакой возможности прочитать хэндл выделенной памяти? Зачем же для этого заново считывать весь массив? Причем считывание всегда работает только все данные равны нулю и ошибки нет.

 
sergeev:

ваш код

В функции MemWrite(hmem,data,HEAD,SIZE,err) вроде бы передается весь массив data. Или нужно записывать каждый элемент по отдельности в цикле? Как тогда это делать чтобы правильно задать все смещения? К сожалению не нашел этой формулы в примерах, а угадать не удалось. Тоже самое непонятно и для чтения. data[2] равна нулю после инициализации если не задана.

 
Andrei01:

Спасибо, 2 массива работают! Скрипт смотрел, но не увидел там где нужно ставить этот множитель 4 на размер первого массива чтобы можно было задать новый массив.

Мне достаточно узнать что область под массив выделена, например после его записи туда. Пробовал также функцию MemoryIndexByName(), но она тоже не работает.

Разве нет никакой возможности прочитать хэндл выделенной памяти? Зачем же для этого заново считывать весь массив? Причем считывание всегда работает только все данные равны нулю и ошибки нет.


Вот аналогия. Когда работаете с глобальными переменными, как проверяете значение глобальной переменной? Просто читаете её. Нужен ли для чтения её значения какой-нибудь дескриптор?

В библиотеке реализован простейший интерфейс. Запись-чтение, чтение-запись. Ничего больше не надо. Ничего не прочитано, значит ничего не записано.

Все функции в библиотеке работают. Не все сможете проверить. 

 
Zhunko:

Вот аналогия. Когда работаете с глобальными переменными, как проверяете значение глобальной переменной? Просто читаете её. Нужен ли для чтения её значения какой-нибудь дескриптор?

В библиотеке реализован простейший интерфейс. Запись-чтение, чтение-запись. Ничего больше не надо. Ничего не прочитано, значит ничего не записано.

В глобальных переменных есть функция GlobalVariableCheck() чтобы проверить существует ли она. Считывание не дает однозначной информации о существовании так как всегда что-то считается, например нули. Также непонятно зачем в библиотеке находятся эти нерабочие функции для проверки существования области памяти.
 
Andrei01:
В глобальных переменных есть функция GlobalVariableCheck() чтобы проверить существует ли она. Считывание не дает однозначной информации о существовании так как всегда что-то считается, например нули. Также непонятно зачем в библиотеке находятся эти нерабочие функции для проверки существования области памяти.

Тут тоже самое. Одно любое обращение к памяти создаёт отображение с выделенной памятью с затребованным размером. Что туда запишите, то и прочитаете.

С какой целью надо проверять наличие выделенной памяти? Считайте, что она всегда есть. Не надо на этом заморачиваться. Специально так сделал. Обращения синхронизированны в библиотеке. Так, что одновременно читать и писать не получится. Пользуйтесь этим. Там всё написано.

Все остальные функции работают. Не все Вам доступны. Да и не нужны они Вам. Они для ускорения работы с памятью нужны.

 
Andrei01:

В функции MemWrite(hmem,data,HEAD,SIZE,err) вроде бы передается весь массив data.

Андрей, написано ведь черным по белому - SIZE.

Или нужно записывать каждый элемент по отдельности в цикле?

нет, весь массив целиком

К сожалению не нашел этой формулы в примерах, а угадать не удалось.

зачем же гадать, если вам доступен ПОЛНОСТЬЮ ИСХОДНЫЙ КОД, в отличии от закрытой SharedMemoryMT4

 

вы поняли все что я вам написал здесь?

#define SIZE 12 
   data[0]=1234999999; data[1]=-5678; data[3]=23451444; // а где data[2]??
   MemWrite(hmem,data,HEAD,SIZE,err);
   data[0]=0; data[1]=0; data[3]=0;  // а где data[2]??
   MemRead(hmem,data,HEAD,SIZE,err); // тут вы читаете 12 байт (3 числа)
   Alert("data[1]= "+data[3]); // но выводите четвертое, которое не прочиталось и равно 0
Ошибку свою видите?
 
Zhunko:

С какой целью надо проверять наличие выделенной памяти? Считайте, что она всегда есть.

Проверка на наличие выделенной памяти это стандартная и минимальная вещь в любой библиотеке и вариантов применения этому много бывает. Вы же сами такую функцию написали почему-то.

А размер этой выделенной памяти можно узнать с помощью какой-то функции?

 
sergeev:

вы поняли все что я вам написал здесь?

Ошибку свою видите?
Пока не понимаю вашего намека и формулу пока не удалось разгадать секретную. ))  Пробовал считывать и 16 и 20 байт, но всё равно не удается считать 4 число.