5

SPI 経由で外部デバイスと接続するための組み込みコードを作成しています。デバイスにはさまざまな長さのレジスタがいくつかあり、物事をまっすぐに保つために、次の構造を定義しました

typedef struct
{
    uint16_t    Signed          :1;  // Register is signed or unsigned
    uint16_t    CommLengthBytes :3;  // The width of the register in bytes 
    uint16_t    Address         :12; // Register address
}ts_register;

次に、ソースで各レジスタを次のように定義しました

static const ts_register    SAGCYC      = {0, 1, 0x000};
static const ts_register    DISNOLOAD   = {0, 1, 0x001};
static const ts_register    LCYCMODE    = {0, 1, 0x004};
static const ts_register    IRMSA       = {0, 4, 0x31A};
static const ts_register    IRMSB       = {0, 4, 0x31B};
static const ts_register    VRMS        = {0, 4, 0x31C};

ts_registers の配列へのポインターを取得し、配列内のすべてのレジスターを読み取るために必要な SPI 転送をキューに入れ、コールバック関数を呼び出して応答を処理する関数があります。

私の問題は、次のように読み取りたい ts_registers の配列を作成しようとしたときに発生します。

ts_register regs_to_read[3] = {VRMS, IRMSA, IRMSB};

これにより、「式には定数値が必要です」というエラーが 3 回発生します (配列要素ごとに 1 回)。

それらは定数として定義されているため、何を見落としているのでしょうか?

4

4 に答える 4

8

それらは定数として定義されているため、何を見落としているのでしょうか?

const修飾子で宣言された C オブジェクトは、真の定数ではありません。const のより適切な名前はおそらく次のようになります。readonlyこれが実際に意味することは、コンパイラーが変更を許可しないということです。また、オブジェクトを静的ストレージで初期化するには、真の定数が必要です (regs_to_readグローバルだと思います)。

regs_to_read他の何かがその配列を使用する前に呼び出される関数で代入を試みることができます。

于 2012-07-28T16:20:10.000 に答える
2

constは、コンパイル時にそれらを定数にしません。それらを#definesにすると、コンパイラーは満足します。

于 2012-07-28T16:21:08.767 に答える
1

これはコンパイラの問題である可能性があると思います。使用しているプラ​​ットフォームと、このコードをどのように構築しているかを知っておくと役立ちます。私はあなたのコードのほとんどを取り、それをコンパイルするために修正し、gcc を使用して Linux でコンパイルしました。警告はありませんでした。

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>

typedef struct
{
    uint16_t    Signed          :1;  // Register is signed or unsigned
    uint16_t    CommLengthBytes :3;  // The width of the register in bytes 
    uint16_t    Address         :12; // Register address
}ts_register;

int main(int argc, char **argv) {

    static const ts_register    SAGCYC      = {0, 1, 0x000};
    static const ts_register    DISNOLOAD   = {0, 1, 0x001};
    static const ts_register    LCYCMODE    = {0, 1, 0x004};
    static const ts_register    IRMSA       = {0, 4, 0x31A};
    static const ts_register    IRMSB       = {0, 4, 0x31B};
    static const ts_register    VRMS        = {0, 4, 0x31C};

    ts_register regs_to_read[3] = {VRMS, IRMSA, IRMSB};

    return(0);
}

値をキャストしてみましたか? 常に最善の方法とは限りませんが、エラーを回避できます。

#define エントリの作成を検討しましたか?

また、C では const に慣れるまでに少し時間がかかることに注意してください。常に期待どおりに動作するとは限りません。

于 2012-07-28T16:33:08.320 に答える