Я программирую файтинг на C с помощью своего рода API для добавления плагинов (общая библиотека). Каждый плагин — это своего рода искусственный интеллект, который может играть в игру. Решение может быть принято в каждом конечном кадре игры. Мои плагины имеют такую структуру:
#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 -> Инициализация пространства (использование геттера), чтобы установить локальную переменную в main, указывающую на пространство. (ПУНКТ ПЕРВЫЙ) 2 -> Выделить память внутри поля моей структуры Space. 3 -> отзыв геттера после кучи dlopen над плагинами bar.so (ПУНКТ ВТОРОЙ)
Таким образом, у меня есть какой-то мусорный многословный:
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-модули используют статические переменные из Acquisition.c)? Сколько статических переменных можно использовать в таком шаблоне?
И есть ли тривиальный, безопасный и приятный способ решения такой задачи в Pure C? Я имею в виду, добавить немного ИИ в ту же программу...
Извините за мой английский и за длинное...