2013-07-26 95 views
2

編譯時我不斷收到這些錯誤。我修改了在Arduino上運行的代碼,以運行在我的覆盆子pi上。不斷收到隱式聲明錯誤

test1.c: In function ‘loop’: 
test1.c:24:3: warning: implicit declaration of function ‘rotateDeg’ [-Wimplicit-function-declaration] 
test1.c:33:3: warning: implicit declaration of function ‘rotate’ [-Wimplicit-function-declaration] 
test1.c: At top level: 
test1.c:42:6: warning: conflicting types for ‘rotate’ [enabled by default] 
test1.c:33:3: note: previous implicit declaration of ‘rotate’ was here 
test1.c: In function ‘rotate’: 
test1.c:46:3: warning: implicit declaration of function ‘abs’ [-Wimplicit-function-declaration] 
test1.c: At top level: 
test1.c:61:6: warning: conflicting types for ‘rotateDeg’ [enabled by default] 
test1.c:24:3: note: previous implicit declaration of ‘rotateDeg’ was here 
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../arm-linux-gnueabihf/crt1.o: In function `_start': 
(.text+0x34): undefined reference to `main' 
collect2: ld returned 1 exit status 

這裏是我的源代碼:

#include <wiringPi.h> 
#include <stdio.h> 
#include <stdio.h> 

#define DIR_PIN 0 
#define STEP_PIN 3 

void setup() { 
    pinMode(DIR_PIN, OUTPUT); 
    pinMode(STEP_PIN, OUTPUT); 
} 

void loop(){ 

    rotateDeg(360, 1); 
    delay(1000); 
    rotateDeg(-360, .1); //reverse 
    delay(1000); 
    rotate(1600, .5); 
    delay(1000); 

    rotate(-1600, .25); //reverse 
    delay(1000); 
} 

void rotate(int steps, float speed){ 
    //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement) 
    //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger 
    int dir = (steps > 0)? HIGH:LOW; 
    steps = abs(steps); 

    digitalWrite(DIR_PIN,dir); 

    float usDelay = (1/speed) * 70; 

    for(int i=0; i < steps; i++){ 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(usDelay); 
    } 
} 

void rotateDeg(float deg, float speed){ 
    //rotate a specific number of degrees (negitive for reverse movement) 
    //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger 
    int dir = (deg > 0)? HIGH:LOW; 
    digitalWrite(DIR_PIN,dir); 

    int steps = abs(deg)*(1/0.225); 
    float usDelay = (1/speed) * 70; 

    for(int i=0; i < steps; i++){ 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(usDelay); 
    } 
} 

回答

5

當存在隱式聲明的函數時,會得到隱式聲明警告。

隱式聲明的功能是既沒有 原型也沒有定義的功能,這就是爲什麼編譯器無法驗證 什麼你想用函數來完成。

如果一個函數沒有事先聲明可用,則作出一審被假定爲返回類型爲int,並沒有什麼假設有關參數的聲明暗示。

剛剛離開的功能rotate聲明,並rotatedeg這樣的:

void rotate (int , float); 

void rotateDeg (float , float); 

在循環使用前:

void loop(){ 

    rotateDeg(360, 1); 
    .... 
    .... 
    rotate(1600, .5); 
    ... 
    rotate(-1600, .25); //reverse 
    delay(1000); 
} 

使用任何之前還可以使用#include<math.h>數學函數如abs();

底線是,你必須讓你的編譯器知道你正在使用的函數。

+1

arduino IDE隱藏了用戶的這個要求,使得編寫簡單的arduino草圖變得更簡單,但正如你發現的那樣,代價是它不是標準的C. – ViennaMike

1

你必須讓編譯器知道這個功能在使用它之前。您通常會在包含的.h文件中執行此操作,但在調用它之前,您也可以直接編寫完整的函數。

C編譯器是單通編譯器。它從一開始就開始,當它結束時,就完成了。在告訴編譯器它存在之前,當它看到你使用函數時,你會得到這個錯誤/警告。

你可以簡單地說

void my_func(int); 

在你的代碼的頂部,然後編譯器會知道你的意思,當你在你的代碼再打my_func,並將,即使它沒有看到實際的身體的功能。

2

您需要在調用函數之前先聲明函數rotaterotateDeg等。或者更好的辦法是把函數聲明放在一個頭文件中,並將其包含在開頭。

對於功能abs,你需要include <math.h>

爲什麼你得到這些警告:鑑於這個簡單的程序:

int main(void) 
{ 
    func(); 
    return 0; 
} 
void func(void) 
{ 
    //do something 
} 

編譯器看到了它的聲明之前看到func,所以編譯器會生成隱式聲明:int func();,其默認返回類型爲int。這不是你的意思。要糾正它,使用:

void func(void); 
int main(void) 
{ 
    func(); 
    return 0; 
} 
void func(void) 
{ 
    //do something 
} 

還要注意的函數,隱式聲明是在C89合法的,但在C99已被刪除。

1

這是錯誤的原因是C不提前查找函數聲明。相反,它會創建一個與您使用的簽名相匹配的隱式函數。

代碼rotateDeg(-360, .1)創建了一個隱式函數,其方法簽名爲roatateDeg(int deg, double speed),因爲這些數字文字分析到的類型。

爲了解決這個問題,添加行

void rotateDeg(float deg, float speed); 

你的代碼的頂部,進口後。這會在使用該方法之前明確聲明該方法,並刪除方法衝突和警告。

1

另一種解決方案是簡單地將您的功能放在main之前。這在編寫函數時非常有用,並且您沒有固定函數參數和類型。

在建立函數頭之後,如已經講過的那樣,將原型放在main函數之前,或者將它們放在頭文件中幷包含它。