Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
February 25, 2011 implicite deref on array element access? (indexing) | ||||
---|---|---|---|---|
| ||||
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 Re: implicite deref on array element access? (indexing) | ||||
---|---|---|---|---|
| ||||
Posted in reply to spir | 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 Re: implicite deref on array element access? (indexing) | ||||
---|---|---|---|---|
| ||||
Posted in reply to spir | 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 Re: implicite deref on array element access? (indexing) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | 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 Re: implicite deref on array element access? (indexing) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | 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 Re: implicite deref on array element access? (indexing) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | 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 |
Copyright © 1999-2021 by the D Language Foundation