1

以下のこのコードは、再帰を使用して 3x3 マトリックスの行列式を見つけるためのコードです (このコードは nxn マトリックスを対象としていますが、サンプルでは 3x3 を使用しました)。サブ関数 (それ自体) を呼び出す前に printf("\n") である必要があります。そうしないと、エラー 0xc0000fd (スタック オーバーフロー) が返されます。

#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define size 3


void trimarray(int**rrayrc,int**rrayout, int dim,int cuti,int cutj)
{
    int i, j;
    int ti = 0,tj;

    for(i = 0; i<dim; i++)
    {
        tj = 0;
        for(j = 0; j< dim; j++)
        {
            if(!((i==cuti)||(j==cutj)))
            {
                    rrayout[ti][tj] = rrayrc[i][j];
            }
            if(j!=cutj) {tj++;}
        }
        if(i!=cuti) {ti++;}
    }

}
void initializearray(int** rray,int dim)
{
    int i, j;
    for(i = 0; i<dim; i++)
    {
        for(j = 0; j<dim; j++)
        {
            rray[i][j] = 0;
        }
    }
}
int det(int** rray, int dim)
{
    int i,j;
    int cut[dim-1][dim-1];
    int* cutp[i];
    int mul = 1,sum=0;
    if(dim >1)
    {
        for(i = 0; i<dim-1; i++)
        {
            cutp[i] = cut[i];
        }
        initializearray(cutp,dim-1);
        for(i = 0; i<dim; i++)
        {
            printf("\n",dim); //<< Without this the program won't work
            trimarray(rray,cutp,dim,0,i);
            sum+=det(cutp,dim-1)*mul*rray[0][i];
            mul = 0-mul;
        }
        return sum;

    }
    else
    {
        return rray[0][0];
    }
}
int main()
{
    int test[size][size] = {2,-3,-2,-6,3,3,-2,-3,-2};
    int* testpntr[size];
    int i,deter;
    for(i = 0; i<size; i++)
    {
        testpntr[i] = test[i];
    }
    deter = det(testpntr,size);
    printf("[%d]",deter);
    getch();

    return 0;
}

回答をお待ちしております。

4

1 に答える 1

2

int* cutp[i];iはこの段階で初期化されていないため、未定義の動作です。cutp配列のサイズがわかりません。

于 2012-12-09T16:10:23.320 に答える