Why can't I pass a const array to a function that takes scope const arrays?

Adnan relay.public.adnan at outlook.com
Mon Feb 17 13:44:55 UTC 2020


https://ideone.com/lVi5Uy

module strassens_matmul;

debug {
     static import std;
}

package {
     ulong getRowSize(T)(T[][] mat) {
         return mat[0].length;
     }

     ulong getColumnSize(T)(T[][] mat) {
         return mat.length;
     }

     T[][] createMatrix(T)(const ulong rowSize, const ulong 
columnSize) {
         return new T[][](rowSize, columnSize);
     }

     /// row and column are 0 index-based
     T* getPointPtr(T)(T[][] mat, const ulong row, const ulong 
column) {
         return &mat[row][column];
     }

     T getPointCopy(T)(T[][] mat, const ulong row, const ulong 
column) {
         return mat[row][column];
     }

     T[][] mulIterative(T)(scope const T[][] mat1, scope const 
T[][] mat2) {
         auto result = createMatrix!T(mat1.getRowSize, 
mat2.getColumnSize);
         foreach (row; 0 .. mat1.getRowSize()) {
             foreach (column; 0 .. mat2.getColumnSize()) {
                 T value;
                 foreach (i; 0 .. mat1.getRowSize()) {
                     value += mat1.getPointCopy(row, i) * 
mat2.getPointCopy(i, column);
                 }
                 *result.getPointPtr(row, column) = value;
             }
         }
         return result;
     }
}

unittest {
     const uint[][] matA = [[10, 20, 10], [4, 5, 6], [2, 3, 5]];
     const uint[][] matB = [[3, 2, 4], [3, 3, 9], [4, 4, 2]];
     const uint[][] matC = [[130, 120, 240], [51, 47, 73], [35, 
33, 45]];
     assert(matA.mulIterative(matB) == matC);
}

///

source/strassens_matmul.d(30,42): Error: template 
strassens_matmul.getRowSize cannot deduce function from argument 
types !()(const(uint[][])), candidates are:
source/strassens_matmul.d(8,11):        getRowSize(T)(T[][] mat)
source/strassens_matmul.d(30,59): Error: template 
strassens_matmul.getColumnSize cannot deduce function from 
argument types !()(const(uint[][])), candidates are:
source/strassens_matmul.d(12,11):        getColumnSize(T)(T[][] 
mat)
source/strassens_matmul.d(31,43): Error: template 
strassens_matmul.getRowSize cannot deduce function from argument 
types !()(const(uint[][])), candidates are:
source/strassens_matmul.d(8,11):        getRowSize(T)(T[][] mat)
source/strassens_matmul.d(48,29): Error: template instance 
strassens_matmul.mulIterative!uint error instantiating
dmd failed with exit code 1.


More information about the Digitalmars-d-learn mailing list