2012-05-09 5 views
2

私はアルゴリズムのための小さなCコードを書いています。主なターゲットは組込みマイクロコントローラですが、テスト目的ではMatlab/Pythonインタフェースが必要です。C配列を固定サイズまたは可変サイズのいずれかで宣言するための最も簡単な方法は?

私はC90の使用を必要とする組み込みプログラミングスタンダード(MISRA-C 2004)に従っており、mallocとお友達の使用はお勧めしません。したがって、コード内のすべての配列は、コンパイル時にメモリが割り当てられます。入力配列のサイズを変更する場合は、コードを再コンパイルする必要があります。これはマイクロコントローラのシナリオでは問題ありません。 しかし、Matlab/Pythonでプロトタイプを作成すると、入力配列のサイズがかなり変化し、毎回再コンパイルすることはオプションのようには思えません。この場合、C99の使用は許容され、実行時に配列のサイズを決定する必要があります。

問題は次のとおりです。これらの2つのシナリオを同じコードで共存させ、コードをきれいに保つにはどのようなオプションがありますか?

私の主な関心事は、コードを簡単に保守する方法です。 #ifdefを使用して、静的に割り当てられた配列または動的に割り当てられた配列のいずれかを使用することを検討しました。しかし、あまりにも多くの配列があると私は思う。#ifdefはコードが醜いものに見える。

+0

サイズのランタイム値はどのようにして決まりますか?おそらく、それは計算されるか、どこかから入力されなければならない。静的サイズのケースでは、その計算/ IOをスキップするための条件付き( 'if ifまたは' if)を避けることはできません。 –

+0

あなたのPythonコードでは、関連するビットの.cと.hコードを生成することができます。それは自動的に生成されたアプローチであるため、維持管理が容易になります。 – TJD

+0

@TJD自動生成されたアプローチも良いアイデアです。提案していただきありがとうございます。 – user1069152

答えて

3

私はあなたが1つだけ#ifdefと離れて得ることができる方法を考えました。私は個人的には弾丸を噛んで、必要なときにコードを再コンパイルします。生産とテストのためにCの別の方言を使用するという考えは私を少し緊張させます。

とにかく、できることは次のとおりです。組み込み環境でない場合

#ifdef EMBEDDED 
#define ARRAY_SIZE(V,S) (S) 
#else 
#define ARRAY_SIZE(V,S) (V) 
#endif 

int myFunc(int n) 
{ 
    int myArray[ARRAY_SIZE(n, 6)]; 
    // work with myArray 
} 

ARRAY_SIZEマクロは、可変Vを選択します。埋め込み環境にある場合は固定サイズSです。

+0

Brilliant!私は個人的に毎回再コンパイルしますが、コードは他の人にも使用されることを意図しています。そして、方言を混ぜることは間違いなく醜いことです。しかし、私が言ったように、C99は必須ではなく、不可能です。 – user1069152

+0

...または単に '#ifdef EMBEDDED int myArray [n]; #else int myArray [6]; #endif' – Lundin

+0

@問題を解決するには、複数の配列があり、質問者は、マクロを強く嫌うのではなく、きれいな解決策のために '#ifdef's – JeremyP

1

MISRA-C:2004はC99とVLAを禁止しています。したがって、厳密に準拠しているMISRAコードを作成している場合は使用できません。また、今後のMISRA-C規格では、VLAが明示的に禁止される可能性が非常に高い。

未知のサイズの静的に割り当てられた配列を使用しないことは可能ですか?つまり:

uint8_t arr[] = { ... }; 
... 
n = sizeof(arr)/sizeof(uint8_t); 

これは「最も美しい」方法です。代わりに、C99でV​​LAを使用してデバッグビルドを作成し、それをリリースビルドで静的に割り当てられた配列に変更することもできます。

+0

あなたが言いましたように、VLAはオプションのようには思われません。 「わからないサイズの静的に割り当てられた配列を使用しないことは選択肢ですか?」という意味はどういう意味ですか? – user1069152

+0

@ user1069152配列の要素の数に応じて、実行時に自動的に配列次元を設定します。私の例のように、 'arr [10] ='ではなく 'arr [] ='です。 – Lundin

関連する問題