Как передать массив структуры в функцию - PullRequest
0 голосов
/ 11 ноября 2011

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

 #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", &number) != 1 )
    {
        number  = -1;
    }
    return  number;
}

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

Ваша distance функция неверна.Поскольку у вас есть struct, который содержит flight_time и flight_layover, вы хотите передать массив этих structs в функцию, а не массив каждого из этих int значений.то есть.

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 должны быть объявлены до того, как они будут использованы где-либо (в том числе перед прототипами). Вот весь код с упомянутыми мною модификациями.

Также будьте осторожны с вашей getNum функцией, так как она может вернуть -1 в случае ошибки, и вы будете вызывать неопределенное поведениеесли вы обращаетесь к элементам до вашего массива.Вам также следует проверить вводимые пользователем данные, чтобы убедиться, что начальное и конечное значения находятся в диапазоне от 1 до 5 и уменьшены, так что они являются действительными индексами массива в диапазоне от 0 до 4.

Кроме того, вы можете использовать *Оператор 1044 * для добавления к текущему значению переменной, т. Е.

total_mins=total_mins + flights[i].flight_time + flights[i].flight_layover;

можно изменить на:

total_mins += flights[i].flight_time + flights[i].flight_layover;

EDIT2: И еще одна вещь.По соглашению постоянные #define s должны быть в верхнем регистре, то есть.

#define HOUR 60 в отличие от #define hour 60.

0 голосов
/ 11 ноября 2011

Я полагаю, вы хотите что-то вроде этого:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...