我正在使用一种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 - >空间初始化(使用getter)在main中设置一个指向Space的局部变量。 (POINT ONE) 2 - >在我的struct Space字段中做一些分配内存。 3 - >在插件bar.so(POINT TWO)之后回想起吸气剂。(点二)
因此我有些肮脏的冗长:
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模块使用来自acquire.c的静态变量)?在这种模式中可以使用多少静态变量?
在Pure C中设计这种问题是否存在一种琐碎,安全且好的方法?我的意思是,在同一个程序中插入一些AI ......
对不起我的英语和长篇...