itoa не берет float(ftoa)

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
Всем доброго времени суток. В общем пишу себе какое-то подобие ftoa(). Но прям большое множество ошибок, похожих на те когда функции нету в тулчейне, но опознать не могу. Да и такую пачку в гугл не закинешь =)
C++:
unsigned char ftoa (char *array,unsigned char size, float f, unsigned char accurancy){
    unsigned char len = 0;
    char buff1[5]="";
    char buff2[5]="";
    //len = size/sizeof(array[0]);
    int integer = (int)f;
    float buff3 = f-integer;
    buff3 = buff3*10;
    int fractional = (int)buff3;
    itoa(integer,buff1,10);
    itoa(fractional,buff2,10);
    strcat(array,buff1);
    strcat(array,".");
    strcat(array,buff2);
    return 0;
}
вызываю так
C++:
char lal[15] = "";
float lal2 = 2.52;
unsigned char m = 2;
ftoa(lal,sizeof(lal),lal2,m);
Ошибки такие:
PHP:
Severity    Code    Description    Project    File    Line    Column
Error        Test.elf section `.text.avrlibc.fplib%33' will not fit in region `text'    Test        1    1
Error        Could not allocate section .text.avrlibc.fplib, size = 10 bytes, attributes = code    Test    addsf3.o    0    0
Error        recipe for target 'Test.elf' failed    Test    C:\Users\Evgeniy\Documents\Atmel Studio\7.0\Test\Test\Debug\Makefile    106    1
Warning        unused variable 'len' [-Wunused-variable]    Test    C:\Users\Evgeniy\Documents\Atmel Studio\7.0\Test\Test\main.c    108    16
Error        ld returned 1 exit status    Test    collect2.exe    0    0
Error        Could not allocate section .text, size = 2 bytes, attributes = code    Test    D:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATtiny_DFP/1.8.332/xc8/avr/lib/avr25/tiny-stack/memx-const/crtattiny2313.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 10 bytes, attributes = code    Test    fixsfsi.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 6 bytes, attributes = code    Test    fp_nan.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 14 bytes, attributes = code    Test    fp_pscA.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 14 bytes, attributes = code    Test    fp_pscB.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 34 bytes, attributes = code    Test    fp_round.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 14 bytes, attributes = code    Test    fp_zero.o    0    0
Error        Could not allocate section .text.avrlibc, size = 20 bytes, attributes = code    Test    itoa_ncheck.o    0    0
Error        Could not allocate section .text.SendHalfByte, size = 46 bytes, attributes = code    Test    main.o    0    0
Error        Could not allocate section .text.millis, size = 30 bytes, attributes = code    Test    main.o    0    0
Error        Could not allocate section .text.lcd_clear, size = 20 bytes, attributes = code    Test    main.o    0    0
Error        Could not allocate section .text.setPos, size = 18 bytes, attributes = code    Test    main.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 4 bytes, attributes = code    Test    mulsf3.o    0    0
Error        Could not allocate program memory    Test    RUNCOMPILERTASK    0    0
Error        Could not allocate section .text.avrlibc, size = 46 bytes, attributes = code    Test    strcat_M.o    0    0
Error        Could not allocate section .text.avrlibc, size = 32 bytes, attributes = code    Test    strrev.o    0    0
Error        Could not allocate section .text.avrlibc, size = 50 bytes, attributes = code    Test    utoa_ncheck.o    0    0
Причем если просто прировнять int fractional = 5; то все выведеться коректно, в данном случае на дислпее будет 2.5. Тоесть если я правильно понял то загвозка только с дробной частью, а именно с её преобразованиями.
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
Очень криво преобразовываете.
Попробуйте СНАЧАЛА умножить свой флоат на 10, а потом целочисленно поделить на 10 и взять остаток от деления - так вы получите первый символ после запятой.

Еще - для преобразования одной цифры в символ itoa совершенно избыточна, пользуйтесь выражением
char c = '0' + i;;

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

А, да, еще - не забывайте чистить массив lal между вызовами своей функции, а то на второй- третий раз он переполнится и начнется распашка памяти.
Или просто замените первый вызов strcat на strcpy
 
Изменено:

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
Избыточное цитирование
Очень криво преобразовываете.
Попробуйте СНАЧАЛА умножить свой флоат на 10, а потом целочисленно поделить на 10 и взять остаток от деления - так вы получите первый символ после запятой.

