簡體   English   中英

如何將struct數組傳遞給函數

[英]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_timeflight_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_startuser_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM