[英]How to pass a struct array into a function
我想將一個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;
}
你的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之間的有效數組索引。
此外,您可以使用+=
運算符添加到變量的當前值,即
total_mins=total_mins + flights[i].flight_time + flights[i].flight_layover;
可以改為:
total_mins += flights[i].flight_time + flights[i].flight_layover;
編輯2:另一件事。 按照慣例,常量#define
應該是大寫的,即。
#define HOUR 60
而不是#define hour 60
。
我相信你想要這樣的東西:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.