在 C++ 中具有二维数组的函数

Posted

技术标签:

【中文标题】在 C++ 中具有二维数组的函数【英文标题】:function with arrays with 2 dimensions in c++ 【发布时间】:2013-06-29 23:10:03 【问题描述】:

我有一个乘法数组的函数。函数是multiply

void multiply(int array1[][], array2[][]);

但它不起作用。

例如我要数组

int array1[4][10]
int array2[10][6]
multiply(arra1[4][10], array2[10][6])

但它不起作用。

我需要任意大小的调用函数。

稍后我需要调用函数:

int array3[5][5]
int array4[5][5]
multiply(arra1[5][5], array2[5][5])

如何获取函数中的数组?

多维数组必须对除第一个维度之外的所有维度都有边界

我需要可变行和可变列

【问题讨论】:

你用 C 和 C++ 标记了这个,但在标题中询问了 C++。每个问题你应该只问一个问题,因为这个问题的答案与 C 和 C++ 不同。应该从这个问题中删除 C 标记,如果您对 C 答案感兴趣,您应该创建一个单独的问题。 ***.com/questions/1719051/… 或 ***.com/questions/4767190/… 或许多其他的可能重复。 【参考方案1】:

您似乎使用了 multiply 函数,就像它的定义是这样的: void multiply(int number1, int number2); 也许您应该发布乘法函数的完整定义

【讨论】:

【参考方案2】:

使用 std::vector 对数组建模,除非您有使用数组的特定原因。 示例:

vector< vector<int> > myArray1(3, vector<int>(2,0));
vector< vector<int> > myArray2(3, vector<int>(2,0));

// ... 

vector< vector<int> > multiply(vector< vector<int> > &myArray1, 
                               vector< vector<int> > &myArray2) 

    vector< vector<int> > result(myArray1.length(), myArray2[0].length());

    for(int i = 0; i < myArray1.length(); i++)
        for(int j = 0; j < myArray1[i].length(); j++)
            // ...
        
    

    return result;

【讨论】:

【参考方案3】:

C 风格的数组并不是真正的数组,而是一组指针数学技巧。您根本无法从函数中返回这样的数组,而传入实际上只是在引擎盖下传递了一个指针。

由于指针适用于简单数组并且使用相同的语法,我们可以忘记这种差异。在这种情况下,参数中的数组 externt 将被完全忽略。

对于 2D 数组,它的工作方式将不再相同,因为要使指针数学工作,您必须传递适当的“切片”。因此,除了第一个数组范围之外的所有范围都是强制性的。您可以像以前一样将第一个留空或与任何数字一起使用。

当然,要使函数真正有用,您必须将第一个范围也作为单独的参数传递,除非函数可以以某种方式从数据中找出它。

void multiply(const int in_array1[][10], const int in_array2[][10], int rows, int out_array[][10]);

可能是一个很好的函数,可以将具有 10 列和可变行的数组相乘。

如果您需要全变量,只需传入 (int* arr, int rows, int cols) 并自己计算单元格位置。

【讨论】:

但我需要可变行和可变列 但如果我只是传入 (int* arr, int rows, int cols) 并计算单元格位置,请告诉我:数组下标的无效类型 'int[int]' 尝试类似 arr[5*cols + 6]【参考方案4】:

您可以使用multiply() 的模板定义来完成此操作。

template <unsigned L, unsigned M, unsigned N>
void multiply (int (&array1)[L][M], int (&array2)[M][N]) 
    //...


int main () 
    int array1[4][10];
    int array2[10][6];
    int array3[2][2];
    multiply(array1, array2);  // ok, inner dimensions match
    multiply(array1, array3);  // fail, inner dimensions don't match

数组的维度将由模板函数调用的类型推导确定。

【讨论】:

以上是关于在 C++ 中具有二维数组的函数的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 sizeof() 循环二维数组 [重复]

c++返回二维数组的最大元素和它所在的行、列号?

C++:使用函数为二维数组分配内存时出错

将二维字符串数组传递给函数时出错 (C++)

无法在函数 C++ 中打印二维数组

C++:使用迭代器构造一个二维动态分配的数组