Здрасти. Подскажите, пожалуйста, ответ на следующий вопрос. Создал я динамический массив байтов 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 и через него внести число, но я не совсем понимаю как это сделать.
пихать флоат в чар - оригинально. *(float*)cur++ = 5.12 будет хотя бы синтаксически правильно ЗЫ. Насчет 5,12. запятая по определению отделяет выражения, которые выполняются последовательно и запихивается последнее. Например, чтобы кратко сделать в функции main(), допустим, показ MessageBox и выход одной строчкой, можно записать Code: return MessageBox(0, "Message", "Title", 0) , 0; Сначала выполняется первое выражение - вызов MessageBox, его результатом будет нажатая кнопка в окне, потом выполняется выражение 0, которое и возвращается по return'у
А пробовал вводить числа, большие 255? На мой взгляд, метод вообще не годится. Думаю, здесь подойдет структура с вариантной частью.
Это всё задание учебника. Здесь нужно использовать именно массив байтов. Если написать число через точку - оно становится double: conversion from 'const double' to 'char', possible loss of data а если вот так *(float *)cur++ = 5.12; то warning C4305: '=' : truncation from 'const double' to 'float' Как мне задать нормальный флоат?
Хммм. По-любому с числом с плавающей точкой работать в чистом виде нельзя. Определись, сколько байт у тебя будет отведено в массиве для целого числа, и сколько байт для целой и дробной части дробного числа. К примеру, для целого 2 байта. Тогда разделяй число на старшый и младший байт, записывай их в соответствующие места. Также и для дробных (например, 2 байта для целой и 2 для дробной части). Думаю, так
флоат-числа вводит пользователь в виде 3,12.. Значит я могу заносить флоаты в массив как два обычных инта? =\ Видите в чём у меня задачо: юзер вводит строку: % 2f 3,1 2,14 а мне нужно писать её в память в таком виде: 1231214 где 1 - тип (флоат), 2 - кол-во чисел, 3 - целая часть первого флоата, 1 - дробная, 2 - целая второго, 14 - дробная.. Вот такая муть. 2 Joker-jar спасибо большое, наконец я понял как решать эту задачу.
собсна решил тоже посодействовать обьявляется массив с размерность кратна 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
вобще char это тот же int, ток в нем хранятья asci коды символов, и памяти под него выделяеться сток скок под int, поэтому не думаю что у тя получеться засунуть в char float, это тож самое что пихать float в int.
> вобще char это тот же int, ток в нем хранятья asci коды символов, и памяти под него выделяеться сток скок под int char - 1 байт int, long, DWORD - 4 байта short, short int, WORD - 2 байта Или типа программа динамически выделяет память в зависимости от платформы?)))
компиляция под 8086 архитектуру типа int будет содержать в себе 2 байта вместо привычных 4. кстати, никто не обещает, что байт равный char'у в левой архитектуре будет октетом и содержать 8 бит, поэтому используем, например stdint.h
Проверь на Паскале и Делфи writeln(sizeof(integer)); В Паскале - 2, в Делфи - 4. На этом иногда ловятся (задача: дан массив чисел в диапазоне 1..100000 ..., в Паскале int'a не хватает).