Go Down

Topic: error: expected primary-expression before token (Read 860 times) previous topic - next topic

weicher

Nov 24, 2016, 10:47 pm Last Edit: Nov 24, 2016, 10:57 pm by weicher
Hallo zusammen,

ich möchte Rechtecke auf den Display zeichen und rechteckige Bereiche auf dem Display löschen, also mit der Hintergrundfarbe überschreiben.

Dazu habe ich zwei Klassen geschrieben: TRect und TPaintRect.

Code: [Select]

//------------------|---------------------------------------------------------------
// TRect     Declaration of Rectangle
//----------------------------------------------------------------------------------
class TRect
{
public:
TRect (int16_t x, int16_t y, int16_t width, int16_t height);

int16_t mX;
int16_t mY;
int16_t mWidth;
int16_t mHeight;
};


//==================|=============================================
// TRect    Definition of Rectangle
//================================================================
//---- Constructor -----------------------------------------------------------------
TRect::TRect (int16_t x, int16_t y, int16_t width, int16_t height)
: mX         (x),
  mY         (y),
mWidth     (width),
mHeight (height)
{}

//------------------|---------------------------------------------------------------
// TPaintRect Declaration of TPaintRect
//----------------------------------------------------------------------------------
class TPaintRect
{
public:
TPaintRect (Adafruit_HX8357& display, uint16_t color,  uint16_t backColor);

void Erase (const TRect rect);

void Outline (const TRect rect);

private:
Adafruit_HX8357& mDisplay;
uint16_t mColor;
uint16_t mBackColor;
};

//==================|=================================================
// TPaintRect Definition of TPaintRect
//===================================================================
//---- Constructor -----------------------------------------------------------------
TPaintRect::TPaintRect (Adafruit_HX8357& display, uint16_t color, uint16_t backColor)
: mDisplay        (display),
mColor (color),
mBackColor (backColor)
{
}

//---- Erase -------------------------------------------------------------------------
void TPaintRect::Erase (const TRect rect)
{
mDisplay.fillRect (rect.mX, rect.mY, rect.mWidth, rect.mHeight, mBackColor);
}

//---- Outline -----------------------------------------------------------------------
void TPaintRect::Outline (const TRect rect)
{
mDisplay.drawRect (rect.mX, rect.mY, rect.mWidth, rect.mHeight, mColor);
}


Beim kompilieren erhalte ich die folgenden Fehlermeldungen:

Compiling debug version of 'DisplayTest' for 'Arduino/Genuino Mega w/ ATmega2560 (Mega 2560)'
 
DisplayTest.ino: 27:35: error: expected primary-expression before '(' token
   TPaintRect paintRect = TPaintRect (Adafruit_HX8357& Display, uint16_t color, uint16_t backColor)
 
DisplayTest.ino: 27:51: error: expected primary-expression before '&' token
   TPaintRect paintRect = TPaintRect (Adafruit_HX8357& Display, uint16_t color, uint16_t backColor)
 
DisplayTest.ino: 27:71: error: expected primary-expression before 'color
   TPaintRect paintRect = TPaintRect (Adafruit_HX8357& Display, uint16_t color, uint16_t backColor)
 
DisplayTest.ino: 27:87: error: expected primary-expression before 'backColor
   TPaintRect paintRect = TPaintRect (Adafruit_HX8357& Display, uint16_t color, uint16_t backColor)
Error compiling project sources

Was mache ich falsch?

mit Bestem Dank
Walter

Genosse

Der erkennt Adafruit_HX8357& nicht als Datentyp. Also irgendwas entsprechendes mit include einfügen.

Serenifly

Zwar kein Fehler, aber TRect solltest du auch als Referenz übergeben

weicher

Hallo zusammen,

ich programmiere mit dem AtmelStudio 7.0.1006 mit VisualMicro


die folgenden includes sind vorhanden
Code: [Select]

#include <SPI.h>
#include <gfxfont.h>
#include <Adafruit_GFX.h>
#include <Adafruit_HX8357.h>
#include <Utility.h>
#include <Definitions.h>


