C ++相当陌生。 我在代码的开头有这些声明:
#include <iostream>
#include <iomanip>
using namespace std;
int m, n;
void indtastVektor(double A[m]);
void indtastMatrix(double A[m][n]);
我的主要看起来像这样:
int main() {
string svar;
do {
cout
<< "Ønskes indtastning af en vektor eller en matrix? Tast v for vektor og m for matrix: ";
svar = cin;
if (svar == "v" or svar == "V") {
cout << "Indtast det ønskede antal rækker i vektoren som heltal: ";
cin >> m;
double vektor[m];
indtastVektor(vektor);
break;
} else if (svar == "m" or svar == "M") {
cout << "Indtast det ønskede antal rækker i matricen som heltal: ";
cin >> m;
cout << "Indtast det ønskede antal søjler i matricen som heltal: ";
cin >> n;
double matrix[m][n];
indtastMatrix(matrix); // This line of code gives me an error
break;
} else {
cout << "Intet gyldigt svar indtastet - forsøg igen. \n";
}
} while (true);
return 0;
}
行:indtastMatrix(矩阵);给我以下错误:
没有匹配函数来调用'indtastMatrix'
基本上该函数采用用户指定的m和n,并使用这些值创建二维数组。 Eclipse给了我这个解释:
第一个参数没有从'double [m] [n]'到'double(*)[n]'的已知转换 void indtastMatrix(double A [m] [n]);
这究竟是什么意思?我假设我可能还需要在main函数之前初始化m和n?
令我困惑的是这段代码不会返回任何错误:
cin >> m;
double vektor[m];
indtastVektor(vektor);
为什么我可以在运行时初始化变量并将其传递给函数,如果函数将一维数组作为参数,但是如果它是二维的话则不会?
谢谢!
答案 0 :(得分:0)
您正在使用可变长度数组(VLA),这是非标准扩展名。
请改用std::vector
。
void indtastVektor(std::vector<double>& v);
void indtastMatrix(std::vector<std::vector<double>>& v);
// ...
std::vector<double> vektor(m);
indtastVektor(vektor);
//...
std::vector<std::vector<double>> matrix(m, std::vector<double>(n));
indtastMatrix(matrix); // This line of code gives me an error
答案 1 :(得分:0)
请记住,当您将数组传递给函数时,数组会衰减为指针。因此,数组数组衰减为指向数组的指针,其类型为sometype (*)[size]
,其中size
是&#34; inner&#34;的大小。 (第二维)数组。
但是,在定义或声明函数时,必须在编译时知道完全大小。如果尺寸未知,您根本无法做到。但是有一种使用模板的解决方法:
template<std::size_t SZ>
void indtastMatrix(double (*A)[SZ]);
另请注意,variable-length arrays是某些编译器中的非标准扩展。请改用std::vector
。