PythonからCのデータ構造をつくる場合
CでCのデータ構造を書いていると便利なのが、
structのメモリイメージままに書けるので
アドレスのオフセットを定義しやすいってことですが、
アドレステーブルを作るのはPythonでも簡単だったりします。
ファイルに書き込むオブジェクトの可変長リストは既にあると仮定します。
(この場合、output_cartoon_list。)
dat = open(output_file,'wb') # オブジェクトの個数を書き込む dat.write(struct.pack('H',len(output_cartoon_list))) # アドレステーブルの位置を記憶 cartoon_addr = dat.tell() for i in range(len(output_cartoon_list)): dat.write(struct.pack('H',0xdead)) # ダミーアドレスdeadを書き込む cartoon_addr_table = [] for cartoon in output_cartoon_list: cartoon_addr_table.append(dat.tell()) # 先頭アドレスを記憶 ...処理する # 後で元に戻すために保持 push_addr = dat.tell() dat.seek(cartoon_addr) #アドレステーブルを書き込む位置に移動 for addr in cartoon_addr_table: dat.write(struct.pack('H',addr)) dat.seek(push_addr) #戻す ... dat.close()
としてやると、
「オブジェクト(構造体)の個数」
「アドレステーブル(wordオフセットが個数分ある)」
というデータが先頭にできるので、
ファイルの先頭からオフセット分ポインタ加算するだけで各可変長データにアクセスできる構造ができます。
typedef struct tagCartoonListHead { word size; word addr[1]; } CartoonListHead;
な感じです。addrは1と定義してありますが、普通に個数分まであると思って良いです。
(ケースによってはもちろんdwordにしても良いです)
Cみたいにダイレクトにアドレス演算はできませんが、簡単に書いて試せるので意外に便利です。
ヘッダなどは共用できませんが、シンプルなデータ構造なら特に困りません。
相対オフセットを作りたい場合も、tellでオフセットさえ覚えておけばいくらでも計算可能です。