2017-04-13 159 views
-5

嗨我想在C中使用一個簡單的函數稍後在一個更大的代碼中使用它,但我不知道如何使用變量或函數外聲明的數組。C函數輸入變量

我想這一點,但編譯器給我的錯誤警告廣告的所有短:

#include <stdio.h> 
#include <string.h> 

// function declaration 
int min_hour(int hour[int n]); 

int main() 
{ 
    int hour[5] = {8, 8, 9, 8, 8}; 
    int j = min_hour(hour[5]); 
    printf("%d", j); 
} 

int min_hour(int hour[int n]) 
{ 
    int earliest = 0; 
    for (int i = 1; i <= n + 1; i++) 
    { 
     if (hour[i] < hour[i+1]) 
     { 
      earliest = i; 
     } 
     else 
     { 
      earliest = i+1; 
     } 
    } 
    return earliest; 
} 

Line Col  
5 24 [Error] expected expression before 'int' 
10 3 [Warning] implicit declaration of function 'min_hour' [-Wimplicit-function-declaration] 
14 24 [Error] expected expression before 'int' 
+0

'int min_hour(int * hour)'當你將一個數組作爲參數傳遞給一個函數時,它的第一級間接被自動轉換爲一個指針。然後以相同的方式調用它'int j = min_hour(hour);'最重要的是**總是**編譯時啓用*警告*(例如編譯字符串中的'-Wall -Wextra')並且不接受代碼編譯沒有警告或錯誤。 (你可以通過聽你的編譯器告訴你什麼來學習很多C) –

+0

把int min_hour(int hour [int n])'改爲'int min_hour(int hour [],int n) '和'int j = min_hour(hour,5);' – eyllanesc

+0

將數組長度作爲單獨的參數/參數傳遞,例如'int myFunction(int arr [],int size);' – ThingyWotsit

回答

0

繼續我的評論,你的代碼中有大量的基本錯誤。除了註釋中詳述的參數問題之外,您還有min_hour中的邏輯錯誤。你不能簡單地傳遞一個數組而不知道數組中有多少個元素。除了維持用於比較的最小值之外,您還應該維護與返回最小元素關聯的索引。你只是比較相鄰元素,而無需保存的最低值,爲解決這將是像做以下

方式一:

#include <stdio.h> 

int min_hour (int *hour, int n); 

int main (void) { 

    int hour[] = {8, 8, 9, 8, 8}, 
     n = sizeof hour/sizeof *hour, 
     index = min_hour (hour, n); 

    if (index != -1) /* always validate your function returns */ 
     printf ("minimum in array occurs at index: '%d', value: %d\n", 
       index, hour[index]); 

    return 0; 
} 

int min_hour (int *hour, int n) 
{ 
    if (!hour || !n) { /* validate your parameters */ 
     fprintf (stderr, "min_hour() error: invalid parameter.\n"); 
     return -1; 
    } 

    int earliest = hour[0], idx = 0; 

    for (int i = 1; i < n ; i++) 
     if (hour[i] < earliest) 
     { 
      earliest = hour[i]; 
      idx = i; 
     } 

    return idx; 
} 

示例使用/輸出

$ ./bin/earliest 
minimum in array occurs at index: '0', value: 8 

注意:函數只需要第一個陣列中的最低值,不管是否有相同的最小值r數組內的重複。

讓我知道你是否還有其他問題。

+0

謝謝你的回答,這是非常有幫助的。 我有幾個問題: 爲什麼按其大小劃分數組大小? n = sizeof hour/sizeof * hour 究竟什麼是'!'在小時和n之前呢? 我想我明白了其他所有 –

+0

如果你看看聲明int h [] = {8,8,9,8,8}',沒有指定大小。要查找大小,請將數組大小'sizeof hour'除以每個元素的大小字節數'sizeof * hour'(與sizeof hour [0]'相同)。 **注意**,只能在聲明數組的*範圍*中執行此操作,而不能在將數組傳遞給函數之後執行此操作。 '!'是** not **運算符,它是'if(hour == NULL || n == 0)'的簡寫形式,從字面上看如果'hour = NULL',則''hour'測試'TRUE' )。做得好。 C有很多,慢慢來,享受騎行。 –

1

您需要將指針傳遞給數組和大小。你的判斷最早的邏輯也是錯誤的。

#include <stdio.h> 
#include <string.h> 

int min_hour(int hour[], int n) 
{ 
    int earliest = 0; 
    for (int i = 1; i < n; i++) 
    { 
     if (hour[earliest] > hour[i]) 
     { 
      earliest = i; 
     } 
    } 
    return earliest; 
} 

int main() 
{ 
    int hour[] = {7, 2, 3, 4, 1}; 
    int j = min_hour(hour, sizeof(hour)/sizeof(int)); 
    printf("%d", j); 
} 
+0

謝謝你糾正了我所有的錯誤。但爲什麼要分開這兩種尺寸? –

+0

@Segmentationfault,sizeof(小時)是數組的大小(以字節爲單位)。除以sizeof(int)(或者像David所做的sizeof(*小時))來獲得數組元素數量的大小。因爲sizeof()是一個編譯器指令(在這種情況下),並且C中的數組是簡單的沒有元數據的內存分配,所以你只能在聲明的範圍內這樣做。 – niry