コンパイル時にこれらのエラーが発生し続けます。 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);
}
}
暗黙的に宣言された関数がある場合、暗黙的な宣言の警告が表示されます。
暗黙的に宣言された関数は、プロトタイプも定義も持たない関数です。そのため、コンパイラーは、関数で何をしたいかを検証できません。
関数の事前の宣言が利用できない場合、その最初のインスタンスは戻り値の型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);
}
_
また、abs();
のような数学関数を使用する前に、_#include<math.h>
_を使用してください。
肝心なのは、使用している関数についてコンパイラに知らせる必要があるということです。
関数を呼び出す前に、関数rotate
やrotateDeg
などの宣言を配置する必要があります。または、関数宣言をヘッダーに入れて、最初に含めることをお勧めします。
関数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では削除されていることに注意してください。
関数を使用する前に、コンパイラに関数について通知する必要があります。通常、これはインクルードする.hファイルで行いますが、呼び出す前に関数全体を記述することもできます。
Cコンパイラはワンパスコンパイラです。それは最初から始まり、最後に達すると完了します。コンパイラに関数が存在することを通知する前に関数を使用していることを確認すると、このエラー/警告が表示されます。
あなたは簡単に言うことができます
void my_func(int);
コードの先頭にあると、コンパイラは、関数の実際の本体が表示されていなくても、コードの後半でmy_funcを呼び出すときに意味を認識します。
別の解決策は、関数をmain
の前に置くことです。これは、関数を記述しているときに便利であり、関数のパラメーターとタイプを固定していません。
関数ヘッダーを確立した後、すでに述べたように、メインの前にプロトタイプを配置するか、ヘッダーファイルに配置してインクルードします。
これがエラーとして戻ってくる理由は、Cが関数宣言を見つけるために先読みしないためです。代わりに、使用した署名に一致する暗黙の関数を作成します。
コードrotateDeg(-360, .1)
は、これらの数値リテラルがパーサーするタイプのために、メソッドシグネチャがroatateDeg(int deg, double speed)
の暗黙的な関数を作成します。
この問題を解決するには、行を追加します
void rotateDeg(float deg, float speed);
インポート後、コードの先頭に移動します。これにより、使用前にメソッドが明示的に宣言され、メソッドの競合とimplicit declaration
警告の両方が削除されます。