Как отправить в функцию переменную, которая находится в другом модуле? - PullRequest
0 голосов
/ 07 февраля 2019

Как я могу отправить указатель из другого модуля на новый модуль?

Здравствуйте, я только начинаю проект по программированию в c для игры для класса.Эта игра содержит структуру, называемую game, которая также содержит данные различных типов, такие как Players ir Objects.Эти структуры идентифицируются по длинному Id, классифицированному таким образом, что, например, объекты имеют Id между # 0 и # 100.

Чтобы упростить процесс, я создал функцию "what_id", которая, перебирая только Id, возвращает указатель на соответствующую ему структуру.Я знаю, как, отправляя структуру 'game', где содержатся все идентификаторы и Id, возвращают переменную, но есть модули, которые ни в коем случае не используют эту большую переменную 'game', например player.c.

Как я могу отправить «игру» этой функции, не имея ее?

typedef struct _Game{
  Player* player[MAX_PLAYERS + 1];
  Object* object[MAX_OBJECTS + 1];
  Space* spaces[MAX_SPACES + 1];
 T_Command last_cmd;
} Game;
  typedef struct _Object{
  Id id;
  char name[MAX_SPACES];
}

void* what_id(Game* game, Id id){
   if(id == NO_ID) return ERROR;
   if(0 <id<=MAX_SPACES){
      return what_space(game->space, id);
   }else if(MAX_SPACES<id<=(MAX_OBJECTS+MAX_SPACES)){
      return what_object(game->object, id);
   }else if((MAX_OBJECTS+MAX_SPACES<id<(MAX_PLAYERS+MAX_OBJECTS+MAX_SPACES)){
      return what_player(game->player, id);
   }else {
      fprinf(stderr,"Id asigment max stacked.";
      return ERROR;
    }
}
Space* what_space(const Space* space, Id id){
   int i;
   for(i=0;i<MAX_SPACES;i++){
       if(space[i]->id == id)return space[i];
   }
   fprintf(stderr, "Error no space_id %d founded", id);
   return ERROR;
}

1 Ответ

0 голосов
/ 08 февраля 2019

Непонятно, что вы подразумеваете под «модулем» или откуда придет игра.Если под модулями вы подразумеваете отдельные исходные файлы, которые создают отдельные объектные файлы, как правило, это можно сделать двумя способами.

Первый - объявить глобальную переменную и импортировать ее как extern:

file1.c:

// declare struct
typedef struct {
    int value;
} Foo;

// declare global variable
Foo *globalfoo;

// declare external function from another module
void printfoo();

void main()
{
    Foo foo;
    foo.value = 3;
    globalfoo = &foo;
    printfoo();
}

file2.c:

#include <stdio.h>

// declare struct
typedef struct {
    int value;
} Foo;

// declare variable from another module
extern Foo *globalfoo;

void printfoo()
{
    printf("foo: %d\n", globalfoo->value);
}

Другой способ сделать это - передать его через аргумент функции:

file1.c:

typedef struct {
    int value;
} Foo;

void printfoo(Foo *foo);

void main()
{
    Foo foo;
    foo.value = 3;
    printfoo(&foo);
}

file2.c:

#include <stdio.h>

typedef struct {
    int value;
} Foo;

void printfoo(Foo *foo)
{
    printf("foo: %d\n", foo->value);
}

Вы можете избежать повторного объявления структур и функций в нескольких исходных файлах, поместив их в заголовочный файл и# Включая это:

myproject.h:

typedef struct {
    int value;
} Foo;

void printfoo(Foo *foo);

file1.c:

#include <myproject.h>

void main()
{
    Foo foo;
    foo.value = 3;
    printfoo(&foo);
}

file2.c:

#include <myproject.h>
#include <stdio.h>

void printfoo(Foo *foo)
{
    printf("foo: %d\n", foo->value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...