【问题标题】:Using a void pointer to an array to multiply matrices使用指向数组的 void 指针来乘以矩阵
【发布时间】:2018-10-28 23:50:48
【问题描述】:

我正在尝试在 C 中对矩阵进行乘法运算。乘法函数也称为点积函数。以下是我得到的函数和 3 个错误:

char dotProduct(void *A, void *B, int N, int i, int j) {
    char result;

    while(i < N - 1) {
        while(j < N - 1) {
            result += A[N * i + j] * B[N * i + j];                 // error: invalid operands to binary expression ('void' and 'void')

            j++;
        }

        i++;
    }

    return result;
}

void multiply(void *A, void *B, void *C, int N) {
    for(int i = 0; i < N - 1; i++) {
        for(int j = 0; j < N - 1; j++) {
            C[N * i + j] = 0;                                     // error: incomplete type 'void' is not assignable 

            for(int k = 0; k < N - 1; k++) {
                C[N * i + j] += dotProduct(A, B, N, i, j);        // error: subscripted value is not an array , pointer or vector
            }
        }
    }
}

我不确定这些错误是什么意思。例如,“下标值不是数组、指针或向量”:它是一个数组,我不知道为什么我不能做那个操作。另外,另外两个,我不明白他们的意思。有人可以详细说明吗?

【问题讨论】:

  • 如何将两个空隙相乘?为什么你甚至使用空隙?你为什么使用 char 作为结果?
  • @kingW3 我使用 voids 因为我没有传递数组的类型
  • 你没有什么?被传递的数组的类型?你的句子中缺少一个动词(你不知道?)voidvoid,你不能有void a; 变量,如果是通用指针,void* 类型- 它不是指针,不是数组,也不是向量(C 中没有向量这样的想法)。您可以从研究qsort 函数实现开始,了解如何编写 C 程序来处理泛型类型。

标签: c matrix matrix-multiplication


【解决方案1】:

如果你要使用void,你还需要传递数组的步幅,否则元素的间距是未知的。如果您使用 8、16 或 32 位浮点数(或整数),则需要表达这一点,否则编译器不知道元素之间的间距是多少,也不知道指针增量应该在内存中多远.即使您大步通过,当您将两个 void 相乘时,编译器也不知道您的意思。

如果我在 C 中执行此操作,我可能会写出类型化版本,或者像这样模拟 C++ 模板:

#define DEFN_DOT_PRODUCT(TYPE, suffix) TYPE dotProduct##suffix(TYPE *A, TYPE *B, int N, int i, int j) { \
    TYPE result = 0; \
    while(i < N - 1) { \
        while(j < N - 1) { \
            result += A[N * i + j] * B[N * i + j]; \
            j++; \
        } \
        i++; \
    } \
    return result; \
}
DEFN_DOT_PRODUCT(int, i);
DEFN_DOT_PRODUCT(float, f);
DEFN_DOT_PRODUCT(double, d);
#undef DEFN_DOT_PRODUCT

/* use */
dotProducti(/* whatever */)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2013-05-27
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多