1

C では、uint16_t 配列を uint8_t を受け取る関数に渡したいと思います。

bool fctn(uint8_t *data, size_t length);

私は構造体の中にあるこの配列を持っています:

typedef struct sStruct sStruct;
struct sStruct{
    uint16_t d[10];
}
sStruct myStruct;

私もです:

void test(sStruct structData) {
    fctn( (uint8_t*)structData->d[0], 10*sizeof(uint16_t) );
}

ここでは長さは問題ではなく、配列を渡しています。この配列がまだポインターではない場合、「エラー: 異なるサイズの整数からのポインターへのキャスト」が表示されますが、uint8_t の配列のように見せるにはどうすればよいですか? その関数に関する限り、uint16_t 配列はサイズ uint8_t の倍長配列のように見えますが、コンパイラにこれを伝える方法がわかりません...入力が既にポインターである場合。

配列 'd' が構造体の中になく、単にグローバルであると言う場合、私はそうします

fctn( (uint8_t*)d, 10*sizeof(uint16_t) );

渡された構造体内の配列に対して関数を渡す正しい方法は何ですか?

4

1 に答える 1

1

あなたが言うときuint16_t d[10];、あなたは配列を定義していますd。と言うとd[0]、その配列の最初の要素にアクセスします。これは 型uint16_tです。関数はポインターを想定しているため、配列内の要素ではなく、配列へのポインターをキャストする必要があります。

fctn( (uint8_t*)d, 10*sizeof(uint16_t) );

これを行うと、は typeからにd減衰し、に渡される前に にキャストされます。uint16_t[10]uint16_t*uint8_t*fctn

余談ですがsizeof(d)、長さの計算を簡素化するために使用することもできます。

fctn( (uint8_t*)d, sizeof(d) );

dこれは、 が (スタック上で) 配列として宣言されている場合にのみ機能することに注意してください。

于 2014-11-14T02:34:44.487 に答える