Utility ist ein Library modul und Definitions enthält nur typedefs.

Definitions.h:
==========

Code: [Select]


#ifndef _ARDUINO_DEFINITIONS_H
#define _ARDUINO_DEFINITIONS_H

//----------------------------------------------------------------------------------
// Includes
//----------------------------------------------------------------------------------
#include "Arduino.h"

//------------------|---------------------------------------------------------------
// Type Definitions
//----------------------------------------------------------------------------------
typedef byte Byte;
typedef int Int;
typedef unsigned int UInt;
typedef long Long;
typedef unsigned long ULong;
typedef char Char;
typedef unsigned char UChar;
typedef double Double;
typedef short Short;
typedef unsigned short UShort;

#endif // _ARDUINO_DEFINITIONS_H




Utility.h:
=======


Code: [Select]


#ifndef UTILITY_H
#define UTILITY_H

//----------------------------------------------------------------------------------
// Includes
//----------------------------------------------------------------------------------
#include <Definitions.h>
#include <Adafruit_HX8357.h>

typedef enum EState
{
eStable = 0,
eUnstable,
eTimeout
};

typedef enum ELogic
{
ePosLogic,
eNegLogic
};


//------------------|---------------------------------------------------------------
// TDebounce Declaration of Debounce
//----------------------------------------------------------------------------------
class TDebounce
{
public:
TDebounce (Int pin, ELogic logic);
/*! Constructs the Debouncer
*
* pin : pin to debounce
* debounce : timeout debouce
*/

~TDebounce ();

EState Debounce (ULong debounce);

private:
//bool mPosLogic;
Int mPin;
ELogic mLogic;
bool mBtnPressed;
bool mPinState;
bool mPinTime;
ULong mStartTime;
ULong mDebounce;

EState mState;
};

//------------------|---------------------------------------------------------------
// TCursor Declaration of input cursor
//----------------------------------------------------------------------------------
class TCursor
{
public:
TCursor (Adafruit_HX8357& tft, short x, short y,
short width, short height, short color, short backColor);

void Reset ();
void Move_Y (short y);
void Draw ();
short PosX ();
short PosY ();
void HideCursor ();

private:
Adafruit_HX8357& mtft;
short mX_Start;
short mY_Start;
short mX;
short mY;
short mWidth;
short mHeight;
short mColor;
short mBackColor;
};


//------------------|---------------------------------------------------------------
// TRect Declaration of Rectangle
//----------------------------------------------------------------------------------
class TRect
{
public:
TRect (int16_t x, int16_t y, int16_t width, int16_t height);

int16_t mX;
int16_t mY;
int16_t mWidth;
int16_t mHeight;
};


//------------------|---------------------------------------------------------------
// TPaintRect Declaration of TPaintRect
//----------------------------------------------------------------------------------
class TPaintRect
{
public:
TPaintRect (Adafruit_HX8357& display, uint16_t color,  uint16_t backColor);

void Erase (const TRect rect);
void Outline (const TRect rect);

private:
Adafruit_HX8357& mDisplay;
uint16_t mColor;
uint16_t mBackColor;
};


//---- Key -------------------------------------------------------------------------
bool Key (Int pin, ELogic logic, ULong debounce);


#endif // UTILITY_H

Utility.cpp:

#include "Utility.h"


//==================|=============================================
// Debounce Definition of DeBounce
//================================================================
TDebounce::TDebounce (Int pin, ELogic logic)
: mPin (pin),
mLogic (logic),
mBtnPressed (false),
mPinState (false),
mStartTime (0),
mState (eUnstable)
{}

TDebounce::~TDebounce()
{}


//----- Debounce -------------------------------------------------------------------
EState TDebounce::Debounce (ULong debounce)
{
mState = eUnstable;
if (mLogic == ePosLogic)
mBtnPressed = digitalRead (mPin);
else
mBtnPressed = !digitalRead (mPin);

if (mBtnPressed)
{
if (!mPinState)
{
mPinTime = millis ();
mPinState = true;
}

if (((millis() - mPinTime) > debounce) && mPinState)
{
mState = eStable;
mPinState = false;
}
else
mState = eTimeout;
}
return mState;
}


