首页 > 解决方案 > 如何从函数返回双指针并将其作为输入发送到另一个函数?

问题描述

我是编程新手,正在尝试使用两个函数进行矩阵(二维数组)操作,其中一个函数的输出是下一个函数的输入。但是,我找不到将值从一个函数正确传递到另一个函数的方法。当我在 main() 中打印第一个函数的输出时,它们是正确的,但是当我将它们输入到第二个函数并打印它们时,这些值没有意义。我已经尝试了很多方法,但由于我缺乏对双指针的理解,它可能会失败。我很感谢任何提示或建议!

#include <stdio.h>
#include <stdlib.h>

int** td (int r_in, int c_in, int r_p, int c_p, int input[][c_in],int params[][c_p]){
    int i, j, k;
    int**y_td;
    // memory allocation
    y_td = (int*)malloc(sizeof(int*)*r_in);
    for (i=0; i < r_in; i++){
        y_td[i] = (int*)malloc(sizeof(int)*c_p);
    }

    //
    for (i=0; i < r_in; i++){
        for (j=0; j < c_p; j++){
            y_td[i][j]=0; // Initialization
            for (k=0; k < c_in; k++){
                y_td[i][j]+= input[i][k]*params[k][j];
            }
        }
    }
    return y_td;
}


int** cnv (int r_in, int c_in, int filter, int f_size, int input[][c_in], int params[][f_size][c_in]){
    int x,i,j,k,l,m,n;
    int min_len = ((r_in < f_size)? r_in:f_size);
    int max_len = ((r_in > f_size)? r_in:f_size);
    int r_out = max_len - min_len + 1;//rows_out
    int kernel;
    int** y_cnv;

    // Print input to check if it was correctly transmitted to the function
    printf("Input CV (should be equal to TD result):\n");
    for (i=0;i<r_in;i++){
        for (j=0;j<c_in;j++){
            printf("%d ", input[i][j]);
        }
        printf("\n");
    }
    printf("\n\n");

    //memory allocation
    y_cnv = (int*)malloc(sizeof(int*)*r_out);
    for (i=0; i < r_out; i++){
            y_cnv[i] = (int*)malloc(sizeof(int)*filter);
    }
    //
    for (i=0; i < filter; i++){
        for (k=0; k < r_out; k++){
            y_cnv [k][i]=0; //initialize
        }
        for (j = 0; j < c_in; j++){
            for (n = min_len-1; n < max_len; n++){
                x = n-min_len+1;
                for (m= 0; m < r_in; m++){
                    kernel = (((n-m) < min_len && (n-m) >= 0)? params[i][n-m][j]:0);
                    y_cnv[x][i] += input[m][j]*kernel;
                }
            }
        }
    }
    return y_cnv;
}

int main() {
    // create test arrays
    int A [4][2]= {{1,1},{2,2},{3,3},{4,4}};
    int B [2][3]= {{1,2,3},{2,3,4}};
    int C [2][2][3]= {{{1,1,1},{2,2,2}},{{3,3,3},{4,4,4}}};

    int** matrix;
    int i, j;
    matrix = td(4,2,2,3,A,B);

    // print the result of first function, which is input in 2nd function
    printf("The TD result is:\n");
    for (i=0;i<4;i++){
        for (j=0;j<3;j++){
           printf("%d ",matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n\n");

    matrix = cnv(4,3,2,2,matrix,C);

    return 0;
}

我希望在第一个函数 td () 之后在 main () 中打印的矩阵与我在第二个函数 cnv () 中读取并在那里打印时相同,但事实并非如此。

标签: c

解决方案


看看这个问题。您遇到了同样的潜在问题。

车削

int** cnv (int r_in, int c_in, int filter, int f_size, int input[][c_in], int params[][f_size][c_in])

进入

int** cnv (int r_in, int c_in, int filter, int f_size, int** input, int params[][f_size][c_in])

解决您要求的问题。

原因是您分配了y_td在第一个函数中调用的指针数组。每个指针都是一个数字,命名您存储一些实数的内存段。通过使用int input[][c_in]你告诉计算机将这些指针解释为整数,当你打印它们时,你会得到内存中的地址而不是预期值,因为 theninput[x][y]被转换为*((int *)input+x*c_in+y).

请允许我再发表评论:您应该遵循问题下方的评论并注意所有编译器警告:如果有警告,您应该将其视为编译器错误,除非您确切知道自己在做什么,尤其是在 C 中。您的代码包含一些可能的问题来源,例如上述问题。


推荐阅读