Еще - для преобразования одной цифры в символ itoa совершенно избыточна, пользуйтесь выражением
char c = '0' + i;;

Забыл добавить - ошибки к компиляции отношения не имют, у вас какие-то проблемы с линковкой, попробуйте почистить обьектные файлы и собрать заново.
Чисто гипотетически число может быть больше чем один символ (для целой части) поэтому наверное лучше оставить itoa ?

Сделал пока так:
C++:
unsigned char ftoa (char *array,unsigned char size, float f){
    char buff1[5]="";
    char buff2[5]="";
    int buff = (f*10);
    int integer = buff/10;
    int fractional = buff%10;
    itoa(integer,buff1,10);
    itoa(fractional,buff2,10);
    strcat(array,buff1);
    strcat(array,".");
    strcat(array,buff2);
    
    return 0;
}
Вызываю так:
C++:
char lal[15] = "";
float lal2 = 2.5;
ftoa(lal,sizeof(lal),lal2);
Ошибок меньше) но есть.
PHP:
Severity    Code    Description    Project    File    Line    Column
Error        Test.elf section `.text.avrlibc%36' will not fit in region `text'    Test        1    1
Error        recipe for target 'Test.elf' failed    Test    C:\Users\Evgeniy\Documents\Atmel Studio\7.0\Test\Test\Debug\Makefile    106    1
Error        ld returned 1 exit status    Test    collect2.exe    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 10 bytes, attributes = code    Test    fixsfsi.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 12 bytes, attributes = code    Test    fp_inf.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 6 bytes, attributes = code    Test    fp_nan.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 14 bytes, attributes = code    Test    fp_pscA.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 14 bytes, attributes = code    Test    fp_pscB.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 14 bytes, attributes = code    Test    fp_zero.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 4 bytes, attributes = code    Test    mulsf3.o    0    0
Error        Could not allocate program memory    Test    RUNCOMPILERTASK    0    0
 

Sergo_ST

