配列のように見えるクラスを作成しましたが、プログラム自体にデータを保持するのではなく、ファイルからバイトをストリーミングします (RAM への影響を軽減するため)。これですべてが機能しましたが、プログラマーは次を使用してクラスを定義する必要があります。
#define CreateReadOnlyBlock(name, location, size, ...) \
template<> \
const unsigned int ReadOnlyBlock<location, size>::Data[] \
__asm__( ".readonly__" #location "__" #name) \
= { __VA_ARGS__ }; \
ReadOnlyBlock<location, size> name;
例:
//A read only array of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray, 0, 4, 0, 1, 2, 3);
これは組み込みプロセッサ用であり、asm ディレクティブはアセンブラのツールを経由して読み取り専用ファイルを作成することに注意してください。
ここに私の質問があります。「場所」変数と「サイズ」変数を削除するにはどうすればよいですか? 私は、プログラマーがそれらを手動で入力しなければならないことを嫌い、コンパイル時にそれらを生成する何らかの方法を好んでいます。したがって、プログラマーが次のように入力する必要はありません。
//A read only array at location 0 of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray1, 0, 4, 0, 1, 2, 3);
//A read only array at location 4 of {4, 5, 6, 7}
CreateReadOnlyBlock(readOnlyArray2, 4, 4, 4, 5, 6, 7);
次のように入力するだけです。
CreateReadOnlyBlock(readOnlyArray1, 0, 1, 2, 3);
CreateReadOnlyBlock(readOnlyArray2, 4, 5, 6, 7);
そして、適切な定数が生成されます。基本的に、コンパイル時に以前の定義に基づいてこれらの定数を生成して配置する方法を探しています。C ++ 11は公正なゲームです。私はそれにひどく慣れていません(constexprの何かがもっともらしいですか?)。また、C-Preprocessor も、以前よりも醜くならなければ問題ありません。これは可能ですか?
明確にするために編集:
ReadOnlyBlock クラスには、次のメソッドがあります。
template<const int _location, const int _size> class ReadOnlyBlock
{
...
unsigned int operator[] (size_t index)
{
return LoadFromROM(index + _location);
}
}
ロケーション変数と ROM ファイルの間には固有の相互依存関係があり、それをどのように壊すかは考えられません。ツール チェーンも完全に制御できますが、アセンブラー ツールにファイルの作成方法を渡す方法と、ブロックがファイル内のどこにあるかを C++ コードに示す方法が必要です。
別の編集:
ファイルとそのブロックは非常に大きくなる可能性があり、1,000 ワードにも及ぶため、多くのプリプロセッサ マジックが機能しなくなる可能性があります。また、これまでご協力いただきありがとうございました。