PDA

Просмотр полной версии : Не удаёцо запись флоатов в динамич. массив байтов


Дикс
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.

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

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

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

Как мне задать нормальный флоат?
(float)5.12 уже не рулит?

_Great_
23.07.2007, 09:50
вобще char это тот же int, ток в нем хранятья asci коды символов, и памяти под него выделяеться сток скок под int
Стрём, учи матчать. Ни одного верного слова в предложении

Joker-jar
23.07.2007, 09:59
Под char выделен 1 байт, а под int, насколько помню, 2 или 4 байта, в зависимости от платформы

KEZ
23.07.2007, 13:43
> вобще char это тот же int, ток в нем хранятья asci коды символов, и памяти под него выделяеться сток скок под int

char - 1 байт
int, long, DWORD - 4 байта
short, short int, WORD - 2 байта

Или типа программа динамически выделяет память в зависимости от платформы?)))

_Great_
23.07.2007, 14:09
KEZ, int на 8086 2 байта. на x86 4 байта

KEZ
23.07.2007, 14:16
что значит на 8086 2 байта?

tclover
23.07.2007, 14:22
cout << "The size of a char is:\t\t" << sizeof(char) << " bytes.\n";

The size of a char is: 1 bytes.

ZaCo
23.07.2007, 14:23
компиляция под 8086 архитектуру типа int будет содержать в себе 2 байта вместо привычных 4. кстати, никто не обещает, что байт равный char'у в левой архитектуре будет октетом и содержать 8 бит, поэтому используем, например stdint.h

Joker-jar
24.07.2007, 01:45
Проверь на Паскале и Делфи writeln(sizeof(integer)); В Паскале - 2, в Делфи - 4. На этом иногда ловятся (задача: дан массив чисел в диапазоне 1..100000 ..., в Паскале int'a не хватает).

_Great_
24.07.2007, 08:37
что значит на 8086 2 байта?
В 16битных процессорах инт был 16 бит или 2 байта - максимальное число, обрабаьываемое процессором

sn0w
26.07.2007, 13:17
сперва полезно почитать си для чайников и отдать особое внимание указателям а потом спрашивать