2014-11-25 751 views
0

我是C語言的新手,我遇到了一個我實際上不理解的問題。我想從另一個功能的陣列,但是當我嘗試提取信息,它給了我以下警告:函數的隱式聲明在C99中無效

的功能「getk_vector_calculation」隱聲明是無效的C99 數組初始化函數必須是初始化列表或字符串文字

下面是代碼:

int k_vector_calculation(int krec[3]) 

{ 
    ... 

    krec [0] = l*u[0]+m*v[0]+o*[0] ; 

    krec [1] = l*u[1]+m*v[1]+o*[1] ; 

    krec [2] = l*u[2]+m*v[2]+o*[2] ; 

    return k_vector_calculation(&krec[3]) 

} 

int main() 

{ 

    char krec[3] = getk_vector_calculation(&krec[3]); 

    ... 

} 

回答

2
main()

你調用的函數是getk_vector_calculation()[這不是k_vector_calculation()],並且在使用之前不是declareddefined

要解決這個問題,

  1. 要麼#include頭文件方含的getk_vector_calculation()聲明在SORCE文件。 [考慮到getk_vector_calculation()在某個其他文件中]
  2. 或者,在main()之前添加前向聲明getk_vector_calculation(),並在某處定義getk_vector_calculation()

要了解更多關於隱式聲明的內容,可以查看這個question


編輯:

正如其他人所指出的那樣,在您的代碼段更多問題。但由於問題標題僅限於implicit declaration錯誤,IMO認爲此答案應該滿足需要。其餘的錯誤完全是一個不同的方面。

+1

指出'char krec [3] = getk_vector_calculation(&krec [3]);'是完全無效的也是有幫助的。 – 2014-11-25 12:27:28

+0

謝謝,但我該如何寫呢? – 2014-11-25 12:29:52

0

在早期版本的C中,尚未聲明的函數仍然可以調用,並且假定它們返回了int並且帶有未指定數量的參數。嚴格來說,在C99中,不允許在沒有首先聲明的情況下調用函數。

對於您的情況,您嘗試調用一個名爲getk_vector_calculation的函數,但是您已經定義了一個名爲k_vector_calculation(在開頭爲)的函數。

你也試圖用函數初始化一個數組,這是不允許的(在C中,函數不能返回數組)。簡單地聲明數組並調用k_vector_calculation作爲一個單獨的語句,例如:

int krec[3] = {0}; 
k_vector_calculation(krec); 

不要使用&krec[3],因爲這指向一個無效的位置。使用&krec[0]來提供數組中第一個元素的地址,或者相當於krec會做的。注:還聲明瞭一個類型爲char的數組,但函數接受指向int的指針,並且這些類型不兼容。你的函數也會無條件地調用它自己,所以如果被刪除的代碼沒有有條件地返回,就會有一個保證的無限遞歸。如果你的函數不需要調用它自己,並且它沒有返回任何重要的值,那麼將返回類型改爲void以表示它沒有返回值。

由於使用的是C99,你可以在你的函數的參數聲明中使用static關鍵字的優勢:

void k_vector_calculation(int krec[static 3]) 
{ 
    // ... other code here ... 
    krec[0] = l*u[0]+m*v[0]+o*[0]; 
    krec[1] = l*u[1]+m*v[1]+o*[1]; 
    krec[2] = l*u[2]+m*v[2]+o*[2]; 
} 

上面的代碼聲明瞭一個函數,它作爲一個參數的至少數組3 int

0

幾個問題,在這裏:

  1. 由於Sourav戈什指出,定義k_vector_calculation(),但隨後嘗試調用getk_vector_calculation()。你必須使用正確的名字。

  2. 你說你要「從另一個函數獲取數組」 - 你不能在C做

  3. 你不顯示你所有的代碼k_vector_calculation(),但如圖所示,這函數會永遠調用自己,因爲它所做的最後一件事是無條件地再次調用自己。如果你有一個遞歸函數,你需要給它一個終止的方法。

  4. &krec[3]是數組k的第四個元素的地址,這不是你想要做的,在這裏,尤其是因爲你的數組只包含3個元素。要引用陣列本身,只需使用krec

  5. char krec[3] = getk_vector_calculation(&krec[3]);由於多種原因無效。一,你不能在C中用這種方式初始化數組。二,參見第(4)點。三,即使你可以在C中以這種方式初始化數組,你也會嘗試將未初始化的數組傳遞給函數,在那裏初始化它,然後嘗試用結果初始化原始數組。這沒有意義。

  6. 您也寫你的函數在main()int陣列工作,但聲明krec作爲char數組。

不清楚你想k_vector_calculation()要做什麼,但你不能像C那樣返回數組。可能你想要做的只是將數組傳遞給函數,使函數在其中工作,並且不返回任何內容。例如:

#include <stdio.h> 

void k_vector_calculation(int kvec[]) 
{ 
    kvec[0] = 1; 
    kvec[1] = 2; 
    kvec[2] = 3; 
} 

int main(void) 
{ 
    int kvec[3]; 
    k_vector_calculation(kvec); 

    for (int i = 0; i < 3; ++i) { 
     printf("kvec[%d] is %d.\n", i, kvec[i]); 
    } 

    return 0; 
} 
+0

謝謝你的解釋,非常感謝 – 2014-11-25 13:07:59

相關問題