★★★★★★✩
15 Мар 2020
980
830
Вот держите, кодировка на выходе UTF8:
C++:
void NumFtoUTF8(char *array, float num, uint8_t dec, char divider) //массив строки, число с плавающей точкой, знаков после точки, символ разделитель
{
  char ct[10];
  char ft[10];
  uint8_t c = 0, d = 0, s = 0;
  uint32_t numInt = 0;
  float decNum = 0;

  if (num < 0) {
    s = 1;
    numInt = num * -1;
    decNum = (num + numInt) * -1;
  }
  else {
    numInt = num;
    decNum = num - numInt;
  }

  if (numInt) {
    while (numInt > 0) {
      ct[c++] = 48 + (numInt % 10);
      numInt = (numInt - (numInt % 10)) / 10;
    }
  }
  else ct[c++] = 48;

  if (s) ct[c++] = 45;

  if (dec) {
    ft[d++] = divider;
    for (uint8_t i = 0; i < dec; i++) {
      decNum *= 10.0;
      ft[d++] = 48 + decNum;
      decNum -= (uint8_t)decNum;
    }
  }

  for (uint8_t i = 0; i < c; i++) array[i] = ct[c - i - 1];
  for (uint8_t i = 0; i < d; i++) array[i + c] = ft[i];

  array[c + d] = 0;
}
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@Sergo_ST, подскажите может не правильно вызываю её ?)
C++:
char lal[15] = "";
float lal2 = 2.5;
//ftoa(lal,sizeof(lal),lal2);
NumFtoUTF8(lal,lal2,10,".");
Пробовал и так)
NumFtoUTF8(lal,lal2,10,'.'); но нет)
PHP:
Severity    Code    Description    Project    File    Line    Column
Error        Test.elf section `.text.avrlibc.fplib%24' will not fit in region `text'    Test        1    1
Error        Could not allocate section .text.avrlibc.fplib, size = 10 bytes, attributes = code    Test    addsf3.o    0    0
Error        recipe for target 'Test.elf' failed    Test    C:\Users\Evgeniy\Documents\Atmel Studio\7.0\Test\Test\Debug\Makefile    106    1
Message        expected 'char' but argument is of type '__memx char *'    Test    C:\Users\Evgeniy\Documents\Atmel Studio\7.0\Test\Test\main.c    138    6
Warning        passing argument 4 of 'NumFtoUTF8' makes integer from pointer without a cast [-Wint-conversion]    Test    C:\Users\Evgeniy\Documents\Atmel Studio\7.0\Test\Test\main.c    207    25
Error        Could not allocate section .text.avrlibc.fplib, size = 8 bytes, attributes = code    Test    cmpsf2.o    0    0
Error        ld returned 1 exit status    Test    collect2.exe    0    0
Error        Could not allocate section .text, size = 2 bytes, attributes = code    Test    D:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATtiny_DFP/1.8.332/xc8/avr/lib/avr25/tiny-stack/memx-const/crtattiny2313.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 72 bytes, attributes = code    Test    fp_cmp.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 12 bytes, attributes = code    Test    fp_inf.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 14 bytes, attributes = code    Test    fp_pscA.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 14 bytes, attributes = code    Test    fp_pscB.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 34 bytes, attributes = code    Test    fp_round.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 68 bytes, attributes = code    Test    fp_split3.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 14 bytes, attributes = code    Test    fp_zero.o    0    0
Error        Could not allocate section .text.avrlibc, size = 20 bytes, attributes = code    Test    itoa_ncheck.o    0    0
Error        Could not allocate section .text.__vector_13, size = 74 bytes, attributes = code    Test    main.o    0    0
Error        Could not allocate section .text.sendStr, size = 64 bytes, attributes = code    Test    main.o    0    0
Error        Could not allocate section .text.sendByte, size = 50 bytes, attributes = code    Test    main.o    0    0
Error        Could not allocate section .text.SendHalfByte, size = 46 bytes, attributes = code    Test    main.o    0    0
Error        Could not allocate section .text.millis, size = 30 bytes, attributes = code    Test    main.o    0    0
Error        Could not allocate section .text.setPos, size = 18 bytes, attributes = code    Test    main.o    0    0
Error        Could not allocate section .text.avrlibc.fplib, size = 4 bytes, attributes = code    Test    mulsf3.o    0    0
Error        Could not allocate program memory    Test    RUNCOMPILERTASK    0    0
Error        Could not allocate section .text.avrlibc, size = 32 bytes, attributes = code    Test    strrev.o    0    0
Error        Could not allocate section .text.avrlibc, size = 50 bytes, attributes = code    Test    utoa_ncheck.o    0    0
Error        Could not allocate section .text.libgcc.div, size = 68 bytes, attributes = code    Test    _udivmodsi4.o    0    0
 

Sergo_ST

★★★★★★✩
15 Мар 2020
980
830
Если я все правильно понял, то компилятор ругается не на процедуру, а на что-то другое в коде.

А под какой камень компилируете??
 
Изменено:

Sergo_ST

★★★★★★✩
15 Мар 2020
980
830
Тогда не подскажу, в Atmel Studio особо не работал...
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@Sergo_ST, а в чем сидите ?) Может быть сменю студию на что-то другое. Поидеи компилятор в других средах может быть позговорчивее )
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@bort707, флеша вроде норм, видимо ОЗУ нема. Понял спасибо. Попробую сделать так: флоат умножу на 10. Беру целую часть. Делаю итоа, а потом в цыкле ищу последнюю цифру в массиве, вместо неё пишу точку, а последнюю цифру переношу в след адресс. Как-то так )
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
Ошибки связаны с ОЗУ, а не флеш.

Лучше полностью отказаться от флоат. Во всей программе. Уверен, что все ваши датчики возвращают целое. Вот с ними и работайте. А в удобный для человека формат с цифрами после запятой переводите только при выводе на экран, без использования флоат
 

Sergo_ST

★★★★★★✩
15 Мар 2020
980
830
@Evgeniy2020, какие то серьёзные среды не использую, мне достаточно простого блокнота или ArduinoIDE.
На счёт кода полностью согласен с @bort707, числа с плавающей точкой жрут много ресурсов, если конечно на борту нету мат.сопроцессора...
 
