Ошибка указателя на многомерный массив: выражение должно иметь тип указатель на объект - PullRequest
0 голосов
/ 07 июня 2018

Следующий код возвращает ошибку: выражение должно иметь тип указатель на объект.почему-то проблема заключается в том, как я ссылаюсь на параметры A, B и какие из них указывают на двумерный массив.Любая помощь будет высоко ценится.

Цель состоит в том, чтобы умножить два массива.

#include <stdio.h>

void matrixmul(const float *A, const float *B, int m, int n, int k, float *out)
{
    float value = 0.0;

    int x, y, z;

    for (x = 0; x < k; x++) {
        for (y = 0; y < m; y++) {
            for (z = 0; z < n; z++) {

                    float product = A[y][z] * B[z][y];
                    value = value + product;
                    printf("%lf", value);
                }
                out[y][x] = value;
                value = 0;
            }
        }
    }

    int main(void) {
        float a[2][3] = {
            { 1.0,2.0,1.0 },
            { 3.0,4.0,1.0 }
        };


        float b[3][1] = {1, 2, 3};

        float array[2][1]; 
        matrixmul((float *) a, (float *) b, 2, 3, 1, (float *) array);
        return 0;
    }

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Функция не знает размеры вашего массива, поэтому она не знает, как вычислить адрес значения, заданного строкой и столбцом.Однако вы можете использовать аргументы функции для определения размеров вашей матрицы.Вам придется переставить аргументы в вашей функции так, чтобы аргументы, определяющие размеры, появлялись перед массивом.Используя вашу функцию, это может выглядеть примерно так:

void matrixmul(int m, int n, int k, const float A[m][n], const float B[n][m], float out[m][k])

Кстати, я не совсем полностью прочитал функцию, но out[y][k] = value; должен быть out[y][x] = value;?

0 голосов
/ 07 июня 2018

Поскольку A объявлено как const float *A в функции, A[y][z] является недопустимым термином.A[y] соответствует типу const float.Вы не можете использовать оператор массива, [z], с плавающей точкой.

Та же проблема возникает с B и out.

Вы можете определить функцию как

void matrixmul(const float A[][3], const float B[][1], int m, int n, int k, float out[][1])
{
  ...
}

и вызовите функцию просто как:

matrixmul(a, b, 2, 3, 1, array);

C99 / C11 поддерживают массивы переменной длины.Предполагая, что вы можете использовать компилятор, который поддерживает C99 / C11, вы можете определить функцию как

void matrixmul(int arows, int acols, int bcols,
               const float A[arows][acols],
               const float B[acols][bcols],
               float out[arows][bcols])
{
  ...
}

и вызвать функцию, используя

matrixmul(2, 3, 1, a, b, array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...