试图在C中为任意大小的矩阵编写矩阵乘法函数.我正在尝试以下函数签名:
void matrixMult(void *A, int Xa, int Ya, void *B, int Xb, int Yb);
Run Code Online (Sandbox Code Playgroud)
(现在,当我对其进行故障排除时,它将返回无效状态,一旦我按照我希望的方式工作,我将在以后做出正确的返回)
X和Y参数用于告知函数传入数组的维数(根据我的理解,这是必要的,因为在C数组中不知道它们自己的大小).所以我传递了两个无效指针A和B,以及它们的尺寸.
我的问题: 一旦我进入函数,我该如何将void指针转换回int数组,以便我可以读取它们?我尝试了以下方法:
(int)*A[someX][someY]
Run Code Online (Sandbox Code Playgroud)
,但我收到有关"无效使用void指针"的编译器错误.
编辑
以下是我现在的全部功能(更新,因为我正在排除故障):
#pragma warning(disable: 8057)
#include <stdio.h>
void matrixMult(int **A, int Xa, int Ya, int **B, int Xb, int Yb);
int main(int argc, char *argv[]) {
// [x][y] x--> row; y-->cols
int a[3][5] = {
{ 1, 2, 3, 4, 5 }
, { 10, 20, 30, 40, 50 }
, { 4, 8, 15, 16, 23 }
};
int b[5][7] = {
{ 1, 2, 3, 4, 5, 6, 7 }
, { 10, 20, 30, 40, 50, 60, 70 }
, { 4, 8, 15, 16, 23, 42, 0 }
, { 1, 2, 3, 4, 5, 6, 7 }
, { 10, 20, 30, 40, 50, 60, 70 }
};
matrixMult((int **)a, 3, 5, (int **)b, 5, 7);
printf("done\n");
return 0;
}
void matrixMult(int **A, int Xa, int Ya, int **B, int Xb, int Yb) {
printf("starting matrix mult\n");
int i, j;
for (i=0; i<Xa; i++) {
for (j=0; j<Ya; j++) {
//printf("%i, %i:\t", i, j);
printf("%i\t", A[Ya*i+j]);
}
printf("\n");
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2 感谢您的提示和资源!上面发布的版本的工作方式与我现在的预期相同,但我担心如何使用指针是一个丑陋的混蛋.现在我要去做一些关于指针的阅读(感谢cnicutar!),我稍后会再看一遍.我对最新版本的任何进一步批评表示赞赏,但我现在已经回答了这个问题并继续进行了进一步的阅读.再次感谢!
如果我理解你正确的问题,你可以做类似的事情
int **a = A;
Run Code Online (Sandbox Code Playgroud)
你为什么使用void *而不是int **A直接使用?
根据下面的评论:请参阅此FAQ条目(f3是您想要的).还有这个.
声明并初始化它们(某事物)如下:
int **a;
a = malloc(sizeof(*a) * 3);
for (i = 0; i < 3; i++) {
a[i] = malloc(sizeof(int) * 5);
}
Run Code Online (Sandbox Code Playgroud)