Как передать значения указателя из отдельной функции обратно в main, используя структуру

#c #arrays #pointers #structure #return-value

#c #массивы #указатели #структура #возвращаемое значение

Вопрос:

 #include <stdio.h>
#define G 9.81
 

/используемый /structure bring называется USER_INPUT

 typedef struct
{
    double weight;
    double drag;
    double time;

} USER_INPUT;

void getInput(USER_INPUT *); //function prototype - which i think works

void main()

{
    USER_INPUT input;
    getInput(amp;input);
 

// Здесь должны отображаться введенные значения, но они ничего не вернут

     printf("Weight = ", input.weight);
    printf("Drag = ", input.drag);
    printf("Time =", input.drag);


}
 

// Отдельная функция, в которой я получаю входные данные от пользователя. это работает, но значения не передаются обратно в main

 void getInput (USER_INPUT *inpPtr)
{
    printf("Please enter the weight:");
    scanf("%lf", amp;inpPtr->weight);
    fflush(stdin);
    printf("Please enter the drag:");
    scanf("%lf", amp;inpPtr->drag);
    fflush(stdin);
    printf("Please enter the time:");
    scanf("%lf", amp;inpPtr->time);
    fflush(stdin);
    return(0); //<- idk if this is right either

}
 

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

1. Это неверно, вам не разрешено возвращать значение, если возвращаемый тип равен void . Ваша проблема в том, что ваши printf s неверны. ideone.com/f3BqOC

Ответ №1:

Проблема, которую вы описываете, может быть связана с тем фактом, что вы не указали спецификаторы формата в своих printf() операторах. Кроме того, вы пытаетесь отобразить .drag дважды:

 printf("Weight = %gn", input.weight);
printf("Drag = %gn", input.drag);
printf("Time = %gn", input.time);
 

Функция getInput() не передает значения обратно в main() (в конце концов, она имеет возвращаемый тип void !), Но она изменяет значения, хранящиеся в полях USER_INPUT структуры input , которая существует в области видимости main() .

Здесь есть некоторые другие проблемы. main() Функция всегда возвращает an int , и вы должны объявить ее следующим образом:

 int main(void){}
 

В качестве альтернативы, если вы используете аргументы командной строки, вы можете сделать:

 int main(int argc, char *argv[]){}
 

или:

 int main(int argc, char **argv){}
 

Сброс входного потока — это неопределенное поведение, хотя оно работает в некоторых системах. Для переносимости лучше этого не делать. Вы можете использовать что-то вроде:

 while (getchar() != 'n')
    continue;
 

чтобы отбросить ненужные символы во входном потоке после вызова scanf() .

Наконец, функция с возвращаемым типом void не нуждается в return инструкции, хотя некоторые люди любят использовать return ; , чтобы сделать возврат явным. Но возвращать int значение из такой функции, безусловно, неправильно.