//==================|============================================
// Key Definition of KeyPressed
//===============================================================
bool Key (Int pin, ELogic logic, ULong debounce)
{
TDebounce bounce = TDebounce (pin, logic);
EState state = bounce.Debounce (debounce);
switch (state)
{
case eStable:
return true;
break;

case eUnstable:
break;

case eTimeout:
break;
}
return false;
}


//==================|============================================
// TCursor Definition of TCursor
//===============================================================
//---- Constructor -----------------------------------------------------------------
TCursor::TCursor (Adafruit_HX8357& tft, short x, short y,
  short width, short height, short color, short backColor)
: mX_Start (x),
mY_Start (y),
mX (x),
mY (y),
mWidth (width),
mHeight (height),
mColor (color),
mBackColor (backColor),
mtft (tft)
{

}


//---- Reset -----------------------------------------------------------------------
void TCursor::Reset()
{
mtft.drawRect (mX, mY, mWidth, mHeight, mBackColor);
mtft.drawRect (mX_Start, mY_Start, mWidth, mHeight, mBackColor);
mX = mX_Start;
mY = mY_Start;
}


//---- Move_Y ----------------------------------------------------------------------
void TCursor::Move_Y (short y)
{
mtft.drawRect (mX, mY, mWidth, mHeight, mBackColor);
mY += y;
mtft.drawRect (mX, mY, mWidth, mHeight, mColor);
}


//---- Draw ------------------------------------------------------------------------
void TCursor::Draw ()
{
mtft.drawRect (mX, mY, mWidth, mHeight, mColor);
}


//---- PosY ------------------------------------------------------------------------
short TCursor::PosY()
{
return mY;
}


//---- PosX ------------------------------------------------------------------------
short TCursor::PosX()
{
return mX;
}


//---- HideCursor ------------------------------------------------------------------
void TCursor::HideCursor()
{
mtft.drawRect (mX, mY, mWidth, mHeight, mBackColor);
}


//==================|=============================================
// TRect Definition of Rectangle
//================================================================
//---- Constructor -----------------------------------------------------------------
TRect::TRect (int16_t x, int16_t y, int16_t width, int16_t height)
: mX (x),
mY (y),
mWidth (width),
mHeight (height)
{}


//==================|=============================================
// TPaintRect Definition of TPaintRect
//================================================================
//---- Constructor -----------------------------------------------------------------
TPaintRect::TPaintRect (Adafruit_HX8357& display, uint16_t color, uint16_t backColor)
: mDisplay (display),
mColor (color),
mBackColor (backColor)
{
}


void TPaintRect::Erase (const TRect rect)
{
mDisplay.fillRect (rect.mX, rect.mY, rect.mWidth, rect.mHeight, mBackColor);
}


void TPaintRect::Outline (const TRect rect)
{
mDisplay.drawRect (rect.mX, rect.mY, rect.mWidth, rect.mHeight, mColor);
}





Code: [Select]
const TRect& rect

habe ich schon ausprobiert, hat aber nichts geändert.

Gruss
Walter



Serenifly

#4
Nov 25, 2016, 01:08 am Last Edit: Nov 25, 2016, 01:14 am by Serenifly
habe ich schon ausprobiert, hat aber nichts geändert.
Hat auch mit dem Fehler nichts zu tun. Ist aber trotzdem viel besser. Objekte sollte man einfach als Referenzen übergeben damit sie nicht kopiert werden


Die Adafruit_HX8357.h sollte sowohl in der Klasse als auch im Arduino Sketch inkludiert werden. Die Arduino IDE hat da ein paar Eigenheiten die erfordern dass man dass unter bestimmten Umständen doppelt macht. Das ist auch der Grund weshalb die die SPI.h inkludieren musst auch wenn du die nicht direkt verwendest.
Wenn ich das richtig sehe ist dass der Fall, aber es ist gut möglich, dass die IDE immer noch Murks macht. Der Arduino Build Prozess ist an ein paar Stellen einfach anders als Standard C/C++.


