如何将struct数组传递给函数

时间:2011-11-10 21:00:00

标签: c function data-structures

我想将一个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", &number) != 1 )
    {
        number  = -1;
    }
    return  number;
}

2 个答案:

答案 0 :(得分:2)

您的distance功能完全错误。由于您的struct包含flight_timeflight_layover,因此您希望将这些structs的数组传递给函数,而不是每个{{1}的数组值。即

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) ),flightsuser_start将指定用于计算距离的数组范围。

另请注意,您可以访问user_end数组范围之外的索引。我特别不明白为什么您有flights,也许您想要{{1} }}?

你的for循环的条件和减量部分也有反转,这就是我认为应该如此:

i=end+1

编辑:显然你的函数原型需要更新,你的i = end - 1应该在它们被使用之前声明(包括在原型之前)。 Here's整个代码以及我提到过的修改。

另外,请注意for (i = start; i <= end; i++) 函数,因为它可以在出错时返回-1,如果您在数组之前访问元素,则会导致未定义的行为。您还应检查用户输入以确保起始值和结束值介于1和5之间,并且递减以使它们是0到4之间的有效数组索引。

此外,您可以使用struct运算符添加到变量的当前值,即

getNum

可以更改为:

+=

EDIT2:另一件事。按照惯例,常量total_mins=total_mins + flights[i].flight_time + flights[i].flight_layover; s应为大写,即

total_mins += flights[i].flight_time + flights[i].flight_layover; 而不是#define

答案 1 :(得分:0)

我相信你想要这样的东西:

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);