Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Не удаёцо запись флоатов в динамич. массив байтов (https://forum.antichat.xyz/showthread.php?t=45017)

Дикс 22.07.2007 12:16

Не удаёцо запись флоатов в динамич. массив байтов
 
Здрасти.
Подскажите, пожалуйста, ответ на следующий вопрос.

Создал я динамический массив байтов
char *start = new char[1024];
char *current_char = start;

потом передал его функции:
current_char = in(start);

Определение функции следующее:
char *in(char *cur)

Она принимает указатель на начало динамического массива байтов, вносит туда
несколько байт информации и возвращает указатель на текущую позицию в массиве.

Мне нужно занести в неё данные типа int и float.
С int всё получается, а с float нет. На экран выводится 0.00000

Вот что я вношу в массив чтобы хранить там int:

*cur++ = '0'; // тип данных. Для инт - 0, для флоат - 1
*cur++ = '2'; // сколько чисел
*cur++ = 12; // само число
*cur++ = 54;

Потом включается парсер и выводит текст:
Print 2 ints - 12 54.

А теперь мне нужно внести туда float:
*cur++ = '1';
*cur++ = '1';
*cur++ = 5,12;

на что я получаю
Print 1 floats: 0.000000

Мне подсказывали что нужно создать указатель типа float, натравить его на cur
и через него внести число, но я не совсем понимаю как это сделать.

Ni0x 22.07.2007 12:39

дробная часть отделяется точкой.
*cur++ = 5.12;

_Great_ 22.07.2007 12:59

Цитата:

дробная часть отделяется точкой.
*cur++ = 5.12;
пихать флоат в чар - оригинально.

*(float*)cur++ = 5.12 будет хотя бы синтаксически правильно

ЗЫ. Насчет 5,12. запятая по определению отделяет выражения, которые выполняются последовательно и запихивается последнее.

Например, чтобы кратко сделать в функции main(), допустим, показ MessageBox и выход одной строчкой, можно записать
Код:

return MessageBox(0, "Message", "Title", 0) , 0;
Сначала выполняется первое выражение - вызов MessageBox, его результатом будет нажатая кнопка в окне, потом выполняется выражение 0, которое и возвращается по return'у

Joker-jar 22.07.2007 13:19

Цитата:

*cur++ = '0'; // тип данных. Для инт - 0, для флоат - 1
*cur++ = '2'; // сколько чисел
*cur++ = 12; // само число
*cur++ = 54;
А пробовал вводить числа, большие 255? На мой взгляд, метод вообще не годится. Думаю, здесь подойдет структура с вариантной частью.

Дикс 22.07.2007 13:49

Это всё задание учебника. Здесь нужно использовать именно массив байтов.
Если написать число через точку - оно становится double:

conversion from 'const double' to 'char', possible loss of data

а если вот так
*(float *)cur++ = 5.12;
то
warning C4305: '=' : truncation from 'const double' to 'float'

Как мне задать нормальный флоат?

Joker-jar 22.07.2007 14:01

Хммм. По-любому с числом с плавающей точкой работать в чистом виде нельзя. Определись, сколько байт у тебя будет отведено в массиве для целого числа, и сколько байт для целой и дробной части дробного числа. К примеру, для целого 2 байта. Тогда разделяй число на старшый и младший байт, записывай их в соответствующие места. Также и для дробных (например, 2 байта для целой и 2 для дробной части). Думаю, так

Ni0x 22.07.2007 14:10

Great, я не смотрел что у него там чар, я просто написал как правильно дробную часть отделять.

Дикс 22.07.2007 15:05

флоат-числа вводит пользователь в виде 3,12..
Значит я могу заносить флоаты в массив как два обычных инта? =\

Видите в чём у меня задачо:
юзер вводит строку: % 2f 3,1 2,14
а мне нужно писать её в память в таком виде: 1231214
где 1 - тип (флоат), 2 - кол-во чисел, 3 - целая часть первого флоата, 1 - дробная, 2 - целая второго, 14 - дробная.. Вот такая муть.

2 Joker-jar
спасибо большое, наконец я понял как решать эту задачу.

da_ff 23.07.2007 00:36

собсна решил тоже посодействовать
обьявляется массив с размерность кратна 4 тк 4б размер float и соответственно перемещение между элементами массива не +1 а +4
int main ()
{
char *c=(char *)malloc(12);
char *ind=c;
float f=6.5;
CopyMemory(ind,&f,sizeof(float));
f=7.5;
ind+=4;
CopyMemory(ind,&f,sizeof(float));
f=8.5;
ind+=4;
CopyMemory(ind,&f,sizeof(float));
printf("%f %f %f",*(float*)&c[0],*(float*)&c[4],*(float*)&c[8]);
return 0;
}
здесь есть массив типа char в нем хранится три элемента типа float

nc.STRIEM 23.07.2007 00:50

вобще char это тот же int, ток в нем хранятья asci коды символов, и памяти под него выделяеться сток скок под int, поэтому не думаю что у тя получеться засунуть в char float, это тож самое что пихать float в int.


Время: 18:18