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

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

ただいまの
回答率

88.64%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,637

gucci12321

score 49

 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

#include <stdio.h>
#include "loopback.h"
#include "socket.h"
#include "w5200.h"
#include "wizchip_conf.h"

#if LOOPBACK_MODE == LOOPBACK_MAIN_NOBLCOK


int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port)
{
   int32_t  ret;
   uint16_t size, sentsize;
   uint8_t  destip[4];
   uint16_t destport;

   switch(getSn_SR(sn))
   {
      case SOCK_UDP :
         if((size = getSn_RX_RSR(sn)) > 0)
         {
            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
            ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
            if(ret <= 0)
            {
#ifdef _LOOPBACK_DEBUG_
               printf("%d: recvfrom error. %ld\r\n",sn,ret);
#endif
               return ret;
            }
            size = (uint16_t) ret;
            sentsize = 0;
            while(sentsize != size)
            {
               ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
               if(ret < 0)
               {
#ifdef _LOOPBACK_DEBUG_
                  printf("%d: sendto error. %ld\r\n",sn,ret);
#endif
                  return ret;
               }
               sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
            }
         }
         break;
      case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
         //printf("%d:UDP loopback start\r\n",sn);
#endif
         if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn)
            return ret;
#ifdef _LOOPBACK_DEBUG_
         printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port);
#endif
         break;
      default :
         break;
   }
   return 1;
}

#endif

 試したこと

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

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

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

♦IDE
simpleIDE

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2018/12/03 22:28

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

    キャンセル

  • gucci12321

    2018/12/03 23:28

    ご指摘ありがとうございます!!ソースが長いため、共有フォルダのリンクを張らせていただきました!ここにも添付しておきます。【https://drive.google.com/file/d/15lpRaOo4jUhdvDjfJt5lxRJy_IEo3pGc/view?usp=sharing

    キャンセル

回答 3

checkベストアンサー

+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"が行われる

追記

原因が判明しました。

--- wizchip_conf.h      2018-12-04 07:33:56.965148400 +0900
+++ wizchip_conf_mod.h  2018-12-03 17:55:26.000000000 +0900
@@ -53,6 +53,7 @@

 #ifndef  _WIZCHIP_CONF_H_
 #define  _WIZCHIP_CONF_H_
+#endif

 #ifdef __cplusplus
 extern "C" {
@@ -98,7 +99,7 @@
  */
 //     #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_DIR_
 //     #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_INDIR_
-          #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_
+/*        #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_

 //A20150601 : Define the unit of IO DATA.
    typedef   uint8_t   iodata_t;
@@ -113,13 +114,15 @@
 */
 //     #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_INDIR_
        //#define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_5500_
-       #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_
+       //#define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_

 //A20150601 : Define the unit of IO DATA.
    typedef   uint8_t   iodata_t;
 //A20150401 : Indclude W5100.h file
-       #include "W5100S/w5100s.h"
-#elif (_WIZCHIP_ == W5200)
+       //#include "W5100S/w5100s.h"
+
+
+#if (_WIZCHIP_ == W5200)
    #define _WIZCHIP_ID_                "W5200\0"
 /**
  * @brief Define interface mode.
@@ -132,8 +135,11 @@
 //A20150601 : Define the unit of IO DATA.
    typedef   uint8_t   iodata_t;
    #include "W5200/w5200.h"
-#elif (_WIZCHIP_ == W5500)
-  #define _WIZCHIP_ID_                 "W5500\0"
+
+
+
+/*#elif (_WIZCHIP_ == W5500)
+  /*#define _WIZCHIP_ID_                 "W5500\0"

 /**
  * @brief Define interface mode. \n
@@ -148,7 +154,7 @@
  *        ex> <code> #define \_WIZCHIP_IO_MODE_ \_WIZCHIP_IO_MODE_SPI_VDM_ </code>
  *
  */
-#ifndef _WIZCHIP_IO_MODE_
+/*#ifndef _WIZCHIP_IO_MODE_
    //#define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_FDM_
    #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_SPI_VDM_
 #endif
@@ -161,7 +167,7 @@
  * @brief Define interface mode.
  * @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_
  */
-#ifndef _WIZCHIP_IO_MODE_
+/*#ifndef _WIZCHIP_IO_MODE_
 //   #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_DIR_
  #define _WIZCHIP_IO_MODE_           _WIZCHIP_IO_MODE_BUS_INDIR_
 #endif

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/04 13: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);
    、、、

    キャンセル

  • 2018/12/04 18:54 編集

    うーん、わかりませんね
    その前で問題が発生しているようにも見えます
    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点の書き換えでビルドに成功しました。

    キャンセル

  • 2018/12/04 19:21

    一番上にあるコメント部分が、うまくコメントアウトしていなかっただけでした。
    エラーを取ることができました!!!
    本当にありがとうございます!!!

    そして、エラーがなくなったのですが、main関数がないとのことでうまくUDP通信ができなかったようです。プログラムは以下のようになっております。
    https://drive.google.com/file/d/1i9Z9Sn0VGTsTHljJTBmZ5KjWvuLpps-D/view?usp=sharing

    また、最初の質問とかなり変わってしまったので、
    asmさんをベストアンサーとしたうえで、
    再度teratailで質問させていただきます。

    そちらでも回答していただけたら、本当にありがたいです。
    この度は、初心者にもわかりやすく教えていただきありがとうございました。

    キャンセル

+1

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 23:47

    回答ありがとうございます。
    ヘッダファイルを張りたいのですが、字数制限のため
    https://drive.google.com/file/d/15lpRaOo4jUhdvDjfJt5lxRJy_IEo3pGc/view?usp=sharing
    このリンクに張らせていただくことにいたしましたm(__)m

    もしよければご参照ください。

    キャンセル

0

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る