www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - implicite deref on array element access? (indexing)

reply spir <denis.spir gmail.com> writes:
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
Feb 25 2011
next sibling parent Jesse Phillips <jessekphillips+D gmail.com> writes:
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.
Feb 25 2011
prev sibling next sibling parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
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
Feb 25 2011
prev sibling next sibling parent Andrej Mitrovic <andrej.mitrovich gmail.com> writes:
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 ?
Feb 25 2011
prev sibling next sibling parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
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
Feb 25 2011
prev sibling parent spir <denis.spir gmail.com> writes:
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
Feb 25 2011