Atof не работает в C и без atof также не работает в отладке

У меня проблемы с функцией Atof. Я пытаюсь преобразовать строку в число с плавающей запятой, но это не дает никаких ошибок, когда я пытаюсь использовать программное обеспечение Coocox в разделе «Отладка», вывод ничего не показывает. Пробовал две функции Atoi и Atof. Когда я использую Atoi, выхода нет. Когда я использую Atof, программа начинает перезапускаться. Я поместил определение stdlib.h для atof здесь. Но здесь atoff для значения с плавающей запятой. Я попробовал тот же код в Dev C++ в C, он работает очень хорошо. Другие вещи я использую без работы Atof, но в этот раз снова перезапуск программы. Это работает на Dev C. Но не на Coocox. Как я могу решить проблему? Разница только в офф! С чем это может быть связано? Я использовал stdlib.h, и ошибки при компиляции нет!

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

int main ()
{
    float c;
    int b;

    char *array[1] = {"52.43525"};

    b=(atoi(array[0])/100);
    c=((atof(array[0]))/100.0)*100.0;
    c/=60;
    c+=b;

    printf ("%f\n", c);

    return 0;
}

-----stdlib.h----
double  _EXFUN(atof,(const char *__nptr));
#if __MISC_VISIBLE
float   _EXFUN(atoff,(const char *__nptr));
#endif
int _EXFUN(atoi,(const char *__nptr));
int _EXFUN(_atoi_r,(struct _reent *, const char *__nptr));
long    _EXFUN(atol,(const char *__nptr));
long    _EXFUN(_atol_r,(struct _reent *, const char *__nptr));
------------------------------------

person Nobody    schedule 17.09.2017    source источник
comment
Если действительно atof() не работает, вам следует упростить код, чтобы убедиться, что проблема именно в нем.   -  person Clifford    schedule 17.09.2017
comment
Когда я удаляю atof(), все работает очень хорошо. Нет проблем!   -  person Nobody    schedule 17.09.2017
comment
Любопытно, та же проблема, если float c изменить на double c?   -  person chux - Reinstate Monica    schedule 17.09.2017
comment
Обратите внимание, что (atoi(array[0]) / 100) оценивается как 0.   -  person chux - Reinstate Monica    schedule 17.09.2017
comment
Я попробовал atof (двойной формат) снова то же самое!   -  person Nobody    schedule 17.09.2017
comment
Некоторые компиляторы видят весь этот код и преобразуют его в puts("0.873921");, что исключает необходимость в библиотеках FP. Предложите сделать код не столь детерминированным (например, добавить пользовательский ввод) и убедиться, что компиляция включает поддержку FP.   -  person chux - Reinstate Monica    schedule 17.09.2017
comment
Это не то, что я имел в виду под упрощением. Если просто взять строковый литерал и вывести его без арифметических выражений, чтобы исключить их.   -  person Clifford    schedule 17.09.2017
comment
@Nobody Ваш код в том виде, в котором он опубликован, отлично работает для меня, и я не вижу в нем ничего плохого (кроме целой школы отвлекающих маневров). Предложите вам попробовать "char *s = "52.43525"; c = atof(s)"; или даже c = atof("52.43525");, чтобы попытаться сузить круг вашей проблемы.   -  person Steve Summit    schedule 17.09.2017
comment
@chux: самый простой способ заставить компилятор не оптимизировать выражения - объявить переменные volatile.   -  person Clifford    schedule 17.09.2017
comment
@Клиффорд Хорошая идея.   -  person chux - Reinstate Monica    schedule 17.09.2017
comment
Я использую Cortex M3 и добавил -mfloat-abi=softfb;-mfloat-abi=hard; Другое дело, я читал комментарий об оборудовании. В Cortex-M3 нет аппаратного обеспечения с плавающей запятой, но поддержка C float и double предоставляется в программном обеспечении большинством компиляторов/библиотек. Может ли аппаратное влияние?   -  person Nobody    schedule 17.09.2017
comment
трудно поверить в оптимизацию с изменением функции. Какой компилятор делает такую ​​оптимизацию?   -  person Jacek Cz    schedule 17.09.2017
comment
символ *s = 52,43525; c = atof(s); или даже c = atof(52.43525); Они не работали, потому что я пытался раньше.   -  person Nobody    schedule 17.09.2017
comment
Попробуйте char s[] = "52.43525";. Все другие формы приводят к литералу только для чтения, и библиотека может задохнуться от этого.   -  person Paul Ogilvie    schedule 17.09.2017
comment
@ Пол Огилви char s[] = 52.43525 Я только что попробовал, который снова перезагружается в режиме отладки!   -  person Nobody    schedule 17.09.2017
comment
#define RCC_CSR_SFTRSTF ((uint32_t)0x10000000) /*!‹ Флаг сброса программного обеспечения */ --_RCC_CSR-- Когда я смотрю причину сброса, это   -  person Nobody    schedule 17.09.2017


Ответы (1)


после исправления всех предупреждений компилятора получился вот такой код:

Примечание: поскольку функция массива не использовалась, я заменил ее на простой указатель. Это не повлияло на вывод.

#include <stdio.h>   // printf()
//#include <string.h> -- contents not used
#include <stdlib.h>  // atoi(), atof()

int main ()
{
    float c;
    int b;

    char *array = {"52.43525"};

    b =  atoi(array);
    c =  ( (float)( atof(array) ) / 100.0f ) * 100.0f;
    c /= 60.0f;
    c += (float)b;

    printf ("%f\n", c);

    return 0;
}

запуск программы привел к:

52.873920

Поэтому, если ваш компилятор не находит atof(), это проблема с компилятором.

person user3629249    schedule 17.09.2017
comment
он снова перезапускается. Если проблема в компиляторе, что я могу сделать? Какую ссылку на компилятор я должен добавить? - person Nobody; 17.09.2017