PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Error: expected identifier before "." token



Artemis_Simetra
15.01.2014, 13:53
Unsere selbstgeschriebene Lib (verwendet auch fertige Libs aus dem Net), produziert beim compilen immer den Fehler:

In file included from katze.cpp:1:
katze.h:15: error: expected identifier before '.' token
katze.h:15: error: expected unqualified-id before '.' token
katze.cpp:4: error: expected unqualified-id before '.' token
katze.cpp:26: error: expected unqualified-id before '.' token
katze.cpp:40: error: expected unqualified-id before '.' token


Hier der Code:


#ifndef katze_h
#define katze_h

#include "Arduino.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Motor.h>
#include <SonarSRF08.h>

#define CompI2CADDR 0x30
#define CompTakeMeasure 0x01
#define CompSet 0x02
#define CompReset 0x04

class katze
{
public:
katze(int ml1, int ml2, int mr1, int mr2, int md1, int md2);
void us_tm();
int us1_r();
int us2_r();
double comp_r();
void comp_tm();
void comp_reset();
void comp_calib();
void ml_speed(int v, int d);
void mr_speed(int v, int d);
void md_speed(int v, int d);

private:
int mlp1, mlp2, mrp1, mrp2, mdp1, mdp2;
int x_min = 3000, x_max = -3000, y_min = 3000, y_max = -3000;
int i;
byte MsbX,LsbX,MsbY,LsbY;
int x,y;
};

#endif


HAt jemand von euch eine Idee, woran das liegen könnte.
vg Malte

Peter(TOO)
15.01.2014, 13:58
Hallo malte,

