【发布时间】:2017-07-26 06:17:26
【问题描述】:
我正在尝试制作以动态二维数组为参数的函数(加法、减法、乘积等)。
例如,给定两个二维双精度数组,每个数组有 2 行 2 列:
double** m1;
m1 = new double *[2];
for (int i = 0; i < 2; ++i) {
m1[i] = new double[2];
}
double k1 = 1.0;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
m1[i][j] = k1;
k1 += 2.0;
}
}
double** m2;
m2 = new double *[2];
for (int i = 0; i < 2; ++i) {
m2[i] = new double [2];
}
double k2 = 2.0;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
m2[i][j] = k2;
k2 += 2.0;
}
}
我为他们做了一个添加功能。它首先检查两个数组是否具有相同的行数和列数。但是由于数组是完全动态的(行数和列数)并且被声明为指针的指针,所以我无法获得行数和列数。
例如,
的价值sizeof(m1[0])
为4,即双指针的bit大小(大概) 但是,
的价值sizeof(m1[0][0])
是8,是double类型的正确大小。
我想要前者的适当版本。
double** add_m(double **m1_, double** m2_) {
//HERE first part that needs the numbers of arguments' rows and columns.
if ((sizeof(*m1_) != sizeof(*m2_)) || (sizeof(**m1_) != sizeof(**m2_))) {
cout << "The sizes of the matrices don't match each other";
return 0;
}
else {
//HERE second part that needs the numbers of arguments' rows and columns.
int num_rows = sizeof(m1_[0])/sizeof(m1[0][0]);//??
int num_cols = sizeof(m1_[0][0])/sizeof(m1_[0][0]);//??
double** res;
res = new double*[num_rows];
for (int i = 0; i < num_rows; ++i) {
res[i] = new double[num_cols];
}
for (int i = 0; i < num_rows; ++i) {
for (int j = 0; j < num_cols; ++j) {
res[i][j] = m1_[i][j] + m2_[i][j];
}
}
return res;
}
}
编辑: 大多数答案都说使用已经存在的工具,如向量、矩阵。那么只是为了好奇,没办法呢?唯一的方法是从头开始制作类向量类或类矩阵类?
【问题讨论】:
-
你可以使用
std::array和它的size() -
我建议使用
class Matrix来存储行数、列数和值的向量。通过resp可以实现两个dim-access。方法甚至运算符重载。 -
另外值得一看的是
std::vector,因为你从来没有正确地取消分配这些东西,所以这段代码会疯狂地泄漏内存。 -
三思而后行,你需要存储行数和向量。列数可以通过 vector::size() / nRows 动态确定。
-
如果将 C 数组作为函数参数传递,它们会“衰减”为指针。因此,
sizeof无法提供函数内部数组的大小。