Как передать 2D-массив из функции в основную? - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь вернуть 2D-массив из функции в основную. У меня 1 основной стек и 2 функции. Я анализирую 2D-массив из main () в функцию, используя указатель типа данных указателя, память которого динамически выделяется с помощью mallo c.

float determinant(float [][200], int);
float** inverse(float [][200], int);
float** transpose(float [][200], float [][200], float);
float** getFloatArray(int);
void printSquareMatrix(float**,int);

double main()
{
    int size = 10;
    float dummyMatrix[200][200];
    for(i=0;i<size;i++){
        for(j=0;j<size;j++){
            dummyMatrix[i][j] = someMatrix[i][j];
            }
        }
    float **inverseB;
    inverseB = getFloatArray(size);
    inverseB = inverse(dummyMatrix,size);
    printf("%f",inverseB[0][0]); //segfault happened here why?
}

float** getFloatArray(int size)
{
    int i;
    float** arr;
    arr = malloc(sizeof(float*)*size);
        for(i=0;i<size;i++){
            arr[i] = malloc(sizeof(float*)*size);
        }
    return arr;
}
float** inverse(float num[200][200], int yyy){
    /*some codes here*/

    float **retMatrix;
    retMatrix = getFloatArray(yyy);
    retMatrix = transpose(num, fac, f);//the inverse function calls transpose function()
    printf("Print retMatrix");
    return retMatrix //this will be returned to main function 
}

float** transpose(float num[200][200], float fac[200][200], float r){
    /*some code*/
    float **transposeReturn;
    transposeReturn = getFloatArray((int)r);
    printf("Print transposeReturn");

    return transposeReturn; //this will be returned to inverse() function
}

Поток данных: 2D-массив анализируется на обратный ( ), а внутри inverse () вызывается transpose (), и 2D-массив анализируется для транспонирования для обработки и возвращается обратно в inverse () для дальнейшей обработки до того, как окончательный 2D-массив будет проанализирован обратно в main ().

Как видно, как transpose (), так и inverse () меняют местами 2D-массивы, и все работает нормально. Он всегда терпит неудачу, когда я хочу протестировать, распечатав 2D-массив inverseB (после вызова функции inverse ()). Я размышлял 2 дня подряд, чтобы найти какое-нибудь просветление, пока ничего не получил.

Вы знаете, что здесь произошло?

Полный код ниже:

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

float determinant(float [][200], int);
float** inverse(float [][200], int);
float** transpose(float [][200], float [][200], float);
float** getFloatArray(int);
void printSquareMatrix(float**,int);


double main()
{
    int i;
    int j;
    int horison = 2, nCons = 3, biggerthan = 1;
    int M = 10000000;

    double A[3][6] = {{2.,1.,1.,0.,0.,0.},
                      {1.,1.,0.,1.,0.,0.},
                      {1.,2.,0.,0.,-1.,1}};

    double b[3]    = {20,18,12};
    double c[6]    = {5.,4.,0,0,0,-M};

    /*Size of the basic solution*/
    int basicSize = biggerthan+nCons /*1+3 = 4*/;
    int nonbasicSize = horison /*the originial variables = 2 (x1 and x2)*/;

    int row = nCons /*3*/;
    int column = basicSize+nonbasicSize /*6*/;

    /*Finding the column index that contains basic variable*/
    int size = 0;
    //Dynamic memory allocation to indexBasic array type int

    int *indexBasic = malloc(sizeof(int*)*size);
    int sumColumn;
    int counter=0;
    for(i=column-basicSize;i<column;i++){
        sumColumn=0;
        for(j=0;j<row;j++)  { 
            sumColumn = sumColumn + A[j][i];
            }
        if (sumColumn==1)         {
            size ++ 
            indexBasic[counter]= i;
            printf("%d\n",indexBasic[counter]);
            counter ++;
            }
        }
    /*Initialise new matrix square B which is taken from the basic vars column of Matrix A*/
    double B[size][size];

    for (i=0;i<size;i++) {
        for (j=0;j<size;j++) {
            B[i][j] = A[i][indexBasic[j]];
            }
    }

    /*Find the inverse of matrix B ~ will call determinant function*/
    float dummyMatrix[200][200];
    for(i=0;i<size;i++){
        for(j=0;j<size;j++){
            dummyMatrix[i][j] = B[i][j];
            }
        }

    /*Calling determinant of the B matrix*/
    float det = determinant(dummyMatrix,size);
    printf("determinant: %f\n\n",det);

    float **inverseB;
    inverseB = getFloatArray(size);
    inverseB = inverse(dummyMatrix,size);

    printf("\nsegfault start from here?\n");
    printf("%f",inverseB[0][0]);
    for (i=0;i<size;i++);{
        for(j=0;j<size;j++){
            printf("%f ",inverseB[i][j]);
            }
        printf("%s","\n");
        }
    return 0;
}

