error: variable or field '.. declared void

Hi Leute,

ich verzweifle ein wenig an folgendem Code :

#include <Arduino.h>

typedef struct 
{

  byte           actRPM;
  byte           actPWM;
  long           actSTEP;
  unsigned int   lastWND;
  unsigned long  nextCNT;
  unsigned long  actWND;
  float          uSec;
  float          wndsize;
  long           tmpwndcnt;
  long           tmpstepcnt;
  unsigned long  starttime;
  byte           stepdir;
  bool           livemode;
} pdata;

void processStopping(pdata* rd)
{
 

};

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
 pdata workdata;

  processStopping(&workdata);
}

Compilieren ergibt :

Arduino: 1.6.5 (Windows 7), Platine: "Arduino Uno"

D:\app\arduino-1.6.5-r2\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10605 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -ID:\app\arduino-1.6.5-r2\hardware\arduino\avr\cores\arduino -ID:\app\arduino-1.6.5-r2\hardware\arduino\avr\variants\standard C:\Users\44857\AppData\Local\Temp\build3124045810087997209.tmp\sketch_oct29a.cpp -o C:\Users\44857\AppData\Local\Temp\build3124045810087997209.tmp\sketch_oct29a.cpp.o 

sketch_oct29a.ino:4:22: error: variable or field 'processStopping' declared void
sketch_oct29a.ino:4:22: error: 'pdata' was not declared in this scope
sketch_oct29a.ino:4:29: error: 'rd' was not declared in this scope
variable or field 'processStopping' declared void

Vielleicht sehe ich den Wald vor lauter Bäumen nicht, was will der Compiler von mir ?

Grüßle

Harry

Gar nix machst du falsch!
Ok, ein Semikolon zuviel, ist aber nicht das Problem.
Und dein #include <Arduino.h> ist auch überflüssig.
Aber ebenso nicht das Problem.

Du bist auf folgende Sachlage gestoßen:
Die Arduino IDE erzeugt automatisch Funktionsprototypen.
Und da scheppert es öfter …

Im Anhang ein Vorschlag, wie man sich das Problem vom Halse schaffen kann.

PS:
Arduino baut folgendes aus deinem Code:

#line 1 "sketch_oct29a.ino"
#include <Arduino.h>

#include "Arduino.h"
void processStopping(pdata* rd);
void setup();
void loop();
#line 3
typedef struct 
{

  byte           actRPM;
  byte           actPWM;
  long           actSTEP;
  unsigned int   lastWND;
  unsigned long  nextCNT;
  unsigned long  actWND;
  float          uSec;
  float          wndsize;
  long           tmpwndcnt;
  long           tmpstepcnt;
  unsigned long  starttime;
  byte           stepdir;
  bool           livemode;
} pdata;

void processStopping(pdata* rd)
{
 

}

void setup() {
                                           

}

void loop() {
                                                
 pdata workdata;

  processStopping(&workdata);
}

Man sieht, dass der Funktionsprototype vor der Struktur deklariert wird.
Das verursacht den Fehler

tuts.zip (774 Bytes)

HarryR: Vielleicht sehe ich den Wald vor lauter Bäumen nicht, was will der Compiler von mir ?

Der Compiler möchte, dass Du zwischen - der struct-Definition und - der Funktion, die einen struct-Pointer als Parameter verarbeiten soll einen Funktions-Prototylen manuell selbst deklarierst. Etwa:

typedef struct 
{
...
} pdata;

void processStopping(pdata* rd);  // Funktions-Prototypdeklaration hier!
void processStopping(pdata* rd)
{


};

Die Arduino-IDE hat die Eigenheit, dass der sichtbare "Sketch" Code nicht identisch ist mit dem tatsächlich compilierten Code, und eine der unsichtbar im Hintergrund durchgeführten Änderungen am Code ist, dass die IDE für alle von Dir selbstgeschriebenen Funktionen einen Prototypen anlegt, und zwar GANZ AM ANFANG der Sketch-Datei. D.h. oberhalb Deiner struct-Deklaration. Und wenn der Funktions-Prototyp einen struct-Parameter enthält, der erst darunter deklariert wird, schlägt die Compilierung fehl.

Wenn Du aber MANUELL einen Funktions-Prototypen dort deklarierst, wo es besser passt, nämlich zwischen der struct-Deklaration und dem Code der Funktion, dann legt die IDE keinen automatischen Funktions-Prototypen für diese Funktion mehr an und es passt wieder.

Ansonsten müßtest Du Deine struct-Deklarationen immer in eine eigene .h Headerdatei auslagern und die Headerdatei ganz oben im Sketch inkludieren, das wäre ebenfalls möglich.

Vielen Dank.

Ich dachte schon ich wäre verblödet :o

Oki, das sind Arduino-Details die man wohl nur dann kennenlernt, wenn sie stören - also so ein Fall wie meiner.

Ich werde die Lösung mit den Funktionsprototypen nehmen, denn ein weiterer Header-File für das struct ist mir einer zu viel :confused:

Viele Grüße

Harry

PS.: Ich ändere mal das Subject, damit andere Foristen davon profitieren können