8

コンパイル時にこれらのエラーが発生し続けます。arduino で実行されるコードを、raspberry 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); 
  } 
}
4

5 に答える 5

10

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

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

関数の以前の宣言が利用できない場合、その最初のインスタンスは戻り値の型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();ください。

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

于 2013-07-26T04:50:23.187 に答える
3

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 では削除されていることにも注意してください。

于 2013-07-26T01:30:54.637 に答える
1

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

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

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

void my_func(int); 

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

于 2013-07-26T01:30:41.353 に答える
1

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

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

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

void rotateDeg(float deg, float speed);

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

于 2013-07-26T01:31:34.660 に答える
1

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

関数ヘッダーを設定したら、既に説明したように、プロトタイプを main の前に配置するか、ヘッダー ファイルに配置してインクルードします。

于 2013-07-26T09:33:28.827 に答える