Я ломал головы на этом некоторое время, я просто пытаюсь создать метод, который возвращает структуру, поскольку я хочу возвратить два интервала.
Мой прототип для метода следующие:
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;
};
Вы захотите, чтобы typedef struct ... diceData
располагалась перед вашей функцией, и тогда сигнатура функции будет diceData RollDice ()
.
typedef
означает, что всякий раз, когда встречается
, обрабатывать его так, как если бы оно означает
. Итак, в случае того, что вы написали, вы сообщаете компилятору, что struct RollDice
является исходным типом (и, конечно же, такая структура не определена); а затем он видит ()
, где ожидал новый псевдоним.
Проблема в том, что вы не указали методу возвращаемый тип. Похоже, вы должны возвращать тип dicedata
, чтобы подпись прототипа выглядела как
struct dicedata RollDice();
И метод
struct dicedata RollDice()
{
diceData diceRoll;
diceRoll.dice1 = 0;
diceRoll.dice2 = 0;
return diceRoll;
}
Вы не можете использовать 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;
}
Это просто конкретная версия ответа Марка Рушакова:
typedef struct
{
int dice1;
int dice2;
} diceData;
diceData RollDice()
{
diceData diceRoll;
diceRoll.dice1 = 0;
diceRoll.dice2 = 0;
return diceRoll;
}