Объявление прототипа типа "struct" - C - PullRequest
7 голосов
/ 23 марта 2010

Я какое-то время ломал голову над этим, я просто пытаюсь создать метод, который возвращает структуру, поскольку я хочу вернуть два целых числа.

Мой прототип для метода выглядит следующим образом:

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 ]

8 голосов
/ 23 марта 2010

Вы захотите, чтобы typedef struct ... diceData появилось перед вашей функцией, и тогда подпись функции будет diceData RollDice().

typedef <ORIGTYPE> <NEWALIAS> означает, что всякий раз, когда происходит <NEWALIAS>, обрабатывайте его так, как если бы оно означало <ORIGTYPE>. Таким образом, в случае написанного вы сообщаете компилятору, что struct RollDice - это оригинальный тип (и, конечно, такая структура не определена); и затем он видит (), где он ожидал новый псевдоним.

5 голосов
/ 23 марта 2010

Это только конкретная версия ответа Марка Рушакова:

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

diceData RollDice()
{
  diceData diceRoll;

  diceRoll.dice1 = 0;
  diceRoll.dice2 = 0;

  return diceRoll;
}
3 голосов
/ 23 марта 2010

Вы не можете использовать typedef для определения функции.

Введите вашу структуру сначала как

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

Затем объявите вашу функцию как

diceData RollDice()
{
    diceData diceRoll;

    diceRoll.dice1 = 0;
    diceRoll.dice2 = 0;

    return diceRoll;
}

Это объявляет RollDice как функцию, которая возвращает структуру diceData.

Альтернативный способ попытаться вернуть два значения - использовать параметры.

В этом случае ваша функция будет возвращать логическое значение (для указания успеха или неудачи) и принимать два указателя на целые числа в качестве параметров. Внутри функции вы должны заполнить содержимое указателей, например:

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;
}
1 голос
/ 23 марта 2010

Проблема в том, что вы не дали методу тип возвращаемого значения. Похоже, вы должны возвращать тип dicedata, чтобы сигнатура прототипа выглядела как

struct dicedata RollDice();

И метод

struct dicedata RollDice()
{
    diceData diceRoll;

    diceRoll.dice1 = 0;
    diceRoll.dice2 = 0;

    return diceRoll;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...