0

uint8サイズ(バイト数)である別のパラメーターを持つポインターを受け取るC関数があります。

doubleこのバッファからデータを抽出したい。これが私のコードです:

Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
    double d;
    for (i = 0; i < size; i++)
    {
        d = ((double*)&data)[i];
        printf(" d = %d\n");
    }
}

問題は、外部ハードウェア内で送信しているものを受信して​​いないことです。私のキャストは間違っていると思います。他の方法を試しましたが、良い結果は得られませんでした。送信したものをまだ取得できません。

4

3 に答える 3

2

データが実際にはdoubleの配列であり、サイズがバイト数であるとすると、コードは次のようになります。

Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
  double d;
  int i;
  for (i=0; i<size/sizeof(double); ++i) {
    d = ((double*)data)[i];
    printf(" d = %g\n",d);
  }
}

ほとんどの場合、サイズはバイト数であり、doubleの数ではないため、実際のdoubleの数を取得するには、サイズをdoubleのサイズで割る必要があります。

これを行う場合:

    d = ((double*)&data)[i];

次に、データへのポインタへのポインタがダブルポインタであると言っています。

また、printfステートメントは次のようになりました。

printf(" d = %d\n");

あなたはint(%dはint)を印刷するように指示していて、実際に印刷する値を与えていませんでした。これを%gに変更しました。これは、doubleを最適な形式で出力します。

于 2012-10-02T15:19:26.727 に答える
1
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
 {

  double d;
  for (i=0; i<size; i++) {
  d = ((double*)data)[i];
  printf(" d = %d\n", d);
  }

 }

あなたが探しているのは推測ですが、ポインタは実際にはdoubleの配列へのポインタなので、正確にそれをキャストするだけです。

于 2012-10-02T15:24:39.407 に答える
0

私があなたの質問を理解している場合(抽出するものがせいぜい1doubleつあるのか、それとも多くなる可能性があるのか​​は完全には明らかではありません)、これが私がやろうとしていることです:

double Write(uint8* data, uint8 size)
{
    double d;

    if (size < sizeof(d))
        return 0; // failure; you may want something smarter than this

    memcpy(&d, data, sizeof(d));

    return d;
}

これが回避するのは、のようなキャストでの潜在的な配置の問題d = *(double*)dataです。

データが有効なものを表していない場合double、特にデータが逆になっている場合(たとえば、ハードウェアがリトルエンディアンで、このコードを実行しているCPUがビッグエンディアンである場合など)、これは奇妙で醜い方法で失敗する可能性があります。

エイリアシングの問題が当てはまるかどうかはまだわかりません。標準をもう一度読む必要があります。しかし、実際にはそれらを見たことがありません。

于 2012-10-02T15:32:12.850 に答える