Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #109604
| From | jak <please@nospam.tnx> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: error: initializer element is not constant| |
| Date | 2017-05-09 19:06 +0200 |
| Organization | Aioe.org NNTP Server |
| Message-ID | <oessve$f4k$1@gioia.aioe.org> (permalink) |
| References | (3 earlier) <gmXPA.1653357$Pm3.1121619@fx42.am4> <oepglk$1vlt$1@gioia.aioe.org> <ufYPA.134876$QR.27637@fx34.am4> <oersjf$1q6f$1@gioia.aioe.org> <37hQA.7825$Aj7.1467@fx33.am4> |
Il 09/05/2017 12:47, bartc ha scritto:
> On 09/05/2017 08:54, jak wrote:
>> Il 08/05/2017 13:02, bartc ha scritto:
>>> On 08/05/2017 11:18, jak wrote:
>>>
>>>> I would like to create an array of pointers, of pointers to strings. In
>>>> this way I can have the pointers as constant and I wrote this:
>>>>
>>>> char *Date = "01-01-80";
>>>>
>>>> typedef char * ch;
>>>> typedef ch * p_ch;
>>>>
>>>> p_ch foo[] =
>>>> {
>>>> &Date,
>>>> (p_ch)&"Date"
>>>> };
>>>>
>>>> This works but I do not know how to declare foo without using typedef.
>>>
>>> Those types would look like this without typedefs:
>>>
>>> char * str;
>>> char * array_of_str[];
>>> char ** ptr_to_str;
>>> char ** array_of_ptr_to_str[];
>>>
>>> (The arrays will need a dimension, or need to be initialised.)
>>>
>>> But arrays of pointers to strings would be unusual, and be harder to
>>> initialise as you can't just have "ABC", but need to set up a named
>>> string: char* abc="ABC", then use &abc.
>>>
>>> I don't think you can apply a cast to "ABC" to get the pointer you need.
>>> (Well, you can cast it, but it won't be a proper pointer to string,
>>> it'll just be a string, and will crash when you apply the dereference
>>> below.)
>>>
>>> Using the array would be harder too as you'll need an extra dereference
>>> to extract the string:
>>>
>>> puts(*array_of_ptr_to_str[0]);
>>>
>> Ok ok. Bugs have also been put in the middle. The first time I wrote the
>> declaration in this way:
>>
>> char *Date = "01-01-80";
>> char **Phrases[]
>> {
>> &Date
>> }
>>
>> and gcc gave me a lot of errors.
>
> Not surprising as you've left out "=" after "[]", and ";" after "}". You
> should try and post exact code.
>
> After fixing that, it seemed to compile. Date has type char*; &Date has
> type char**; Phrases has type char**[], and each element needs to be
> type char**, so &Date matches (also surprising as it looked wrong).
>
> Then this works:
>
> puts(*Phrases[0]);
>
>> But I still do not understand why the compiler does not allow me this:
>>
>> char *Date = NULL;
>> char *Phrases[]
>> {
>> "Date: ",
>> Date,
>> "\r\n"
>> };
>>
>> In the end I'm just asking him to allocate space to write in an address
>> exactly as it happens when I write NULL instead of 'Date'.
>
> Does it say it an initialiser is not constant?
>
> NULL is just 0.
>
> Date requires a memory access to get the NULL stored in it. Memory
> accesses only take place at runtime.
>
> You can make this work by putting it inside a function. But then those
> memory accesses needed to build Phrases will happen every time you call
> the function. (Maybe, you can call the function once to set up a version
> of Phrases[] which is then copied to the Phrases declared outside the
> functions.)
>
> But it's still not clear what you're trying to achieve.
>
> Here's a normal list of strings:
>
> char *List1[] = {"one", "two", "three"};
>
> Here's an indirect one (list of pointers to strings):
>
> char *A="uno", *B="due", *C="tre";
> char **List2[] = {&A, &B, &C};
>
> And you access them like this:
>
> puts(List1[0]);
> puts(List1[1]);
> puts(List1[2]);
>
> puts(*List2[0]);
> puts(*List2[1]);
> puts(*List2[2]);
>
> What do you want to do that is different?
>
No, I do not want anything different. Only I can not understand the
reason why the compiler wants the initializer to be constant. When I
write this:
char *Phrase[] =
{
NULL, /*1*/
NULL, /*2*/
NULL, /*3*/
NULL /*4*/
};
I ask the compiler to allocate for me 4 contiguous memory areas, each
large to contain a pointer. Each pointer is char type and then uses this
step in its arithmetic. If at runtime I can modify, with new values,
each of the 4 pointers I have declared; Why does the compiler want it to
be constant during the definition? Is there a real reason, or is it just
the imagination of those who have thought about grammar and syntax?
Please, excuse my English.
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
error: initializer element is not constant| jak <please@nospam.tnx> - 2017-05-08 09:55 +0200
Re: error: initializer element is not constant| jak <please@nospam.tnx> - 2017-05-08 10:05 +0200
Re: error: initializer element is not constant| Noob <root@127.0.0.1> - 2017-05-08 10:38 +0200
Re: error: initializer element is not constant| jak <please@nospam.tnx> - 2017-05-08 11:55 +0200
Re: error: initializer element is not constant| bartc <bc@freeuk.com> - 2017-05-08 11:01 +0100
Re: error: initializer element is not constant| jak <please@nospam.tnx> - 2017-05-08 12:18 +0200
Re: error: initializer element is not constant| bartc <bc@freeuk.com> - 2017-05-08 12:02 +0100
Re: error: initializer element is not constant| Keith Thompson <kst-u@mib.org> - 2017-05-08 09:00 -0700
Re: error: initializer element is not constant| bartc <bc@freeuk.com> - 2017-05-08 17:50 +0100
Re: error: initializer element is not constant| Keith Thompson <kst-u@mib.org> - 2017-05-08 11:37 -0700
Re: error: initializer element is not constant| bartc <bc@freeuk.com> - 2017-05-08 19:49 +0100
Re: error: initializer element is not constant| Ben Bacarisse <ben.usenet@bsb.me.uk> - 2017-05-08 20:13 +0100
Re: error: initializer element is not constant| Keith Thompson <kst-u@mib.org> - 2017-05-08 12:44 -0700
Re: error: initializer element is not constant| scott@slp53.sl.home (Scott Lurndal) - 2017-05-08 20:24 +0000
Re: error: initializer element is not constant| jak <please@nospam.tnx> - 2017-05-09 09:54 +0200
Re: error: initializer element is not constant| jak <please@nospam.tnx> - 2017-05-09 10:15 +0200
Re: error: initializer element is not constant| GOTHIER Nathan <nathan.gothier@gmail.com> - 2017-05-09 12:12 +0200
Re: error: initializer element is not constant| bartc <bc@freeuk.com> - 2017-05-09 11:47 +0100
Re: error: initializer element is not constant| jak <please@nospam.tnx> - 2017-05-09 19:06 +0200
Re: error: initializer element is not constant| scott@slp53.sl.home (Scott Lurndal) - 2017-05-09 17:10 +0000
Re: error: initializer element is not constant| jak <please@nospam.tnx> - 2017-05-09 19:20 +0200
Re: error: initializer element is not constant| Barry Schwarz <schwarzb@dqel.com> - 2017-05-09 10:35 -0700
Re: error: initializer element is not constant| jak <please@nospam.tnx> - 2017-05-09 20:04 +0200
Re: error: initializer element is not constant| Keith Thompson <kst-u@mib.org> - 2017-05-09 11:57 -0700
Re: error: initializer element is not constant| supercat@casperkitty.com - 2017-05-09 12:50 -0700
Re: error: initializer element is not constant| Keith Thompson <kst-u@mib.org> - 2017-05-09 12:54 -0700
Re: error: initializer element is not constant| bartc <bc@freeuk.com> - 2017-05-09 20:15 +0100
Re: error: initializer element is not constant| "James R. Kuyper" <jameskuyper@verizon.net> - 2017-05-09 14:13 -0400
Re: error: initializer element is not constant| Keith Thompson <kst-u@mib.org> - 2017-05-09 11:41 -0700
Re: error: initializer element is not constant| Ben Bacarisse <ben.usenet@bsb.me.uk> - 2017-05-09 12:16 +0100
Re: error: initializer element is not constant| Keith Thompson <kst-u@mib.org> - 2017-05-09 08:11 -0700
Re: error: initializer element is not constant| Ben Bacarisse <ben.usenet@bsb.me.uk> - 2017-05-08 12:12 +0100
Re: error: initializer element is not constant| bartc <bc@freeuk.com> - 2017-05-08 13:45 +0100
Re: error: initializer element is not constant| Keith Thompson <kst-u@mib.org> - 2017-05-08 09:04 -0700
Re: error: initializer element is not constant| Ben Bacarisse <ben.usenet@bsb.me.uk> - 2017-05-08 19:53 +0100
Re: error: initializer element is not constant| bartc <bc@freeuk.com> - 2017-05-08 20:44 +0100
Re: error: initializer element is not constant| Noob <root@127.0.0.1> - 2017-05-09 09:27 +0200
Re: error: initializer element is not constant| Tim Rentsch <txr@alumni.caltech.edu> - 2017-05-09 07:10 -0700
Re: error: initializer element is not constant| Keith Thompson <kst-u@mib.org> - 2017-05-08 09:30 -0700
Re: error: initializer element is not constant| John Bode <jfbode1029@gmail.com> - 2017-05-08 08:05 -0700
csiph-web