Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Не удаёцо запись флоатов в динамич. массив байтов |

22.07.2007, 12:16
|
|
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме: 2209675
Репутация:
537
|
|
Не удаёцо запись флоатов в динамич. массив байтов
Здрасти.
Подскажите, пожалуйста, ответ на следующий вопрос.
Создал я динамический массив байтов
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
и через него внести число, но я не совсем понимаю как это сделать.
|
|
|

22.07.2007, 12:39
|
|
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме: 2009677
Репутация:
472
|
|
дробная часть отделяется точкой.
*cur++ = 5.12;
|
|
|

22.07.2007, 12:59
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
дробная часть отделяется точкой.
*cur++ = 5.12;
пихать флоат в чар - оригинально.
*(float*)cur++ = 5.12 будет хотя бы синтаксически правильно
ЗЫ. Насчет 5,12. запятая по определению отделяет выражения, которые выполняются последовательно и запихивается последнее.
Например, чтобы кратко сделать в функции main(), допустим, показ MessageBox и выход одной строчкой, можно записать
Код:
return MessageBox(0, "Message", "Title", 0) , 0;
Сначала выполняется первое выражение - вызов MessageBox, его результатом будет нажатая кнопка в окне, потом выполняется выражение 0, которое и возвращается по return'у
|
|
|

22.07.2007, 13:19
|
|
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме: 4172659
Репутация:
646
|
|
*cur++ = '0'; // тип данных. Для инт - 0, для флоат - 1
*cur++ = '2'; // сколько чисел
*cur++ = 12; // само число
*cur++ = 54;
А пробовал вводить числа, большие 255? На мой взгляд, метод вообще не годится. Думаю, здесь подойдет структура с вариантной частью.
|
|
|

22.07.2007, 13:49
|
|
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме: 2209675
Репутация:
537
|
|
Это всё задание учебника. Здесь нужно использовать именно массив байтов.
Если написать число через точку - оно становится double:
conversion from 'const double' to 'char', possible loss of data
а если вот так
*(float *)cur++ = 5.12;
то
warning C4305: '=' : truncation from 'const double' to 'float'
Как мне задать нормальный флоат?
|
|
|

22.07.2007, 14:01
|
|
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме: 4172659
Репутация:
646
|
|
Хммм. По-любому с числом с плавающей точкой работать в чистом виде нельзя. Определись, сколько байт у тебя будет отведено в массиве для целого числа, и сколько байт для целой и дробной части дробного числа. К примеру, для целого 2 байта. Тогда разделяй число на старшый и младший байт, записывай их в соответствующие места. Также и для дробных (например, 2 байта для целой и 2 для дробной части). Думаю, так
|
|
|

22.07.2007, 14:10
|
|
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме: 2009677
Репутация:
472
|
|
Great, я не смотрел что у него там чар, я просто написал как правильно дробную часть отделять.
|
|
|

22.07.2007, 15:05
|
|
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме: 2209675
Репутация:
537
|
|
флоат-числа вводит пользователь в виде 3,12..
Значит я могу заносить флоаты в массив как два обычных инта? =\
Видите в чём у меня задачо:
юзер вводит строку: % 2f 3,1 2,14
а мне нужно писать её в память в таком виде: 1231214
где 1 - тип (флоат), 2 - кол-во чисел, 3 - целая часть первого флоата, 1 - дробная, 2 - целая второго, 14 - дробная.. Вот такая муть.
2 Joker-jar
спасибо большое, наконец я понял как решать эту задачу.
|
|
|

23.07.2007, 00:36
|
|
Участник форума
Регистрация: 11.07.2006
Сообщений: 125
Провел на форуме: 413927
Репутация:
71
|
|
собсна решил тоже посодействовать
обьявляется массив с размерность кратна 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
Последний раз редактировалось da_ff; 23.07.2007 в 11:17..
|
|
|

23.07.2007, 00:50
|
|
Members of Antichat - Level 5
Регистрация: 05.04.2006
Сообщений: 1,066
Провел на форуме: 3493315
Репутация:
1228
|
|
вобще char это тот же int, ток в нем хранятья asci коды символов, и памяти под него выделяеться сток скок под int, поэтому не думаю что у тя получеться засунуть в char float, это тож самое что пихать float в int.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|