Ошибка сегментации, когда программа пытается записать результаты - PullRequest
0 голосов
/ 20 октября 2011

Приветствие

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

А хотелось бы получить результаты?

#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 ]

1 голос
/ 20 октября 2011

В 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));
            }
            /* ... */

Ваши отступы и использование пробелов тоже могут немного улучшиться.1017 *

0 голосов
/ 21 октября 2011

В функции lup в строке 157 (во втором блоке «if (isSingular == 0)») вы написали

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

эта строка записана в цикле for, итерирующем по i, в то время какk имеет оставшееся значение из последнего цикла.Условием прерывания этого цикла было то, что k = v (размер C, AKA "b" из строки кода выше).

Итак, в основном вы написали:

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

И это, вероятно, тот мерзавец, которого вы ищете.

Две заметки.Во-первых, я слишком долго был человеком .Net, поэтому я мог бы упустить что-то совершенно тривиальное здесь, в таком случае, извините.Во-вторых, когда вы хотите, чтобы люди читали ваш код (например, когда он публикует его для помощи), необходимо использовать более значимые имена или что-то еще, чтобы улучшить читабельность кода, но если вы не собираетесь этого делать, по крайней мере, избегайте путаницыкак передача переменной с именем "C" в параметр с именем "b", если ее можно избежать.

0 голосов
/ 20 октября 2011

Оформить заказ учебник .Он учит вас, как найти сегфолты с помощью GDB.

...