0

私のマイクロコントローラー UART にはデータを処理するための小さなバッファーがあるため、sprintf を使用して文字列形式で小さなチャンクでデータを送信したいと考えています。sample[k] = 電圧サンプルは乱数ではなく、電圧を区切るにはカンマが必要です。

if() elseしたがって、ステートメントの代わりに乱数でサンプル配列を埋めたいと思います。sprintf()動的インデックスを使用するには?

char str[512];
int sample[512];

printf("T1[");

int i = 0;
for (int j = 0; j < 64; j++)
{
    for(int k = 0; k < 8; k++)
    {
        sample[k] = rand() % 256;
    }

    sprintf( str, "%d,%d,%d,%d,%d,%d,%d,%d", sample[0],sample[1],sample[2],sample[3],sample[4],sample[5],sample[6],sample[7]);
    printf(str);
}

printf("]\r\n");

私はこのようなことをすることができます

if (j == 0)
sprintf( str, "%d,%d,%d,%d,%d,%d,%d,%d", sample[0],sample[1],sample[2],sample[3],sample[4],sample[5],sample[6],sample[7]);
if (j == 1)
sprintf( str, "%d,%d,%d,%d,%d,%d,%d,%d", sample[8],sample[9],...

私が試してみました:

sprintf( str, "%d,%d,%d,%d,%d,%d,%d,%d", sample[i++],sample[i++],sample[i++],sample[i++],sample[i++],sample[i++],sample[i++],sample[i++]);
4

2 に答える 2

1

不運にも、

sprintf( str, "%d,%d,%d,%d,%d,%d,%d,%d", sample[i++],sample[i++],sample[i++],
           sample[i++],sample[i++],sample[i++],sample[i++],sample[i++]);

動作しません。関数の引数が評価される順序は指定されていないため、それぞれが左から右に評価されることは保証されず、それぞれが評価された直後にsample[i++]の副作用が適用されることも保証されません。このコードの動作はundefinedです。つまり、結果は予測できません。 ++i++

sprintf残念ながら、1 回の呼び出しで求めていることを実行する良い方法はありません。のように、各インデックスを明示的に指定する必要があります。

sprintf( str, "%d,%d,%d,%d,%d,%d,%d,%d", sample[0],sample[1],sample[2],sample[3],
           sample[4],sample[5],sample[6],sample[7]);

または、次のように別のものを書く必要があります

strcpy( str, "" );
for ( size_t i = 0; i < 8; i++ )
{
  char tmp[4] = {0};
  char *empty = "";
  char *comma = ",";
  char *sep = empty;

  sprintf( tmp, "%s%d", sep, samples[i] );
  strcat( str, tmp );
  sep = comma;
}

ええ、私は知っています。率直に言って、1 回のsprintf呼び出しで各インデックスを手動で指定する方がよいでしょう。

もっと注意を払っていないのは当然のことです。一度に 8 つのサンプルの行を標準出力に出力する必要がある場合、これははるかに簡単になります。

for ( j = 0; j < 64; j++ )
{
  printf( "%d", samples[ j * 8 ] );

  for ( k = 1; k < 8; k ++ )
  {
    printf( ",%d", sep, samples[ j * 8 + k ] );
  }
  putchar( '\n' );
}        

編集

for ( j = 0; j < 63; j++ )
{
    sprintf( str, "%d,%d,%d,%d,%d,%d,%d,%d,", 
      samples[ j * 8 ],     samples[ j * 8 + 1 ], samples[ j * 8 + 2 ],
      samples[ j * 8 + 3 ], samples[ j * 8 + 4 ], samples[ j * 8 + 5 ],
      samples[ j * 8 + 6 ], samples[ j * 8 + 7 ] );

    // send str
}        

sprintf( str, "%d,%d,%d,%d,%d,%d,%d,%d", 
  samples[ j * 8 ],     samples[ j * 8 + 1 ], samples[ j * 8 + 2 ],
  samples[ j * 8 + 3 ], samples[ j * 8 + 4 ], samples[ j * 8 + 5 ],
  samples[ j * 8 + 6 ], samples[ j * 8 + 7 ] );

// send str

最後の行の特殊なケースです。最後のサンプルの後に末尾のコンマが必要ないと想定しているためです。

于 2013-09-19T21:02:51.493 に答える
0

一度に 1 つずつデータを送信する方がはるかに簡単な場合があります。これにより、実際に必要なメモリが少なくなります。例えば

char str[10]; //FIXME verify this is enough for longest possible case
int samples[256];

//fill random data here

for (i = 0; i< 256; i++) {
    sprintf(str, "%d, ", samples[i]);  //could use snprintf for more safety
    #ifdef WINDOWS
      printf(str);
    #else
      UART_SEND_STRING(str);
    #endif
}
于 2013-09-21T15:38:47.197 に答える