Как передать указатель массива [5] [5] в функцию, для которой требуется двойной указатель того же массива? - PullRequest
0 голосов
/ 01 июня 2019

Я делаю программу, которая может вычислять квадратную матрицу, умноженную на свои собственные элементы несколько раз, и может печатать элементы.

Чтобы сделать это, я хочу дать указатель массива функции, которая требует двойного указателя, но массив, который я хочу заполнить вычисляемыми элементами, становится NULL, поэтому я нахожусь в потеря.

Я пытался понять, как работают указатели, и изменил массив на указатель массива или указатель на указатель на массив, но я не мог понять, как он работает.

#include <stdio.h>
#include <stdlib.h>

#define row 5
#define col 5
#define max 5
void input_matrix(float [][col], int n);
void output_matrix(float [][col], int n);
void multiply_matrix(float [][col], float [][col], float [][col], int n);
void power_matrix(float (**)[max],float [][col], int n, int k);
float A[row][col];
float B[row][col];
float ak[row][col];
int i, j, k, l, n;

int main() {
    printf("What order square matrix do you want?\n");
    scanf("%d", &n);
    scanf("%d", &k);

    if(n > max) {
        fprintf(stderr, "Make it less than 5 digits.\n");
        return -1;
    }

    input_matrix(A, n);
    power_matrix(ak, A, n, k);
    output_matrix(A, n);

    return 0;
}

void input_matrix(float a[][col], int n) {
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            printf("Enter the element of row %d column %d.\n", i+1, j+1);
            scanf("%f", &a[i][j]);
        }
    }
}

void output_matrix(float a[][col], int n) {
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            printf("%f ", a[i][j]);printf("\n");
        }
    }
}

void multiply_matrix(float ak[][col], float a[][col], float b[][col], int n){
for(i=0;i<n;i++){
    for(j=0;j<n;j++){
        for(l=0;l<n;l++){
            ak[i][j]+=a[i][l] * b[l][j];
        }
    }
}

}

void power_matrix(float (**ak)[col],float a[][col], int n, int k){
float (*x)[max], (*y)[max];
switch(k){
    case 1:
        *ak=a;
        break;

    case 2:
        multiply_matrix(*ak, a, a, n);
        break;

    default:
        multiply_matrix(*ak, a, a, n);
        for(i=3;i<=k;i++){
            x=*ak;
            y=B;
            multiply_matrix(y, a, x, n);
            *ak=y;
        }
}
}

Я ожидаю, что результат будет, как,

4.000000
4.000000
4.000000
4.000000

при вводе

2 2
1
1
1
1
...