Struct array assignment behaviour using example from Programming in D, chapter 78

data pulverizer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Mar 25 02:44:41 PDT 2016


On Friday, 25 March 2016 at 08:53:20 UTC, Ali Çehreli wrote:
> On 03/25/2016 12:00 AM, data pulverizer wrote:
> > On Thursday, 24 March 2016 at 18:46:14 UTC, Ali Çehreli wrote:
> >> On 03/24/2016 10:24 AM, data pulverizer wrote:
> >> > I have been playing with the matrix example given at the
> end
> >> of chapter
> >> > 78 of Ali Çehreli's
> >>
> >> For reference, it's "Multi-dimensional operator overloading
> example"
> >> here:
> >>
> >>   http://ddili.org/ders/d.en/templates_more.html
> >>
> >> >having problems with overloading the opAssign operator.
>
> > Thank you. Let me try to ask the question again. The problem
> I am
> > experiencing is to do with opIndexAssign().
> >
> > I added the following public operators:
> >
> >      Matrix opAssign(int[][] arr)
> >      {
> >          writeln(__FUNCTION__);
> >          this.rows = arr;
> >          return this;
> >      }
>
> The problem is due to the aliasing of 'rows' members of Matrix 
> objects. subMatrix is supposed to be a reference into some 
> elements of an existing Matrix. As soon as we do the above 
> assignment, this Matrix (which may be a subMatrix in a specific 
> context) breaks lose from its actual Matrix elements.
>
> We need to implement the function above "in place":
>
>     Matrix opAssign(int[][] arr)
>     {
>         writeln(__FUNCTION__);
>
>         if (rows.length < arr.length) {
>             rows.length = arr.length;
>         }
>
>         foreach (i, row; arr) {
>             const newLength = row.length;
>
>             if (rows[i].length < newLength) {
>                 rows[i].length = newLength;
>             }
>             rows[i][0..newLength] = row[];
>         }
>
>         return this;
>     }
>
> (There must be an existing function that does that.)
>
> >      Matrix opAssign(Matrix mat)
> >      {
> >          writeln(__FUNCTION__);
> >          this.rows = mat.rows;
>
> Same thing applies above: We need to assign to this.rows in 
> place (which is easier by taking advantage of the previous 
> function):
>
>         this = mat.rows;
>
> >          return this;
> >      }
>
> No changes needed for the other two functions but I would 
> 'return this' instead of 'return subMatrix' for them as well.
>
> Ali

That's great! Thank you very much for the fix and extra 
suggestions, and for your patience putting up with my poorly 
formulated question! Looks like I need to go and read all the 
structs and operators chapters thoroughly!


More information about the Digitalmars-d-learn mailing list