尝试在 C 中为任意大小的矩阵编写矩阵乘法函数。我正在尝试以下函数签名:
void matrixMult(void *A, int Xa, int Ya, void *B, int Xb, int Yb);
(在我对其进行故障排除时,它现在正在返回 void,一旦它按照我想要的方式工作,我将在稍后进行适当的返回)
X 和 Y 参数旨在告知函数传入数组的维度(据我了解,这是必要的,因为在 C 中数组不知道自己的大小)。所以我传入了两个 void 指针 A 和 B,以及它们的尺寸。
我的问题: 进入函数后,如何将 void 指针转换回 int 数组以便读取它们?我尝试了以下方法:
(int)*A[someX][someY]
,但我收到有关“无效指针的无效使用”的编译器错误。
编辑
以下是我目前的全部功能(在我对其进行故障排除时进行更新):
#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");
}
}
编辑 2 感谢您提供提示和资源!上面发布的版本正如我现在所期望的那样工作,但我担心它是如何使用指针的丑陋 SCSS 。现在我要继续阅读有关指针的内容(感谢 cnicutar!),稍后我会重新讨论。对我的最新版本的任何进一步批评表示赞赏,但我将其标记为已回答并继续进行进一步阅读。再次感谢!
最佳答案
如果我理解你的问题你可以做类似的事情
int **a = A;
为什么你使用 void *
而不是 int **A
直接?
编辑 1
根据以下评论:见 this FAQ entry (f3
是你想要的)。还有this one .
编辑 2
像这样声明和初始化它们(一些东西):
int **a;
a = malloc(sizeof(*a) * 3);
for (i = 0; i < 3; i++) {
a[i] = malloc(sizeof(int) * 5);
}
关于c - 尝试为任意大小的矩阵编写矩阵乘法器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6378905/