试图为任意大小的矩阵编写矩阵乘数

lon*_*oat 2 c arrays matrix

试图在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!),我稍后会再看一遍.我对最新版本的任何进一步批评表示赞赏,但我现在已经回答了这个问题并继续进行了进一步的阅读.再次感谢!

cni*_*tar 5

如果我理解你正确的问题,你可以做类似的事情

int **a = A;
Run Code Online (Sandbox Code Playgroud)

你为什么使用void *而不是int **A直接使用?

编辑1

根据下面的评论:请参阅此FAQ条目(f3是您想要的).还有这个.

编辑2

声明并初始化它们(某事物)如下:

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)