🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

3758閲覧

printf関数が使いたい

Rk_kita

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/11/08 02:20

編集2019/11/08 02:22

前提・実現したいこと

リンク内容
こちらのサイトを参考にprintf関数を使おうとしたらビルドの段階で以下のエラーが出ます。

error: (1098) conflicting declarations for variable "_putch"

関数の名前を変更すると(putch→putcなど)変更した名前に合わせて「” ”」内が変わりエラーになります。
インターネットで検索しても英語の質問サイトがほとんどで、プログラミング初心者の私では理解することができませんでした。
マクロについてあまりしっかりと理解できていません。
初心者にもわかりやすく教えていただけると助かります。

発生している問題・エラーメッセージ

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf make[1]: Entering directory 'C:/Users/*****/MPLABXProjects/887function_UART.X' make -f nbproject/Makefile-default.mk dist/default/production/887function_UART.X.production.hex make[2]: Entering directory 'C:/Users/*****/MPLABXProjects/887function_UART.X' "C:\Program Files (x86)\Microchip\xc8\v2.05\bin\xc8-cc.exe" -mcpu=16F887 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/test.p1 test.c "C:\Program Files (x86)\Microchip\xc8\v2.05\bin\xc8-cc.exe" -mcpu=16F887 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/source.p1 source.c ::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries ::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries "C:\Program Files (x86)\Microchip\xc8\v2.05\bin\xc8-cc.exe" -mcpu=16F887 -Wl,-Map=dist/default/production/887function_UART.X.production.map -DXPRJ_default=default -Wl,--defsym=__MPLAB_BUILD=1 -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -Wl,--memorysummary,dist/default/production/memoryfile.xml -o dist/default/production/887function_UART.X.production.elf build/default/production/test.p1 build/default/production/source.p1 ::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries C:\Program Files (x86)\Microchip\xc8\v2.05\pic\sources\c90\common\doprnt.c:553:4: warning: implicit declaration of function 'putch' is invalid in C99 [-Wimplicit-function-declaration] pputc(c); ^ C:\Program Files (x86)\Microchip\xc8\v2.05\pic\sources\c90\common\doprnt.c:471:19: note: expanded from macro 'pputc' #define pputc(c) (putch(c) INCR_CNT) ^ 1 warning generated. C:\Program Files (x86)\Microchip\xc8\v2.05\pic\sources\c90\common\doprnt.c:553:: error: (1098) conflicting declarations for variable "_putch" (source.c:155) (908) exit status = 1 make[2]: *** [dist/default/production/887function_UART.X.production.hex] Error 1 make[1]: *** [.build-conf] Error 2 nbproject/Makefile-default.mk:153: recipe for target 'dist/default/production/887function_UART.X.production.hex' failed make[2]: Leaving directory 'C:/Users/*****/MPLABXProjects/887function_UART.X' nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed make[1]: Leaving directory 'C:/Users/*****/MPLABXProjects/887function_UART.X' nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed make: *** [.build-impl] Error 2 BUILD FAILED (exit value 2, total time: 4s)

該当のソースコード

C

1#include <xc.h> 2#include <htc.h> 3#include <stdio.h> 4#include <stdlib.h> 5#define RSset RE0 6 7void send4(char data) 8{ 9LCDdata = (LCDdata & 0xf0) | (data & 0x0f); 10 11__delay_ms( 10 ); 12 13Eset = 1; 14__delay_ms( 10 ); 15Eset = 0; 16__delay_ms(10); 17 18//データクリア 19LCDdata = (LCDdata & 0xf0); // 下位4bitをクリア 20} 21 22void sendD(char d){ 23 RSset = 1; //データを送る 24 __delay_ms(10); 25 send4((d & 0xf0) >> 4); //上位4ビットを送る 26 __delay_ms(10); 27 send4((d & 0x0f)); //下位4ビットを送る 28} 29 30//***************************************************************************** 31// Function : lcd_putc 32// Description : LCDに1文字出力 33//***************************************************************************** 34void lcd_putc( char c ){ 35RSset = 1; 36__delay_us( 5 ); // 40nSec以上 37 38sendD(c); 39} 40 41 42////////////printf関数の出力先のスタブ関数を定義する//////////// 43void putch(unsigned char ch){ 44lcd_putc(ch); 45} 46

試したこと

「__delay_ms」の時間はわざと長めにとってあります。
「send~」の関数は全て動作を確認済みです。
自作関数でLCDに1文字ずつ文字を表示することはできています。
今回はprintf関数を使いたいのと、以前別の関数でも同じエラーが出たことがあったので質問に来ました。

 

補足情報(FW/ツールのバージョンなど)

MPLAB X IDE v5.20
CX8(v2.05)
PICkit3
PIC16F887

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

質問から時間がたってしまい申し訳ありません。
別の方向からアプローチをすることになったのでこちらはまたいつか考えることになりました。
回答してくださった皆様ありがとうございました。

投稿2019/11/28 01:40

