Используйте двойной указатель, чтобы создать функцию для выполнения матричной операции. - PullRequest
0 голосов
/ 13 мая 2018

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

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

static double P[4][4]={ { 1,   0,   0,   0},
                        { 0,   1,   0,   0},
                        { 0,   0,   1,   0},
                        { 0,   0,   0,   1}                       
                      };
double **P_M;
void show_matrix(int n,int m,double **matrix)
{
    int i,j;
    printf("\n The matrix is:\n");
    for (i=0;i<n;i++)
    {
        for (j=0;j<m;j++);
        printf(" \t",&matrix[i][j]);
        printf("\n");
    }
}

double matrix( int n, int m, double **matrix)
{
    int row;
    /*  allocate N 'rows'. */
    matrix = malloc( sizeof( double* ) * n );
    /*  for each row, allocate M actual doubles. */
    for( row = 0; row < n; row++ )
    matrix[ row ] = malloc( sizeof( double ) * m );

}

void main()
{
    int i, j;
    matrix(4,4,P_M);    
    for(i=1; i<5; i++)
            for(j=1; j<5; j++)
                P_M[i][j] = P[i-1][j-1];    
    //show_matrix(4,4,P_M);

}  

1 Ответ

0 голосов
/ 13 мая 2018

много проблем.

  1. Вне границ - так как индексы начинаются с нуля.
  2. printf(" \t",&matrix[i][j]); -> printf("%lf \t",matrix[i][j]);
  3. double matrix( int n, int m, double **matrix) -> double **matrix( int n, int m, double ***matrix) и соответствующие изменения внутри функции + return *martix; в конце, если вам это нужно. В противном случае сделайте его недействительным. Назовите это matrix(4,4,&P_M);

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

double **matrix(int n, int m)
{
    int row;
    double **array;
    /*  allocate N 'rows'. */
    if (!(array = malloc(sizeof(double*) * n)))
    {
        return NULL;
    }
    /*  for each row, allocate M actual doubles. */
    for (row = 0; row < n; row++)
        if (!(array[row] = malloc(sizeof(double) * m)))
        {
            //do something if malloc failed - for example free already allocated space.
            return NULL;
        }
    return array;
}

и в основном P_M = matrix(4,4);

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