program.exe(C)已停止工作

时间:2017-09-04 16:44:12

标签: c

我是C的新手并且设法编译了这个程序,但exe在运行时停止工作。我真的不确定是什么错误。

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

#define TINY 1.0e-20    // A small number.

void ludcmp(float a[3][3], int n, int *indx, float *d);
void lubksb(float a[3][3], int n, int *indx, float b[]) ;

int main(){
    int i,n,*indx;
    float *b,d;
    float a[3][3] = {
        { 1.0, 2.0, 5.0},
        {-1.0, 2.0, 3.0},
        { 6.0, 0.0, 1.0}
    };

    ludcmp(a,n,indx,&d);
    lubksb(a,n,indx,b);

    for(i = 1; i = 3; i++) {
        printf("%.2f",b[i]);
    }

    getchar();
    return 0;
}

对于那些提出要求的人来说,ludcmp和lubksg的2个功能如下。我从数字食谱教科书中得到了它们,但编辑了一些行来删除我没有的独家例程。具体来说,它们是malloc,printf和free的行。

原始代码带有从1开始的所有循环,这就是为什么我也用1开始循环。我已经将所有循环改为从0开始,希望不会引入任何新错误。

您可以在此处查看原始代码: https://github.com/saulwiggin/Numerical-Recipies-in-C/tree/master/Chapter2.Solution-of-Linear-Equations

这是ludcmp:

void ludcmp(float a[3][3], int n, int *indx, float *d)
{
    int i, imax, j, k;
    float big, dum, sum, temp;
    float *vv;  // vv stores the implicit scaling of each row.

    vv = (float *) malloc(n * sizeof(float));

    *d=1.0;
    for (i=0;i<n;i++) {
        big=0.0;
        for (j=0;j<n;j++)
            if ((temp=fabs(a[i][j])) > big) big=temp;

        if (big == 0.0)
        {
            printf("Singular matrix in routine ludcmp");
            //free(vv);
        }

        // No nonzero largest element.
        vv[i] = 1.0 / big;       // Save the scaling.
    }

    // This is the loop over columns of Crout's method.
    for (j=0;j<n;j++) {
        for (i=0;i<j;i++) {
            sum=a[i][j];
            for (k=0;k<i;k++) sum -= a[i][k]*a[k][j];
            a[i][j]=sum;
        }

        // Initialize for the search for largest pivot element.
        big=0.0;
        for (i=j;i<=n;i++) {
            sum=a[i][j];
            for (k=0;k<j;k++)
                sum -= a[i][k]*a[k][j];
            a[i][j]=sum;
            if ( (dum=vv[i]*fabs(sum)) >= big) {
                big=dum;
                imax=i;
            }
        }
        if (j != imax) {
            for (k=0;k<n;k++) {
                dum=a[imax][k];
                a[imax][k]=a[j][k];
                a[j][k]=dum;
            }
            *d = -(*d);
            vv[imax]=vv[j];
        }
        indx[j]=imax;
        if (a[j][j] == 0.0) a[j][j]=TINY;
        if (j != n) {
            dum=1.0/(a[j][j]);
            for (i=j+1;i<n;i++) a[i][j] *= dum;
        }
    } // Go back for the next column in the reduction.

    free(vv);

}

和lubksb:

void lubksb(float a[3][3],int n,int *indx,float b[])

{
    int i,ii=0,ip,j;
    float sum;

    for (i=1;i<=n;i++) {
        ip=indx[i];
        sum=b[ip];
        b[ip]=b[i];
        if (ii)
            for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j];
        else if (sum) ii=i;
        b[i]=sum;
    }
    for (i=n;i>=1;i--) {
        sum=b[i];
        for (j=i+1;j<=n;j++) sum -= a[i][j]*b[j];
        b[i]=sum/a[i][i];
    }
}

2 个答案:

答案 0 :(得分:1)

这是一个二维数组,你正在循环,因为它只是一个。你应该做点什么:

 for (int i = 0; i < 3; ++i) {
    for(int j = 0; j < 3; ++j) {
        printf("%d %d: ", i+1, j+1);

    }
}

明确定义数组大小是不好的做法。尝试使用常量。

正如@Marged的评论所说:

  

在C数组中以0开始

答案 1 :(得分:0)

b永远不会被声明为有效的任何内容:

float *b,d;

充其量,它是NULL或指向无效的内存地址:

我不知道lubksb函数的作用:

lubksb(a,n,indx,b);

但是b显然是一个无效的参数,因为在调用此函数之前,你从未指定它。

有了这句话:

for(i = 1; i = 3; i++) {
    printf("%.2f",b[i]);
}

正如其他人所指出的,数组索引从零开始。但是,没有证据表明b的长度为3。