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

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Mar 25 01:53:20 PDT 2016


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



More information about the Digitalmars-d-learn mailing list