Объявление прототипа типа “структура” - C

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

Мой прототип для метода следующие:

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;
    };
7
задан Jamie Keeling 23 March 2010 в 16:42
поделиться

4 ответа

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

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

8
ответ дан 6 December 2019 в 11:47
поделиться

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

struct dicedata RollDice();

И метод

struct dicedata RollDice()
{
    diceData diceRoll;

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

    return diceRoll;
}
1
ответ дан 6 December 2019 в 11:47
поделиться

Вы не можете использовать 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;
}
3
ответ дан 6 December 2019 в 11:47
поделиться

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

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

diceData RollDice()
{
  diceData diceRoll;

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

  return diceRoll;
}
5
ответ дан 6 December 2019 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: