#c #function #data-structures
#c #функция #структуры данных
Вопрос:
Я хочу передать массив struct в функцию, и я продолжаю получать ошибку. Я не уверен, как это сделать в целом, поскольку меня никогда не учили. Я немного погуглил, но ничего не могу найти. Ребята, вы можете мне помочь и объяснить, почему это не работает? Вот код всей программы (он небольшой, просто тестовая программа):
#include <stdio.h>
#include <stdlib.h>
#define hour 60
int getNum(void);
int distance(int start, int end , int flight_time[5], int flight_layover[5]);
int main(void)
{
int user_start=-1;
int user_end=-1;
int travel_time=0;
struct flight
{
int flight_time;
int flight_layover;
};
struct flight flights[5]=
{
{4 * hour 15, 1 * hour 20},
{3 * hour 58, 0 * hour 46},
{3 * hour 55, 11 * hour 29},
{2 * hour 14, 0 * hour 53},
{3 * hour 27, 0 * hour 0}
};
printf ("Hello sir. Please enter you starting city:n");
user_start=getNum();
user_start--;
printf ("Good. Now enter the city you would like to end it:n");
user_end=getNum();
user_end--;
travel_time = distance(user_start,user_end, flights[5].flight_layover, flights[5].flight_time);
printf ("The total travel time from %d to %d is %d.",user_start, user_end, travel_time);
return 0;
}
int distance(int start, int end , int flight_time[5], int flight_layover[5])
{
int total_mins=0;
int i=0;
for (i=end 1;i--;i=start)
{
total_mins=total_mins flight_time[i] flight_layover[i];
}
return total_mins;
}
int getNum(void)
{
char record[121] = {0};
int number = 0;
fgets(record, 121, stdin);
if(sscanf_s(record, "%d", amp;number) != 1 )
{
number = -1;
}
return number;
}
Комментарии:
1. Я допустил ошибку, когда ввел int flight_time[5] и int flight_layover[5]. Мне нужен весь массив, а не только 5 (индекс 5, или 4, чтобы быть более точным).
2. Имейте в виду, что объявление параметра
int flight_time[5]
в точности эквивалентноint *flight_time
;5
игнорируется. Рекомендуемое чтение: раздел 6 часто задаваемых вопросов на comp.lang.c .
Ответ №1:
Ваша distance
функция полностью неправильная. Поскольку у вас есть a, struct
который содержит flight_time
и flight_layover
, вы хотите передать функции их массив structs
, а не массив каждого из этих int
значений. ie.
int distance(int start, int end, struct flight flights[])
{
int total_mins=0;
int i=0;
for (i=end 1;i--;i=start)
{
total_mins=total_mins flights[i].flight_time flights[i].flight_layover;
}
return total_mins;
}
Изменена сигнатура функции и строка внутри for
цикла.
Затем при вызове distance
вы можете изменить вызов на:
distance(user_start,user_end, flights)
Это передаст указатель на начало вашего массива ( flights
), а user_start
и user_end
укажет границы массива, которые будут использоваться для вычисления расстояния.
Также обратите внимание, что вы могли бы обращаться к индексам за пределами flights
массива. Я особенно не понимаю, зачем вам это i=end 1
, возможно, вы хотели i = end - 1
?
У вас также есть измененная часть условия и уменьшения в вашем цикле for, я думаю, так и должно быть:
for (i = start; i <= end; i )
РЕДАКТИРОВАТЬ: Очевидно, что прототип вашей функции нуждается в обновлении, и ваши struct
s должны быть объявлены до того, как они будут использованы где-либо (в том числе перед прототипами). Вот весь код с упомянутыми мной изменениями.
Кроме того, будьте осторожны со своей getNum
функцией, поскольку она может вернуть -1 при ошибке, и вы вызовете неопределенное поведение, если будете обращаться к элементам перед вашим массивом. Вы также должны проверить пользовательский ввод, чтобы убедиться, что начальное и конечное значения находятся в диапазоне от 1 до 5 и уменьшены так, чтобы они были допустимыми индексами массива от 0 до 4.
Кроме того, вы можете использовать =
оператор для добавления к текущему значению переменной, т.Е.
total_mins=total_mins flights[i].flight_time flights[i].flight_layover;
может быть изменен на:
total_mins = flights[i].flight_time flights[i].flight_layover;
ПРАВКА2: Еще одна вещь. По соглашению, константа #define
s должна быть в верхнем регистре, т.Е.
#define HOUR 60
в отличие от #define hour 60
.
Комментарии:
1. да, я подумал, что если бы у меня был цикл for, начинающийся в конце, он уменьшился бы (i —) и пропустил бы один. Я также хотел бы упомянуть, что в struct flight (у меня еще нет проверки ошибок), способ, которым это работает, заключается в том, что мне нужно отображать города полета и куда пользователь может отправиться из каждого города. Итак, способ, которым это работает, заключается в том, что город 1 может перейти только в город 2, а город 2 может перейти только в город 3. Я просто хотел убедиться, что он правильно суммирует минуты от общего времени прохождения.
2. Кроме того, установка stuct flight flights[] привела к множеству ошибок. То, как вы это сделали.
3. @Robsta вам также нужно изменить прототип функции и переместить объявления структуры, позвольте мне загрузить полный код.
4. @Robsta, ну вот, теперь все будет скомпилировано. Также обратите внимание, что я изменил
sscanf_s
наsscanf
, чтобы он компилировался.5.@Robsta если вы уже загрузили обновленный код, сделайте это снова. Я только что понял, что
end
в вашемdistance()
for
цикле было включено, так что на самом деле это должно быть:for (i = start; i <= end; i )
Ответ №2:
Я полагаю, вы хотите что-то вроде этого:
int distance(int start, int end , struct flight flights[5])
{
int total_mins=0;
int i=0;
for (i=end 1;i--;i=start)
{
total_mins=total_mins flights[i].flight_time flights[i].flight_layover;
}
return total_mins;
}
которая затем вызывается как
travel_time = distance(user_start,user_end, flights);
Комментарии:
1. Должно быть
flights[i].flight_time
неflights.flight_time[i]
.2. @AusCBloke: исправлено. Спасибо, что сообщили мне, я не заметил.