3

マイクロコントローラーの周辺機器をCで構成する関数を書こうとしています。そのために、を使用しva_argました。関数は次のとおりです。

void init_peripheral(int ID, ...){
    va_list device;
    va_start(device, ID);
    io * temp; // No error here
            //io is a structure 
            //IO, USART, LCD are 01, 02, 03.
    (*temp).portB.set = set_portB;

    if( ID == IO ){
        io* config_io; // error:expected specifier-qualifier-list before ‘*’ token
        config_io = va_arg(device, *io);
        (*config_io).portB.set = set_portB;
        (*config_io).portB.clr = clr_portB;
        (*config_io).portB.mkin = mkin_portB;
        (*config_io).portB.mkout = mkout_portB;

        (*config_io).portC.set = set_portC;
        (*config_io).portC.clr = clr_portC;
        (*config_io).portC.mkin = mkin_portC;
        (*config_io).portC.mkout = mkout_portC;

        (*config_io).portD.set = set_portD;
        (*config_io).portD.clr = clr_portD;
        (*config_io).portD.mkin = mkin_portD;
        (*config_io).portD.mkout = mkout_portD;
    }

    else if( ID == LCD ){       
        lcd *config_lcd;
        config_lcd = va_arg(device, *lcd);
         //Set necessary params here
    }

    else if( ID == USART){
        usart *config_usart;
        config_usart = va_arg(device, *usart);
        (*config_usart).init = usart_init;
        (*config_usart).transmit = usart_transmit;
        (*config_usart).receive = usart_receive;
    }


    va_end(device);
}

行のエラーは発生しませんが、次のエラーio * tempが発生します。構造体io * config_io;
は次のとおりです。io

struct __io__{
    struct __port__ portB;
    struct __port__ portC;
    struct __port__ portD;
};
typedef struct __io__ io;
4

2 に答える 2

3

問題は実際には次の行のva_argマクロにあります。タイプの代わりに逆参照ポインターを送信しています:

config_io = va_arg(device, *io);       // Should be io*

config_lcd = va_arg(device, *lcd);     // Should be lcd*

config_usart = va_arg(device, *usart); // Should be usart*

これがコンパイルの問題があるコードです。
これが修正バージョンです。

于 2012-07-09T13:34:03.550 に答える
1

コードは正しいようです。そして、あなたが宣言することができるので、私はなぜ突然失敗するべきtempかわかりません。io_configあなたが試すべきこと:

  1. #under config_io関数の前に追加します。たぶんマクロconfig_ioが定義されています。

  2. それがコンパイルされるかどうかを確認するためだけにio置き換えます。変数宣言をブロックstruct __io__外に移動しない場合。if()コンパイラのバージョンがサポートしていない可能性があります。

  3. 前処理されたソースコードを表示するようにコンパイラーに指示します(つまり、すべてのマクロが展開された後)。多分それはあなたにヒントを与えます。

于 2012-07-09T13:26:57.473 に答える