ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Не удаёцо запись флоатов в динамич. массив байтов
  #1  
Старый 22.07.2007, 12:16
Аватар для Дикс
Дикс
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме:
2209675

Репутация: 537


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

Здрасти.
Подскажите, пожалуйста, ответ на следующий вопрос.

Создал я динамический массив байтов
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
и через него внести число, но я не совсем понимаю как это сделать.
 
Ответить с цитированием

  #2  
Старый 22.07.2007, 12:39
Аватар для Ni0x
Ni0x
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме:
2009677

Репутация: 472
По умолчанию

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

  #3  
Старый 22.07.2007, 12:59
Аватар для _Great_
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

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

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

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

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

  #4  
Старый 22.07.2007, 13:19
Аватар для Joker-jar
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

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

  #5  
Старый 22.07.2007, 13:49
Аватар для Дикс
Дикс
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме:
2209675

Репутация: 537


Отправить сообщение для Дикс с помощью ICQ
По умолчанию

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

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

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

Как мне задать нормальный флоат?
 
Ответить с цитированием

  #6  
Старый 22.07.2007, 14:01
Аватар для Joker-jar
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

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

  #7  
Старый 22.07.2007, 14:10
Аватар для Ni0x
Ni0x
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме:
2009677

Репутация: 472
По умолчанию

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

  #8  
Старый 22.07.2007, 15:05
Аватар для Дикс
Дикс
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме:
2209675

Репутация: 537


Отправить сообщение для Дикс с помощью ICQ
По умолчанию

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

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

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

  #9  
Старый 23.07.2007, 00:36
Аватар для da_ff
da_ff
Участник форума
Регистрация: 11.07.2006
Сообщений: 125
Провел на форуме:
413927

Репутация: 71
Отправить сообщение для da_ff с помощью ICQ
По умолчанию

собсна решил тоже посодействовать
обьявляется массив с размерность кратна 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..
 
Ответить с цитированием

  #10  
Старый 23.07.2007, 00:50
Аватар для nc.STRIEM
nc.STRIEM
Members of Antichat - Level 5
Регистрация: 05.04.2006
Сообщений: 1,066
Провел на форуме:
3493315

Репутация: 1228


Отправить сообщение для nc.STRIEM с помощью ICQ
По умолчанию

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





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