Wie wärs mit einem Datentyp vor
katze(.....

?

MfG Peter(TOO)

Sisor
15.01.2014, 15:18
Hallo malte,

Wie wärs mit einem Datentyp vor
katze(.....

?

MfG Peter(TOO)
Nein, es wird eine Klasse definiert, das ist schon richtig so.

In dem angehängten File hast du #ifndef katze.h stehen.
Es muss aber ein Makro sein. Das Makro endet aber für den Kompiler beim Punkt.

Am besten in
#ifndef KATZE__H
#define KATZE__H
umschreiben.
Großbuchstaben und 2*__ sind gebräuchlich in dieser Situation.
Das oben in dem SouceCode stehende katze_h sollte allerdings auch funktionieren.

Und du solltest statt
int x_min = 3000, x_max = -3000, y_min = 3000, y_max = -3000;
static const int x_min = 3000, x_max = -3000, y_min = 3000, y_max = -3000;
schreiben, weil eine direkte Werteinitialisierung in Klassen normalerweise verboten ist.
Ausnahme sind statitische ganzzahlige Konstanten.

Wsk8
15.01.2014, 16:08
Das sollte kompilieren:


#ifndef KATZE_H_
#define KATZE_H_


#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Motor.h>
#include <SonarSRF08.h>


#define CompI2CADDR 0x30
#define CompTakeMeasure 0x01
#define CompSet 0x02
#define CompReset 0x04




class katze {
public:
katze(int ml1, int ml2, int mr1, int mr2, int md1, int md2);
void us_tm();
int us1_r();
int us2_r();
double comp_r();
void comp_tm();
void comp_reset();
void comp_calib();
void ml_speed(int v, int d);
void mr_speed(int v, int d);
void md_speed(int v, int d);

private:
int mlp1, mlp2, mrp1, mrp2, mdp1, mdp2;
int x_min, x_max, y_min, y_max;
int i;
byte MsbX,LsbX,MsbY,LsbY;
int x,y;

};


#endif /*KATZE_H_*/


mfg

Peter(TOO)
15.01.2014, 16:32
Hallo,

Nein, es wird eine Klasse definiert, das ist schon richtig so.

Nicht der Klassenname, die andere Katze :-)


class katze
{
public:
katze(int ml1, int ml2, int mr1, int mr2, int md1, int md2);
void us_tm();
....

Unter public ist eine Memberfunktion katze und die hat keinen Typ angegeben!

Da aber die Implementierung fehlt, habe ich keine Ahnung was diese Funktion für einen Rückgabewert liefert.

MfG Peter(TOO)

Sisor
15.01.2014, 16:50
Stichwort: Konstruktor!

Das bedeutet, dass man ein katze-Objekt nur erstellen kann, wenn man ml1, ml2, mr1, mr2, md1, md2 angibt.
Da diese wahrscheinlich die Pinbelegung der Motoren darstellen, macht das auch Sinn.
Im Hauptprogramm wird das dann z.B. so genutzt:

katze miau(2,3,4,5,6,7);

Artemis_Simetra
15.01.2014, 17:11
Genau: katze(...); soll der Konstruktor der Klasse katze sein. Der Aufbau wird auch bei http://arduino.cc/en/Hacking/LibraryTutorial
so gehandhabt.

Auch in der Version von Wsk8 treten noch Fehler auf:

In file included from katze.cpp:1:
katze.h:15: error: expected identifier before '.' token
katze.h:15: error: expected unqualified-id before '.' token
katze.cpp:4: error: expected unqualified-id before '.' token
katze.cpp:26: error: expected unqualified-id before '.' token
katze.cpp:40: error: expected unqualified-id before '.' token


Vilen Dank für die Hilfe,
Malte

Wsk8
15.01.2014, 17:23
Katze.h sollte zu 99.9% stimmen.

Da du am Anfang noch so viele Header einbindest:

#include <Arduino.h>#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Motor.h>
#include <SonarSRF08.h>
gehe ich davon aus, dass der Fehler hier irgendwo liegen muss.

Würde ich entfernen und wenn dann in der cpp einfügen. Sieht nicht so aus als ob man die im Header benötigt.

mfg

Sisor
15.01.2014, 17:24
Schau mal nach, ob katze.cpp noch ne alte falsche Version einbinded (included).
Denn eigentlich sollte das so funktionieren.

Artemis_Simetra
15.01.2014, 17:54
Der alte Fehler hat sich so beheben lasse. Vielen Dank!

Allerdings binded er die übrigen Libs nicht ein, bzw. erstellt die anderen Objekte nicht.
Auch die unter private eingeführten Vars gehen nicht:




C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:14: error: 'LiquidCrystal_I2C' does not name a type
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:15: error: 'Motor' does not name a type
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:16: error: 'Motor' does not name a type
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:17: error: 'Motor' does not name a type
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp: In constructor 'katze::katze(int, int, int, int, int, int)':
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:29: error: 'Wire' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:31: error: 'display' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp: In function 'void comp_reset()':
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:38: error: 'Wire' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:46: error: 'display' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp: In function 'void comp_calib()':
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:52: error: 'display' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:54: error: 'i' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:56: error: 'Wire' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:66: error: 'MsbX' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:67: error: 'LsbX' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:68: error: 'MsbY' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:69: error: 'LsbY' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:71: error: 'x' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:72: error: 'y' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:73: error: 'x_min' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:77: error: 'x_max' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:81: error: 'y_min' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:85: error: 'y_max' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:89: error: 'ml' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:90: error: 'mr' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp: In function 'void comp_tm()':
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:103: error: 'Wire' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp: In function 'double comp_r()':
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:112: error: 'Wire' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:117: error: 'MsbX' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:118: error: 'LsbX' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:119: error: 'MsbY' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:120: error: 'LsbY' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:122: error: 'x' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:123: error: 'y' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:124: error: 'x_min' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:124: error: 'x_max' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:125: error: 'y_min' was not declared in this scope
C:\Dokumente und Einstellungen\Malte\Eigene Dateien\Arduino\libraries\katze2\katze2.cpp:125: error: 'y_max' was not declared in this scope


#ifndef katze2_h
#define katze2_h


class katze
{
public:
katze(int ml1, int ml2, int mr1, int mr2, int md1, int md2);
void us_tm();
int us1_r();
int us2_r();
double comp_r();
void comp_tm();
void comp_reset();
void comp_calib();
void ml_speed(int v, int d);
void mr_speed(int v, int d);
void md_speed(int v, int d);

private:
int mlp1, mlp2, mrp1, mrp2, mdp1, mdp2;
int x_min, x_max, y_min, y_max;
int i;
int MsbX,LsbX,MsbY,LsbY;
int x,y;
};

#endif


#include <katze2.h>

#include "Arduino.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Motor.h>
#include <SonarSRF08.h>

#define CompI2CADDR 0x30
#define CompTakeMeasure 0x01
#define CompSet 0x02
#define CompReset 0x04

LiquidCrystal_I2C display(0x20, 16, 2);
Motor ml(mlp1,mlp2);
Motor mr(mrp1,mrp2);
Motor md(mdp1,mdp2);

katze::katze(int ml1, int ml2, int mr1, int mr2, int md1, int md2)
{
mlp1=ml1; mlp2=ml2; mrp1=mr1; mrp2=mr2; mdp1=md1; mdp2=md2;
pinMode(mlp1,OUTPUT); digitalWrite(mlp1,LOW);
pinMode(mlp2,OUTPUT); digitalWrite(mlp2,LOW);
pinMode(mrp1,OUTPUT); digitalWrite(mrp1,LOW);
pinMode(mrp2,OUTPUT); digitalWrite(mrp2,LOW);
pinMode(mdp1,OUTPUT); digitalWrite(mdp1,LOW);
pinMode(mdp2,OUTPUT); digitalWrite(mdp2,LOW);

Wire.begin();

display.init();
display.backlight();
display.print("Hello, world!");
}

void comp_reset()
{
Wire.beginTransmission(CompI2CADDR);
Wire.write(0x00);
Wire.write(CompSet);
delay(10);
Wire.write(0x00);
Wire.write(CompReset);
delay(10);
Wire.endTransmission();
display.setCursor(0,0);
display.print("comp reset done ");
}

void comp_calib()
{
display.setCursor(0,0);
display.print("Start Calib ");
for(i=0;i<255;i++)
{
Wire.beginTransmission(CompI2CADDR); // Pollin HDMM01
Wire.write(0x00);
Wire.write(CompTakeMeasure);
Wire.endTransmission();
delay(20);
Wire.beginTransmission(CompI2CADDR);
Wire.write(0x01);
Wire.requestFrom(CompI2CADDR, 4);

while(Wire.available()<4);
MsbX =Wire.read(); // obere 4 Bit X
LsbX =Wire.read(); // untere 8 Bit X
MsbY =Wire.read(); // obere 4 Bit Y
LsbY =Wire.read(); // untere 8 Bit Y
Wire.endTransmission(); // stop transmitting
x=((MsbX&0x0f)*256)+(LsbX);
y=((MsbY&0x0f)*256)+(LsbY);
if(x < x_min)
{
x_min = x;
}
if(x > x_max)
{
x_max = x;
}
if(y < y_min)
{
y_min = y;
}
if(y > y_max)
{
y_max = y;
}
ml.set_speed(1,255);
mr.set_speed(-1,255);
delay(100);
ml.set_speed(0,0);
mr.set_speed(0,0);

}
display.setCursor(0,0);
display.print("End Calib ");

}

void comp_tm()
{
Wire.beginTransmission(CompI2CADDR); // Pollin HDMM01
Wire.write(0x00);
Wire.write(CompTakeMeasure);
Wire.endTransmission();
delay(20);
}

double comp_r()
{
Wire.beginTransmission(CompI2CADDR);
Wire.write(CompTakeMeasure);
Wire.requestFrom(CompI2CADDR, 4);

while(Wire.available()<4);
MsbX =Wire.read(); // obere 4 Bit X
LsbX =Wire.read(); // untere 8 Bit X
MsbY =Wire.read(); // obere 4 Bit Y
LsbY =Wire.read(); // untere 8 Bit Y
Wire.endTransmission(); // stop transmitting
x=((MsbX&0x0f)*256)+(LsbX);
y=((MsbY&0x0f)*256)+(LsbY);
x = map(x, x_min, x_max, -180, 180);
y = map(y, y_min, y_max, -180, 180);
double mygrad = atan2(x, y)*180/3.1415927410;
if (mygrad < 0) mygrad = mygrad +360;

return(mygrad);
}

Sisor
15.01.2014, 18:09
Vorher war die Reihenfolge richtig.
Jetzt versucht die zuerst includierte katze2.h auf Objekte zuzugreifen, die (noch) nicht definiert sind.
Vielleicht mal die #include Befehle einzeln aus .cpp ausschneiden, in .h einfügen und kompilieren lassen?
Dann kannst du beobachten, wie sich die Fehlermeldungen ändern. Vielleicht bringt dich das weiter...

Achja, vor die einzelnen Methoden musst du katze:: einfügen, sonst definierst du außerhalb der Klasse. Dann sind die katze-Variablen für die Funktionen natürlich nicht sichtbar.

Und für Bonus-Punkte in der B-Note: Klassennamen werden der Cpp-Konvention nach groß geschrieben.

Wsk8
15.01.2014, 18:10
Ich weis ja nicht, wo die ganzen Header liegen, aber sollten sie im gleichen Projektverzeichnis sein (wie katze.h), dann werden sie mit "blabla.h" eingebunden, und nicht mit <blabla.h>


#include <katze2.h>

#include "Arduino.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Motor.h>
#include <SonarSRF08.h>


mfg

Artemis_Simetra
18.01.2014, 14:52
Vielen Dank für eure Hilfe erstmal,
aber da sich das Problem mit den Nicht eigebundenen Libs/den nicht erstellten Objekten bisher nicht hat beheben lassen (egal ob die header in .h oder .cpp) liegen,
binde ich sie jetzt eben direkt und einzeln ein und verzichte auf eine eigene Klasse, die alles bündeln sollte.
Die header sind mit <bsp.h> übriegens richtig eingebunden, da sie im Libaries Ordner der Arduino ide liegen.

vg Malte

Sisor
18.01.2014, 21:15
Ja, irgendwie geht das mit dem Einbinden von Libraries aus einer header-Datei heraus nicht.
Was es aber sollte, denn in VisualStudio oder Dev-Cpp funktioniert das tadelos.
SCHADE. Auch um die Zeit, die man braucht, um das rauszufinden.
Falls jemand weiss, warum der Arduino-Linker das nicht gebacken kriegt... würde mich interessieren.