Вопрос о типе String

// C function ftoa() that converts a given floating-point number or a double to a string.

ftoa(n, res, afterpoint)
n → Input Number
res → Array where output string to be stored
afterpoint → Number of digits to be considered after the point.

что-нибудь типа такого

Или типа такого:

void setup()
{
  Serial.begin(9600);
  char a[] = "abcdefghij";
  float ff = 45.6;
  String hlp = String(ff, 1);
  a[3] = hlp[0];
  a[4] = hlp[1];
  a[5] = hlp[2];
  a[6] = hlp[3];
  Serial.println(a);
}

void loop()
{
}

Здесь выходит такой результат, который нужен. Но не нравится String hlp. Избавиться бы от него…

Тот вариант, что я предложил как-раз без стрингов. Могу найти перевод флоата в символы вручную, вообще без библиотек )) он и короче в разы в машинном коде.

Поищите, пожалуйста.

Недоделаный могу дать, там сразу на LCD вывод, вместо него надо подставить вывод символов куда надо; и знаков там дохрена, надо сократить, и там всё вручную ))

void PrintHexDigit(unsigned char i) // Печать мл. ниббла 0...9 A...F
{
  i &= 0b1111;                        // уберем старшие биты
  if(i < 10)
   i += 0x30;                        // цифры
  else
   i += 0x41 - 10;
  ByteToLCD(i);
}

void PrintLong10(unsigned long i)  // вывод long 11 знаков на дисплей  
{
  //  *-----------------23.03.03 20:49-------------------
  //   * Печать 11 знаков 
  //   * --------------------------------------------------*
  unsigned long j;
  unsigned char    c;
  unsigned char Poz;


  Poz = 10; //11-5=6
  j = 1000000000;
  do
   {
    c = i / j % 10;
    PrintHexDigit(c);       // выводим цифры
    j /= 10;
   } while ( --Poz != 0);
} //________


void PrintDouble5s(double F)  // печать double 5знаков, 4 зн после зап.макс. со знаком
{
  unsigned long  i;
  unsigned long j;
  unsigned char    c;
  unsigned char DecPoz, Poz;

  if ( F < 0)                    // если отрицательное
   {
    ByteToLCD('-');             // печатаем минус                     
    F = -F;                       // сделаем положительным                 
   }

  // автомасштаб запятой:
  DecPoz = 1;                   // положение запятой на последнем знаке
  Poz = 5 - 1;
  j = 10000;
  do
   {
    if( (F + 0.5) >= j) continue; // после запятой чисел не будет
    F *= 10;
    if( ++DecPoz > 6) break;    // ограничим число зн. после запятой
   } while ( --Poz != 0);

  i = (unsigned long) (F + 0.5);  //округлим

  // выводим числа:
  Poz = 5;                      // число знаков для вывода
  do
   {
    c = i / j % 10;                // Остаток от делени
    if(DecPoz == (Poz + 1)) ByteToLCD('.');
    PrintHexDigit(c);
    j /= 10;
   } while ( --Poz != 0);

  ByteToLCD(' ');               // затрем если был минус, а потом плюс
} //_______________конец PrintDouble5 ____________________________________





1 лайк

Да, там лишнюю функцию по печати long по ошибке вставил, ну пусть будет. Может пригодится, посмотреть сам принцип. Эта технология называется “Закат солнца вручную” ахаха

может легче sprintf использовать?
да жрет много, но одна строка и все.
если ресурсы позволяют, почему нет.

1 лайк

А можно даже сделать процедуры для переноса переменных, например, типа int в какую-то часть массива char с применением указателей. Параметры такой процедуры: откуда, куда, сколько. И если это относительно несложно, то с float придется потанцевать.

Говорят, что в системе Ардуино sprintf не поддерживает формат чисел с плавающей запятой.

Секунду! тут не просто байты из флоата, а перевод флоата в символы. Сам формат флоат-числа совсем другой и нечитаемый человеком ))
Его можно разбирать на части при помощи union, например. Или да, через указатели.
Но это - Другое™ Тут надо не путать.

Можно, если захотеть… )))
Вот например:

char a[10] = "abcdefghi";
void setup() {
  Serial.begin(9600);

  float ff = 45.6;

  uint16_t ft = static_cast <uint16_t> (ff * 10);
  a[3] = static_cast <char> ( (ft / 100) + '0' );
  a[4] = static_cast <char> ( ((ft / 10) % 10) + '0' );
  a[5] = '.';
  a[6] = static_cast <char> ( (ft % 10) + '0' );

  Serial.print("Stroka: '");
  Serial.print(a);
  Serial.println("'");
}

void loop() {
}

Петрович скорее всего поругает и скажет, что можно проще и красивее, но оно работает ))

Stroka: 'abc45.6hi'

#22 тоже работает

Так никто же не спорит. Но в моём (#31) без стрингов и хлп (как ты, вроде бы, и хотел). И ещё…

Просто сравни:

#22:

Скетч использует 4364 байт

#31:

Скетч использует 1544 байт

А вроде бы тоже самое делают… ))

ЗЫ: Ардуино Нано на 168PA чипе.
ЗЫ2: И запомни уже (если читать книжки лень) - если в массиве символов объявлено 10 символов, то «запихать» туда можно только 9. Десятым идет нулевой символ (признак конца строки) ‘\0’. Он туда без явного тобой объявления добавляется.

Я знал об этом давно, просто забыл.

На 8-разрядных МК не работает с плавающей точкой.

Тут проблема не с “поддержкой”, а с особенностями языка Си.