Я пытаюсь вернуть 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");
}