1

私はライブラリから次の構造を持っています:

typedef struct
{
    unsigned char pin;              //!< Module pin.
    unsigned char function;         //!< Module function.
} gpio_map_t[]; 

今、私のコードでは、次のような構造のインスタンスを作成します。

gpio_map_t display_spi_pins = {
        {1,1},
        {2,2},
        {3,3},
        {4,4}
    };

そして、私はそのようなポインタを作成します:

gpio_map_t* spi_pins_pointer = &display_spi_pins;

ここまですべてがうまくいき、コンパイルエラーはありません。

display_spi_pinsへの参照を取得する方法を知りたいです。私はそのようにしようとします:

gpio_map_t display_spi_pins_new_reference = *spi_pins_pointer;

しかし、次のようなコンパイルエラーが発生します。

配列初期化子は初期化子リストである必要があります

編集: typedef sctruct ...がライブラリから来ていることを忘れないでください、私はそれを変更することはできません。

4

4 に答える 4

1

問題はgpio_map_t、長さが未定義の構造体の配列として定義していることです。代わりにそのようなことをしてください:

typedef struct
{
    unsigned char pin;              //!< Module pin.
    unsigned char function;         //!< Module function.
} gpio_map_t;

gpio_map_t[] display_spi_pins = {
    {1,1},
    {2,2},
    {3,3},
    {4,4}
};

gpio_map_t** spi_pins_pointer = &display_spi_pins;
gpio_map_t* display_spi_pins_new_reference = *spi_pins_pointer;

( a は agpio_map_t*に非常に近いことに注意してくださいgpio_map_t[])。

于 2013-01-30T10:43:20.307 に答える
1

この場合、ポインタを介してデータにアクセスすることはできません。配列を使用して直接アクセスできます display_spi_pins

for(i=0; i<sizeof(display_spi_pins)/sizeof(display_spi_pins[0]); i++) {
    printf("pin[%d]=%X, function[%d]=%X\n",
           i, display_spi_pins[i].pin,
           i, display_spi_pins[i].function);
}
于 2013-01-30T10:40:42.097 に答える
0

gpio_map_t型エイリアスを配列型として宣言しないでください。代わりに、構造体の配列が必要な場合は、変数を配列として宣言し、参照にのみポインターを使用します。

于 2013-01-30T10:42:26.750 に答える
0

これはあなたが探しているものですか?

typedef struct
{
    unsigned char pin;              //!< Module pin.
    unsigned char function;         //!< Module function.
} gpio_map_t[]; 


void main()
{
    gpio_map_t display_spi_pins = {{1,1}, {2,2}, {3,3}, {5,6}};
    gpio_map_t* spi_pins_pointer = &display_spi_pins;
    gpio_map_t* display_spi_pins_new_reference = spi_pins_pointer;

    int i;    

    for(i=0;i<4;i++){
        printf("%d: %d  %d\n",i,(display_spi_pins+i)->pin,(display_spi_pins+i)->function);

        if(((display_spi_pins+i)->pin != (*spi_pins_pointer+i)->pin) ||
            ((display_spi_pins+i)->pin != (*display_spi_pins_new_reference+i)->pin) ||
            ((display_spi_pins+i)->function != (*spi_pins_pointer+i)->function) ||
            ((display_spi_pins+i)->function != (*display_spi_pins_new_reference+i)->function))  
            printf("Reference ERROR\n");
    }
}
于 2013-01-31T05:44:01.783 に答える