c - 如何从函数返回双指针并将其作为输入发送到另一个函数?
问题描述
我是编程新手,正在尝试使用两个函数进行矩阵(二维数组)操作,其中一个函数的输出是下一个函数的输入。但是,我找不到将值从一个函数正确传递到另一个函数的方法。当我在 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 () 中读取并在那里打印时相同,但事实并非如此。
解决方案
看看这个问题。您遇到了同样的潜在问题。
车削
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 中。您的代码包含一些可能的问题来源,例如上述问题。
推荐阅读
- sql - 无法显示数据 PostgreSQL 的货币格式
- flutter - 颤动下拉列表不存储选择值
- python - 如何使用 Keras 中的训练模型预测图像的输入概率?
- python - 使用python将对象附加到列表中会抛出对象内存地址而不是对象内部的数据
- ios - 有没有办法获得由 UICollectionViewDropCoordinator.drop(_:to:) 创建的 UICollectionViewCell?
- android - 使用 viewpager 时片段未全屏显示
- r - 使用 unicode 字符作为形状
- angular - ngx-translate 对象插值
- websocket - Websockets+单实例+交叉表通信的最佳方式?
- android - Android:当使用 PageKeyedDataSource 和 PagedList 时,如何在列表到达底部时添加更多数据?