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

 
Maxim Kuznetsov:
по моему скромному мнению, тот самый случай когда правильнее всё это сделать в DLL.
Это как посмотреть, если нужна нативная реализация, тогда DLL сразу отметаются. В моем случае нужна именно нативная реализация...
 
fxsaber:
Аналогично, с любым стандартным типом или простой структурой.

Спасибо!

Но, честно говоря, я люблю прямые решения, без использования лишних зависимостей, типа включаемых файлов, поэтому для своей задачи я пошел коротким путем, взяв основной принцип (кастинг через структуры), как мне и посоветовали (в том числе и по вашей библиотеке):

struct sFloat {float v0;};
struct sFloatBytes {uchar v0, v1, v2, v3;};

bool FloatToBytes (const float val,uchar & out[])
{
   sFloat F; F.v0 = val;
   
   sFloatBytes Fb = (sFloatBytes)F;
   
   out[0] = Fb.v0;
   out[1] = Fb.v1;
   out[2] = Fb.v2;
   out[3] = Fb.v3;
   
   return true;
}
 
Alexey Volchanskiy:
Да, глобально. Но раз писать в бинар, может сразу так и делать? Винда же все равно все кешит.
Не вижу смысл делать лишние телодвижения (сначала писать на жесткий, потом читать, чтобы получить байты) если можно обычным кастингом прямо в регистре и кэш памяти процессора это все провернуть :)
 
Alexey Volchanskiy:
Винда же все равно все кешит.

Кстати, а вот и нет :)

Чтобы записываемые данные функцией FileWriteFloat (да и любой другой) затем были доступны для чтения функцией FileReadFloat, к сожалению, необходима ф-я FileFlush, чтобы сбросить на диск всех данных, оставшихся в файловом буфере ввода-вывода. Похоже, что запись и чтение происходит из отдельных буфферов, которые нужно синхронизировать вручную через запись и чтение на жесткий диск. Если подумать, то это вполне разумно, я так думаю.

 
Marat Sultanov:

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

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

https://www.mql5.com/ru/code/845
CFastFile - класс для работы с байтовым массивом как с файлом
CFastFile - класс для работы с байтовым массивом как с файлом
  • голосов: 27
  • 2012.02.29
  • o_O
  • www.mql5.com
Класс CFastFile избавляет от необходимости промежуточной записи данных в физический файл на диске. Это позволяет получить значительное ускорение при работе с данными.
 

Ого, вот это круто! И почему я сразу не нашел ваш класс? Видимо, плохо искал :(

Кстати, я и сам подобный класс написал, только оставалось сделать последний штрих (float и double), собственно, из-за которого я и под застрял.