0

これは、AVR の私の最初のプログラムです。ビルド中に、コードにエラーが表示されます: 'Encode' の暗黙の宣言の型が競合しています

私は次のコードを書きました:

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

#define SegDataPort PORTC
#define SegDataPin PINC
#define SegDataDDR DDRC

#define SegCntrlPort PORTD
#define SegCntrlPin PIND
#define SegCntrlDDR DDRD

int main(void)
{
   SegDataDDR = 0xFF;
   SegCntrlDDR = 0xF3;
   SegCntrlPort = 0xF3;
   SegDataPort = 0x00;
   unsigned char adc_value;
   float volt = adc_value/1023;
   int temp = floor(volt*10 + 0.5);

   SegDataPort = Encode(temp1%10);

   //^^^^ implicit declaration of 'Encode' 

   SegCntrlPort = ~0x01;
   SegDataPort = Encode((temp1/10)%10);
   SegCntrlPort = ~0x02;
   SegDataPort = Encode(temp1/100);
   SegCntrlPort = ~0x04;
}

unsigned char Encode(int digit)
{
   unsigned char val;
   switch(digit)
   {
      case 0 : Val = 0b00111111;
      case 1 : val = 0b00000110;

      /// so on till case 9
   }
   return val;
}

マイコンとしてATmega16を使用しています。また、フロア関数の数学など、さらに多くのライブラリを追加しました。int を unsigned int、unsigned char などに変更しようとしましたが、それでも機能せず、同じエラーが表示されます。私を助けてください。

4

2 に答える 2

2

「エンコード」の暗黙の宣言

C関数内では、使用する (呼び出す) 前に宣言または定義する必要があります。

また

  • Encode()関数の定義を前に移動main()
  • Encode()before に前方宣言を追加しmain()ます。

つまり、ライブラリで定義および定義されfloor()た関数です。これを使用するには、コンパイル時にリンクする必要があります。math.hmath#include <math.h>-lm


ここで使用するプログラムロジックについては、

unsigned char adc_value;
float volt = adc_value/1023;
int temp = floor(volt*10 + 0.5);

かなり問題があります

  1. adc_value初期化されていない状態で使用されるため、 未定義の動作が発生します。
  2. adc_valueタイプcharです。の値で割ると、1023常に の結果が得られます。これは、除算が整数除算0として行われ、期待どおりに結果自体が生成れないためです。float

私の提案は、そのコードブロックを

int adc_value = <some value to initialize>;  //or some input function
float volt = (float)adc_value/1023;          //enforce floating point division
int temp = floor(volt*10 + 0.5);
于 2015-06-02T06:45:03.467 に答える
0

最初の間違い:

 unsigned char adc_value;
 float volt = adc_value/1023;

andadc_valueとして定義unsigned charし、次の行でそれを除算して1023、結果をfloat型変数に代入しようとしました。Cこれらは言語ではできません。(さらに、に値を割り当てていませんadc_value!ゼロまたはランダムな値になります)

2番目の間違い:

2 番目の問題は、Encode関数を で呼び出した後に関数を定義したことですmain()。関数全体を関数の前に移動するmain()か、関数の前にプロトタイプを追加する必要がありmain()ます。

unsigned char Encode(int digit);つまり、前に追加main()

喉の渇きの間違い:

で宣言した変数にいくつかの値を代入しようとしました#define:

#define SegDataPort PORTC
#define SegDataPin PINC
#define SegDataDDR DDRC

#define SegCntrlPort PORTD
#define SegCntrlPin PIND
#define SegCntrlDDR DDRD

int main(void)
{
   SegDataDDR = 0xFF;
   SegCntrlDDR = 0xF3;
   SegCntrlPort = 0xF3;
   SegDataPort = 0x00;
   .
   .
   .

これも違法です。で定義されている変数#defineは定数であり、プログラム本体でそれらを変更しようとしてはなりません。

于 2015-06-02T06:45:11.993 に答える