【问题标题】:Structures and pointer to pointer element结构和指向指针元素的指针
【发布时间】:2019-12-09 11:43:24
【问题描述】:

我正在为学校做一个项目:

我必须用这个原型创建一个函数:

int ddg_add_player(ddg_t *ddg, player_t *player); 

这里是ddg_t 结构:

typedef struct
{
        int day; /**< The DDG date (day). */
        char *dmname; /**< The dungeon master name. */
        int month; /**< The DDG date (month). */
        char *name; /**< The DDG name. */
        int nplayers; /**< The DDG number of players. */
        player_t **players; /**< The DDG players. */
        int year; /**< The DDG date (year). */
} ddg_t;

所以我必须将填充的player_t 结构添加到ddg_t 结构中。而且不知道怎么处理,

我试过了

ddg->players->ac = player->ac;

但它显然不起作用。

对于这个例子,假设player_t 如下:

typedef struct
{
        int ac; /**< The player armor class. */
} player_t;

我不知道为什么我必须使用这个player_t **players,而且我不能问我的老师,因为我会在这个项目上接受评估。

另一方面,我确实有一个结构数组player_t,因为我有多个玩家。

最初我认为我当时必须通过一个结构,我的调用看起来像这样:

for(i = 0; i < nPlayers; i++) {
        ddg_add_player(&ddg, &players[i]);
    }

我的电话现在看起来像这样:

ddg_add_player(&amp;ddg, players); /* players is my array of struct */

还有这样的功能:

int ddg_add_player(ddg_t *ddg, player_t *player){
    ddg->players = malloc(sizeof(player_t) * 3); /* i have 3 players */
    ddg->players[0]->ac = player[0].ac;
    printf("%d\n", ddg->players[0]->ac); /* just to check */

    return 0;
}

所以,代码有效,但在老师给出的标题中,它说我当时必须添加一名玩家。

有没有办法做到这一点?

我试过你的解决方案@chmike,但它给了我这个错误:

error: expected expression before ‘player_t’
 oc(ddg->players, (ddg->nplayers+1)*sizeof(*player_t));
                                            ^~~~~~~~

我试图删除*,但它给了我一个分段错误。

【问题讨论】:

  • 你必须问你的老师为什么你需要player_t **。因为这暗示了一个指向玩家的指针数组,而听起来你只需要一个玩家数组。
  • 这看起来与 the problem addressed here 非常相似,在这种情况下,本质上是标题信息(描述事件的成员的集合。)然后是未知的(在编译时) -time) 参与事件的玩家人数。而且我必须同意@Lundin,我不明白为什么需要指向指针的指针。如果您可以用您的老师所追求的内容更新您的问题,那将会很有趣(当然,在您提交此内容以获得学分之后)。

标签: c pointers structure


【解决方案1】:

我假设您在这里使用“指向指针元素的指针”player_t **players 来存储指向多个玩家的指针数组?

在这种情况下,问题基本上是ddg-&gt;players-&gt;ac,它不知道你想要哪个播放器,那里有一个额外的间接级别。例如第一个玩家是ddg-&gt;players[0]-&gt;ac,第二个玩家是ddg-&gt;players[1]-&gt;ac

当然,您还需要在这里单独分配和释放ddg-&gt;players,例如ddg-&gt;players = malloc(sizeof(player_t*) * 5) 5 名玩家。然后您需要分别分配每个玩家指针,例如ddg-&gt;players[0] = first_player 你在别处创建播放器的地方。

ddg->players = malloc(sizeof(player_t*) * 2)
ddg->players[0] = amy;
ddg->players[1] = bill;
printf("%d %d", ddg->players[0]->ac, ddg->players[1]->ac);

现在,如果 ddg_t 应该“拥有”player_t 并且每个只使用一次,则可以使用 player_t *players 数组,摆脱额外的间接和分配,但您通常仍应始终指定一个索引,即使是第一项。

ddg->players = malloc(sizeof(player_t) * 3);
ddg->players[0].ac = 14;
ddg->players[1].ac = 18;
ddg->players[2].ac = 20;

【讨论】:

  • 不,鉴于player_t ** 声明,ddg-&gt;players = malloc(sizeof(player_t) * 5) 不正确。这又没有多大意义,OP必须澄清。
  • @Lundin 是的,我错过了一个角色。 T** 在这种情况下看起来真的像一个指针数组。可能有很多原因,例如一个玩家可以参与多个游戏。
【解决方案2】:

ddg_t 结构中,我们看到了字段

int nplayers; /**< The DDG number of players. */
player_t **players; /**< The DDG players. */

我们可以从中推断出players 是一个指向player_t 的指针。因此players 是一个指向玩家的指针数组,nplayers 是数组中元素的数量(指向player_t 的指针)。

要添加新玩家,您需要将其附加到玩家数组中。这意味着阵列需要增长。这是通过使用 realloc 函数和数组的新字节大小作为参数来执行的。

这里是函数的代码:

int ddg_add_player(ddg_t *ddg, player_t *player){
    ddg->players = realloc(ddg->players, (ddg->nplayers+1)*sizeof(*player_t));
    ddg->players[ddg->nplayers++] = player;
}

第一条指令将players 数组的末尾增加一个元素。

第二条指令将player 分配给数组的最后一个元素,它增加了nplayers

当函数终止时,players 是附加了player 的输入数组,而nplayers 已经增加,因为它包含了一个玩家。

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 2013-02-15
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2023-02-16
    • 2016-03-21
    相关资源
    最近更新 更多