C-更改void*函数中结构的变量值
我有一个C语言的练习要做,我不能改变主函数的内容以及其他两个函数的类型和参数。我已经搜索过谷歌了,但没有找到我所理解的问题的答案 目标只是用printf显示结构的内容,但我有一个错误,因为我不知道如何将结构返回到主函数 代码如下:C-更改void*函数中结构的变量值,c,C,我有一个C语言的练习要做,我不能改变主函数的内容以及其他两个函数的类型和参数。我已经搜索过谷歌了,但没有找到我所理解的问题的答案 目标只是用printf显示结构的内容,但我有一个错误,因为我不知道如何将结构返回到主函数 代码如下: void *create_mage(t_character *perso) { if ((perso = malloc(sizeof(t_character))) == NULL) exit(84); perso->niveau =
void *create_mage(t_character *perso)
{
if ((perso = malloc(sizeof(t_character))) == NULL)
exit(84);
perso->niveau = 1;
perso->pdv = 100;
perso->mana = 200;
perso->attaque = 40;
perso->defense = 3;
perso->crit_chance = 10;
perso->vitesse = 4;
return (perso);
}
void *create_warrior(t_character *perso)
{
if ((perso = malloc(sizeof(t_character))) == NULL)
exit(84);
perso->niveau = 1;
perso->pdv = 200;
perso->mana = 50;
perso->attaque = 10;
perso->defense = 8;
perso->crit_chance = 10;
perso->vitesse = 3;
return (perso);
}
int main()
{
t_character p_ava;
t_character p_thi;
p_ava = create_mage(&p_ava);
p_thi = create_warrior(&p_thi);
printf("def %d - atk %d - vit %d - crit %d\n", p_ava.defense,
p_thi.attaque, p_ava.vitesse, p_thi.crit_chance);
return (0);
}
这是我编译项目时遇到的错误:
gcc *.c -Wall -Wextra
create_class.c: In function ‘main’:
create_class.c:48:9: error: incompatible types when assigning to type ‘t_character {aka struct s_character}’ from type ‘void *’
p_ava = create_mage(&p_ava);
^
create_class.c:49:9: error: incompatible types when assigning to type ‘t_character {aka struct s_character}’ from type ‘void *’
p_thi = create_warrior(&p_thi);
^
我对结构如何工作没有很好的概念,也没有发现任何关于从void*函数返回结构的内容,因此,如果您有答案或链接,我可以找到我的问题,这将是非常受欢迎的。提前谢谢你 如果无法更改
main
,则无法编译代码--period(参见上面J.Leffler的评论)。但是,如果“更改”表示您“无法添加”,则您可以。为什么?
您真正需要做的就是在main
之外声明一个struct
(或者最好简单地将所需结构的typedef
声明为t\u character
),然后在main
中删除p_ava=
和p_thi=
和删除每个函数中对malloc
的调用,一切正常
为什么??声明结构时:
t_character p_ava;
t_character p_thi;
您已经为每个变量的类型
t\u字符
创建了存储。编译器只需要知道该类型是什么。因此,定义t_字符
struct(或typdef
),编译器将为变量提供足够的存储空间,例如
typedef struct {
int niveau, pdv, mana, attaque, defense, crit_chance, vitesse;
} t_character;
当您将变量传递给函数(例如create_-mage(&p_-ava);
)时,您正在将p_-ava的地址传递给函数。在该地址已为t\u字符
创建了足够的存储空间。因此,在函数中只需验证传递给函数的变量是否具有有效地址,然后只需填充结构的成员值即可
将这些部分放在一起,您可以(不是“更改”,而是“删除”)并执行以下操作:
#include <stdio.h>
#include <stdlib.h> /* for exit() */
typedef struct {
int niveau, pdv, mana, attaque, defense, crit_chance, vitesse;
} t_character;
void *create_mage (t_character *perso)
{
if (!perso) {
fprintf (stderr, "create_mage() error: invalid parameter.\n");
exit (84);
}
perso->niveau = 1;
perso->pdv = 100;
perso->mana = 200;
perso->attaque = 40;
perso->defense = 3;
perso->crit_chance = 10;
perso->vitesse = 4;
return (perso);
}
void *create_warrior (t_character * perso)
{
if (!perso) {
fprintf (stderr, "create_warrior() error: invalid parameter.\n");
exit (84);
}
perso->niveau = 1;
perso->pdv = 200;
perso->mana = 50;
perso->attaque = 10;
perso->defense = 8;
perso->crit_chance = 10;
perso->vitesse = 3;
return (perso);
}
int main (void)
{
t_character p_ava;
t_character p_thi;
create_mage (&p_ava);
create_warrior (&p_thi);
printf ("def %d - atk %d - vit %d - crit %d\n", p_ava.defense,
p_thi.attaque, p_ava.vitesse, p_thi.crit_chance);
return 0;
}
示例使用/输出
$ ./bin/magewarrior
def 3 - atk 10 - vit 4 - crit 10
仔细检查一下,如果有任何问题,请告诉我。如果你不能摆脱,你几乎是一条小溪没有桨
您的替代方法是按照注释中的说明制作p_ava
和p_thi
指针(在printf
中用'->'
箭头运算符替换.
运算符),然后您可以在函数中分配malloc
,但是,除非在调用之前初始化了指针,否则将收到通过p_ava
和p_thi
未初始化的警告:
p_ava = create_mage (p_ava);
这将需要对main
进行比备选方案更多的更改,例如:
int main (void)
{
t_character *p_ava = NULL;
t_character *p_thi = NULL;
p_ava = create_mage (p_ava);
p_thi = create_warrior (p_thi);
printf ("def %d - atk %d - vit %d - crit %d\n", p_ava->defense,
p_thi->attaque, p_ava->vitesse, p_thi->crit_chance);
return 0;
}
您必须执行其中一项操作。报告的错误非常清楚。
void*
不是t\u字符
。main
中的那些变量应该是指针,t\u character*
,并通过->
而不是
解除引用。此外,您的两个create
函数会丢弃传入的值。如果您无法更改main()
,您将永远不会得到p\u ava=create\u mage(&p\ava)要编译的代码-因为t_character
是一种结构类型(错误消息是这样说的),并且您无法分配指向结构类型的指针。关键是,您已经有了在main
中创建的p_ava
和p_thi
的存储空间,因此不需要在两个函数中分配,只需填写数值。谢谢您的回答!当然,看看更新后的答案,你有两个选择。花点时间去理解每一个变化,如果你没有,请随意提问,重要的是你理解为什么需要每一个变化。
int main (void)
{
t_character *p_ava = NULL;
t_character *p_thi = NULL;
p_ava = create_mage (p_ava);
p_thi = create_warrior (p_thi);
printf ("def %d - atk %d - vit %d - crit %d\n", p_ava->defense,
p_thi->attaque, p_ava->vitesse, p_thi->crit_chance);
return 0;
}