Thread overview
implicite deref on array element access? (indexing)
Feb 25, 2011
spir
Feb 25, 2011
Jesse Phillips
Feb 25, 2011
Andrej Mitrovic
Feb 25, 2011
spir
February 25, 2011
Hello,

I thought it worked, just like implicite deref on (struct, class) member access. But I cannot have it work:

    auto a = [1,2,3];
    auto pa = &a;
    writeln((*pa)[2]);      // ok
    writeln(pa[2]);         // segfault

Denis
-- 
_________________
vita es estrany
spir.wikidot.com

February 25, 2011
spir Wrote:

> Hello,
> 
> I thought it worked, just like implicite deref on (struct, class) member access. But I cannot have it work:
> 
>      auto a = [1,2,3];
>      auto pa = &a;
>      writeln((*pa)[2]);      // ok
>      writeln(pa[2]);         // segfault

You aren't making a pointer to the data, only the array. I probably would have made the same mistake, but I think you want to use:

auto pa = a.ptr;

Don't know if there is a ptr property for array.
February 25, 2011
On Fri, 25 Feb 2011 10:15:52 -0500, spir <denis.spir@gmail.com> wrote:

> Hello,
>
> I thought it worked, just like implicite deref on (struct, class) member access. But I cannot have it work:
>
>      auto a = [1,2,3];
>      auto pa = &a;
>      writeln((*pa)[2]);      // ok
>      writeln(pa[2]);         // segfault

Because indexing a pointer like ptr[n] is the equivalent of *(ptr + n).

This is how it is in C.

Fun fact, you can avoid array bounds checks (if you know the index is valid) by doing arr.ptr[n]

-Steve
February 25, 2011
On 2/25/11, Steven Schveighoffer <schveiguy@yahoo.com> wrote:
> Fun fact, you can avoid array bounds checks (if you know the index is
> valid) by doing arr.ptr[n]

Can't you do the same with -noboundscheck ?
February 25, 2011
On Fri, 25 Feb 2011 10:58:49 -0500, Andrej Mitrovic <andrej.mitrovich@gmail.com> wrote:

> On 2/25/11, Steven Schveighoffer <schveiguy@yahoo.com> wrote:
>> Fun fact, you can avoid array bounds checks (if you know the index is
>> valid) by doing arr.ptr[n]
>
> Can't you do the same with -noboundscheck ?

No, -noboundscheck stops bounds checking everywhere.  arr.ptr[n] stops bounds checking for that one statement.  It's a lot easier to prove that one time that bounds checking is not necessary than it is to prove that no bounds checking is necessary anywhere.

Plus, you can't always control the command line.

-Steve
February 25, 2011
On 02/25/2011 04:43 PM, Steven Schveighoffer wrote:
> On Fri, 25 Feb 2011 10:15:52 -0500, spir <denis.spir@gmail.com> wrote:
>
>> Hello,
>>
>> I thought it worked, just like implicite deref on (struct, class) member
>> access. But I cannot have it work:
>>
>> auto a = [1,2,3];
>> auto pa = &a;
>> writeln((*pa)[2]); // ok
>> writeln(pa[2]); // segfault
>
> Because indexing a pointer like ptr[n] is the equivalent of *(ptr + n).
>
> This is how it is in C.
>
> Fun fact, you can avoid array bounds checks (if you know the index is valid) by
> doing arr.ptr[n]

All right! This is what I did not get. Thank you, Steve.
Too bad. Anyway, in the meanwhile I have opted for another approach. (FWIW, in Oberon implicite deref works on array indexing just like on struct [record] member access.)

Denis
-- 
_________________
vita es estrany
spir.wikidot.com