実行コードの決定論と透過性は、私が取り組んでいる組み込みプログラミングのタイプにおいて非常に重要です。私が透明性を意味するのは、例えば、メモリの任意のセクションを見てそこにどの変数が格納されているかを知ることができるということです。したがって、組み込みプログラマが期待しているように、可能な限り新しいものは避け、回避できない場合は初期化に限定します。組み込みプログラミングでのグローバル変数の回避
私はこれの必要性を理解していますが、私の同僚がこれをやり遂げたやり方に同意せず、より良い選択肢もわかりません。
私たちが持っているのは、いくつかのグローバル構造体配列といくつかのグローバルクラスです。ミューテックスの構造体の配列は、セマフォー用とメッセージキュー用の2つです(これらはメインで初期化されています)。実行されるスレッドごとに、それを所有するクラスはグローバル変数です。
私がこれをもっている最大の問題は単体テストです。クラスをテストしたいときにモックオブジェクトを挿入するにはどうすればいいですか?#include
グローバル変数はありませんか?
はここで擬似コードでの状況です:
がfoo.h
#include "Task.h"
class Foo : Task {
public:
Foo(int n);
~Foo();
doStuff();
private:
// copy and assignment operators here
}
bar.h
#include <pthread.h>
#include "Task.h"
enum threadIndex { THREAD1 THREAD2 NUM_THREADS };
struct tThreadConfig {
char *name,
Task *taskptr,
pthread_t threadId,
...
};
void startTasks();
bar.cpp
#include "Foo.h"
Foo foo1(42);
Foo foo2(1337);
Task task(7331);
tThreadConfig threadConfig[NUM_THREADS] = {
{ "Foo 1", &foo1, 0, ... },
{ "Foo 2", &foo2, 0, ... },
{ "Task", &task, 0, ... }
};
void FSW_taskStart() {
for (int i = 0; i < NUMBER_OF_TASKS; i++) {
threadConfig[i].taskptr->createThread();
}
}
多かれ少なかれタスクが必要な場合はどうすればよいですか? foo1のコンストラクタの異なる引数セット?私は別のbar.hとbar.cppを持たなければならないと思います。これは必要以上に多くの作業のようです。
私はあなたが '%のfoo1が'(剰余演算子)を意味する '&foo1の' といないと仮定? – DaveR
ありがとうございます。コピー/ペーストの代わりに書き直しをするのはこれだよ。 –