我收到此错误:主题1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)

时间:2017-10-25 08:40:36

标签: c matrix

我需要帮助!我试图编写一个基于控制台的C程序,它解决了几个方程组。

练习:

程序接收一个输入文件(用户输入的输入和输出文件名),包含n,m和一串将填充矩阵的数字。该矩阵是一个扩展矩阵,它有n行和n + m列(其中m是要求解的系统数)。第一个"子矩阵"必须使用带旋转的高斯消除法减少nxn。

这是我的代码:

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

    int gauss_pivot (double **a, int n, int m, double tol);

    void resol (double **a, int n, int m);

    int main(void) {

        double **ampliada;
        int n, m;
        int i, j;
        FILE *entrada, *sortida;
        char nomE[31], nomS[31];

        printf("Noms dels fitxers d'entrada i sortida\n");
        scanf("%s %s", nomE, nomS);

        entrada = fopen(nomE, "r");
        sortida = fopen(nomS, "w");

        if (entrada == NULL || sortida == NULL){
            if (entrada == NULL){
                printf("Error en el fitxer d'entrada\n");
                exit(1);
            }
            else{
                printf("Error en el fitxer de sortida\n");
                exit(1);
            }
        }

        fscanf(entrada, "%d", &n);
        fscanf(entrada, "%d", &m);

        ampliada = (double**)malloc(n*sizeof(double*));
        if (ampliada == NULL) {
            printf("Memòria insuficient\n");
            exit(1);
        }
        for (i=0; i<n; i++){
            ampliada[i] = (double*)malloc(m*sizeof(double));
            if (ampliada[i] == NULL){
                printf("Memòria insuficient\n");
                exit(1);
            }
        }

        for (i=0; i<n; i++){
            for (j=0; j<=m; j++){
                fscanf(entrada, "%le", &ampliada[i][j]);
            }
        }

        gauss_pivot(ampliada, n, m, 10^(-16));

        resol(ampliada, n, m);

        return 0;
    }

    int gauss_pivot (double **a, int n, int m, double tol){

        float q;
        double pivot, aux;
        int r;

        for (int j = 0; j < n; j++){
            pivot = 0;
            for (r = j; r < n; r++){
                if (fabs(a[r][j]) > pivot){
                    pivot = a[r][j];
                }
            }
            if (pivot != a[j][j]){
                for (int s = 0; s < (n+m); s++){
                    aux = a[r][s];
                    a[r][s] = a[j][s];
                    a[j][s] = aux;
                }
            }
            for (int i = 0; i < n; i++){
                if(i > j){
                    q = a[i][j]/a[j][j];
                    for (int k = 0; k < (n+m); k++){
                        a[i][k] = a[i][k] - q*a[j][k];
                    }
                }
            }
        }

        return 0;
    }

    void resol (double **a, int n, int m){

        double resultats[n], suma;

        for (int s = 1; s <= m; s++){
            printf("Solució al sistema %d:\n", s);

            resultats[n]=a[n][n+1]/a[n][n];
            for(int i = n-1; i >= 1; i--){
                suma=0;
                for(int j=i+1; j<=n; j++){
                    suma=suma+a[i][j]*resultats[j];
                }
                resultats[i]=(a[i][n+1]-suma)/a[i][i];
            }

            for (int r = 1; r <= n; r++){
                printf("X_%d = %f", r, resultats[r]);
            }

        }
    }

它崩溃了以下几行(有时一个,其他一些):

                    aux = a[r][s];
                    a[r][s] = a[j][s];
                    a[j][s] = aux;

我收到以下错误消息:

  

主题1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)

我做错了什么?

0 个答案:

没有答案