質問:
関数の引数として列挙型を使用できません
Loreno
2016-08-07 21:55:09 UTC
view on stackexchange narkive permalink

列挙型を宣言し、Dirと呼びました。そのタイプの値を関数Move()で使用したかったのです。コードは次のとおりです。

  enumDir {forward = 1、backward = 2、left = 3、right = 4}; void Move(Dir direction、int distance){direction = forward;} void setup(){//セットアップコードをここに配置して1回実行:} void loop(){//メインコードをここに配置して繰り返し実行:}  

残念ながら、次のエラー:

  V2.ino:23:13:エラー:変数またはフィールド「移動」がvoidV2.ino:23:13と宣言されました:エラー:「Dir」がこのscopeV2で宣言されていません。 ino:23:29:エラー:「int」の前にプライマリ式が必要です 

何が問題になっていますか?

[最小限、完全、検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください
(空の)setup()関数とloop()関数を指定すると、コンパイルはOKになりました。 23行(引用されたエラーの行番号)未満であるため、抜粋が表示されていると思います。問題を実証し、それを完全に示すために必要な最小限にコードを減らすことができますか?
@JRobert私もあなたと同じようにやりました。新しいスケッチを作成し、投稿からコードをコピーしました(setup()またはloop()には何も入れませんでした)。同じエラーが発生しました。なぜ私はそれらを手に入れるのですか?
2番目のJRobert: `void setup(){} void loop(){}`でOKをコンパイルしましたが、関数パラメーターが使用されていないことに関するいくつかの警告を除いて。
Arduino IDE1.7.10を使用しています。 2台目のPCでこのコードを確認します
そのため、ラップトップ(Arduino IDE 1.7.7)で同じコードをコンパイルしようとしましたが、結果は同じです。私は文字通り持っています:空のvoid setup()、空のvoid loop()、そして上記の私の投稿からのコード(私はsetup()関数の上に置きました)。実際、投稿を更新して、.inoファイルにあるすべてのものを表示しました。
あなたはIDEのプリプロセッサが厚くて間違ったことをしていることに苦しんでいます。
それで私はそれについて何ができますか?
私はそれに取り組んでいます... 1.7.10がダウンロードされるのを待っています。
わかりました、ありがとう。同じことが1.7.7でも起こります
四 答え:
Edgar Bonet
2016-08-07 23:31:42 UTC
view on stackexchange narkive permalink

私は通常ArduinoIDEの代わりにMakefileを使用しているため、問題は発生しませんでした。私は今IDEバージョン1.0.5で試しましたが、あなたと同じ問題がありました。修正は、関​​数を定義する前に明示的に関数を宣言することです。

  void Move(Dir direction、int distance); void Move(Dir direction、int distance) {方向=前方;} コード> 
Majenko
2016-08-07 23:31:52 UTC
view on stackexchange narkive permalink

Arduino.orgのArduino1.7.xシリーズは、単純な型よりも複雑なことをしようとするとひどく壊れてしまう古いビルドシステムを使用しています。

関数の上部にプロトタイプを追加します。プログラムの順序を正しくする必要はありませんが、完全に間違った場所に配置されます。結果は次のようなC ++ファイルになります。

  #include <Arduino.h>void Move(Dir direction、int distance); void setup(); void loop(); enum Dir {forward = 1、backward = 2、left = 3、right = 4}; void Move(Dir direction、int distance){direction = forward;} void setup(){//セットアップコードをここに配置して、1回実行します:} void loop (){//メインコードをここに配置して繰り返し実行します:}  

ご覧のとおり、 Dir を含むプロトタイプが Dir なので、惨めに失敗します。

定義の後にプロトタイプを配置するように強制するために実行できるハックがいくつかありますが、それらが手元にないものを思い出せません。 。

簡単な答えは、Arduino 1.7.10を捨てて、代わりにArduino.ccからArduino1.6.10に切り替えることです。これは、プロトタイプを適切な場所に配置するなど、はるかに優れたArduinoBuilderシステムを使用しています。

番号1.7.10は1.6.10よりも新しいバージョンではありませんが、古いバージョンの番号が付け直されています。 。それはすべて、Arduinoの2つの半分の間の分裂の一部です。

さらに良いのは、ひどいArduino IDEを完全に捨てて、存在する多くのはるかに優れたIDEの1つを使用することです。

どうもありがとうございました。他にどのIDEをお勧めしますか?正直なところ、私はArduino IDEに耐えられません。コードは非常に読みにくく、個人的にはVisual StudioCodeでプログラムを作成しています。そこからArduinoにアップロードできたらいいのにと思います。
ええと、[UECIDE](http://uecide.org)をお勧めしなければなりませんが、それを書いたので偏見があります;)
確認してみます
Arduinoはまったくお勧めしません。代わりに、C / C ++を直接使用してください。そこにはC / C ++用のIDEがたくさんあります。実際のプログラミングポッドを入手した場合は、シングルステップでハードウェアレジスタを検査することもできます。
aastronaut
2016-08-07 23:46:05 UTC
view on stackexchange narkive permalink

Majenkoが指摘しているように、これはプリプロセッサの解析に問題があるようです。

2つのオプションがあります。

  • Edgar Bonetsソリューションを使用し、関数を定義する前に宣言します
  • 新しいタブで列挙型用の個別のヘッダーファイルを作成し、#include "[myEnumsHeaderFilename] .h"
  •   #include "myEnums.h"を使用してインポートしますvoid Move(Dir direction、int distance){direction = forward; } void setup(){} void loop(){}  
    または、別のIDEを使用してください。ご入力いただきありがとうございます
    Flanker
    2016-08-07 23:32:00 UTC
    view on stackexchange narkive permalink

    新しい列挙型を定義する必要があります:

      typedef enum {forward = 1、backward = 2、left = 3、right = 4} Dir; void Move(Dir direction、int distance){direction = forward;}  

    typedef がないと、Dirは単なる静的列挙型変数であり、他の変数を定義するために使用することはできません。

    >
    C ++は、手動で作成しなくても、デフォルトですべての列挙型と構造体のtypedefを作成します。


    このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 3.0ライセンスに感謝します。
    Loading...