Ошибка в функции, возвращающей структуру в c: ожидаемый идентификатор или ‘(‘ перед параметром

#c #function #struct #declaration #definition

Вопрос:

Я новичок в c, и я пытаюсь создать функцию, которая принимает два параметра типа double в качестве входных данных и возвращает структуру, содержащую каждый параметр в виде элементов, называемых «реальными» и мнимыми. Ошибка, которую я получаю, заключается в следующем:

 error: expected identifier or ‘(’ before ‘double’
 

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

Вот мой код:

 #include <stdio.h>

int main(void) {
    return 0;
}

struct make_complex(double real_input, double imaginary_input) {

    struct complex {
        double real;
        double imaginary;
    } complex_output = {real_input, imaginary_input};

    return complex_output; 
}
 

В конечном итоге я хочу вызвать функцию make_complex в main, но я полностью упростил main, чтобы исключить любой другой источник ошибок. Я попытался объявить функцию make_complex перед определением функции следующим образом:

 struct make_complex(double real_input, double imaginary_input);
 

Это не сработало. Идеи?

Спасибо, что уделили мне время.

Комментарии:

1. struct make_complex() это тарабарщина. Вам нужно изучить структуру, прежде чем использовать структуру.

Ответ №1:

Возвращаемый тип функции должен включать тип структуры, а не только struct . И вы должны определить тип структуры вне функции, чтобы на нее можно было ссылаться в вызывающих устройствах.

 #include <stdio.h>

struct complex {
    double real;
    double imaginary;
};

int main(void) {
    return 0;
}

struct complex make_complex(double real_input, double imaginary_input) {
    struct complex complex_output = {real_input, imaginary_input};
    return complex_output; 
}
 

Ответ №2:

В этом объявлении функции

 struct make_complex(double real_input, double imaginary_input) {
 

компилятор рассматривает эту строку как объявление структуры с именем make_complex .

Вам необходимо определить комплекс структуры перед объявлением функции, например

 struct complex {
    double real;
    double imaginary;
};

struct complex make_complex(double real_input, double imaginary_input) {

    struct complex complex_output = {real_input, imaginary_input};

    return complex_output; 
}
 

В C вы даже можете определить структуру в объявлении типа возвращаемой функции

 struct complex { double real; double imaginary; }
make_complex(double real_input, double imaginary_input) {
    struct complex complex_output = {real_input, imaginary_input};

    return complex_output; 
}
 

хотя это не очень хорошая идея.:)

Комментарии:

1. @user3629249 Если тип возвращаемого значения не указан, то объявление неверно.

2. кроме того, пожалуйста, обратите внимание, что «двойной комплекс» является допустимым типом в современном C

3. @user3629249 Определяется реализацией, поддерживает ли компилятор тип

4. @user3629249 Я не понял ваш вопрос о подписи, потому что такое объявление присутствует в моем ответе.

5. Я прочитал это слишком быстро и упустил деталь о том, что они не являются точкой с запятой в конце определения структуры