C-更改void*函数中结构的变量值

C-更改void*函数中结构的变量值,c,C,我有一个C语言的练习要做,我不能改变主函数的内容以及其他两个函数的类型和参数。我已经搜索过谷歌了,但没有找到我所理解的问题的答案 目标只是用printf显示结构的内容,但我有一个错误,因为我不知道如何将结构返回到主函数 代码如下: void *create_mage(t_character *perso) { if ((perso = malloc(sizeof(t_character))) == NULL) exit(84); perso->niveau =

我有一个C语言的练习要做,我不能改变主函数的内容以及其他两个函数的类型和参数。我已经搜索过谷歌了,但没有找到我所理解的问题的答案

目标只是用printf显示结构的内容,但我有一个错误,因为我不知道如何将结构返回到主函数

代码如下:

 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;
}