web-dev-qa-db-ja.com

暗黙の宣言エラーが発生し続ける

コンパイル時にこれらのエラーが発生し続けます。 arduinoで実行されるコードをRaspberryPiで実行するように変更しました。

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); 
  } 
}
6
Yamaha32088

暗黙的に宣言された関数がある場合、暗黙的な宣言の警告が表示されます。

暗黙的に宣言された関数は、プロトタイプも定義も持たない関数です。そのため、コンパイラーは、関数で何をしたいかを検証できません。

関数の事前の宣言が利用できない場合、その最初のインスタンスは戻り値の型intを持つ暗黙の宣言であると見なされ、パラメーターについては何も想定されません。

関数の宣言rotaterotatedegを次のように残してください:

_void rotate (int , float );
_

そして

_void rotateDeg (float , float );
_

ループで使用する前に:

_void loop(){ 

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

また、abs();のような数学関数を使用する前に、_#include<math.h>_を使用してください。

肝心なのは、使用している関数についてコンパイラに知らせる必要があるということです。

9
0decimal0

関数を呼び出す前に、関数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では削除されていることに注意してください。

2
Yu Hao

関数を使用する前に、コンパイラに関数について通知する必要があります。通常、これはインクルードする.hファイルで行いますが、呼び出す前に関数全体を記述することもできます。

Cコンパイラはワンパスコンパイラです。それは最初から始まり、最後に達すると完了します。コンパイラに関数が存在することを通知する前に関数を使用していることを確認すると、このエラー/警告が表示されます。

あなたは簡単に言うことができます

void my_func(int); 

コードの先頭にあると、コンパイラは、関数の実際の本体が表示されていなくても、コードの後半でmy_funcを呼び出すときに意味を認識します。

1
xaxxon

別の解決策は、関数をmainの前に置くことです。これは、関数を記述しているときに便利であり、関数のパラメーターとタイプを固定していません。

関数ヘッダーを確立した後、すでに述べたように、メインの前にプロトタイプを配置するか、ヘッダーファイルに配置してインクルードします。

1
LS_ᴅᴇᴠ

これがエラーとして戻ってくる理由は、Cが関数宣言を見つけるために先読みしないためです。代わりに、使用した署名に一致する暗黙の関数を作成します。

コードrotateDeg(-360, .1)は、これらの数値リテラルがパーサーするタイプのために、メソッドシグネチャがroatateDeg(int deg, double speed)の暗黙的な関数を作成します。

この問題を解決するには、行を追加します

void rotateDeg(float deg, float speed);

インポート後、コードの先頭に移動します。これにより、使用前にメソッドが明示的に宣言され、メソッドの競合とimplicit declaration警告の両方が削除されます。

1
cptroot