【问题标题】:How to return a 3D array of integers from a function to be used in another function in C?如何从一个函数返回一个 3D 整数数组以用于 C 中的另一个函数?
【发布时间】:2016-05-21 15:53:52
【问题描述】:

我创建了这个函数来将任何矩阵拆分成更小的矩阵,它将用于另一个函数,该函数将通过使用 for 循环继续对“容器”数组进行计算(循环通过它) 我需要知道如何正确返回“容器”数组以在另一个函数中使用(而不是在主函数中),考虑到这个函数中的参数来自另一个函数。 所以这个函数将从另一个函数接收一个数组,然后将其拆分并打包成一个 3D 数组,然后将其返回以在函数中使用来自的参数

int split_matrix(int matrix[][COL3]){
int row2, col2, row3, col3, row1, col1 , row , col , x , unwanted_col;
int container[COL3][COL3-1][COL3-1];
for (x =0, unwanted_col = 0 ; x < COL3 ; x++ , unwanted_col++){
    for (row2 = 0 , row3=0; row3 < COL3 ; row3++ ){
         for (col2=0, col3 =0; col3 < COL3; col3++){
             if (row3!=0 && col3 !=unwanted_col){
                container[x][row2][col2]= matrix[row3][col3] ;
                     col2++;
                          if (col2 == (COL3-1)){row2++;}
              }
          }
       }
}
return ?? ;}

该函数中将使用容器 3D 数组 此函数将从用户输入(主函数)接收一个 2D 数组作为参数,然后将此数组传递给上述函数,然后使用上述函数的返回值(本例中为容器 3D 数组)并继续正在处理它,如何从上述函数中的(容器 3D 数组)中提取所有元素并在此处使用它们。

void function_name(int matrix[][COL3]){
// for loop goes here to cycle through the return array and print every single element in the matrix return from the first function

如何正确返回,如何在第二个函数中使用它?

【问题讨论】:

    标签: c arrays function return


    【解决方案1】:

    假设你想返回container,目前没有办法,因为它是函数内部的一个局部变量,一旦函数返回就会超出范围。

    您基本上只有两种可能的解决方案:对数组的所有级别使用动态分配,并返回一个指针(指向指向指针的指针),但请注意,three star programmer 不被视为恭维)。

    另一种解决方案是在调用函数中声明数组数组的数组,并在参数中传递给函数,然后函数可以使用它。这是我推荐的解决方案,然后函数原型看起来像

    void function_name(int matrix[][COL3], int (*container)[COL3-1][COL3-1]);
    

    【讨论】:

    • 谢谢,我想要的是在第二个函数中使用容器数组,然后循环遍历它。
    • @John 那么以同样的方式将它传递给第二个函数?
    • 对不起,第一个函数的{return}后面应该放什么才能通过?
    • 我想在第二个函数中使用第一个函数,像这样 void function_name(int matrix[][COL3]{ split_matrix(matrix); } 然后我想使用“split_matrix(matrix)”用于进一步计算容器数组中每个元素的值。这正是我正在寻找的。​​span>
    • 和第二个函数本身我想在主函数中使用它,所以我需要它只接受一个参数。所以每次我想在主函数中使用第二个函数时,我都不能为第二个函数传递另一个参数
    【解决方案2】:

    这是一个符合要求的答案: 通过制作动态指针数组来制作3D数组。 这将允许在函数之外使用数组。 使用 malloc() 分配动态内存。 最后,释放 3D 数组以供再次使用。

    int COL;  //global variable that will be assigned a value by the user's input
    void split_matrix (int *matrix[COL]);
    
    int main ()
    {
        scanf ("%d", &COL);
        //code goes here to receive the matrix from the user
        split_matrix (the_matrix);
        return 0;
    }
    
    void split_matrix (int *matrix[COL])
    {
        int x, y;
        int ***container;
        container = malloc (COL * sizeof (int **));
        for (x = 0; x < (COL); x++) {
            container[x] = malloc ((COL - 1) * sizeof (int *));
            for (y = 0; y < (COL - 1); y++) {
                container[x][y] = malloc ((COL - 1) * sizeof (int));
            }
        }
        //code goes here to split the parameter matrix(2D array)
    
        for (x = 0; x < (COL); x++) {
            for (y = 0; y < (COL - 1); y++) {
                free (container[x][y]);
            }
            free (container[x]);
        }
        free (container);
    
    
    }
    

    【讨论】:

    • 在处理数值数组时,建议初始化所有元素,以防止在 OP 遍历数组时无意中读取未初始化的值。这可以通过在分配container[x][y] 时使用calloc 而不是malloc 轻松完成。接下来,永远不建议分配内存并且无法检查malloccalloc 的返回。这同样适用于scanf 的使用——尤其是在接受用户输入时,一般来说,对于任何提供non-void 返回的库函数。
    • 其实是程序的原型。谢谢你的笔记,我会努力的。
    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2023-04-08
    • 2014-09-16
    相关资源
    最近更新 更多