error: expected identifier before string constant
-
I hope I can explain this problem. I can make an instance of a class in my main()
CLASS\_I2CIO i2c\_ads1115(DEVICE\_I2C,ADDRESS\_ADS);
no problema. But if I add same code as class variable - I need an access to the class form main() - I get the following error.
class C_VNA {
public:
C_VNA();
virtual ~C_VNA();C\_Utility utility; CLASS\_LCM1602 i2c; // default constructor x,x,x,x); CIOCTLGPIO gpio; // GPIo C\_IOCTL\_SPI spi; // temporary not coded C\_DDS\_60 dds; // frequency C\_AD8302\_Detector det; C\_ADS1115 ads; CLASS\_I2CIO i2c\_ioctl; // genric i2c using ioctl
error here
CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
error here
};Partial compiler output
Compiler executable checksum: 606522cdd68a1ba2fd9e2930e9d38d0d
In file included from ../src/MODULES/M_VNA/CVNA.cpp:8:0:
../src/MODULES/M_VNA/CVNA.h:28:20: error: expected identifier before string constant
#define DEVICE_I2C "dev/i2c-1"
^
../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
src/MODULES/M_VNA/subdir.mk:18: recipe for target 'src/MODULES/M_VNA/CVNA.o' failed
CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
^
../src/MODULES/M_VNA/CVNA.h:28:20: error: expected ‘,’ or ‘...’ before string constant
#define DEVICE_I2C "dev/i2c-1"
^
../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
^
make: *** [src/MODULES/M_VNA/CVNA.o] Error 1There is nothing special about #defines
// devices
#define DEVICE_SPI "dev/spidev0.0"
#define DEVICE_I2C "dev/i2c-1"// define i2c addresses
#define ADDRESS_HITACHI 0x27
#define ADDRESS_ADS 0x48The error "points " to #define which is redefined in this class - temporary for test purposes. I did look thru similar problems and they all indicate the #define is NOT the issue, however I am unable to figure this out and correct it. Any help would be appreciated. Cheers
Vaclav_ wrote:
The error "points " to #define which is redefined in this class - temporary for test purposes.
Are you doing something like this?
#include "spi.h" // #defines DEVICE_SPI, etc
#define DEVICE_SPI_"dev/spidev0.0" // Temporary define
class C_VNA {
// ...
};That would mean that you're re-defining DEVICE_SPI, but normally your compiler should warn about redifines. Maybe you need #undef where you set up your temp defines. e.g.
#ifdef DEVICE_SPI
#define ORIG_DEVICE_SPI DEVICE_SPI
#undef DEVICE_SPI
#endif
#define DEVICE_SPI "dev/spidev0.0"
// your code here that uses the temporary DEVICE_SPI#ifdef ORIG_DEVICE_SPI
#undef DEVICE_SPI
#define DEVICE_SPI ORIG_DEVICE_SPI
#undef ORIG_DEVICE_SPI
#endif -
Here is the part in question
class CLASS_I2CIO {
public:
CLASS_I2CIO();
CLASS_I2CIO(char Device, int Address);
CLASS_I2CIO(int width, int length, int height)
: m_width(width), m_length(length), m_height(height)
{}CLASS\_I2CIO(char \*x1, int y1); // :
this is the one which fails
CLASS_I2CIO(char *x1, int y1, int Width, int Height);private:
char *device;
int address;
int width, height;public:
virtual ~CLASS_I2CIO();
int FileDescriptor = 0;// class variables \_\_u8 reg; /\* Device register to access \*/ \_\_s32 res; char buffer\[10\]= { }; // clear buffer - was not initialized
-
I hope I can explain this problem. I can make an instance of a class in my main()
CLASS\_I2CIO i2c\_ads1115(DEVICE\_I2C,ADDRESS\_ADS);
no problema. But if I add same code as class variable - I need an access to the class form main() - I get the following error.
class C_VNA {
public:
C_VNA();
virtual ~C_VNA();C\_Utility utility; CLASS\_LCM1602 i2c; // default constructor x,x,x,x); CIOCTLGPIO gpio; // GPIo C\_IOCTL\_SPI spi; // temporary not coded C\_DDS\_60 dds; // frequency C\_AD8302\_Detector det; C\_ADS1115 ads; CLASS\_I2CIO i2c\_ioctl; // genric i2c using ioctl
error here
CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
error here
};Partial compiler output
Compiler executable checksum: 606522cdd68a1ba2fd9e2930e9d38d0d
In file included from ../src/MODULES/M_VNA/CVNA.cpp:8:0:
../src/MODULES/M_VNA/CVNA.h:28:20: error: expected identifier before string constant
#define DEVICE_I2C "dev/i2c-1"
^
../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
src/MODULES/M_VNA/subdir.mk:18: recipe for target 'src/MODULES/M_VNA/CVNA.o' failed
CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
^
../src/MODULES/M_VNA/CVNA.h:28:20: error: expected ‘,’ or ‘...’ before string constant
#define DEVICE_I2C "dev/i2c-1"
^
../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
^
make: *** [src/MODULES/M_VNA/CVNA.o] Error 1There is nothing special about #defines
// devices
#define DEVICE_SPI "dev/spidev0.0"
#define DEVICE_I2C "dev/i2c-1"// define i2c addresses
#define ADDRESS_HITACHI 0x27
#define ADDRESS_ADS 0x48The error "points " to #define which is redefined in this class - temporary for test purposes. I did look thru similar problems and they all indicate the #define is NOT the issue, however I am unable to figure this out and correct it. Any help would be appreciated. Cheers
Inside a function, this declares a variable called
i2c_ads1115
with typeCLASS_I2CIO
and calls the constructor with the two valuesDEVICE_I2C
andADDRESS_ADS
:CLASS_I2CIO i2c_ads1115(DEVICE_I2C,ADDRESS_ADS);
Inside a class definition it declares a member function called
i2c_ads1115
that returns aCLASS_I2CIO
type and takes two arguments, which is where the compiler is having problems. Instead ofDEVICE_I2C
being a type, you have a #defined string. To geti2c_ads1115
as a member variable, declare it the same way as thei2c_ioctl
member variable, then construct it with arguments in the initialization list of theC_VNA
class. -
Inside a function, this declares a variable called
i2c_ads1115
with typeCLASS_I2CIO
and calls the constructor with the two valuesDEVICE_I2C
andADDRESS_ADS
:CLASS_I2CIO i2c_ads1115(DEVICE_I2C,ADDRESS_ADS);
Inside a class definition it declares a member function called
i2c_ads1115
that returns aCLASS_I2CIO
type and takes two arguments, which is where the compiler is having problems. Instead ofDEVICE_I2C
being a type, you have a #defined string. To geti2c_ads1115
as a member variable, declare it the same way as thei2c_ioctl
member variable, then construct it with arguments in the initialization list of theC_VNA
class. -
Thanks, I'll give it a go. One more question. Why I have no issue with using same syntax making an instance of the class in main ()? Stupid question - could I just change the #define to "include" type ?
I can't say why that syntax defines a variable using a constructor in one place and declares a member function in another - you would have to ask the people who designed C++ that. Making the #define include the type would probably give you a different error message, but it would still be attempting to declare a member function.
-
I hope I can explain this problem. I can make an instance of a class in my main()
CLASS\_I2CIO i2c\_ads1115(DEVICE\_I2C,ADDRESS\_ADS);
no problema. But if I add same code as class variable - I need an access to the class form main() - I get the following error.
class C_VNA {
public:
C_VNA();
virtual ~C_VNA();C\_Utility utility; CLASS\_LCM1602 i2c; // default constructor x,x,x,x); CIOCTLGPIO gpio; // GPIo C\_IOCTL\_SPI spi; // temporary not coded C\_DDS\_60 dds; // frequency C\_AD8302\_Detector det; C\_ADS1115 ads; CLASS\_I2CIO i2c\_ioctl; // genric i2c using ioctl
error here
CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
error here
};Partial compiler output
Compiler executable checksum: 606522cdd68a1ba2fd9e2930e9d38d0d
In file included from ../src/MODULES/M_VNA/CVNA.cpp:8:0:
../src/MODULES/M_VNA/CVNA.h:28:20: error: expected identifier before string constant
#define DEVICE_I2C "dev/i2c-1"
^
../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
src/MODULES/M_VNA/subdir.mk:18: recipe for target 'src/MODULES/M_VNA/CVNA.o' failed
CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
^
../src/MODULES/M_VNA/CVNA.h:28:20: error: expected ‘,’ or ‘...’ before string constant
#define DEVICE_I2C "dev/i2c-1"
^
../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
^
make: *** [src/MODULES/M_VNA/CVNA.o] Error 1There is nothing special about #defines
// devices
#define DEVICE_SPI "dev/spidev0.0"
#define DEVICE_I2C "dev/i2c-1"// define i2c addresses
#define ADDRESS_HITACHI 0x27
#define ADDRESS_ADS 0x48The error "points " to #define which is redefined in this class - temporary for test purposes. I did look thru similar problems and they all indicate the #define is NOT the issue, however I am unable to figure this out and correct it. Any help would be appreciated. Cheers
The compiler expects a function signature, but the function arguments you specified are missing a type. Try somthing like this
CLASS_I2CIO i2c_ads1115_test(const char* DEVICE_I2C, int ADDRESS_ADS);
(not sure what type the second argument is supposed to be)
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
-
Here is the part in question
class CLASS_I2CIO {
public:
CLASS_I2CIO();
CLASS_I2CIO(char Device, int Address);
CLASS_I2CIO(int width, int length, int height)
: m_width(width), m_length(length), m_height(height)
{}CLASS\_I2CIO(char \*x1, int y1); // :
this is the one which fails
CLASS_I2CIO(char *x1, int y1, int Width, int Height);private:
char *device;
int address;
int width, height;public:
virtual ~CLASS_I2CIO();
int FileDescriptor = 0;// class variables \_\_u8 reg; /\* Device register to access \*/ \_\_s32 res; char buffer\[10\]= { }; // clear buffer - was not initialized
CLASS_I2CIO(char Device, int Address);
Surely you mean
char* Device
, notchar Device
? If the erroneous line is supposed to be an initialization of a variable calling this constructor, then that is not going to work: you can not initialize a member variable right inside the class declaration, unless it is static. Instead you have to do the initialization inside the constructor, like this:class C_VNA {
C_VNA();
...
CLASS_I2CIO i2c_ads1115_test; // just declaring the type of the member variable here
};
...
// constructors
// initialize the class members here (only needed when not using default constructor)
C_VNA::C_VNA()
: i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS)
{
// more initialization code
}[edit2]reintroduced tags [/edit]
-
CLASS_I2CIO(char Device, int Address);
Surely you mean
char* Device
, notchar Device
? If the erroneous line is supposed to be an initialization of a variable calling this constructor, then that is not going to work: you can not initialize a member variable right inside the class declaration, unless it is static. Instead you have to do the initialization inside the constructor, like this:class C_VNA {
C_VNA();
...
CLASS_I2CIO i2c_ads1115_test; // just declaring the type of the member variable here
};
...
// constructors
// initialize the class members here (only needed when not using default constructor)
C_VNA::C_VNA()
: i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS)
{
// more initialization code
}[edit2]reintroduced tags [/edit]
-
Stefan_Lang wrote:
had to remove tags - for some reason they are not working!?
Look at the checkboxes below the edit window. Do you have "Treat my content as plain text, not as HTML" set?
Thanks, that was indeed the problem. No idea why it was checked - I almost always use tags. :confused: GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
-
The compiler expects a function signature, but the function arguments you specified are missing a type. Try somthing like this
CLASS_I2CIO i2c_ads1115_test(const char* DEVICE_I2C, int ADDRESS_ADS);
(not sure what type the second argument is supposed to be)
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)