組み込みターゲットで C をプログラミングしています。複雑さとテスト容易性の問題が増大しているため、モジュール性は必須です。
一見すると、プログラムは制御ループです。内部ハードウェアを使用して物理入力を読み取り、いくつかの計算を適用し、計算された出力を適用します。ただし、コントロールは非常に洗練されており、多くの内部状態と変化する変数があります。
このコントロールはさまざまなモジュールに分割され、さまざまな状態の機能がまとめられています。DRY を維持するために、一般的なタスク/計算は個別のモジュールで提供され、別のモジュールで呼び出されます。プロジェクト全体で列挙型と型の一貫性を保つために、最上位の .H ファイルが使用されます (私の知る限り、継承などの OO 戦略は私のフレームワークではオプションではないため)。
モジュールとの間で変数を渡す方法を決定するときに、私の問題が発生します。
私の最初のアプローチは次のとおりです。
mymodule.H:
struct Inputs{
int input1;
...
int inputN;
}
struct Outputs{
int output1;
...
int outputN;
}
void mymodule(Inputs in,Outputs* out);
そして、メイン関数 (またはこのモジュールを呼び出すモジュール) で、「入力」および「出力」タイプの構造体を作成します。
次に、変数が Inputs 構造体にコピーされ、関数が呼び出され (Outputs 構造体を参照)、完了すると、この構造体の内容がさらなる計算に使用されます。
ただし、各モジュールは InputType および OutputType のインスタンスを呼び出し元のモジュールで作成する必要があるため、メモリ フットプリントが大きくなります。私の意見では、それはエレガントなソリューションではありません。ちなみに、私のプロジェクトでは動的割り当ては許可されていません。
良い解決策にたどり着くためのガイドラインや別のアイデアを教えていただけますか?
ありがとうございました。
追加した
解決策の 1 つは、InputStruct をポインターとして渡すこともできますが、それらは実質的にモジュールへの入力であるため、コードに沿って変更されていないことをどのように保証できますか?
追加した
ところで、発生するもう 1 つの問題は、すべてのモジュールが同じ変数を受け取るわけではなく、(これは C であるため) 継承メカニズムが利用できないため、各モジュールの構造に適切な値をロードする必要があるという事実です。私はかなり難読化されています...