/*For calculating Determinant of the Matrix */

float determinant(float a[200][200], int xxx){
    float s = 1, det = 0, b[200][200];
    float k = (float) xxx;
    int i, j, m, n, c;

    if (k == 1){
        return (a[0][0]);
        }

    else{
        det = 0;
        for (c = 0; c < k; c++){
            m = 0;
            n = 0;
            for (i = 0;i < k; i++){
                for (j = 0 ;j < k; j++){
                    b[i][j] = 0;
                    if (i != 0 && j != c){
                        b[m][n] = a[i][j];
                        if (n < (k - 2))
                            n++;
                        else{
                            n = 0;
                            m++;
                            }
                        }
                    }
                }
            det = det + s * (a[0][c] * determinant(b, k - 1));
            s = -1 * s;
            }
        }
    return det;
}

float** inverse(float num[200][200], int yyy)
{

    float b[200][200], fac[200][200];
    float f = (float)yyy;
    int p, q, m, n, i, j;
    for (q = 0;q < f; q++){
        for (p = 0;p < f; p++){
            m = 0;
            n = 0;
            for (i = 0;i < f; i++){
                for (j = 0;j < f; j++){
                    if (i != q && j != p){
                        b[m][n] = num[i][j];
                        if (n < (f - 2))
                        n++;
                    else{
                        n = 0;
                        m++;
                        }
                    }
                }
            }
          fac[q][p] = pow(-1, q + p) * determinant(b, f - 1);
        }
    }

    int rowRet = (int)f;
    float **retMatrix;
    retMatrix = getFloatArray(rowRet);/*creating 1D array memory allocaton */

    retMatrix = transpose(num, fac, yyy);

    printf("Print matrix ke 2\n");
    printSquareMatrix(retMatrix,rowRet);
    return retMatrix;
}

/*Finding transpose of matrix*/
float** transpose(float num[200][200], float fac[200][200], float r)
{
    int i, j;
    float b[200][200], inverse[200][200], d;
    for (i = 0;i < r; i++){
        for (j = 0;j < r; j++){
            b[i][j] = fac[j][i];
            }
        }
        d = determinant(num, r);
        for (i = 0;i < r; i++){
            for (j = 0;j < r; j++){
                inverse[i][j] = b[i][j] / d;
                }
            }

    /*Declaring 2D-Array with dynamic allocation memory*/
    int indexRow = (int)r;
    int indexCol = (int)r;
    float **transposeReturn;
    transposeReturn = getFloatArray(r);

    printf("Print matrix ke 1\n");
    for (i=0;i<r;i++){
        for(j=0;j<r;j++){
            transposeReturn[i][j] = inverse[i][j];
            }
        }
    printSquareMatrix(transposeReturn,r);
    return transposeReturn;
}

float** getFloatArray(int size)
{
    int i;
    float** arr;
    arr = malloc(sizeof(float*)*size);
        for(i=0;i<size;i++){
            arr[i] = malloc(sizeof(float*)*size); /*for each element in the memory address, create number of r of integer*/
        }
    return arr;
}

void printSquareMatrix(float** matrix,int size)
{
    int i;
    int j;
    for (i=0;i<size;i++){
        for (j=0;j<size;j++){
            printf("%f ",matrix[i][j]);
            }
         printf("\n");
    }
    printf("\n");
}
...