【问题标题】:C return of multiple values [closed]C返回多个值[关闭]
【发布时间】:2013-11-07 19:40:43
【问题描述】:

所以我想退货

monsterstat[4] = {monsterhp, monsteratkmin,monsteratkmax,monstermax};
return monsterstat;

这可以用另一个相同大小的数组来接收值吗? 观察:

    double monsterstat[4];

【问题讨论】:

  • 看起来您想创建一个struct 来保存这些值。
  • 你不能返回一个数组但是可以返回一个指向基地址的双指针
  • 如果要修改某个数组中的值,请将其作为参数传递给将修改它的函数,并且根本不返回任何值。没有奇怪的、完全不必要的结构。

标签: c arrays function return


【解决方案1】:

使用结构

创建一个包含所有字段的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;
}

返回数组

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

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

【讨论】:

    【解决方案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);
    

    但是,请注意(至少在 Linux x86-64 上根据其ABI)数据将进入堆栈(但如果您只有 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] 一些 heap allocated struct 或数组(所以在你的函数中调用 malloc),例如记录的约定,您的函数的调用者必须 free 它。当心memory leaksbuffer overflowundefined behavior等等……

    顺便说一句,花几个小时阅读一本好的C编程书籍,并研究和研究一些免费软件(例如@987654328 @、sourceforgegithub 和许多其他地方)类似于您要编码的内容。

    【讨论】:

    • 谢谢,但我怎样才能访问和机会结构中的值?
    • 我建议你花几个小时阅读一本关于 C 编程的好书。我们根本没有时间和耐心来教所有这些!然后,查看一些现有的免费软件并研究其代码以获得灵感。
    【解决方案3】:

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

    void get_monstrstat(int *pmonsterhp, int *pmonsteratkmin, int *pmonsteratkmax, int *pmonstermax)
    {
        *pmonsterhp = monsterhp;
        // … similar for the remaining items
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多