Ошибка вызова функции из процедуры СИ

Была поставлена следующая задача на СИ: Составить и отладить программу вычисления матрицы F по заданным матрицам A, B и С размера n x n. Матричные операции реализовать в виде отдельных подпрограмм.

Вот формула матрицы F = C x A + A x C x B

Я сначала решила написать целый код для вычисления формулы. Получилась основная программа и вызов процедуры. Все работает. Но когда я попыталась разделить ее на подпрограммы в виде функций, которые вызывает процедура, у меня возникла такая ошибка:

[Error] cannot convert 'int (*)[(((sizetype)(((ssizetype)n) + -1)) + 1)]' to 'int**' for argument '4' to 'int multCA(int, int**, int**, int**)'

Я решила сначала вынести одно действие в отдельную функцию, но программа перестала выполняться.

Еще объясняю свою логику написания функции умножения дву матриц С на А. Я туда переношу дополнительно матрицу F1, чтобы сохранить в ней результат и вернуть ее в процедуру для дальнейших расчетов. И с остальными я хотела аналогично написать подпрограммы, но пока я в тупике.

Я пыталась самостоятельно найти решение, но так и не поняла в чем тут проблема, может что-то не так с синтаксисом, я не поняла этот момент. Помогите исправиться, пожалуйста.

Вот код:

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <locale.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

int multCA(int n, int**C, int**A, int** F1)
{

    
    for(int i = 0; i < n; i++) // подсчет произведеия матриц C на A
    for(int j = 0; j < n; j++)
    {
        F1[i][j] = 0;
        for(int k = 0; k < n; k++)
        F1[i][j] += C[i][k] * A[k][j];
    }   
    
    
    return **F1;
}

void sum(int n, int**A, int**B, int**C)
{
    int i,j;
    int F1[n][n];
    multCA(n, C, A, F1); //вызов функции multCA
    
    int F2[n][n];
    for(i = 0; i < n; i++) // подсчет произведеия матриц A на C 
    for(j = 0; j < n; j++)
    {
        F2[i][j] = 0;
        for(int k = 0; k < n; k++)
        F2[i][j] += A[i][k] * C[k][j];
    } 
    
    int F3[n][n];
    for(i = 0; i < n; i++) // подсчет произведеия матриц (A на C) на B
    for(j = 0; j < n; j++)
    {
        F3[i][j] = 0;
        for(int k = 0; k < n; k++)
        F3[i][j] += F2[i][k] * B[k][j];
    } 
    
    int F[n][n];
    for(i = 0; i < n; i++) // подсчет произведеия матриц (A на C) на B
    for(j = 0; j < n; j++)
    {
       
        F[i][j] = F1[i][j] + F3[i][j];
    } 
    
    printf("\nРезультат\n");
    
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%d\t", F[i][j]);
        }
        printf("\n");
    }  
    
}


int main(void)
{
    int n;
    int i,j;
    srand(time(NULL));
    
    setlocale(LC_ALL,"");
    printf("Введите размер матрицы n: ");
    scanf("%d", &n);
    
    int **A = (int**)malloc(n * sizeof(int*));
    int **B = (int**)malloc(n * sizeof(int*));
    int **C = (int**)malloc(n * sizeof(int*));
    
    for (i = 0; i < n; i++)
    {
    A[i] = (int*)malloc(n * sizeof(int));
    B[i] = (int*)malloc(n * sizeof(int));
    C[i] = (int*)malloc(n * sizeof(int));
    }
    
    

    srand(time(NULL)); // генерация трех матриц
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            A[i][j] = rand() % 10;
            B[i][j] = rand() % 10;
            C[i][j] = rand() % 10;
        }
    
    
     printf("\nМатрица А:\n");
    for (i = 0; i < n; i++) // вывод матрицы А
    {
        for (j = 0; j < n; j++)
        {
            printf("%d\t", A[i][j]);
        }
        printf("\n");
    }
    
    printf("\nМатрица В:\n");
        for (i = 0; i < n; i++) // вывод матрицы В
    {
        for (j = 0; j < n; j++)
        {
            printf("%d\t", B[i][j]);
        }
        printf("\n");
    }
    
    
    printf("\nМатрица С:\n");
    for (i = 0; i < n; i++) // вывод матрицы С
    {
        for (j = 0; j < n; j++)
        {
            printf("%d\t", C[i][j]);
        }
        printf("\n");
    }    
    
    printf("\n\n");
    
    
    sum(n, A, B, C);

    
}

Ответы (1 шт):

Автор решения: Harry

Я бы делал примерно так — вынес в отдельные функции создание матриц, их уничтожение, сложение и умножение. Да, можно немного эффективнее — например, передавать готовую матрицу, но и создавать-уничтожать много времени не займет :) А главное — без этих издевательств типа передачи статического двумерного массива как динамического int**.

int ** createMatrix(unsigned int n)
{
    int **A = malloc(n * sizeof(int*));
    for(unsigned int i = 0; i < n; i++)
    {
        A[i] = malloc(n * sizeof(int));
    }
    return A;
}

void killMatrix(int**A, unsigned int n)
{
    for(unsigned int i = 0; i < n; i++)
    {
        free(A[i]);
    }
    free(A);
}

int** mult(int**A, int**B, unsigned int n)
{
    int ** R = createMatrix(n);
    for(unsigned int i = 0; i < n; i++)
        for(unsigned int j = 0; j < n; j++)
        {
            R[i][j] = 0;
            for(unsigned int k = 0; k < n; k++)
                R[i][j] += A[i][k] * B[k][j];
        }
    return R;
}

int** sum(int**A, int**B, unsigned int n)
{
    int ** R = createMatrix(n);
    for(unsigned int i = 0; i < n; i++)
        for(unsigned int j = 0; j < n; j++)
            R[i][j] = A[i][j]+B[i][j];
    return R;
}

void printMatrix(int** A, unsigned int n)
{
    for(unsigned int i = 0; i < n; i++) // вывод матрицы А
    {
        for(unsigned int j = 0; j < n; j++)
            printf("%d\t", A[i][j]);
        printf("\n");
    }
}

int main(void)
{
    unsigned int n;
    srand(time(NULL));
    printf("Введите размер матрицы n: ");
    scanf("%u", &n);

    int **A = createMatrix(n);
    int **B = createMatrix(n);
    int **C = createMatrix(n);

    for(unsigned int i = 0; i < n; i++)
        for(unsigned int j = 0; j < n; j++)
        {
            A[i][j] = rand() % 10;
            B[i][j] = rand() % 10;
            C[i][j] = rand() % 10;
        }


    printf("\nМатрица А:\n");
    printMatrix(A,n);

    printf("\nМатрица В:\n");
    printMatrix(B,n);

    printf("\nМатрица С:\n");
    printMatrix(C,n);

    int ** F = mult(C,A,n);
    int ** G = mult(A,C,n);
    int ** H = mult(G,B,n);
    killMatrix(G,n);
    G = sum(F,H,n);
    killMatrix(F,n);
    killMatrix(H,n);

    printf("\nМатрица-результат:\n");
    printMatrix(G,n);
    killMatrix(G,n);
}

См. https://ideone.com/GuVBTO

→ Ссылка