Array of structures - initialization errors

I create some data structures here (with MFC), compiling in MS Visual C ++ 6.0 (yes, it is old).

struct SOpcodeData { BYTE m_byDataType; DWORD m_dwMinValue; DWORD m_dwMaxValue; WORD m_wRepeat; }; const BYTE DATA_U8 = 0; const BYTE DATA_U16 = 1; const BYTE DATA_U32 = 2; SOpcodeData MY_BYTE = { DATA_U8, 0, UCHAR_MAX, 1 }; SOpcodeData MY_WORD = { DATA_U16, 0, USHRT_MAX, 1 }; SOpcodeData MY_DWORD = { DATA_U32, 0, UINT_MAX, 1 }; 

This code compiles without errors or warnings. But when I try to create an array of my structure type ...

 SOpcodeData foo[] = { MY_BYTE, MY_BYTE, MY_WORD, MY_DWORD, MY_BYTE }; 

VC6 throws a compilation error for each element of the array:

device.cpp (78): error C2440: 'initializing': cannot convert from 'struct SOpcodeData' to 'unsigned char'

There are no user-defined conversion operators available that can perform this conversion, or the statement cannot be called.

Apparently it mistakenly accepts the entire structure type with the first structure field, which is BYTE (or unsigned char for those not used for MFC).

Tried this on Visual Studio 2010 and it works great. But I need to build it using VC6.

I tried explicitly converting to a structure type inside array initialization, but this is redundant and does not solve anything. Any other ideas?

+4
source share
2 answers

We figured out another solution without using #define : using a constructor to initialize data structures. Varieties like this:

 struct SOpcodeData { SOpcodeData (const BYTE byDataType, const DWORD dwMinValue, const DWORD dwMaxValue, const WORD wRepeat) : m_byDataType(byDataType), m_dwMinValue(dwMinValue), m_dwMaxValue(dwMaxValue), m_wRepeat(wRepeat) {} BYTE m_byDataType; DWORD m_dwMinValue; DWORD m_dwMaxValue; WORD m_wRepeat; }; SOpcodeData MY_BYTE (DATA_U8, 0, UCHAR_MAX, 1); SOpcodeData MY_WORD (DATA_U16, 0, USHRT_MAX, 1); SOpcodeData MY_DWORD (DATA_U32, 0, UINT_MAX, 1); SOpcodeData foo[] = { MY_BYTE, MY_WORD, MY_DWORD }; 

Thanks everyone!

0
source

Since you insist on using a compiler with many and many known errors, you will need an ugly workaround:

 #define MY_BYTE_CONTENT { DATA_U8, 0, UCHAR_MAX, 1 } #define MY_WORD_CONTENT { DATA_U16, 0, USHRT_MAX, 1 } #define MY_DWORD_CONTENT { DATA_U32, 0, UINT_MAX, 1 } SOpcodeData MY_BYTE = MY_BYTE_CONTENT; SOpcodeData MY_WORD = MY_WORD_CONTENT; SOpcodeData MY_DWORD = MY_DWORD_CONTENT; SOpcodeData foo[] = { MY_BYTE_CONTENT, MY_BYTE_CONTENT, MY_WORD_CONTENT, MY_DWORD_CONTENT, MY_BYTE_CONTENT }; 
+4
source

All Articles