So i want to return this
monsterstat[4] = {monsterhp, monsteratkmin,monsteratkmax,monstermax};
return monsterstat;
this is possible reciving the value with another array with the same size? Obs :
double monsterstat[4];
创建一个struct
包含所有字段的。
typedef struct MonsterStat {
int monsterhp;
int monsteratkmin;
int monsteratkmax;
int monstermax;
} MonsterStat;
现在声明一个变量
MonsterStat monsterstat;
初始化成员变量,有几种方法
// In order
MonsterStat monsterstat = {60, 12, 14, 60};
// Specifying fields
MonsterStat monsterstat = {
.monsterhp = 60,
.monsteratkmin = 12,
.monsteratkmax = 14,
.monstermax = 60
};
// Level up the monster
MonsterStat level_up(MonsterStat monsterstat){
monsterstat.monsterhp += 10;
monsterstat.monstermax += 12;
return monsterstat;
}
// Return a default monster
MonsterStat default(){
MonsterStat monsterstat = {60, 12, 14, 60};
return monsterstat;
}
(正确)“返回”数组的唯一方法是接收指向已分配数组的指针并更改元素。数组本身不能被传递。只有指针真正被传递(指向内存中的数组)。
你当然可以这样做真的错了,在函数中分配一个数组,并返回一个指向该数组的指针。您现在已经向堆栈溢出敞开了大门(这里没有双关语,这是该站点的同名)。
您不能在 C 中返回值数组(您只会返回指向该数组的指针)。
您可以考虑返回一个struct
,例如声明
struct monsterstat_st {
double m_hp, m_kmin, m_kmax, m_max;
};
typedef struct monsterstat_st monsterstat_t;
在标题中(或在您的函数之前)。那么我认为命名的函数compute_monster_stat
可能是
monsterstat_t compute_monster_stat(double x) {
monsterstat_t res;
res.m_hp = compute_hp(x); // or some computation
res.m_kmin = compute_kmin(x); // or some other computation
res.m_kmax = compute_kmax(x); // or something more
res.m_max = compute_max(x); // or your own code
return res;
}
你会这样称呼它,例如
monsterstat_t mystat = compute_monster_stat(something);
但是,请注意(至少根据其ABI在 Linux x86-64 上)数据将进入堆栈(但如果您只有 2 个成员,它可以通过寄存器;细节非常具体)。
或者,通常在 C 代码中,您传递一个指向计算数据的指针,所以代码
int computed_monster_stat(monsterstat_t* ptr, double data) {
if (ptr && happy_with(data)) {
ptr->m_hp = compute_hp(data);
ptr->m_kmin = compute_kmin(data);
ptr->m_kmax = compute_kmax(data);
ptr->m_max = compute_max(data);
return 1;
} else return 0;
}
你会使用喜欢
monsterstat_t s;
memset (&s, 0, sizeof(s)); // easy way to clear the data
if (computed_monster_stat (&s, data)) {
// do something with s.m_kmin etc....
} else {
// unhappy
}
Linux 上的stat(2)或clock_gettime(2)系统调用给出了更具体的示例。
或者,返回一个 [pointer to] 一些分配的堆 struct
或数组(所以malloc
在你的函数内部调用),例如你的函数的调用者对它的记录约定。free
当心内存泄漏、缓冲区溢出、未定义行为等......
顺便说一句,花几个小时阅读一本好的C编程书籍,并研究和研究一些类似于您想要编码的免费软件(例如在freecode、sourceforge、 github和许多其他地方)。
另一种选择是传递一个地方的地址来存储每个值:
void get_monstrstat(int *pmonsterhp, int *pmonsteratkmin, int *pmonsteratkmax, int *pmonstermax)
{
*pmonsterhp = monsterhp;
// … similar for the remaining items
}