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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Дикс, 22 Jul 2007.

  1. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    Здрасти.
    Подскажите, пожалуйста, ответ на следующий вопрос.

    Создал я динамический массив байтов
    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. Ni0x

    Ni0x Elder - Старейшина

    Joined:
    27 Aug 2006
    Messages:
    338
    Likes Received:
    157
    Reputations:
    37
    дробная часть отделяется точкой.
    *cur++ = 5.12;
     
  3. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    пихать флоат в чар - оригинально.

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

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

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

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    А пробовал вводить числа, большие 255? На мой взгляд, метод вообще не годится. Думаю, здесь подойдет структура с вариантной частью.
     
  5. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    Это всё задание учебника. Здесь нужно использовать именно массив байтов.
    Если написать число через точку - оно становится double:

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

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

    Как мне задать нормальный флоат?
     
  6. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Хммм. По-любому с числом с плавающей точкой работать в чистом виде нельзя. Определись, сколько байт у тебя будет отведено в массиве для целого числа, и сколько байт для целой и дробной части дробного числа. К примеру, для целого 2 байта. Тогда разделяй число на старшый и младший байт, записывай их в соответствующие места. Также и для дробных (например, 2 байта для целой и 2 для дробной части). Думаю, так
     
  7. Ni0x

    Ni0x Elder - Старейшина

    Joined:
    27 Aug 2006
    Messages:
    338
    Likes Received:
    157
    Reputations:
    37
    Great, я не смотрел что у него там чар, я просто написал как правильно дробную часть отделять.
     
  8. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    флоат-числа вводит пользователь в виде 3,12..
    Значит я могу заносить флоаты в массив как два обычных инта? =\

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

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

    da_ff Elder - Старейшина

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    собсна решил тоже посодействовать
    обьявляется массив с размерность кратна 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
     
    #9 da_ff, 23 Jul 2007
    Last edited: 23 Jul 2007
  10. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    вобще char это тот же int, ток в нем хранятья asci коды символов, и памяти под него выделяеться сток скок под int, поэтому не думаю что у тя получеться засунуть в char float, это тож самое что пихать float в int.
     
  11. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    (float)5.12 уже не рулит?
     
  12. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    Стрём, учи матчать. Ни одного верного слова в предложении
     
    1 person likes this.
  13. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Под char выделен 1 байт, а под int, насколько помню, 2 или 4 байта, в зависимости от платформы
     
  14. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    > вобще char это тот же int, ток в нем хранятья asci коды символов, и памяти под него выделяеться сток скок под int

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

    Или типа программа динамически выделяет память в зависимости от платформы?)))
     
    1 person likes this.
  15. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    KEZ, int на 8086 2 байта. на x86 4 байта
     
  16. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    что значит на 8086 2 байта?
     
  17. tclover

    tclover nobody

    Joined:
    13 Dec 2005
    Messages:
    741
    Likes Received:
    682
    Reputations:
    287
    cout << "The size of a char is:\t\t" << sizeof(char) << " bytes.\n";

    The size of a char is: 1 bytes.
     
    2 people like this.
  18. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    компиляция под 8086 архитектуру типа int будет содержать в себе 2 байта вместо привычных 4. кстати, никто не обещает, что байт равный char'у в левой архитектуре будет октетом и содержать 8 бит, поэтому используем, например stdint.h
     
    1 person likes this.
  19. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Проверь на Паскале и Делфи writeln(sizeof(integer)); В Паскале - 2, в Делфи - 4. На этом иногда ловятся (задача: дан массив чисел в диапазоне 1..100000 ..., в Паскале int'a не хватает).
     
  20. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    В 16битных процессорах инт был 16 бит или 2 байта - максимальное число, обрабаьываемое процессором