Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #15340 > unrolled thread

Create readonly array of data ?

Started bypaolo <pc8875@nospam.mail.com.br>
First post2012-01-02 21:44 +0000
Last post2012-01-03 21:12 -0500
Articles 6 — 6 participants

Back to article view | Back to comp.lang.c


Contents

  Create readonly array of data ? paolo <pc8875@nospam.mail.com.br> - 2012-01-02 21:44 +0000
    Re: Create readonly array of data ? Eric Sosman <esosman@ieee-dot-org.invalid> - 2012-01-02 17:30 -0500
    Re: Create readonly array of data ? ec429 <ec429@cam.ac.uk> - 2012-01-02 22:33 +0000
    Re: Create readonly array of data ? jt@toerring.de (Jens Thoms Toerring) - 2012-01-02 23:12 +0000
      Re: Create readonly array of data ? Thad Smith <ThadSmith@acm.org> - 2012-01-02 19:46 -0700
    Re: Create readonly array of data ? Roberto Waltman <usenet@rwaltman.com> - 2012-01-03 21:12 -0500

#15340 — Create readonly array of data ?

Frompaolo <pc8875@nospam.mail.com.br>
Date2012-01-02 21:44 +0000
SubjectCreate readonly array of data ?
Message-ID<jdt8fi$e1f$1@speranza.aioe.org>
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.

[toc] | [next] | [standalone]


#15343

FromEric Sosman <esosman@ieee-dot-org.invalid>
Date2012-01-02 17:30 -0500
Message-ID<jdtb6m$1r7$1@dont-email.me>
In reply to#15340
On 1/2/2012 4:44 PM, paolo wrote:
> 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.)

-- 
Eric Sosman
esosman@ieee-dot-org.invalid

[toc] | [prev] | [next] | [standalone]


#15344

Fromec429 <ec429@cam.ac.uk>
Date2012-01-02 22:33 +0000
Message-ID<jdtbbf$2ij$1@dont-email.me>
In reply to#15340
On 02/01/12 21:44, paolo wrote:
>     //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
-- 
'sane', adj.: see 'unimaginative'
   on the web - http://jttlov.no-ip.org

[toc] | [prev] | [next] | [standalone]


#15346

Fromjt@toerring.de (Jens Thoms Toerring)
Date2012-01-02 23:12 +0000
Message-ID<9merupF53dU1@mid.uni-berlin.de>
In reply to#15340
paolo <pc8875@nospam.mail.com.br> wrote:
> 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
-- 
  \   Jens Thoms Toerring  ___      jt@toerring.de
   \__________________________      http://toerring.de

[toc] | [prev] | [next] | [standalone]


#15352

FromThad Smith <ThadSmith@acm.org>
Date2012-01-02 19:46 -0700
Message-ID<jdtq70$hjg$1@speranza.aioe.org>
In reply to#15346
On 1/2/2012 4:12 PM, Jens Thoms Toerring wrote:
> paolo<pc8875@nospam.mail.com.br>  wrote:
>> 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

[toc] | [prev] | [next] | [standalone]


#15391

FromRoberto Waltman <usenet@rwaltman.com>
Date2012-01-03 21:12 -0500
Message-ID<79d7g7l5urvuq85r2he87a9gqs2rbpoejc@4ax.com>
In reply to#15340
paolo  wrote:

>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"
--
Roberto Waltman

[ Please reply to the group,
  return address is invalid ]

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.c


csiph-web