Как приписать значения из матричных указателей в функции - PullRequest
0 голосов
/ 18 октября 2019

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

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

//Here I create a function to transpose the matrix
//I receive a pointer to a double matrix
void transpose(double *matrix[][5], int size)
{
    //I create a second matrix
    double transposed[size][5];
    //I transpose the original matrix into the transposed matrix
    for (int i=0; i<=size-1; i++)
    {
        for (int j=0; j<=4; j++)
        {
            transposed[j][i] = *matrix[i][j];
        }
    }
    //I attribute the values from the transposed matrix to the original matrix
    for (int i=0; i<=size-1; i++)
    {
        for (int j=0; j<=4; j++)
        {
            *matrix[i][j] = transposed[i][j];
        }
    }

}

int main()
{
    //Here I create a matrix and ask for the user to type its values
    double matrix[5][5];
    for (int i=0; i<=4; i++)
    {
        for (int j=0; j<=4; j++)
        {
            printf("Position [%d][%d]", i+1, j+1);
            scanf("%lf", &matrix[i][j]);
        }
    }
    //I use the function
    //I print the matrix after using the function
    transpose(matrix, 5);
    printf("Transposed:\n");
    for (int i=0; i<=4; i++)
    {
        for (int j=0; j<=4; j++)
        {
            printf("%lf   ", matrix[i][j]);
        }
        printf("\n");
    }
}

1 Ответ

0 голосов
/ 18 октября 2019

Предупреждение компилятора об «уровнях косвенности» должно было вас предупредить. Функция должна быть

void transpose(double matrix[][5], int size)

, а остальные * звезды тоже должны быть удалены.

transposed[j][i] = matrix[i][j];
...
matrix[i][j] = transposed[i][j];


В сторону: ваши пределы управления циклом не идиоматичны. Это i<=size-1; лучше, чем i<size; (и может быть ошибочным).

Если вы жестко закодировали предел, такой как j<=4, не сразу видно, что это на самом деле 5-1, и если выиспользовал j<5, что было бы более очевидно, что это тот же 5, что и в измерении массива.

Если вы решите заменить это измерение значением #define или const int, выПридется выследить 4 с, а также 5 с.

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