拥有以下代码,我如何“获取”接收地图,并返回指定位置的值?
我试图在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;
}
答案 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 ;
}
干杯!