Изменено:

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@Sergo_ST, понял. В случае с блокнотом тоже компилируете черерз ардуино иде ?
@bort707, а мне так и надо) я хочу скорость выводить на экран. Кол-во оборотов (геркон стоит) множу на некую константу(заранее посчитаное по формуле длины окружности) и получаю флоат. Как-то вывести и всё. Потом это можно в функцию запихнуть и тогда все переменные после выхода из функции будут пропадать тем самым освобождая ОЗУ. Как-то так думал )
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
я хочу скорость выводить на экран. Кол-во оборотов (геркон стоит) множу на некую константу(заранее посчитаное по формуле длины окружности) и получаю флоат.
А в скорости сколько знаков после запятой надо? - заранее домножте свою константу на десять в нужной степени и флоат вообще не понадобится

Что касается проблем с памятью - думаю что написание функции может и не помочь. Динамические переменные из того же ОЗУ выделяются, если у вас место на куче кончилось - то выделять неоткуда ( а по ошибкам на то похоже)
Если так - придется глубже копать и переписывать программу на предмет правильной работы с памятью
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Можно еще поиграться с типом оптимизации компилятора.
Кстати, компилируете надеюсь в релизе, а не в дебаге?
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@bort707, думаю что хотя бы одной будет достаточно. Тогда константу (188,4) умножаю на 10. Получу 1884, получается потом нули как-то убирать прийдеться ?
@Геннадий П, когда лазил по настройкам искал заветную галочку для принтф. Вроде видел что стоит дебаг. Но это как я понял по умолчанию ставиться ? Надо ставить релиз ?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
@Evgeniy2020, В дебаге практически нет оптимизации. В релизе обычно максимальная оптимизация, но какая (на минимальное использование ОЗУ или флеш) нужно смотреть в настройках.
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@Геннадий П, вот. Сиё окошко ?
1628244701033.png

тут везде релиз ставить ?
UPD: Вот что мне капиталисты написали :ROFLMAO:
1628244868873.png

UPD2: Также ошибки при вызове функции NumFtoUTF8 но скорее всего из-за того что релиз в данном случае не на что не влияет ведь не стоит ПРО компилятор :ROFLMAO:
1628245044416.png
UPD3: Мда, так и думал) 40$ хотят за подписку, видимо раз в месяц или что-то типа такого. Может поставить что-то типа WinAVr ? Что подскажите ?
Хотя может если отказаться от флоата, как писал @bort707 , то можно и забить)
 
Изменено:

Sergo_ST

★★★★★★✩
15 Мар 2020
980
830
@Evgeniy2020, да компилирую в IDE.
И ещё, разделительную точку нужно передавать как номер символа - '.', а не как строку ".", на что и указывает варнинг компилятора когда говорит что не верный тип данных использован.
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
@Evgeniy2020, а в чем вообще смысл использования вами этой ИДЕ? На профи, простите, вы не очень похожи :) даже разницу между дебагом и релизом не очень знаете...так нафига вам эта среда для гиков?:)

Если не в курсе - в ардуино тоже можно писать код на регистрах, без использования digitalWrite() и прочих подобных функций.
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@bort707, но сможет она ли она компилировать код под tiny2313, именно для этого камня есть один аддон назовем его так под arduino IDE, но не уверен что он будет лучше чем студия которая вроде как заточена под всю линейку авр
 

Sergo_ST

★★★★★★✩
15 Мар 2020
980
830
@Evgeniy2020, в ArduinoIDE компилятор такой же как и бесплатный в AVR Studio - avr-gcc. А от "адонна"(ядра) зависят только стандартные ардуиновские функции по типу digitalWrite и настройки под конкретный камень. По сути ArduinoIDE это просто блокнотик с кнопками компиляции и загрузки))
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@Sergo_ST, столкнулся с тем что при компиляции на уну ругался на не объявленные регистры(напр TIMS). Потом юзнул ядро (ATtiny Core) и скомпилировал. Результат есть =)
Авр студия
1628283850535.png

Ардуина
1628283881886.png

Функцию пока что такого вида:
C++:
void ftoa (char *array,unsigned int a_size,unsigned int k){
    unsigned char len = a_size/sizeof(array[0]);
    unsigned char effected = 0;
    itoa(k, array, 10);
    if(k>0){
    for(unsigned char i = 0; i < len-1; i++){
        if(array[i+1] == 0){
            char buf1 = array[i];
            array[i] = '.';
            array[i+1] = buf1;
            break;
        }
    }
    }

}