プラグイン (共有ライブラリ) を追加できるようにするための一種の API を使用して、C で格闘ゲームをプログラミングしています。各プラグインは、ゲームをプレイできる一種の人工知能です。ゲーム中の各終了フレームで決定を下すことができます。私のプラグインはこのような構造になっています:
#include "acquisition.h"
void decision_frame(Decision_frame* d){
void* me = tell_me_who_i_am("my_plugin.so");
if (some_information_about(me) == foo){
d->turn_left = 12;
}
/* bla bla bla */
}
したがって、非指向オブジェクト言語でいくつかのオブジェクトを実装しようとしていることに気付きました。そのため、「void* me」は呼び出し元を識別する変数です。ヘッダーの取得は次のようになります。
#ifndef _GUARD_
#define _GUARD_
typedef struct{
int move;
double angle_move;
double angle_gun;
double angle_radar;
int shot;
}Decision_frame;
void* tell_me_how_i_am(char* plug_name);
Bar some_information_about(void* me);
Foo other_information_about(void* me);
#endif
私の Acquisition.c (一種の API 部分...) ファイルには現在、次のものが含まれています。
Space* get_space(void){
static Space S;
printf("Space adress (by getter) : %p\n", &S);
return &S;
}
最後に、私の主なことは次のとおりです。
1 -> スペースを指すメインのローカル変数を設定するためのスペースの初期化 (ゲッターの使用)。(POINT ONE) 2 -> 構造体 Space のフィールド内でメモリの割り当てを行います。3 -> プラグイン bar.so で大量の dlopen を実行した後の getter のリコール (ポイント 2)
したがって、私はいくつかの無駄に冗長です:
Space address (by getter) : 0x6071c0 (POINT ONE)
Space address in main : 0x6071c0
Auto-loading of plugins...
2 potential plugins founds :
- alea_all.so... loading OK
- full_dummy.so... loading OK
Space address (by getter) : 0x7ff4e6c650a0 (POINT TWO)
Space address in main : 0x6071c0
位置に依存しないコードと位置に依存しないコードを混在させるのは悪いことだと思います!!!!!!!! 私は次のようにコンパイルを処理します:
bin/acquisition.o: src/acquisition.c includes/acquisition.h
$(GCC) -fpic -c src/acquisition.c -o bin/acquisition.o $(CFLAGS)
plugins/full_dummy.so: plugins/full_dummy.c bin/acquisition.o
$(GCC) -c -fPIC plugins/full_dummy.c -o plugins/full_dummy.o $(CFLAGS)
$(GCC) -shared -o plugins/full_dummy.so plugins/full_dummy.o bin/acquisition.o $(CFLAGS)
わかりません: -fpic コードは非 -fpic コードにどの程度依存する可能性がありますか? この種のパターンでは、どのくらいの静的変数を使用できますか?
そして、Pure C でこの種の問題を設計する簡単で安全で良い方法はありますか? つまり、同じプログラムにいくつかの AI をプラグインする...
私の英語で、長くなってすみません...