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

Passing non-initialised variable to function with array as argument

本文关键字:函数 数组 参数 初始化 变量      更新时间:2023-10-16

对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(matrix(; 给我以下错误:

调用"indtastMatrix"时没有匹配函数

基本上,该函数采用用户指定的 m 和 n,并使用这些值创建一个二维数组。Eclipse给了我这样的解释:

对于第一个参数,没有从"双精度 [m][n]"到"双精度 (*([n]"的已知转换void indtastMatrix(double A[m][n](;

这到底是什么意思?我想我可能还需要在主函数之前初始化 m 和 n?

让我感到困惑的是,这段代码没有返回任何错误:

cin >> m;
double vektor[m];
indtastVektor(vektor);

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

谢谢!

您正在使用可变长度数组 (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

请记住,当您将数组传递给函数时,数组会衰减为指针。因此,数组数组衰减为指向数组的指针,类型sometype (*)[size]其中size是"内部"(二维(数组的大小。

但是,在编译时定义或声明函数必须知道确切的大小。如果大小未知,您根本无法做到。不过,使用模板有一种解决方法:

template<std::size_t SZ>
void indtastMatrix(double (*A)[SZ]);

另请注意,可变长度数组在某些编译器中是非标准扩展。请改用std::vector