C передать указатель на функцию, как? - PullRequest
0 голосов
/ 25 февраля 2011

Имея следующий код, как я могу "получить" получить карту и вернуть значение в указанной позиции?

Я пытаюсь написать клеточный автомат на C, чтобы попытаться обернуть мою головувокруг указателей и выделения памяти.Все было хорошо, пока я не решил сделать «get» для получения данных вместо прямой карты [x + world.w * y], как я привык.Я нуждаюсь в этом, потому что в будущем я планирую иметь две карты одинакового размера и использовать одну и ту же функцию для получения данных из них (так что вместо «get (» будет «get (& map2, x, y)»).& map, x, y) ".

Я делаю это, потому что мне не рекомендуется использовать глобальные переменные, поэтому я оставлю две карты в основном и отправлю их адреса функциям для обработки.

Этоявляется языком C, поэтому решения C ++ не действительны.

Я пытался найти это в Google, но вся документация чрезвычайно техническая и запутанная, и я не уверен, как эта процедура на самом деле названа ...Кто-нибудь может мне помочь с этим? Как я могу передать массив malloc в функцию и получить или изменить данные из нее?

typedef struct Map {
int HP;
int type;
unsigned int flags;
} Map;

typedef struct World {
int w;
int h;
} World;

struct World world;

int tile (int x, int y) { return x + world.w * y; }

int get (/*unknown*/map , int x, int y){
int val = x + world.w * y;
return /*unknown ->?*/ type;
}


int main (){
Map* map;
world.w = 8;
world.h = 8;
int tiles = world.w * world.h;
map = (Map*)malloc(sizeof(Map) * tiles);
int i;
for(i = 0; i < tiles; i++){
    map[i].type = rand()%2;
}
int x,y;

while(1){
    put(0,0);
    for(y = 0; y < world.h; y++){
        printf("\n");
        for(x = 0; x < world.w; x++){
            printf("%i ", get(&map, x, y));
        }
    }
};
printf("\n");
return 0;

}

Ответы [ 4 ]

2 голосов
/ 25 февраля 2011

вместо: get(&map, x, y)

, в котором вы передаете адрес адреса указателя карты, который возвратил malloc (), просто передайте сам адрес: get(map, x, y) AFAICT из вашего кода, malloc () возвращает именно то, что get () ищет, то есть указатель на место в памяти, в котором есть место для 64 плиток. Так что get () может выглядеть примерно так: int get( Map *map, int x, inty ) { int val = x + map->w * y; // map is a pointer to struct, not the struct itself return val; // get( ) returns an int, and it's in val }

Это может быть ближе к тому, что вы хотите.

- Пит

В вашем коде также есть несколько других ошибок, но это может позволить компилятору взяться за дело.

1 голос
/ 25 февраля 2011

Ваша переменная map в main() уже является Map *, поэтому не создавайте из нее двойной косвенный указатель, применяя & к нему на сайте вызова., int get(Map *m, int x, int y) { ... return map[...]; }

Не приводить возвращаемое значение из malloc(3).

0 голосов
/ 25 февраля 2011

Передать указатель на структуру (или объединение) в C очень просто:

typedef struct Foo
{
  int a      ;
  char b[32] ;
} FOO ;

void do_something_with_a_foo( FOO* p )
{
  // using the arror operation '->' to deference a structure pointer
  int  m = p->a    ;
  char n = p->b[3] ;

  // using the * operator to deference a structure pointer
  int  x = (*p).a    ;
  char y = (*p).b[3] ;

  return ;
}

void pass_a_foo_pointer_to_function()
{
  FOO  stack_instance  = { 3 , "hello, world" , } ;
  FOO* heap_instance   = malloc( sizeof(FOO) ) ;

  heap_instance->a = 12 ;
  strcpy( heap_instance->b , "this, that and the other" ) ;

  do_something_with_a_foo( &stack_instance ) ;
  do_something_with_a_foo(  heap_instance  ) ;

  free( heap_instance) ;

  return ;
}

Ура! * * 1004

0 голосов
/ 25 февраля 2011

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

typedef struct Map {
int HP;
int type;
unsigned int flags;
} Map;

typedef struct World {
int w;
int h;
} World;

struct World world;

int tile (int x, int y) { return x + world.w * y; }

Map * get (Map *map , int x, int y){
return map[x + world.w * y];
}


int main (){
Map *map;
Map *m;
world.w = 8;
world.h = 8;
int tiles = world.w * world.h;
map = (Map*)malloc(sizeof(Map) * tiles);
int i;
for(i = 0; i < tiles; i++){
    map[i].type = rand()%2;
}
int x,y;

while(1){
    put(0,0);
    for(y = 0; y < world.h; y++){
        printf("\n");
        for(x = 0; x < world.w; x++){
            m = get(map, x, y); // map was already declared as a pointer
            printf("%d\n", m->HP);
            printf("%d\n", m->type);
            printf("%X\n", m->flags);
        }
    }
};
printf("\n");
return 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...