-1

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];
4

3 回答 3

3

使用结构

创建一个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;
}

返回数组

(正确)“返回”数组的唯一方法是接收指向已分配数组的指针并更改元素。数组本身不能被传递。只有指针真正被传递(指向内存中的数组)。

你当然可以这样做真的错了,在函数中分配一个数组,并返回一个指向该数组的指针。您现在已经向堆栈溢出敞开了大门(这里没有双关语,这是该站点的同名)。

于 2013-11-07T19:45:24.180 回答
2

您不能在 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编程书籍,并研究和研究一些类似于您想要编码的免费软件(例如在freecodesourceforgegithub和许多其他地方)。

于 2013-11-07T19:44:29.940 回答
0

另一种选择是传递一个地方的地址来存储每个值:

void get_monstrstat(int *pmonsterhp, int *pmonsteratkmin, int *pmonsteratkmax, int *pmonstermax)
{
    *pmonsterhp = monsterhp;
    // … similar for the remaining items
}
于 2013-11-07T19:48:06.893 回答