【发布时间】:2011-09-16 18:13:43
【问题描述】:
尝试在 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 感谢您提供提示和资源!上面发布的版本正如我现在所期望的那样工作,但我担心它是如何使用指针的丑陋混蛋。现在我要对指针做更多的阅读(感谢 cnicutar!),稍后我会重新讨论。对我的最新版本的任何进一步批评表示赞赏,但我将其标记为已回答并继续进行进一步阅读。再次感谢!
【问题讨论】:
-
使用该签名,您不能使用双数组表示法,因为编译器不知道数组行有多大。您将不得不使用指针算法。
-
int[5][7]更像int*而不是int**。将您的函数更改为int*,并在访问元素时使用a[x+y*width]。 -
@Banthar 但那会是 UB 吗?更不用说不清楚了。
-
@Daniel:我认为没有其他方法可以动态访问静态多维数组。
-
由于他的维数是常数(2D),所以永远是双指针。