gpt4 book ai didi

c - 使用 C 结构

转载 作者:行者123 更新时间:2023-11-30 14:48:29 25 4
gpt4 key购买 nike

我正在为我设计的小型游戏设备开发一些代码。我完全陷入了尝试构建最终的 map 位置图的困境。

我有2个结构:

typedef struct point {
int x;
int y;
} point;


typedef struct location {
const point portal_in;
const point portal_out;

const byte *map;
const byte width;
const byte height;

struct location *portals[8];

point player;

struct location *return_to;
} location;

每个位置都有一个它链接到的其他位置的列表,以及它链接的位置。

我尝试设置这样的位置:

location build_locations()
{
location village = {
.portal_in={15, 14},
.portal_out={0, 0},
.map=&VILLAGE[0],
.width=32,
.height=16,
.player={15, 14},
.return_to=0
};
location loc = {
.portal_in={8, 7},
.portal_out={11, 10},
.map=&HOUSE[0],
.width=8,
.height=8,
.player={0, 0},
.return_to=&village
};

village.portals[0] = &loc;

return village;
}

这在我的 main() 函数中被调用:

location current_location = build_locations();

这在一定程度上是有效的 - 我可以绘制村庄 map 并在其周围移动玩家:

display_map(&current_location);

display_player(&current_location);

等等。当我想换到新位置时,麻烦就来了。

如果我尝试重新分配current_location,则会收到编译器错误,提示分配给只读变量:

current_location = current_location.portals[0];

这无疑是我用 C 编写的最复杂的代码,所以我知道当涉及到结构和指针时我已经超出了我的深度,但我正在努力学习并且已经取得了很大的进步已经。

有更好的方法来完成我想做的事情吗?还是我错过了一些明显的事情?

谢谢

编辑:

这是我能想到的最简单的例子:

typedef unsigned char byte;

static const byte VILLAGE[] = {
0, 0, 0, 0, 175, 181, 181, 181, 181, 181, 181, 175, 0, 0, 0, 0,
/// And so on - indices of tiles defined elsewhere but irrelevant here
};

static const byte HOUSE[] = {
0, 0, 0, 0, 175, 181, 181, 181, 181, 181, 181, 175, 0, 0, 0, 0,
/// And so on - indices of tiles defined elsewhere but irrelevant here
};

typedef struct point {
int x;
int y;
} point;


typedef struct location {
const point portal_in;
const point portal_out;

const byte *map;
const byte width;
const byte height;

struct location *portals[8];

point player;

struct location *return_to;
} location;

location build_locations()
{
location village = {
.portal_in={15, 14},
.portal_out={0, 0},
.map=&VILLAGE[0],
.width=32,
.height=16,
.player={15, 14},
.return_to=0
};
location loc = {
.portal_in={8, 7},
.portal_out={11, 10},
.map=&HOUSE[0],
.width=8,
.height=8,
.player={0, 0},
.return_to=&village
};

village.portals[0] = &loc;

return village;
}

int main(void)
{
location current_location = build_locations();

if (current_location.player.x == 5 && current_location.player.y == 4)
{
current_location = current_location.portals[0];
}
}

最佳答案

运行时问题:

问题很简单。 villageloc 都在堆栈上。

返回时,您会获得village的副本,但没有loc的副本。所以loc会在返回后被释放。您可以使用这样的代码来解决您的问题:

village.portals[0] = calloc(1, sizeof(*(village.portals[0])));
memcpy(&village.portals[0], &loc, sizeof(loc)); //->or just assign village.portals[0] directly

更新:

编译问题

是的,对 current_location 的评论也是正确的。你可以这样解决:

current_location = *(current_location.portals[0]);

或者完全使用指针来访问数据。

但请记住我提到的运行时问题非常重要,而且以后也很难追踪。

更新2:

我刚刚注意到您的结构中有 const 成员。这就是为什么如果您仅使用赋值,则会出现这些只读错误。您可以通过从 location 结构中删除这些 const 来解决这个问题,或者您可以这样做:

memcpy(&current_location, current_location.portals[0], sizeof(current_location));

但我不建议这种方法,最好使用指针来防止这个问题。

关于c - 使用 C 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50372244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com