0

我正在用一种允许添加插件(共享库)的 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中设置一个局部变量指向空间。(要点一) 2 -> 在我的结构空间的字段内分配一些内存。3 -> 在插件 bar.so 上的一堆 dlopen 之后召回 getter(第二点)

因此,我有一些冗长的冗长:

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 代码(因为很多非 fpic 模块使用来自 acquire.c 的静态变量)?在这种模式中可以使用多少静态变量?

在纯 C 中设计这类问题是否有一种简单、安全和好的方法?我的意思是,在同一个程序上插入一些人工智能......

对不起我的英语和长...

4

0 回答 0