1

あるIDEから別のIDEで使用するためにコードを変換しようとしています。現在のものは、この構造を変数配列から初期化できるようにするgccを使用しています。新しいツールはgccを使用しないため、「フレキシブル配列メンバーに初期化子を指定できません」というエラーが表示されます。それで、誰かが私がこれを設定する方法を理解するのを手伝ってくれるでしょうか?可変サイズの空白の配列を設定してから、以下に示すようにどこかに#define配列を割り当てる必要がありますか?

コードの例を次に示します…(これは現在の実装の現在のIDEです)

ビルド切り替え可能である1つのヘッダーファイルには、さまざまなハードウェアプラットフォームでこれをビルドできるため、次の#defineがあります。

#define GPIOS  \ 
          /*     BANK, PIN, SPD,  MODE,…  */
      GPIOINIT(   A,   0,   2,   AIN,  …) \
      GPIOINIT(   A,   1,   2,   AIN,  …) \
      GPIOINTINIT(A,   2,   2,   AIN,  …) \
      .
      .
      .

次に、すべてのビルドで使用される別のヘッダーファイルに

  PLATFORM_CONFIG_T g_platformConfig = {
          .name = {PLATFORM_NAME},

          (bunch of other stuff),

         .allGpios = {
                     GPIOS /* here I get the error */
         },
   };

だから私はエラーラインを可変配列にして後で他の方法でそれに割り当てることができると思っていますか?問題は、実際のアレイ「GPIO」のタイプが異なり、異なるデザインのピンの順序が異なることです。

4

1 に答える 1

0

アグリゲートを使用して柔軟な配列メンバーを初期化することは、gcc拡張機能です。良いニュースは、g_platformConfig静的に割り当てるため、そのメンバーが柔軟な配列である必要はないということです。代わりに、固定サイズの配列を使用できます。

コードのどこかに、GPIOS配列内にあるアイテムの数を示す定数の定義がある可能性が非常に高いです(そうでない場合は、Cのnullターミネータと同様に、ある種の「センチネル」値に依存する必要があります文字列、正当なGPIOS値がどこで終わるかを知るため)。すでにその定数がある場合は、の定義を次のように変更allGpiosします。

gpoinit_t allGpios[GPIO_COUNT]; // regular array

それ以外の

gpoinit_t allGpios[]; // flexible array

この変更を行うと、コードは正しくコンパイルされます。

定数がない場合は、GPIO_COUNT定数を追加するか、MAX_GPIOの項目数を制限する値を導入することを検討してallGpiosください。いずれにせよ、配列を柔軟性のない配列に変換すると、エラーが修正されます。

于 2012-09-19T15:36:45.723 に答える