【问题标题】:function with arrays with 2 dimensions in c++在 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 答案感兴趣,您应该创建一个单独的问题。

标签: c++ arrays function


【解决方案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
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        相关资源
        最近更新 更多