将非初始化变量传递给函数,并将数组作为参数

时间:2014-12-01 12:02:52

标签: c++ arrays multidimensional-array initialization

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);

为什么我可以在运行时初始化变量并将其传递给函数,如果函数将一维数组作为参数,但是如果它是二维的话则不会?

谢谢!

2 个答案:

答案 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