程序尝试写出结果时出现分段错误

时间:2011-10-19 20:57:45

标签: c multidimensional-array segmentation-fault

问候语,

当我接受所有输入时,有人可以找到,为什么要写出这些程序分段错误? 我找不到问题所在,或者应该在哪里修改我的代码

我想得到结果?

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


void inMatrix(int n, double **matrix)
{
    int j, i;
    for (i = 0; i < n; i++)
    {
        for (j= 0; j < n; j++)
        {
            scanf("%lf", &matrix[i][j]);
        }
    }
}

void inVector(double *vektor, int n)
{
    int k;
    for (k = 0; k < n; k++)
    {
        scanf("%lf", &vektor[k]);
    }
}

void outVector(double *vektor, int n)
{
    int k;
    for (k = 0; k < n; k++)
    {
        printf("%.8lf ", vektor[k]);
    }
}

void lup(int n, double **A, double **b, int v)
{
    int *Permutation = (int*)malloc(sizeof(int)*n);
    int i,j;
    int k;
    double *max = (double*) malloc (sizeof(double)*n);
    int m=0, p=0;
    int tmp=0, tmp2=0;
    int t=0, isSingular=0;
    double largestElement=0.0;
    double *helpVector = (double*) malloc (sizeof(double)*n);
    double *helpVectorA = (double*) malloc (sizeof(double)*n);
    double *helpVectorB = (double*) malloc (sizeof(double)*n);


//    for(i=0;i<n;i++)
//    {
//        for(j=0;j<n;j++)
//        {
//            A[i][j]=D[i][j];
//        }
//    }

    for(i=0; i<n; i++)
        Permutation[i]=i;

    for(m=0; m<n-1; m++)
    {
        for(i=m; i<n; i++)
        {
            max[i]=fabs(A[i][m]);
        }
        for(i=m; i<n; i++)
        {
            if(max[i]>largestElement)
            {
                largestElement=max[i];
                p=i;
            }
        }
        for(i=0; i<n; i++)
        {
            helpVectorA[i]=A[m][i];
            helpVectorB[i]=A[p][i];
        }
        for(i=0; i<n; i++)
        {
            A[m][i]=helpVectorB[i];
            A[p][i]=helpVectorA[i];
        }
        tmp=Permutation[m];
        tmp2=Permutation[p];
        Permutation[m]=tmp2;
        Permutation[p]=tmp;
        if(fabs(A[m][m])>0.00000000000000001)
        {
            for(i=m+1; i<n; i++)
            {
                A[i][m]=A[i][m]/A[m][m];
                for(j=m+1; j<n; j++)
                {
                    A[i][j]=A[i][j]-A[i][m]*A[m][j];
                }
            }
        }
        if(fabs(A[m][m])<0.00000000001)
        {
            printf("szingularis\n");
            isSingular=1;
            break;
        }
        for(i=0; i<n; i++) max[i]=-1;
        largestElement=0.0;
        p=m+1;
    }

    if(isSingular==0)
    {
        if(fabs(A[n-1][n-1])<0.00000000001)
        {
            printf("szingularis\n");
            isSingular=1;
        }
    }
    if(isSingular==0)
    {
        for(k=0; k<v;k++)
        {
             for(i=0; i<n; i++)
        {
            t=Permutation[i];
            helpVector[i]=b[k][t];
        }
        for(i=0; i<n; i++)
        {
            b[i][k]=helpVector[i];
        }

        for(i=1; i<n; i++)
        {
            for(j=0; j<i; j++)
            {
                b[k][i]-=A[i][j]*b[k][j];
            }
        }
        for(i=n-1; i>=0; i--)
        {
            for(j=i+1; j<n; j++)
            {
                b[k][i]-=A[i][j]*b[k][j];
            }
            b[k][i]=b[k][i]/A[i][i];
        }
    }
    for(i=0; i<n; i++)
    {
        printf("%.8lf ", b[k][i]);
    }
    printf("\n");

 }

}

int main()
    {
        int k, v,n;
        int j;
        double **A;
        double **C;

        // read dimension of matrix and value
        scanf("%d", &n);
        //matrix
        A = (double **) calloc(n, sizeof ( double*));
        // matrix to store the vectors
        C = (double **) calloc(n, sizeof(double *));

        while(n!=0)
        {
        for (k = 0; k < n; k++)
        {
            A[k] = (double *) calloc(n, sizeof ( double));
        }
            inMatrix(n, A);

            scanf("%d", &v);
            for(k=0;k<v;k++)
            {
                C[k] = (double *) calloc(n, sizeof ( double));
            }

            for(k=0; k<v;k++)
            {
                for(j=0;j<n;j++)
                {
                    scanf("%lf", &C[k][j]);
                }
            }
            //print out result
            for(k=0;k<v;k++)
            {
                for(j=0;j<v;j++)
                {
                    lup(n,A,C,v);
                }
            }

        }
    return 0;
}

3 个答案:

答案 0 :(得分:1)

main中,您有

        /* ... */
        C = (double **) calloc(n, sizeof(double *));

n元素

        while(n!=0)
        {
        for (k = 0; k < n; k++)
        {
            A[k] = (double *) calloc(n, sizeof ( double));
        }
            inMatrix(n, A);

            scanf("%d", &v);
            for(k=0;k<v;k++)

v?它从哪里来的?你或许是n 请记住,C元素已为n元素分配空间,即使在设置v之前也是如此。

            {
                C[k] = (double *) calloc(n, sizeof ( double));
            }
            /* ... */

你的缩进和空格的使用也会有所改善。

答案 1 :(得分:0)

结帐tutorial。它教你如何使用GDB找到段错误。

答案 2 :(得分:0)

在函数lup中,在第157行(在第二个“if(isSingular == 0)”块中)你写了

printf("%.8lf ", b[k][i]);

这一行是在for循环迭代中写入的,而k具有来自最后一个循环的剩余值。该循环的中断条件是k = v(来自上面代码行的C,A.K.A“b”的大小)。

所以,基本上,你写道:

printf("%.8lf", b[MaxIndexOfB+1][i];

这可能是你正在寻找的臭味。

两个音符。首先,我已经是.Net人太久了,所以我可能会遗漏一些完全无足轻重的东西,在这种情况下,抱歉。 其次,当你希望人们阅读你的代码时(比如发帖寻求帮助),必须使用更有意义的名字,或者某些东西来提高代码的可读性,但如果你不打算这样做,至少要避免混淆东西比如将名为“C”的变量传递给名为“b”的参数,如果可以避免的话。