Использование пустого указателя на массив для умножения матриц - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь умножить матрицы на 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
            }
        }
    }
}

Я не уверен, что означают эти ошибки. Например, «подписанное значение не является массивом, указателем или вектором»: это массив, я не знаю, почему я не могу выполнить эту операцию. Кроме того, другие 2, я не понимаю, что они имеют в виду. Может кто-нибудь уточнить, пожалуйста?

1 Ответ

0 голосов
/ 29 октября 2018

Если вы собираетесь использовать 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 */)
...