2

ARM 組み込みアプリケーションを開発しています。私はちょっとばかげた問題で立ち往生しています - 私は符号なしの8ビット整数の配列を持っています:

uint8_t days[42] = { 0 };

それはいくつかのデータで初期化されています - 初期化アルゴリズムは混乱を招き、問題とは関係のない多くの変数を導入するので、ここでは再投稿しません. デバッガーの変数ウォッチにこの配列が表示され、0 から 31 までの整数値で埋められていることは確かです。

この配列の任意の要素、たとえば 15 番目を取得char*して、LCD 画面に表示できるように変換したいと思います。関数を使用して書き直しsprintfます:

char d[3] = { '0', '0', '0' };
sprintf(d, "%d", days[15]);

1 つだけ注意してください。いいえ、このstdlib itoa()関数は MISRA-C 規格に準拠していないため、使用できません。MISRA-C 規格に従う義務があります。

その結果、dバッファーにバイナリ ゼロの値しか取得できません。何か案は?

4

2 に答える 2

3

sprintf()MISRA-C に準拠するために、stdio.h の やその他のものを使用することはできません。とにかく、組み込みシステムでのペストのような sprintf は一般的に避けたいと思います。

単純な 10 進整数から文字列への変換ルーチンを作成することは、非常に基本的なことです... MISRA-C (2004 および 2012) 互換バージョンの私の試みは次のとおりです。

#include <stdint.h>

void dec_to_str (char* str, uint32_t val, size_t digits);

int main (void)
{
  char str[3u + 1u]; // assuming you want null terminated strings?

  dec_to_str(str, 31u, 3u);

  return 0;
}


void dec_to_str (char* str, uint32_t val, size_t digits)
{
  size_t i=1u;

  for(; i<=digits; i++)
  {
    str[digits-i] = (char)((val % 10u) + '0');
    val/=10u;
  }

  str[i-1u] = '\0'; // assuming you want null terminated strings?
}

注: uint32_t 変数は uint8_t に交換される可能性がありますが、MISRA で必要とされるように、暗黙的な型昇格を防ぐために、あらゆる場所に型キャストを追加する必要があります。コードは次のように非常に醜いものになります。

 str[digits-i] = (char)(uint8_t)((uint8_t)(val % 10u) + '0');

その場合に行う唯一の正気のことは、その混乱をいくつかの行に分割することです。

uint8_t ch = (uint8_t)(val % 10u);
ch = (uint8_t)(ch + '0');
str[digits-i] = (char)ch;
于 2015-03-16T15:50:24.640 に答える
0
#include "stdafx.h"
#include <stdio.h>

int days[2] = {12,14};
char d[3] = {'0', '0', 0};

int _tmain(int argc, _TCHAR* argv[])
{
    d[0] = days[1] / 10 + 0x30;  // convert 10's digit to ascii
    d[1] = days[1] % 10 + 0x30;  // convert 1's digit to ascii

    // Debugging help
    printf(d);
    getchar();

    return 0;
}
于 2015-03-16T13:23:26.570 に答える