【问题标题】:How to pass an array to a function?如何将数组传递给函数?
【发布时间】:2016-04-09 14:17:24
【问题描述】:

代码:

void case1();
void case2();
void case3();
void case4();
void case5();

//Global variables
const int MAXROW = 5;
const int MAXCOL = 5;

int main()
{
    ........
    ...
MENU(with do while)
}

void case1()
{
    int A[MAXROW][MAXCOL] = { 0 };

    for (int r = 0; r < MAXROW; ++r)
        for (int c = 0; c < MAXCOL; ++c) {
            cout << "\n A[" << r << "][" << c << "]= ";
            cin >> A[r][c];
        }
}

void case2()
{
    ...
}

//Function to find average of negatives
void case3()
{
    int negNumber = 0;
    double average = 0;

    for (int r = 0; r < 6; ++r) {
        for (int c = 0; c < 6; ++c) {
            if...
}

void case4()
{//Function to find product of numbers different from 0
    ...
}

void case5()
{
    ...
}

如您所见,输入数组位于case1() 中。我想知道的是如何在所有其他函数中使用这个数组(case2case3case4case5)。

我该怎么做?

如何在菜单中调用它们?例如case2():

case '2': {
    case2(......);

目前我的错误列表中充满了类似

的消息

'A':未声明的标识符

【问题讨论】:

  • 请通过editminimal reproducible example 提出您的问题。
  • 你可以通过完全删除来稍微缩短它,但仍然没有那么接近最小。我建议您删除它,花一些时间重新编写(并重建您的示例),并且仅在您准备好取消删除和编辑它时。 (按原样,你只会收集反对票和接近票...)
  • 在函数中本地定义的任何数组都不能在其他函数中看到。正如您所问的,您需要在全局范围内定义该数组(不是我认为这是一个好主意)。

标签: c++ arrays parameter-passing pass-by-reference


【解决方案1】:

可以通过引用传递数组,例如:

void case1(int (&A)[MAXROW][MAXCOL])
{
  // do use array here
}

【讨论】:

    【解决方案2】:

    您应该在main 函数中声明您的数组,不是在您的case... 函数之一中。在 C++ 中,一旦执行超出定义对象的块,对象(包括数组)就会被销毁。所以在你的代码中

    void case1()
    {
        int A[MAXROW][MAXCOL] = { 0 };
        ...
    }
    

    一旦执行离开函数case1,数组A就会被销毁。当编译器抱怨未知名称A 时,它会尝试告诉您这一点。这不是你想要的!相反,请这样做:

    int main()
    {
        int A[MAXROW][MAXCOL] = { 0 };
        ...
        // your menu code
        ...
        switch (menu_result)
        {
        case 1: case1(A); break;
        case 2: case2(A); break;
        case 3: case3(A); break;
        case 4: case4(A); break;
        case 5: case5(A); break;
        }
    }
    

    在这里,您将数组A 传递给您的函数。为了使这段代码工作,你应该声明你的函数接收数组作为参数:

    void case1(int (&A)[MAXROW][MAXCOL])
    {
      // do use array here
    }
    

    (代码取自this答案)


    顺便说一句,传递引用语法很少用于数组,因为即使您省略了引用符号&amp;,代码也可以工作:

    void case2(int A[MAXROW][MAXCOL]) // also works; does the same
    {
    }
    

    这种情况下,也可以省略数组的外维度:

    void case3(int A[][MAXCOL]) // also works; does the same
    {
    }
    

    这两个变体也可以工作的原因is a bit technical - 在这些变体中,传递的东西是指向一维数组的指针,而不是对二维数组的引用。我想避免提及它们,但这实际上是不可能的,因为它们被广泛使用(可能是因为它们可以被 C 编译器编译)。

    【讨论】:

    • 是的,一个case1中的错误消失了,但是如何在另一个fucntion中做到这一点。 [code]void case1(int (&A)[MAXROW][MAXCOL])[/code] 和case 1一样吗?
    • 或类似 void case2(int A[][])
    • 或者这个:void case2 (int A[MAXROW][MAXCOL])
    • 是的,我试过了,但它们是新错误:错误 LNK2019 未解析的外部符号 "void __cdecl case3(int (* const)[5])" (?case3@@YAXQAY04H@Z) 引用函数_main.
    • 我无法理解为什么这只适用于案例 3,4,5
    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 2017-06-03
    • 2019-09-24
    • 2011-12-26
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多