代码之家  ›  专栏  ›  技术社区  ›  Jamie Keeling

声明“struct”类型的原型-c

  •  7
  • Jamie Keeling  · 技术社区  · 14 年前

    我已经绞尽脑汁研究了一段时间了,我只是想创建一个方法,它返回一个结构,正如我希望返回两个int的那样。

    我的方法原型如下:

    typedef struct RollDice();
    

    方法本身:

    typedef struct RollDice()
    {
     diceData diceRoll;
    
     diceRoll.dice1 = 0;
     diceRoll.dice2 = 0;
    
     return diceRoll;
    }
    

    编译器显示错误: "Syntax error: ')'" 对于原型和实际方法。

    结构本身:

    typedef struct
    {
     int dice1;
     int dice2;
    }diceData;
    

    很明显我哪里出错了吗?我已经尽力了。

    谢谢

    编辑/解决方案:

    为了让程序使用建议的解决方案,我必须对结构进行以下更改,

    typedef struct diceData
        {
         int dice1;
         int dice2;
        };
    
    4 回复  |  直到 14 年前
        1
  •  8
  •   Mark Rushakoff    14 年前

    你会想要的 typedef struct ... diceData 出现在函数之前,然后函数的签名将 diceData RollDice() .

    typedef <ORIGTYPE> <NEWALIAS> 意味着无论何时 <NEWALIAS> 发生,就像它意味着 <ORIGTYPE> . 因此,对于您所写的内容,您要告诉编译器 struct RollDice 是原始类型(当然,没有定义这样的结构);然后它看到 () 它期望有一个新的别名。

        2
  •  5
  •   MaxGuernseyIII    14 年前

    这只是马克·拉沙科夫答案的具体版本:

    typedef struct
    {
      int dice1;
      int dice2;
    } diceData;
    
    diceData RollDice()
    {
      diceData diceRoll;
    
      diceRoll.dice1 = 0;
      diceRoll.dice2 = 0;
    
      return diceRoll;
    }
    
        3
  •  3
  •   Vicky    14 年前

    不能使用typedef定义函数。

    typedef您的结构

    typedef struct
    {
        int dice1;
        int dice2;
    } diceData;
    

    然后将您的函数声明为

    diceData RollDice()
    {
        diceData diceRoll;
    
        diceRoll.dice1 = 0;
        diceRoll.dice2 = 0;
    
        return diceRoll;
    }
    

    声明RollDice为返回DiceData结构的函数。

    另一种处理返回两个值的方法是使用out参数。

    在这种情况下,您的函数将返回一个布尔值(表示成功或失败),并将指向整数的两个指针作为参数。在函数中,您将填充指针的内容,如下所示:

    bool_t rollDice(int *pDice1, int *pDice2)
    {
        if (pDice1 && pDice2)
        {
            *pDice1 = 0;
            *pDice2 = 0;
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    
    int main(int argc, char **argv)
    {
        int a, b;
        rollDice(&a, &b);
    
        return 0;
    }
    
        4
  •  1
  •   JaredPar    14 年前

    问题是您没有为该方法提供返回类型。看起来你应该返回一个 dicedata 键入以使原型签名看起来像

    struct dicedata RollDice();
    

    以及方法

    struct dicedata RollDice()
    {
        diceData diceRoll;
    
        diceRoll.dice1 = 0;
        diceRoll.dice2 = 0;
    
        return diceRoll;
    }