Из float в массив uchar - страница 2

 
Marat Sultanov:
Прошу прощения, а можно узнать по больше об этом, уважаемом, "Василий", например его ник? :)

Нашел

Только там структуру в массив. Принцип тот же.

 
Marat Sultanov:
Спасибо! Но, к сожалению, там используются внешние библиотеки, т.е. не при помощи MQL...

Там есть пример, без использования dll,

Пример 4. Копирование структур средствами MQL5
struct str1
{
  double d; // 8 байт
  long l;   // 8 байт
  int i[3]; // 3*4=12 байт
};
struct str2
{
  uchar c[8+8+12]; // размер структуры str1
};
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  str1 src; 
  src.d=-1;
  src.l=20;
  //--- заполняем параметры структуры
  ArrayInitialize(src.i, 0); 
  str2 dst;
  //--- превратили структуру в байтовый массив
  dst=src; 
}

 Таким вот нехитрым способом мы скопировали структуру в байтовый массив. 

 
Sergey Chalyshev:

Там есть пример, без использования dll,

Вы абсолютно правы. Я не внимателен! Все оказалось очень просто, просто до безумия :)

Это то, что надо, спасибо большое!

"Все гениальное - просто!" 

 
Dmitry Fedoseev:

Нашел

Только там структуру в массив. Принцип тот же.

Да, это работает. Спасибо большое!

 

Теперь я счастлив :) Всем большое спасибо за помощь. Вы, прямо, меня засыпали великолепными решениями, сам бы ни за-что не догадался :) 

Тема закрыта! 

 
Marat Sultanov:

Есть еще вариант, которым я пользуюсь, но это, все таки, не рентабельно.

Суть заключается в том, что нужно сначала число записать в бинарный файл, а потом прочитать 4 байта. Но это сойдет лишь для экспериментов и как очень временное решение :)

Кстати да )) Это очень похоже на арифметику указателей, когда можно тупо пройтись по float/double указателем на uchar и побайтово считать значения. А если читать - писать в shared memory? На сайте есть статьи, как это сделать без DLL? но по любасу придется использовать Win API.

Кстати, вопрос ТС, а за каким мяу это все нужно? У меня такой вопрос на С++ возник давно и вроде только один раз, когда нужно было у огроменного массива поменять знак чисел double с плюса на минус. Тогда оказалось по времени очень выгодно работать непосредственно со знаковой частью с помощью указателей А в вашем случае зачем?.  

 
Alexey Volchanskiy:

А если читать - писать в shared memory? На сайте есть статьи, как это сделать без DLL? но по любасу придется использовать Win API.

Можно использовать файловые операции и RamDisk, тогда можно будет обойтись лишь средствами MQL...

Alexey Volchanskiy: 

Кстати, вопрос ТС, а за каким мяу это все нужно? У меня такой вопрос на С++ возник давно и вроде только один раз, когда нужно было у огроменного массива поменять знак чисел double с плюса на минус. Тогда оказалось по времени очень выгодно работать непосредственно со знаковой частью с помощью указателей А в вашем случае зачем?. 

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

 
Marat Sultanov:

Можно использовать файловые операции и RamDisk, тогда можно будет обойтись лишь средствами MQL...

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

по моему скромному мнению, тот самый случай когда правильнее всё это сделать в DLL.
 
#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

void OnStart()
{
  float Tmp = 1;
  
  Print(ArraySize(_R(Tmp).Bytes)); // Массив _R(Tmp).Bytes
}
Аналогично, с любым стандартным типом или простой структурой.
 
Marat Sultanov:

Можно использовать файловые операции и RamDisk, тогда можно будет обойтись лишь средствами MQL...

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

Да, глобально. Но раз писать в бинар, может сразу так и делать? Винда же все равно все кешит.
Причина обращения: