Create readonly array of data ?

P

paolo

Please excuse my very poor English, I hope you understand my question.

I want to create a readonly array of data, then a readonly array of a
structure (STRUCT). This is data I access but I want it protected against
accidental change. The following is my test code.

#include "stdafx.h"

struct LVC
{
unsigned short int lo;
unsigned short int hi;

};

void main()
{
//This seems to work
static const unsigned short int LV[4] =
{0xAC00,
0xAC1C,
0xAC38,
0xAC54 };

//THIS DOESN'T WORK. COMPILER COMPLAINS
static const struct LVC[4] = {
{ 0xAC01, 0xAC1B },
{ 0xAC1D, 0xAC37 },
{ 0xAC39, 0xAC53 },
{ 0xAC55, 0xAC6F },
};

unsigned short i,j;

i = LVC[2].lo;
j = LVC[2].hi;

}

I use Microsoft Visual C++ Express Edition
(I also would like to get rid of that #include "stdafx.h" if
there is some compiler configuration that will allow me
to do that.)

Thank you.
 
E

Eric Sosman

Please excuse my very poor English, I hope you understand my question.

I want to create a readonly array of data, then a readonly array of a
structure (STRUCT). This is data I access but I want it protected against
accidental change. The following is my test code.

#include "stdafx.h"

struct LVC
{
unsigned short int lo;
unsigned short int hi;

};

void main()

int main(void)
{
//This seems to work
static const unsigned short int LV[4] =
{0xAC00,
0xAC1C,
0xAC38,
0xAC54 };

//THIS DOESN'T WORK. COMPILER COMPLAINS
static const struct LVC[4] = {

This array needs a name. `LVC' is not the name of anything
at all; `struct LVC' is the name of a type, just like `float' is
the name of a type. Try something like

static const struct LVC array[4] = { ...
{ 0xAC01, 0xAC1B },
{ 0xAC1D, 0xAC37 },
{ 0xAC39, 0xAC53 },
{ 0xAC55, 0xAC6F },
};

unsigned short i,j;

i = LVC[2].lo;
j = LVC[2].hi;

.... and `i = array[2].lo; j = array[2].hi;'.
}

I use Microsoft Visual C++ Express Edition
(I also would like to get rid of that #include "stdafx.h" if
there is some compiler configuration that will allow me
to do that.)

Just leave it out: It's not part of C, and no C compiler needs
it. If your compiler complains when you omit "stdafx.h", it is
operating in some sort-of-like-C-but-not-actually-C mode; there are
probably compiler flags or options to tell it to behave like a C
compiler instead. (I'm sorry I don't know what those options might
be; perhaps a Microsoft forum would be able to help.)
 
E

ec429

//THIS DOESN'T WORK. COMPILER COMPLAINS
The declaration "static const struct LVC[4]" is invalid; you have not
given the variable a name. "struct LVC" is a type, not a declaration.
Try something like "static const struct LVC my_lvc[4]" instead.

Also, some advice: when asking for help, post the actual error message
produced by the compiler; it makes it easier for others to help you and
thus more likely that they will do so.
(I also would like to get rid of that #include "stdafx.h" if
there is some compiler configuration that will allow me
to do that.)
According to a quick web search, stdafx.h is a precompiled header
containing "standard system and project specific include files that are
used frequently but hardly ever change". You could replace it with
#includes of those headers you actually need, though you may need to
disable the compiler option /Yu'stdafx.h'
-E
 
J

Jens Thoms Toerring

paolo said:
Please excuse my very poor English, I hope you understand my question.
I want to create a readonly array of data, then a readonly array of a
structure (STRUCT). This is data I access but I want it protected against
accidental change. The following is my test code.
#include "stdafx.h"
struct LVC
{
unsigned short int lo;
unsigned short int hi;

void main()

That should be

int main( void )

(main() is supposed to retur an int and take either no arguments
or an int and an array of char pointers, but not an unsoecified
number of arguments).
{
//This seems to work
static const unsigned short int LV[4] =
{0xAC00,cd TE
0xAC1C,
0xAC38,
0xAC54 };

What is the 'static' meant to be good for? Also without
it this will create an array that is read-only. 'static'
only is necessary if you want a variable that "survives"
the end of the function and thus still exists (with the
previous value) when you call the function another time.
//THIS DOESN'T WORK. COMPILER COMPLAINS
static const struct LVC[4] = {

The problem is that this should be something like

const struct LVC some_name[ 4 ] = {

and then the compiler should accept it. That's because
the type is 'struct LVC' and you're creating a strange
mix out of the type name and the variable name.
{ 0xAC01, 0xAC1B },
{ 0xAC1D, 0xAC37 },
{ 0xAC39, 0xAC53 },
{ 0xAC55, 0xAC6F },
};

I use Microsoft Visual C++ Express Edition

I hope you use it as a C and not a C++ compiler, otherwise
you'd better ask in comp.lang.c++.
(I also would like to get rid of that #include "stdafx.h" if
there is some compiler configuration that will allow me
to do that.)

There's nothing in the program you psoted that would require
the inclusion of any header files.

Regards, Jens
 
T

Thad Smith

paolo said:
Please excuse my very poor English, I hope you understand my question. ....
{
//This seems to work
static const unsigned short int LV[4] =
{0xAC00,cd TE
0xAC1C,
0xAC38,
0xAC54 };

What is the 'static' meant to be good for? Also without
it this will create an array that is read-only. 'static'
only is necessary if you want a variable that "survives"
the end of the function and thus still exists (with the
previous value) when you call the function another time.

While that is true, it is also more efficient for many implementations,
especially embedded implementations which use both read-only and read-write
storage. With the static specifier, the data can be loaded into read-only
memory, while without the static attribute, most implementations will copy the
data into read-write memory at run time, increasing code size (slightly), run
time on each function entry, and RAM requirements. The latter can be
significant on small processors.

Thad
 
R

Roberto Waltman

paolo said:
I use Microsoft Visual C++ Express Edition
(I also would like to get rid of that #include "stdafx.h" if
there is some compiler configuration that will allow me
to do that.)

Disable "use precompiled headers"
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,013
Latest member
KatriceSwa

Latest Threads

Top