質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

IDE

IDE、統合開発環境((Integrated Development Environment)とは、テキストエディタ以上の機能を提供して、ソフトウェア開発を効率をあげるコンピュータプログラムを指す。

include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Q&A

解決済

3回答

14943閲覧

undeclared (first use in this function)のエラーが#defineしているのに取れない!

gucci12321

総合スコア49

C

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

IDE

IDE、統合開発環境((Integrated Development Environment)とは、テキストエディタ以上の機能を提供して、ソフトウェア開発を効率をあげるコンピュータプログラムを指す。

include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

0グッド

0クリップ

投稿2018/12/03 13:09

編集2018/12/04 12:16

C言語でUDP通信を実現する(使用機器:P8X32AとW5200、開発環境:SimpleIDE)

現在、添付いたしましたファイルのようにUDP通信プログラムを作成しているのですが、
エラーがなかなか取れません。
作成したプログラムのZIPファイルへのリンク

かなり代表的なエラーではあるのですが、
インクルードしたヘッダファイル(w5200.h)で定義しておりますので、
何が原因かなかなか見つけられておりません。

♦使用しているコード
loopback.c(下に記載)
loopback.h
socket.c
socket.h
w5200.c
w5200.h
wizchip_conf.c
wizchip_conf.h
__*ソースコードが長いため、記載できない部分につきましては下にまとめました。
作成したプログラムのZIPファイルへのリンク__

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

SimpleIDE Version 1.1.2 propeller-elf-gcc.exe -v GCC 4.6.1 (propellergcc_v1_0_0_2408) propeller-elf-gcc.exe -I . -L . -Os -mcmm -m32bit-doubles -fno-exceptions -std=c99 -c loopback.c -o cmm/loopback.o loopback.c: In function 'loopback_udps': loopback.c:17:4: warning: implicit declaration of function 'getSn_SR' [-Wimplicit-function-declaration] loopback.c:19:12: error: 'SOCK_UDP' undeclared (first use in this function) loopback.c:19:12: note: each undeclared identifier is reported only once for each function it appears in loopback.c:20:10: warning: implicit declaration of function 'getSn_RX_RSR' [-Wimplicit-function-declaration] loopback.c:47:12: error: 'SOCK_CLOSED' undeclared (first use in this function) loopback.c:51:31: error: 'Sn_MR_UDP' undeclared (first use in this function) Done. Build Failed! Click error or warning messages above to debug.

loopback.c

c

1#include <stdio.h> 2#include "loopback.h" 3#include "socket.h" 4#include "w5200.h" 5#include "wizchip_conf.h" 6 7#if LOOPBACK_MODE == LOOPBACK_MAIN_NOBLCOK 8 9 10int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port) 11{ 12 int32_t ret; 13 uint16_t size, sentsize; 14 uint8_t destip[4]; 15 uint16_t destport; 16 17 switch(getSn_SR(sn)) 18 { 19 case SOCK_UDP : 20 if((size = getSn_RX_RSR(sn)) > 0) 21 { 22 if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; 23 ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport); 24 if(ret <= 0) 25 { 26#ifdef _LOOPBACK_DEBUG_ 27 printf("%d: recvfrom error. %ld\r\n",sn,ret); 28#endif 29 return ret; 30 } 31 size = (uint16_t) ret; 32 sentsize = 0; 33 while(sentsize != size) 34 { 35 ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport); 36 if(ret < 0) 37 { 38#ifdef _LOOPBACK_DEBUG_ 39 printf("%d: sendto error. %ld\r\n",sn,ret); 40#endif 41 return ret; 42 } 43 sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero. 44 } 45 } 46 break; 47 case SOCK_CLOSED: 48#ifdef _LOOPBACK_DEBUG_ 49 //printf("%d:UDP loopback start\r\n",sn); 50#endif 51 if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn) 52 return ret; 53#ifdef _LOOPBACK_DEBUG_ 54 printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port); 55#endif 56 break; 57 default : 58 break; 59 } 60 return 1; 61} 62 63#endif 64

試したこと

エラーに関して参考にしたサイトに以下のものがあり、そのまま試しましたがエラーに変化はありませんでした。
C言語でMakefileの実行時、インクルードしているはずの変数が"undeclared"となる原因
もしかしたら、この上記のサイトに記載されていることを理解しきれてないのかもしれません

補足情報(使用機器、開発環境、参考にしたURL)

♦使用機器
WIZnet W5200 for QuickStart (#40002)
Propeller QuickStart (#40000)

♦IDE
simpleIDE

また、以下に参考にしたサイトを挙げておきます。
♦プログラムを作成するうえで参考にしたサイト*今回使用しているのはW5200
W5500 UDPサーバーへのデータ送信
WIZnet ioLibrary
W5500 UDP機能
♦エラーに関して参考にしたサイト
C言語でMakefileの実行時、インクルードしているはずの変数が"undeclared"となる原因

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

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

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

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

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

coco_bauer

2018/12/03 13:28

「インクルードしたヘッダファイルで定義しておりますので」との事ですが、そのヘッダファイルの内容を質問に追加してください。プログラムソースを見ずに「確かに定義されてるなぁ」と考える訳にはいきませんから。
guest

回答3

0

ベストアンサー

c++

1#define _WIZCHIP_ 5200

#include "w5200.h"より前で定義してください


https://github.com/Wiznet/ioLibrary_Driverを調べたところ
w5200.hの使い方が間違っています。

  1. wizchip_conf.hを編集もしくは全てのヘッダより前に#define _WIZCHIP_ 5200を行う
    必要に応じて、_WIZCHIP_IO_MODE_を編集する。
  2. wizchip_conf.h#includeすると自動で#include "W5200/w5200.h"が行われる

追記

原因が判明しました。

diff

1--- wizchip_conf.h 2018-12-04 07:33:56.965148400 +0900 2+++ wizchip_conf_mod.h 2018-12-03 17:55:26.000000000 +0900 3@@ -53,6 +53,7 @@ 4 5 #ifndef _WIZCHIP_CONF_H_ 6 #define _WIZCHIP_CONF_H_ 7+#endif 8 9 #ifdef __cplusplus 10 extern "C" { 11@@ -98,7 +99,7 @@ 12 */ 13 // #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_DIR_ 14 // #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_INDIR_ 15- #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_ 16+/* #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_ 17 18 //A20150601 : Define the unit of IO DATA. 19 typedef uint8_t iodata_t; 20@@ -113,13 +114,15 @@ 21 */ 22 // #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_INDIR_ 23 //#define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_5500_ 24- #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_ 25+ //#define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_ 26 27 //A20150601 : Define the unit of IO DATA. 28 typedef uint8_t iodata_t; 29 //A20150401 : Indclude W5100.h file 30- #include "W5100S/w5100s.h" 31-#elif (_WIZCHIP_ == W5200) 32+ //#include "W5100S/w5100s.h" 33+ 34+ 35+#if (_WIZCHIP_ == W5200) 36 #define _WIZCHIP_ID_ "W5200\0" 37 /** 38 * @brief Define interface mode. 39@@ -132,8 +135,11 @@ 40 //A20150601 : Define the unit of IO DATA. 41 typedef uint8_t iodata_t; 42 #include "W5200/w5200.h" 43-#elif (_WIZCHIP_ == W5500) 44- #define _WIZCHIP_ID_ "W5500\0" 45+ 46+ 47+ 48+/*#elif (_WIZCHIP_ == W5500) 49+ /*#define _WIZCHIP_ID_ "W5500\0" 50 51 /** 52 * @brief Define interface mode. \n 53@@ -148,7 +154,7 @@ 54 * ex> <code> #define \_WIZCHIP_IO_MODE_ \_WIZCHIP_IO_MODE_SPI_VDM_ </code> 55 * 56 */ 57-#ifndef _WIZCHIP_IO_MODE_ 58+/*#ifndef _WIZCHIP_IO_MODE_ 59 //#define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_FDM_ 60 #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_VDM_ 61 #endif 62@@ -161,7 +167,7 @@ 63 * @brief Define interface mode. 64 * @todo you should select interface mode as chip. Select one of @ref \_WIZCHIP_IO_MODE_SPI_ , @ref \_WIZCHIP_IO_MODE_BUS_DIR_ or @ref \_WIZCHIP_IO_MODE_BUS_INDIR_ 65 */ 66-#ifndef _WIZCHIP_IO_MODE_ 67+/*#ifndef _WIZCHIP_IO_MODE_ 68 // #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_DIR_ 69 #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_INDIR_ 70 #endif

なんでしょうか、エラーをとにかく消そうとしたのでしょうか?

  • /*で始まったコメントの終端*/が書き込まれておらず広範囲が消えている
  • #elifから#ifに書き換えたせいでw5200.hの読み込みが発生していない

投稿2018/12/03 14:46

編集2018/12/03 22:56
asm

総合スコア15147

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

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

asm

2018/12/03 14:48 編集

多分w5200.hのドキュメントで コンパイラオプションに`-D_WIZCHIP_=5200`をつけること みたいなのが、あったんじゃないかと思う
gucci12321

2018/12/03 15:04

ご回答ありがとうございます。 loopback.cのコードの一番上に【#define _WIZCHIP_ 5200】を書いてみましたが、 同じエラーのままでした。 また、コンパイラオプションに関しましては、 WindowsでSimpleIDEという統合開発環境を使用しているのですが、 そこで`-D_WIZCHIP_ 5200`を付けてやってみましたが、全く同じエラーが発生いたしました。 私が何か勘違いをしているのでしょうか。 上記のことで、やり方がおかしい部分はありますでしょうか。 お時間がありましたら教えていただきたいです。
asm

2018/12/03 22:38 編集

wizchip_conf.hに行った書き換えを全て戻し #include "W5200/w5200.h"を #include "w5200.h"へ書き換え これで当環境ではコンパイルできました。
gucci12321

2018/12/04 04:21

本当にありがとうございます!!!!!! ご指摘の通り、エラーを取ろうとやみくもに消してしまっていました。。 ありがとうございます。 ご指摘の部分のコメントアウトをけしたら、かなりエラーが減りました。 >wizchip_conf.hに行った書き換えを全て戻し >#include "W5200/w5200.h"を >#include "w5200.h"へ書き換え 上記の変更も行った結果、 SimpleIDE Version 1.1.2 C:/Users/Tomoaki Yamaguchi/Documents/SimpleIDE/Learn/Simple Libraries/ C:/Users/Tomoaki Yamaguchi/Documents/SimpleIDE/ Updated on: 2018-12-03 propeller-elf-gcc.exe -v GCC 4.6.1 (propellergcc_v1_0_0_2408) propeller-elf-gcc.exe -I . -L . -Os -mcmm -m32bit-doubles -fno-exceptions -std=c99 -c socket.c -o cmm/socket.o In file included from wizchip_conf.h:130:0, from socket.h:91, from socket.c:56: w5200.h:1200:1: error: expected identifier or '(' before 'uint8_t' socket.c: In function 'socket': socket.c:182:4: warning: implicit declaration of function 'WIZCHIP_READ' [-Wimplicit-function-declaration] Done. Build Failed! Click error or warning messages above to debug. というエラーだけ生じてしまいました。 本当に何度も申し訳ないのですが、 こちらの原因についても教えていただけるとありがたく思います。
gucci12321

2018/12/04 04:32

ちなみに、エラー部分を記載しますと w5200.h:1200:1: error: expected identifier or '(' before 'uint8_t' 1200  uint8_t WIZCHIP_READ (uint32_t AddrSel); 、、、 //////////////////////// // Basic I/O Function // //////////////////////// /** * @ingroup Basic_IO_function_W5200 * @brief It reads 1 byte value from a register. * @param AddrSel Register address * @return The value of register */ uint8_t WIZCHIP_READ (uint32_t AddrSel); /** * @ingroup Basic_IO_function_W5200 * @brief It writes 1 byte value to a register. * @param AddrSel Register address * @param wb Write data * @return void */ void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb ); /** * @ingroup Basic_IO_function_W5200 * @brief It reads sequence data from registers. * @param AddrSel Register address * @param pBuf Pointer buffer to read data * @param len Data length */ void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len); /** * @ingroup Basic_IO_function_W5200 * @brief It writes sequence data to registers. * @param AddrSel Register address * @param pBuf Pointer buffer to write data * @param len Data length */ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len); 、、、
asm

2018/12/04 10:15 編集

うーん、わかりませんね その前で問題が発生しているようにも見えます zipを更新していただけますか? なお、SimpleIDEで試したところ https://raw.githubusercontent.com/Wiznet/ioLibrary_Driver/master/Ethernet/wizchip_conf.h を基に #define _WIZCHIP_ W5100S から #define _WIZCHIP_ W5200 #include "W5200/w5200.h" から #include "w5200.h" の2点の書き換えでビルドに成功しました。
gucci12321

2018/12/04 10:21

一番上にあるコメント部分が、うまくコメントアウトしていなかっただけでした。 エラーを取ることができました!!! 本当にありがとうございます!!! そして、エラーがなくなったのですが、main関数がないとのことでうまくUDP通信ができなかったようです。プログラムは以下のようになっております。 https://drive.google.com/file/d/1i9Z9Sn0VGTsTHljJTBmZ5KjWvuLpps-D/view?usp=sharing また、最初の質問とかなり変わってしまったので、 asmさんをベストアンサーとしたうえで、 再度teratailで質問させていただきます。 そちらでも回答していただけたら、本当にありがたいです。 この度は、初心者にもわかりやすく教えていただきありがとうございました。
guest

0

loopback.c:19:12: error: 'SOCK_UDP' undeclared (first use in this function)

SOCK_UDP という定数が定義されてないというエラーです
ここらへんチェックしてみましょう

SOCK_CLOSED、Sn_MR_UDP というのも定義されてませんねー


インクルードしたヘッダファイル(w5200.h)で定義しておりますので、

残念ながら、コード上からは見つけることはできないということですんで、よくチェックしましょう

#そこんところが提示されてないのでこれしか言えませぬw

投稿2018/12/03 14:34

編集2018/12/03 14:40
y_waiwai

総合スコア87749

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

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

guest

0

回答者の方々にほとんどすべてを解決していただきましたが、
自分でもささやかながら見つけられた部分があったので共有させていただきます。

エラーの原因の一つとして、コメントアウト部分がうまくコメントアウトしていなかったものがあった。
エラーの出方が以下のようであったにもかかわらず、

w5200.h:1200:1: error: expected identifier or '(' before 'uint8_t'

エラーの原因は20行目のコメントアウトを消したら治るというものであった。
初心者の私は、エラーをちゃんと読めば、すぐに解けるものだと思っていたが、
今回のように、どんな関連性なのかわからないが、意外なエラーの出方をする場合があることを知った。

この度は、
皆様からのご指摘、ご回答に助けられました。
ありがとうございました。

初めて、teratailを利用しましたが、初めてでも
質問やコメントがしやすいだけでなく、丁寧な回答をしていただけるこの環境は
素晴らしいと思いました。

投稿2018/12/04 10:34

gucci12321

総合スコア49

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問