我想将一个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;
}
答案 0 :(得分:2)
您的distance
功能完全错误。由于您的struct
包含flight_time
和flight_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)
),flights
和user_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);