C-в чем проблема с этим кодом?Я пытаюсь умножить одну матрицу в другой матрице в Func и получить новую матрицу, но я получаю ошибку сегментации - PullRequest
0 голосов
/ 11 декабря 2018

Это программа, над которой я работаю.Задача состоит в том, чтобы умножить 2 матрицы.Количество столбцов в матрице A совпадает с количеством строк в матрице B. Я даю пользователю возможность вставить то, что содержат две матрицы.это мой код:

#include <stdio.h>
void multiplyMat(int n,int p,int c,int m,int d,int q,int k,int **multiply, 
int **first,int **second);
int main()
{
  int m, n, p, q, c, d, k;
  int first[10][10], second[10][10], multiply[10][10];

  printf("Enter number of rows and columns of first matrix\n");
  scanf("%d%d", &m, &n);
  printf("Enter elements of first matrix\n");

  for (c = 0; c < m; c++)
    for (d = 0; d < n; d++)
      scanf("%d", &first[c][d]);

  printf("Enter number of rows and columns of second matrix\n");
  scanf("%d%d", &p, &q);

  printf("Enter elements of second matrix\n");

  for (c = 0; c < p; c++)
     for (d = 0; d < q; d++)
        scanf("%d", &second[c][d]);

multiplyMat(n,p,c,m,d,q,k,multiply,first,second);
printf("Product of the matrices:\n");

for (c = 0; c < m; c++) {
  for (d = 0; d < q; d++)
    printf("%d\t", multiply[c][d]);
printf("\n");
}
return 0;
}

void multiplyMat(int n,int p,int c,int m,int d,int q,int k,int **multiply, 
int **first,int **second){
    int sum=0;
    if (n == p){
        for (c = 0; c < m; c++) {
           for (d = 0; d < q; d++) {
                for (k = 0; k < p; k++) {
                    sum = sum + first[c][k]*second[k][d];
                }

            multiply[c][d] = sum;
            sum = 0;
            }
        }
    }
    else
        printf("The matrices can't be multiplied with each other.\n");

}

Я получаю «ошибку сегментации».это случилось, когда код попал в "sum = sum + first [c] [k] * second [k] [d]" что я делаю, что вызывает это?возможно, это произошло потому, что я использую неправильное определение указателей.

1 Ответ

0 голосов
/ 11 декабря 2018

int **multiply - это «указатель на указатель на целое число», также интерпретируемый как «указатель на массив указателей на целые числа».

То есть int **multiply и int *multiply[] одинаковы, и вы можете использовать i= multiply[1][3]; Компилятор разыменовывает multiply, добавляет размер указателя 1, затем разыменовывает этот элемент и добавляет размер 3 дюйма, затем получает это int и присваивает ему i.

Но вы передаете 2-мерный массив.Двумерный массив не является массивом столбцов, содержащих указатели на строки.Это просто блок памяти, в котором у вас есть столбцы, умноженные на ряды, аккуратно расположенные один за другим.

Теперь вы создаете функцию для умножения.Но эта функция не знает, сколько столбцов в строке.Таким образом, компилятор не может оценить multiply[1][2] как третий элемент второй строки multiply[10][10].

Для достижения желаемого есть три возможности:

  1. объявлятьматрица с размером в вашей функции размера строки, например, multiply[][10].Это позволяет компилятору выполнять вычисления адресов внутри ваших функций (вы все равно должны указать количество строк)

  2. с современными компиляторами вы можете динамически указывать размеры массива:

    f(int rows, int cols, int a[rows][cols])
    
  3. выполните вычисления адреса самостоятельно.(Я не буду вдаваться в эту опцию; надеюсь, у вас есть современный компилятор).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...