Lege vielleicht mal eine Utility.cpp an und schreibe in den Header nur dass was da auch wirklich rein gehört. Als keine Definitionen von Methoden

weicher

Hallo Serenifly,


Quote
Objekte sollte man einfach als Referenzen übergeben damit sie nicht kopiert werden
Das ist mir schon klar, aber wenn ich eine Fehlermeldung erhalte dann versuche ich alles um diese wegzukriegen.

Quote
dass die IDE immer noch Murks macht.
Wie gesagt, ich benutze AtmelStudio 7.0.1006 mit VisualMicro.


Quote
ege vielleicht mal eine Utility.cpp an und schreibe in den Header nur dass was da auch wirklich rein gehört. Als keine Definitionen von Methoden
Ich habe eine Utility.h und eine Utility.cpp. In der Utility.h sind nur Deklarationen und in Utility.cpp sind die Definitionen.


Das komische ist nur, dass eine andere Klasse in Utility welche auch Adafruit_HX8357 benutzt problemlos kompiliert:


Code: [Select]

//------------------|---------------------------------------------------------------
// TCursor Declaration of input cursor
//----------------------------------------------------------------------------------
class TCursor
{
public:
TCursor (Adafruit_HX8357& tft, short x, short y,
short width, short height, short color, short backColor);

void Reset ();
void Move_Y (short y);
void Draw ();
short PosX ();
short PosY ();
void HideCursor ();

private:
Adafruit_HX8357&         mtft;
short mX_Start;
short mY_Start;
short mX;
short mY;
short mWidth;
short mHeight;
short mColor;
short mBackColor;
};


//==================|========================================================
// TCursor Definition of TCursor
//===========================================================================
//---- Constructor -----------------------------------------------------------------
TCursor::TCursor (Adafruit_HX8357& tft, short x, short y,
  short width, short height, short color, short backColor)
: mX_Start         (x),
mY_Start         (y),
mX (x),
mY (y),
mWidth (width),
mHeight (height),
mColor (color),
mBackColor         (backColor),
mtft         (tft)
{

}


//---- Reset -----------------------------------------------------------------------
void TCursor::Reset()
{
mtft.drawRect (mX, mY, mWidth, mHeight, mBackColor);
mtft.drawRect (mX_Start, mY_Start, mWidth, mHeight, mBackColor);
mX = mX_Start;
mY = mY_Start;
}


//---- Move_Y ----------------------------------------------------------------------
void TCursor::Move_Y (short y)
{
mtft.drawRect (mX, mY, mWidth, mHeight, mBackColor);
mY += y;
mtft.drawRect (mX, mY, mWidth, mHeight, mColor);
}


//---- Draw ------------------------------------------------------------------------
void TCursor::Draw ()
{
mtft.drawRect (mX, mY, mWidth, mHeight, mColor);
}


//---- PosY ------------------------------------------------------------------------
short TCursor::PosY()
{
return mY;
}


//---- PosX ------------------------------------------------------------------------
short TCursor::PosX()
{
return mX;
}


//---- HideCursor ------------------------------------------------------------------
void TCursor::HideCursor()
{
mtft.drawRect (mX, mY, mWidth, mHeight, mBackColor);
}




Gruss
Walter

Serenifly

Quote
Wie gesagt, ich benutze AtmelStudio 7.0.1006 mit VisualMicro.
Und damit immer noch den Build Prozess den die normale Arduino IDE vorgibt. Du bist nicht komplett unabhängig.

weicher

Hallo Serenifly,

Es ist wie immer... Der intelligentere Teil steht auf dem Tisch vor dem Programmierer. :)

Die Farbkonstanten sind 16 Bit, also unsigned short und ich habe als Typ Byte genommen >:(

Mit dem unsigned short (UShort) funktioniert alles wunderbar.

Gruss
Wale

P.S. Die Fehlermeldung könnte aber schon etwas aussagekräftiger sein.

Go Up