• ベストアンサー

分割ファイルのコンパイルができない

こんにちは。 mikroCというコンパイラを使い、 以下の2つのファイルをコンパイル 使用と思っていますが、 「init12f683が宣言されていない」、という エラーが出てしまいます。 プログラム的に問題あるでしょうか( コンパイラでは、ひとつのプロジェクト を作成し、両方そこに加えてあります)。 ----init12f683.c(自作関数) void init12f683(){ GPIO=0; CMCON0=0b00000111; ANSEL=0b01110000; TRISIO=0b00010000; } ----picc1.c(main) extern void init12f683(void);*宣言はここと、 void main(){ extern void init12f683(void);*ここで両方試しました。 init12f683(); Delay_ms(1000); while(1){ GPIO.F0=1 ; Delay_ms(1000) ; GPIO.F0=0 ; Delay_ms(1000) ; } } externでの関数の宣言は、mainの外に置く場合と、 中に入れる場合、両方試しています。 問題が、プロジェクトファイルの設定にあるのか、 プログラム的におかしいのか(どこがおかしいのか)、 知りたいです。 何か分かる人がいましたら、 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jppy
  • ベストアンサー率14% (14/99)
回答No.1

コンパイラ(mikroC)の仕様を知らないのですが(すみません調べてません) 下を試してみたらどうでしょう? ----init12f683.c(自作関数) void init12f683(){    ↓ ----init12f683.c(自作関数) void init12f683( void ){ 引数型を「なし」じゃなくて「void型」としてみる的な?

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

>----init12f683.c(自作関数) >void init12f683(){ >----picc1.c(main) >extern void init12f683(void);*宣言はここと、 「void init12f683()」と「void init12f683(void)」は「違う型の関数」なので、いくらextern宣言しようが「そんな関数は存在しない」と言われて当たり前。 実体の方の引数が「()」ならexternしている方も「()」に合わせるか、externしている方の引数が「(void)」なら実体の方も「(void)」に合わせよう。

すると、全ての回答が全文表示されます。
  • gigamac
  • ベストアンサー率57% (8/14)
回答No.3

ちなみに、コンパイル時でしょうか?リンク時でしょうか? リンク時でしたらmain関数があるpicc1.cの中にinit12f683関数をコピペして試してみるのも手ですね(main関数の前にinit12f683関数をコピペです)。 こんな感じです。 【ファイル名:picc1.c】 ------------------- void init12f683(void){ GPIO=0; CMCON0=0b00000111; ANSEL=0b01110000; TRISIO=0b00010000; } void main(void){ init12f683(); Delay_ms(1000); while(1){ GPIO.F0=1 ; Delay_ms(1000) ; GPIO.F0=0 ; Delay_ms(1000) ; } } ------------------- これでエラーがでなければ、リンクに失敗していると思います。

すると、全ての回答が全文表示されます。
  • S117
  • ベストアンサー率40% (18/45)
回答No.2

エラーメッセージは本当に 「宣言されていない」でしょうか。 とりあえず関数の中に書くのは不適切なので、関数の呼び出しをする関数の前に書いてください。 また、関数のプロトタイプ宣言はデフォルトでexternですので、省略可能です。 で、宣言はちゃんとしているので、定義がないというエラーかもしれません。 プロジェクトファイルでinit12f683.cが対象に含まれているか確認してください。リンク時に失敗しているのかもしれません。 上記は一般的なCコンパイラの場合の対策なので、もしかしたらお持ちのコンパイラに独特の手順が必要かもしれません。そこら辺はマニュアルを読んでもらうか、別の方の回答を期待するしか。 あと、関数の定義で引数を省略していますが、宣言が(void)なので、 void init12f683(void) と、する方がいいでしょう。 また、できればヘッダファイルを使う方がいいでしょう。

すると、全ての回答が全文表示されます。

関連するQ&A