0

配列を整数に変換する方法はありますか、私は次の方法を持っていますが、うまくいかないようです:

int8_t x_array[18] = {0,1,1,0,1,0,1,0,1,0,1,0,0,0,0,0,1,1};
int32_t numb;

for (int8_t j=0;j<19;j++)
{
   numb = numb + pow(2, i)*x_array[i];
}

これには理由がありますか??

PS:これは私が投稿した以前の質問からのフォローアップの質問です スイッチからの出力の結合 質問を編集して、提案された方法が機能しない理由を述べました。

本質的に、私がやろうとしているのは、シミュレータ ソフトウェアである RAPIDILITTE で、18 ビットのデジタル入力である PS 入力 (近接センサー システム) をミリ秒ごとにサンプリングするプログラムを作成することです。入力は、ポート 2 にあるトグル スイッチ 0 ~ 17 (18 ビット) によって表されます。入力は 0 ~ 9999 の間で正規化する必要があります)。

主な問題は、(以前に投稿された質問で述べた) 一度に 1 つのピンにしかアクセスできず、ポート全体を一度に読み取れないことです。ピンを読み取って1つの変数に結合し、それを自然数に変換してから入力を正規化する多くの方法を試しました。最後に、これを行う最善の方法は、各ピンの読み取り値を a に入れ、array[18]これを変数に変換してから正規化することだと思います。

4

3 に答える 3

3

変数を初期化することはないため、それを読み取るのは単純な未定義の動作です。言うべき:

int32_t numb = 0;

また、ループ変数として使用するかどうかを決定する必要がありiます。j

(毎回電力を計算するのも無駄です。代わりに、実行中の乗数を維持し、各ステップで 2 倍にする必要があります。)

于 2012-08-30T05:57:12.837 に答える
1

numb初期化されることはありません。また、配列の最後の要素を超えて反復しています (j < 19である必要がありますj< 18)。さらに、あなたは決して宣言しませんでしたi...それはあなたが意図していたようですj.

ビットの配列を単一の に変換しようとしていると思いますint32_t。おそらく、配列は重要度の昇順、つまり最下位ビットから最上位ビットの順に並んでいます。

int8_t x_array[18] = { 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1 };
int32_t numb = 0;
for (int8_t j = 0; j < 18; ++j) {
  numb |= x_array[j] << j;
}

は と同等であるpowため、ここで使用する必要はありません。pow(2, j)1 << j

于 2012-08-30T06:17:18.310 に答える
0

他の人が述べたように、あなたの問題は、麻痺を初期化しておらず、プログラムの未定義の動作につながることです。また、ループ カウンターを!ではなく
に変更する必要があります。ij

あなたのプログラムにもう 1 つ変更を加えたかっただけで、それが最終結果の計算方法です。これはどう ?答えを得るために必要な操作ははるかに少なくなります:

numb = 0;
for (int8_t i=LEN;i>0;i--)
    numb = numb*2 + x_array[i-1];
于 2012-08-30T07:14:27.637 に答える