Ошибка в умножении вектора матрицы - недопустимые операнды в двоичном * (имеют «double *» и «double *») - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь умножить большую и случайную матрицу (NxN) и случайный вектор (N), используя указатели. Почему я получаю сообщение об ошибке типа "недопустимые операнды в двоичном * (имеют 'double *' и 'double *')"? Ошибка, кажется, в ptr3 [i] [j] = ptr3 [i] + ptr1 [i] * ptr2 [k]; но я не могу понять, почему это не работает. Я новичок в C, так что я до сих пор не очень хорошо получаю указатели.

int main ()
{
    time_t t;
    double **ptr1, **ptr2, **ptr3;
    int i, j, k;
    int N = 500;
    ptr1 = (double **) malloc (sizeof (double *) * N);
    ptr2 = (double **) malloc (sizeof (double *) * N);
    ptr3 = (double **) malloc (sizeof (double *) * N);

    for (i = 0; i < N; i++)
        ptr1[i] = (double *) malloc (sizeof (double) * N);
    for (i = 0; i < N; i++)
        ptr2[i] = (double *) malloc (sizeof (double) * N);
    for (i = 0; i < N; i++)
        ptr3[i] = (double *) malloc (sizeof (double) * N);

    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            ptr1[i][j] = rand ();
        }
    }
for (i = 0; i < N; i++) {
            *ptr2[i] = rand ();
    }
    t = clock();

    for (i = 0; i < N; i++) {

            ptr3[i] = 0;
            for (k = 0; k < N; k++)
                ptr3[i] = ptr3[i] + ptr1[i][k] * ptr2[k];

    }

   t = clock() - t;
    double time_taken = ((double)t)/CLOCKS_PER_SEC;
    printf("Tempo:  %f segundos \n", time_taken);

 printf ("\n");
    return (0);
} ```

1 Ответ

0 голосов
/ 18 апреля 2019

Компилятор говорит, что в операторе ptr3[i] = ptr3[i] + ptr1[i] * ptr2[k]; бит, который говорит ptr1[i] * ptr2[k], пытается * между двумя выражениями типа double*.Другими словами, вам не разрешено умножать два указателя вместе.Чтобы сделать это правильно, вам нужно снова разыменовать ([i] и [k] уже разыменовывают от double** до double*).Чтобы это скомпилировать, нужно добавить следующее утверждение (я добавил скобки для ясности - они на самом деле не нужны):

*ptr3[i] = (*ptr3[i]) + (*ptr1[i]) * (*ptr2[k]);

Это должно привести к компиляции, но следующая проблема, которую вы запуститев это ошибка сегментации.Две строки над местом, где вы выполняете умножение, у вас есть это:

ptr3[i] = 0;

Это присваивает ptr3[i] нулевой указатель , который совпадает с 0в C (другие языки имеют другое имя этого значения: null, None и т. д.).Я думаю, что вы хотели сделать здесь:

*ptr3[i] = 0;

В качестве отступления, поскольку N - известное фиксированное значение, вы можете не работать со всеми вещами mallocпросто сказав:

const int N = 500;
double ptr1[N][N];
double ptr2[N][N];
// ... and so on ...

Это объявляет ptr1 как массив вместо указателя, который идентичен указателю с точки зрения шаблонов доступа к памяти, но отличается по-разному .В зависимости от того, что вы пытаетесь выучить, отсутствие динамической памяти (использование malloc и free) может сэкономить вам немного головной боли.

...