Rk_kita

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーの内容から、
関数 putch() は、定義が無い。--> 暗黙の定義が使用される。(Warning)
で、putch()の定義が重複している(conflicting declarations)から、エラーと言ってるのではないかと思います。

さて、putch()の定義は? と調べてみると、 int putch(int ch) C言語での暗黙の関数定義は、全て intになるので、これに一致しています。

本来ならば、 関数putch() の定義を行うべきかと、思うのですが、まずは、

void putch(unsigned char ch){

を、int putch(int ch){ としたら、どうでしょうか?
この場合、戻り値が必要なので、関数の最後に return 0; でも入れるとか。

投稿2019/11/08 12:16

pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Rk_kita

2019/11/12 00:43

回答ありがとうございます。 変更する部分はこちらでよろしかったですか? ////////////printf関数の出力先のスタブ関数を定義する//////////// int putch(int ch){ lcd_putc(ch); return 0; } この部分のみ変更してビルドしてみたところ、以下のエラーが返ってきました。 前回のエラーと各エラーコードのような数字が変わっていないようなのですが、改善されなかったと見て間違いないのでしょうか? make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf make[1]: Entering directory 'C:/Users/****/MPLABXProjects/887function_UART.X' make -f nbproject/Makefile-default.mk dist/default/production/887function_UART.X.production.hex make[2]: Entering directory 'C:/Users/****/MPLABXProjects/887function_UART.X' "C:\Program Files (x86)\Microchip\xc8\v2.05\bin\xc8-cc.exe" -mcpu=16F887 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/source.p1 source.c ::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries source.c:166:5: error: conflicting types for 'putch' int putch(int ch){ ^ ./header.h:19:6: note: previous declaration is here void putch(unsigned char ch); ^ 1 error generated. (908) exit status = 1 nbproject/Makefile-default.mk:122: recipe for target 'build/default/production/source.p1' failed make[2]: Leaving directory 'C:/Users/****/MPLABXProjects/887function_UART.X' nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed make[1]: Leaving directory 'C:/Users/****/MPLABXProjects/887function_UART.X' nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed make[2]: *** [build/default/production/source.p1] Error 1 make[1]: *** [.build-conf] Error 2 make: *** [.build-impl] Error 2 BUILD FAILED (exit value 2, total time: 1s)
dodox86

2019/11/12 00:58

> source.c:166:5: error: conflicting types for 'putch' putchのプロトタイプ宣言が異なっているので、競合しているとのエラーです。header.h 内では、 ./header.h:19:6: note: previous declaration is here void putch(unsigned char ch); それに対して、質問者さんの定義するputchは、 int putch(int ch){ です。これを、header.hの内容に合わせる必要があるでしょう。
pepperleaf

2019/11/12 13:37

新しいエラーメッセージを見ると、"./header.h" に "putch" の定義があるようですね。これは、新規に作られたもの? それとも参考ソースとかで持ってきたものでしょうか?
Rk_kita

2019/11/13 00:18

回答ありがとうございます。 すみません、"./header.h"は私が作ったヘッダーで、そちらの宣言を書き換え忘れていました。 変更してビルドした際のエラーがこちらです… make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf make[1]: Entering directory 'C:/Users/****/MPLABXProjects/887function_UART.X' make -f nbproject/Makefile-default.mk dist/default/production/887function_UART.X.production.hex make[2]: Entering directory 'C:/Users/****/MPLABXProjects/887function_UART.X' "C:\Program Files (x86)\Microchip\xc8\v2.05\bin\xc8-cc.exe" -mcpu=16F887 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/test.p1 test.c "C:\Program Files (x86)\Microchip\xc8\v2.05\bin\xc8-cc.exe" -mcpu=16F887 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/source.p1 source.c ::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries ::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries "C:\Program Files (x86)\Microchip\xc8\v2.05\bin\xc8-cc.exe" -mcpu=16F887 -Wl,-Map=dist/default/production/887function_UART.X.production.map -DXPRJ_default=default -Wl,--defsym=__MPLAB_BUILD=1 -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -Wl,--memorysummary,dist/default/production/memoryfile.xml -o dist/default/production/887function_UART.X.production.elf build/default/production/test.p1 build/default/production/source.p1 ::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries C:\Program Files (x86)\Microchip\xc8\v2.05\pic\include\c90\conio.h:16:: error: (1098) conflicting declarations for variable "_putch" (source.c:166) (908) exit status = 1 nbproject/Makefile-default.mk:153: recipe for target 'dist/default/production/887function_UART.X.production.hex' failed make[2]: Leaving directory 'C:/Users/****/MPLABXProjects/887function_UART.X' nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed make[1]: Leaving directory 'C:/Users/****/MPLABXProjects/887function_UART.X' nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed make[2]: *** [dist/default/production/887function_UART.X.production.hex] Error 1 make[1]: *** [.build-conf] Error 2 make: *** [.build-impl] Error 2 BUILD FAILED (exit value 2, total time: 3s)
guest

0

マニュアルをgoogle翻訳したところputch関数をカスタマイズすることでprintfでの出力を変更できるとのこと。

putch関数のスタブは、コンパイラのソースディレクトリにあります。

とのことなので通常はそこにあるのをコピーして自分のプロジェクトに取り込みカスタマイズすればよいと思いますが、現状コンパイルエラーでconflictingつまり競合しているとエラーが出ているので、そのスタブのソースもビルドの対象になっているのではないでしょうか。
つまり同じ関数が複数あるからエラーなっているように思えます。
以下のどちらかの対応で解決するような気がします。

  • スタブの方をビルドの対象から外す。
  • そのスタブが入ったソースも必要なら、スタブputch関数を削除(コメントアウトなど)する。

以下マニュアルから抜粋です。

2.5.8 How Do I Use Printf to Send Text to a Peripheral?
The printf function does two things: it formats text based on the format string and
placeholders you specify, and sends (prints) this formatted text to a destination (or
stream); see Appendix A. Library Functions. The printf function performs all the formatting; then it calls a helper function, called putch, to send each byte of the formatted
text. By customizing the putch function you can have printf send data to any peripheral or location (see Section 4.12 “Mixing C and Assembly Code”). You can choose the
printf output go to an LCD, SPI module or USART, for example.
A stub for the putch function can be found in the compiler’s sources directory. Copy
it into your project then modify it to send the single byte parameter passed to it to the
required destination. Before you can use printf, peripherals that you use will need to
be initialized in the usual way. Here is an example of putch for a USART on a mid-range
device.
void putch(char data) {
while( ! TXIF) // check buffer
continue; // wait till ready
TXREG = data; // send data
}
You can get printf to send to one of several destinations by using a global variable
to indicate your choice. Have the putch function send the byte to one of several destinations based on the contents of this variable.

google翻訳

2.5.8 Printfを使用して周辺機器にテキストを送信する方法
printf関数は、2つのことを行います。フォーマット文字列に基づいてテキストをフォーマットし、
指定したプレースホルダー、およびこのフォーマットされたテキストを宛先に送信(印刷)します(または
ストリーム);付録A.ライブラリー関数を参照してください。 printf関数は、すべてのフォーマットを実行します。次に、putchというヘルパー関数を呼び出して、フォーマットされた各バイトを送信します
テキスト。 putch関数をカスタマイズすることにより、printfに任意の周辺機器または場所にデータを送信させることができます(セクション4.12「Cとアセンブリコードの混合」を参照)。あなたは選ぶことができます
printf出力は、LCD、SPIモジュール、またはUSARTなどに送られます。
putch関数のスタブは、コンパイラのソースディレクトリにあります。コピー
それをあなたのプロジェクトに入れてから、それに渡されたシングルバイトパラメータを送信するように変更します
必須の宛先。 printfを使用する前に、使用する周辺機器が必要です。
通常の方法で初期化されます。ミッドレンジでのUSARTのプッチの例です
端末。
void putch(char data){
while(!TXIF)//バッファをチェック
持続する; //準備が整うまで待つ
TXREG =データ; // データを送る
}
グローバル変数を使用して、printfに複数の宛先のいずれかに送信させることができます。
選択を示します。 putch関数に、この変数の内容に基づいて、いくつかの宛先の1つにバイトを送信させます。

あ、私はMPLABもXC8も詳しくないし環境もないのでこれ以上のことはわかりません。

投稿2019/11/08 04:47

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Rk_kita

2019/11/12 00:17 編集

回答ありがとうございます。 大変申し訳ありませんが、スタブというものについてあまりよくわかっていません。 自分で調べてはいるのですが、テストの時に使う仮の関数という意味で合っているのでしょうか? スタブに関する理解がその程度のため、回答のような対応をしてみようにもどこにどのような形で存在しているのかわかりません… 教えていただけると助かります。
ttyp03

2019/11/12 00:33

そんな感じであっています。 本物ではないダミーの関数とか、本物が用意できるまでの仮関数とかそんな感じです。 今回の場合ですと関数の枠だけ用意してあるので、そこに処理を追加してねってことではないかと思います。
pepperleaf

2019/11/12 13:35

確かに競合しているスタブがある? 探すには、関連ソースで、'putch' で検索してみたら、どうでしょう。 或いは、コンパイラのディレクトリで。
Rk_kita

2019/11/13 00:19

回答ありがとうございます。 コンパイラのディレクトリ内で検索してみたところ、2つの"putch.c"という名前のファイルが見つかりました。 どちらも中身はこのようになっています。 /* * Function: putch * Weak implementation. User implementation may be required */ void putch(char c) { } こちらに処理を追加する?ということでしょうか…?
ttyp03

2019/11/13 01:11

> コピーそれをあなたのプロジェクトに入れてから、それに渡されたシングルバイトパラメータを送信するように変更します とあるので、自分のプロジェクトにコピーして、それに修正を加えると解釈できます。 そしてビルドの対象からスタブは外しましょう。 他の似たような記事を見てもスタブ側について言及はしていないのでスタブの方をビルドの対象にしているとは思えません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問