C传递指针函数,如何?

时间:2011-02-25 18:38:14

标签: c arrays pointers

拥有以下代码,我如何“获取”接收地图,并返回指定位置的值?

我试图在C中编写一个元胞自动机,试图围绕指针和内存分配。一切都很好,直到我决定“获取”获取数据而不是像以前那样直接映射[x + world.w * y]。 我需要这个,因为在将来,我计划有两个相同大小的地图,并使用相同的函数从它们获取数据(所以它是“get(& map2,x,y)”而不是“得到(& map,x,y)“。

我之所以这样做是因为我被建议不要使用全局变量,因此我会将两张地图保留在main中,并将其地址发送给要处理的函数。

这是C语言,因此没有C ++解决方案有效。

我试图在谷歌搜索这个但是所有文档都非常技术性和复杂性,而且我不确定这个程序是如何实际命名的......那么,任何人都可以帮我这个吗?如何将malloc'ed数组传递给函数并从中检索或更改数据?

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 个答案:

答案 0 :(得分:2)

而不是:

get(&map, x, y)

在其中传递malloc()返回的地图指针地址的地址,只需传递地址本身:

get(map, x, y)
来自您的代码的AFAICT,malloc()完全返回get()正在查找的内容,即指向内存中有64个tile的空间的指针。所以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 :(得分:1)

map中的main()变量已经是Map *,所以不要通过在呼叫网站上将&应用到它来创建双重间接指针

此外,int get(Map *m, int x, int y) { ... return map[...]; }

不要从malloc(3)投射返回值。

答案 2 :(得分:0)

我可能错了,但是从阅读你的问题来看,这听起来并不像你真的在寻找一个函数指针,而是一个指向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;

答案 3 :(得分:0)

将指针传递给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 ;
}

干杯!