« リアプロ購入計画絶賛頓挫中 | トップページ | 「隊長!虫歯発生です!」「うむ。フッ素を塗れ」 »

ポインタテーブル使えませんかそうですか

 BREWに新たな発見。ポインタテーブル作れません!
 実行してからプログレッシブに作ることは可能なんだが、静的にテーブルを用意しておくのはダメだとさ。

const int foo = 1;
const int bar = 2;
const int * const tbl[] = { &foo, &bar };
↑ダメな例

 アンナァ・・・。ポインタテーブルなんてそこら中で必要だっつ-の。関数テーブルとかどうすんのよ。switch/caseでやれってか? それともC++で継承でござんすかい?
 一次が可変長な二次元テーブルとかもポインタテーブルでやるんですがね・・・。

 いろいろ調べてみて、原因はどうやら完全リロケータブルなコードにしておかなければいけないかららしい。つまり、実行時スタートアドレスが不明のため、リンカでアドレス解決できないものは全て×だと。だから、上記の例がstaticになっていると、PC相対でアドレスを決定できるので、OKになることがある(場所が遠くなったらダメ)。externalなシンボルは全部ダメ。

 やっかいなことに、エミュレータ上だとOKなんだよな。VC++でIntelコードだから。ARMコンパイラだとダメになる。だから、エミュレータ上でガンガンポインタテーブルを用意して、いざARMでビルドすると、鬼のようなエラーが!!! ぎゃああああぁぁぁ・・・・(憤死) 
 それにしても、エミュレータ上と実機上でマシンコードが異なる環境ってのはどうなのよ?

 他にもARMの自動make生成がANSI C strictなもんだから、warning吐く々々w ビットフィールドはintでないとダメだとか、()は(void)にしろだとか、warning撲滅運動員のワタクシと致しましては、売られたケンカ(warning)は買わなきゃ収まらねぇ。ま、makeを手で書き換えりゃいいんだけどね。メンドクセーANSI C の勉強にもなる からそのまんま。

 グローバル変数の問題は、GETAPPINSTATNCE()を引っ張ってくることで解決しそうなんだが、その関数(マクロ?)も機種依存で無効になることがあるらしく、おーまいごっです。

 とりあえず、御約束のassert()とかデバッグ用printf()とか(ほんのちょっぴり)安全なmalloc()/free()とか便利マクロを作る日々。なんかプラットフォームが新しくなるたびに作っているような気がするアルよw

|

« リアプロ購入計画絶賛頓挫中 | トップページ | 「隊長!虫歯発生です!」「うむ。フッ素を塗れ」 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/19762/3115001

この記事へのトラックバック一覧です: ポインタテーブル使えませんかそうですか:

« リアプロ購入計画絶賛頓挫中 | トップページ | 「隊長!虫歯発生です!」「うむ。フッ素を塗れ」 »