Как передать структурный массив в функцию

#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: исправлено. Спасибо, что сообщили мне, я не заметил.