LINUX.ORG.RU

преобразование в float (double)


0

0

Имею строку с константой, равной, например, "3.25" (идет синтаксический разбор строки). Как из этой строки получить представление числа в машинном формате для float(double).


Ответ на: комментарий от gtyrin

> Т.е. сколько там float/double занимает в памяти получить эти байты массивом.

в смысле (char *)&float_var или что?

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

типа... Просто заполняю файл не мною придуманным форматом, а к тому же мне эти данные нужны и вдиалогах.

gtyrin
() автор топика
Ответ на: комментарий от gtyrin

Что-то я не догоняю...
Если грам. разбор, то почему не используешь flex/bison или хотя бы просто flex?
Он бы тебе выделил нужные лексемы в отдельные строчки - делай с ними что хочешь - хоть дергай тот же atof:

//tokens.h:
#define tkNUMBER 1
#define tkTEXT 2

//test.l:
%{
#include <stdio.h>
#include "tokens.h"
%}
%option noyywrap
%x TEXT
%%
[ \t\n]* /*skip whitespaces*/
-?[0-9]+("."[0-9]+) return tkNUMBER;
. begin(TEXT); yymore();
<TEXT>[ \n\t]* begin(INITIAL);
<TEXT>.* return tkTEXT;
%%

//test_main.c:
#include "tokens.h"
#include <stdio.h>
#include <assert.h>

int yylex();
void yyrestart(FILE*,FILE*);
extern char* yytext;

int main(int ac, char** av){
int token;
float num;
FILE* f = fopen(av[1],"r");
yyrestart(f,stdout);
while((token=yylex()) != 0){
switch(token){
case tkTEXT: /*...*/ break;
case tkNUMBER: num = atof(yytext); /*...*/ break;
}
}
return 0;
}

Flogger_d
()
Ответ на: комментарий от Flogger_d

Какой там flex/bison. У меня заказчик под M$. Это только что я взял QT ради кроссплатформенности. Не говоря о том, что в C/C++ я пишу только около года.

gtyrin
() автор топика
Ответ на: комментарий от gtyrin

Неужели, раз M$, то сканеры/парсеры они каждый раз пишут сами...
Точно помню, что flex был под маздай тоже. Кроме того, он генерит сишный код, которы вроде бы масдаем транслировался. Т.е. *.l можно обработать в Linux, потом просто переписать файлики в масдай и радоваться жизни

Flogger_d
()

Это не то, что я думаю?

#include <stdio.h>

int main (int argc, char ** argv)
{
        int i;
        char *str="3.12";
        union {
                float a;
                unsigned char k[sizeof(float)];
        } p;

        p.a=atof(str);
        for (i=0; i<sizeof(float); i++)
        printf ("byte %d: %d \n",i, (int)p.k[i]);
        return 1;
}

octy ★★
()
Ответ на: комментарий от octy

К сожалению чтение элемента union'а, отличного от того, в который была
произведена последняя запись вызывает implementation-defined behaviour (читай: как оно сработает и сработает ли вобще - неизвестно, это надо будет прочесть в документации конкретного компилятора). К счастью, можно вон так вот:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char **argv)
{
size_t i;
float a = atof(argv[1] ? argv[1] : "3.14");

for (i = 0; i < sizeof (float); i++)
printf ("%02x", ((unsigned char *) &a)[i]);

puts("");
return 0;
}

rihad
()
Ответ на: комментарий от rihad

Да, нашел в своём посте дурацкую, но тотальную ошибку. Забыл подключить stdlib - без этого фигня получилась.

С Вами я спорить не буду, ибо сам я самоучка, но ради интереса проверил: на VC/win, gcc, ifc/Linux & FreeBSD - результат не отличается.

octy ★★
()
Ответ на: комментарий от octy

Все мы самоучки :)

> Забыл подключить stdlib - без этого фигня получилась.

Я тоже забыл было, но всегда запускаю gcc -Wall -W - это меня спасло ;)

rihad
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.