【问题标题】:c++ error: invalid types 'int[int]' for array subscriptc++错误:数组下标的无效类型'int [int]'
【发布时间】:2011-05-29 01:38:46
【问题描述】:

尝试学习 C++ 并完成一个简单的数组练习。

基本上,我已经创建了一个多维数组,并且我想创建一个打印出值的函数。

在 Main() 中注释的 for 循环工作正常,但是当我尝试将该 for 循环转换为函数时,它不起作用,而且在我的一生中,我不明白为什么。

#include <iostream>
using namespace std;


void printArray(int theArray[], int numberOfRows, int numberOfColumns);

int main()
{

    int sally[2][3] = {{2,3,4},{8,9,10}};

    printArray(sally,2,3);

//    for(int rows = 0; rows < 2; rows++){
//        for(int columns = 0; columns < 3; columns++){
//            cout << sally[rows][columns] << " ";
//        }
//        cout << endl;
//    }

}

void printArray(int theArray[], int numberOfRows, int numberOfColumns){
    for(int x = 0; x < numberOfRows; x++){
        for(int y = 0; y < numberOfColumns; y++){
            cout << theArray[x][y] << " ";
        }
        cout << endl;
    }
}

【问题讨论】:

标签: c++


【解决方案1】:

C++ 继承自 C 的语法,并努力保持语法匹配的向后兼容性。所以传递数组就像 C 一样:长度信息丢失了。

但是,C++ 确实提供了一种使用引用自动传递长度信息的方法(没有向后兼容性问题,C 没有引用):

template<int numberOfRows, int numberOfColumns>
void printArray(int (&theArray)[numberOfRows][numberOfColumns])
{
    for(int x = 0; x < numberOfRows; x++){
        for(int y = 0; y < numberOfColumns; y++){
            cout << theArray[x][y] << " ";
        }
        cout << endl;
    }
}

演示:http://ideone.com/MrYKz

这是一个避免复杂数组引用语法的变体:http://ideone.com/GVkxk

如果大小是动态的,则不能使用任一模板版本。您只需要知道 C 和 C++ 以行优先顺序存储数组内容。

适用于可变大小的代码:http://ideone.com/kjHiR

【讨论】:

  • 为了迂腐,使用引用增加向后兼容性问题,因为C没有引用:P
  • @Tomalek:向后兼容性表明现有的有效 C 代码在编译为 C++ 时仍应执行相同的操作。这不是有效的 C 代码,因此不需要与 C 的行为方式相同。
  • printArray(*sally, 2, 3); 的实现正是我所暗示的……但我完全错了!感谢这条鱼。
  • @corlettk:哦,好吧....我以为你的意思是锯齿状数组样式,我看了你的评论两次。带有*sally 的版本确实需要在编译时知道尺寸(第一个除外),它们只是隐藏在编译器推断的T 类型中。
【解决方案2】:

由于theArray是多维的,你应该在函数原型中指定它所有维度的边界(除了第一个):

void printArray(int theArray[][3], int numberOfRows, int numberOfColumns);

【讨论】:

  • 做到了!感谢您的帮助!
  • ... 或将矩阵作为指向 int 数组的指针数组传递...这是您不知道时的一种选择(在“写​​入时间”,即当您编写 printArray 方法)后续维度是什么。另一种选择是#define the following-dimension(s)。如果可能,我更喜欢后一种方法。
  • @corlettk:C++(或 C)多维数组不是指针数组。
  • @corlettk:这并不是说你不能那样做,你只需要先设置指针数组。
【解决方案3】:

我知道这篇文章的发布日期,但只是为了完整起见,也许是为了将来参考,以下是另一种解决方案。尽管 C++ 提供了许多标准库工具(参见 std::vectorstd::array),与内置数组内在低级概念相比,在这种情况下程序员的工作更轻松,但如果您需要调用 printArray像这样:

printArray(sally, 2, 3);

你可以这样重新定义函数:

void printArray(int* theArray, int numberOfRows, int numberOfColumns){
    for(int x = 0; x < numberOfRows; x++){
        for(int y = 0; y < numberOfColumns; y++){
            cout << theArray[x * numberOfColumns + y] << " ";
        }
        cout << endl;
    }
}

特别注意第一个参数和下标操作:

  • 该函数接受一个指针,因此您传递多维数组的名称,该名称也是其第一个元素的地址。

  • 在下标操作 (theArray[x * numberOfColumns + y]) 中,我们访问将多维数组视为唯一行数组的顺序元素。

【讨论】:

  • 正是我正在寻找的。你能多解释一下你计算括号之间的公式的方式吗?
  • @Cătălina Sîrbu,如结束列表的第二点所述,如果您将数组视为一维数组,则该公式将返回当前元素的整数。如果还不清楚,您应该先了解数组,特别是多维数组是如何有效地存储在内存中的。如果您需要进一步的解释,请告诉我。
  • 我终于明白了
【解决方案4】:

如果您将数组作为参数传递,则必须指定除第一个暗淡之外的维度大小。编译器需要这些来计算数组中每个元素的偏移量。说你可以让printArray点赞

void printArray(int theArray[][3], int numberOfRows, int numberOfColumns){
    for(int x = 0; x < numberOfRows; x++){
        for(int y = 0; y < numberOfColumns; y++){
            cout << theArray[x][y] << " ";
        }
        cout << endl;
    }
}

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 2022-01-05
    • 1970-01-01
    • 2015-09-26
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多