Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550

Коррекция перевода float > char[]

03.03.2010, 19:59. Показов 3948. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вечер добрый! Задача такова - из float'а получить строку, но после запятой нужно оставить N знаков. Собственно я вывожу FPS на экран если конкретнее, а так в общем и для других целей сгодится.
Делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define DOT_DIG_NUM 2
#define TEMP_SIZE 30
qString::qString(float newData){
    char newCharData[TEMP_SIZE] = {0};
/// start
    gcvt(newData, 1 + newData/10.0 + DOT_DIG_NUM, &newCharData[0]);
    int dot_pos = 0; while(newCharData[dot_pos] != '.') dot_pos++;
    if ( dot_pos >= TEMP_SIZE ) dot_pos = 0;
    char* AfterDot = &newCharData[dot_pos+1];
    for (int i = 0; i < DOT_DIG_NUM; i++)
    {
        if ( AfterDot[i] == 0 )
            AfterDot[i] = '0';
    }
    AfterDot[DOT_DIG_NUM] = 0;
/// end
    _new(&newCharData[0]);
}
При этом коде тут
C++
1
2
3
4
5
void qString::_new (const char* newData){
    if ( newData != NULL )
    {
        // Выделение памяти под полученную строку
        _size = strlen(newData) + 1; // тут
вылетает
Необработанное исключение в "0x00479982" в "WFAE.exe": 0xC0000005: Нарушение прав доступа при записи "0x00003034".
(адрес this - 0x00003030)
Впрочем ошибка не важна, хочется хороший алгоритм перевода написать, видно тот барахлит А без него все работает отлично
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.03.2010, 19:59
Ответы с готовыми решениями:

Функция перевода из Float в Hex
Подскажите функции для перевода вещественного числа в шестнадцатеричное число, и будет ли она переводить отрицательное число?

Из char во float на С
Здравствуйте, пишу программу, которая запускается из командной строки, считывает числа из одного файла, прибавляет к ним 10, записывает...

Float to char array
Доброго времени! Подскажите с конвертацией float в char array float X = 14.16; char buff1; // работает, на выходе...

9
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
03.03.2010, 20:25
А чем не угодили sprintf и std::strstream?
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
03.03.2010, 20:40  [ТС]
Нужно быстро и безопасно И вообще я не люблю пушкой по воробьям...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
04.03.2010, 01:12
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от insideone Посмотреть сообщение
Нужно быстро и безопасно
Цитата Сообщение от Nick Alte Посмотреть сообщение
А чем не угодили sprintf и std::strstream?
И в правду - уж куда быстрей и безопаснее? Я бы тоже примерно так сделал:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
#define LEN 32
 
int main(void){
    int n;
    char template[LEN] = { 0 }, strval[LEN] = { 0 };
    double dval;
    
    printf("Double value: ");
    scanf("%lf", &dval);
    printf("Digits after point: ");
    scanf("%d", &n);
    
    snprintf(template, LEN - 1, "%%.%df", n);
    snprintf(strval, LEN - 1, template, dval);
    printf("As string: %s\n", strval);
    
    return 0;
}
Добавлено через 29 минут
вариант C++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <sstream>
#include <string>
 
int main(){
    double dval;
    int n;
    std::string str;
    
    std::cout << "Double value: ";
    std::cin >> dval;
    std::cout << "Digits after point: ";
    std::cin >> n;
    
    std::stringstream ss;
    ss.setf(std::ios::fixed, std::ios::floatfield);
    ss.precision(n);
    ss << dval;
    ss >> str;
    
    std::cout << "As string: " << str << std::endl;
    
    return 0;
}
3
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.03.2010, 01:25  [ТС]
2 easybudda: Если я не ошибаюсь достаточно 2 строчек По крайне мере это у меня работает верно
C++
1
2
char newCharData[TEMP_SIZE] = {0};
sprintf(&newCharData[0], "%." DOT_DIG_NUM "f", newData);
Быстра ли универсальная функция? Точно не быстрее узконаправленной (если качество кода одинаково). Про ненадежность просто читал где то и не раз. И то и другое важно - приложение игровое. Вернее даже... конечно безопасность вопрос сильный, и все же сейчас на первом плане скорость. К тому же мне просто интересно реализовать этот алгоритм без применения сторонних функций... Впринципе я то его и реализовал, но почему то ошибки вылетают

Не по теме:

А вообще чисто на подсознательном уровне эти printf функции кажутся консольными и мозолят глаза :( Интересно разработчики передовых трехмерных игр тоже их используют? :-D



Добавлено через 6 минут
Хм, вариант с std заинтересовал конечно, хотя вопрос... а накладные расходы на конструкцию
C++
1
std::stringstream ss;
и её убиение не убьют ли всю скорость? По крайне мере безопасности std я доверяю...
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
04.03.2010, 03:11
Цитата Сообщение от easybudda Посмотреть сообщение
C++
1
2
3
4
5
// ...
  ss.setf(std::ios::fixed, std::ios::floatfield);
  ss.precision(n);
  ss << dval;
// ...
Этот фрагмент можно переписать чуть проще:
C++
1
2
3
4
#include <iomanip>
// ...
  ss << std::setprecision(n) << std::fixed << dval;
// ...
2
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
04.03.2010, 08:56
insideone, кстати, вот Вам ещё вариант. Не знаю, на сколько быстрый, крайне не устойчивый к плохим данным, но может, как идея, пригодится...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <math.h>
 
#define LEN 32
 
char *strReverse(char *s){
    char *h, *t, c;
    for ( t = s; *t; ++t )
        ;
    for ( h = s, t -= 1; h < t; ++h, --t ){
        c = *h;
        *h = *t;
        *t = c;
    }
    return s;
}
 
char *doubleToStr(double d, int n, char *s){
    char *p = s;
    long num = (long)( d * pow(10, n) );
    while ( n-- ){
        *p++ = num % 10 + '0';
        num /= 10;
    }
    *p++ = '.';
    do {
        *p++ = num % 10 + '0';
        num /= 10;
    } while ( num );
    *p = 0;
    return strReverse(s);
}
 
int main(void){
    int n;
    double dval;
    char buf[LEN];
    
    printf("Double value: ");
    scanf("%lf", &dval);
    printf("Digits after point: ");
    scanf("%d", &n);
    
    printf("As string: %s\n", doubleToStr(dval, n, buf));
    
    return 0;
}
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.03.2010, 16:03  [ТС]
Спасибо, становился на
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
long qString::_pow(unsigned char x , unsigned char n){
    long res = 1;
    while ( n-- ) res *= x;
return res;
}
 
char *qString::str_reverse(char *s){
    char *h, *t, c;
    for ( t = s; *t; ++t );
    for ( h = s, t -= 1; h < t; ++h, --t )
    {
        c = *h;
        *h = *t;
        *t = c;
    }
return s;
}
 
char* qString::_long2str(long Number, char* Dest, bool AddDot){
    do {
        *Dest++ = Number % 10 + '0';
        Number /= 10;
    }
    while ( Number );
    if ( AddDot ) *Dest++ = '.';
return Dest;
}
 
char* qString::_float2str(float Number, unsigned char DotDig, char* Dest){
    long int_part = Number;
    long rest_part = (Number - int_part) * _pow(10, DotDig);
    _long2str(int_part, _long2str(rest_part, Dest, true));
return str_reverse(Dest);
}
 
qString::qString(float newData){
    char newCharData[TEMP_SIZE] = {0};
    _float2str(newData, 2, &newCharData[0]);
    _new(&newCharData[0]);
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.03.2010, 16:29
Цитата Сообщение от insideone Посмотреть сообщение
Быстра ли универсальная функция?
А зачем тебе в данном месте скорость? Ты же это значение так или иначе собираешься печатать на экран, всё равно это место (печать на экран) у тебя отожрёт основное время. Так стОит ли экономить на спичках?
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.03.2010, 17:11  [ТС]
И вправду Я не думал в таком ракурсе... Впрочем на рендере не сэкономить особо, приходится заботится об остальном
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2010, 17:11
Помогаю со студенческими работами здесь

Конвертировать float в *char???
Как преобразовать float в *char?

преобразовать float в char
Привет. Не могу понять как представляется ftoot в памяти. Прочитал статью https://en.wikipedia.org/wiki/Single-pr ... int_format написал...

char[] в int, float.
Интересует такой вопрос: Допустим у меня есть массив из char, и в этом массиве посимвольно лежат цифры (через %s), т.е: char ach;...

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

Float в char с форматированием
Всем снова привет, опять никак не пойму - постоянно ругается на типы данных.. float _val = 1.12 - надо вывести как .12 - char {'.',...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru