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