program.exe(c)已停止工作

  • 本文关键字:停止工作 exe program 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在下面。我从数字食谱教科书中获得了它们,但是编辑了一些行以删除我没有的独家例程。具体而言,它们是带有malloc,printf和Free的线条。

原始代码都带有所有循环以1的范围开始,这就是为什么我也以1的方式启动了循环。从那以后,我更改了所有循环以从0开始,希望不引入任何新错误。

您可以在此处查看原始代码:https://github.com/saulwiggin/numerical-recipies-in-c/tree/master/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];
    }
}

这是一个二维数组,您正在循环,因为它只是一个。您应该做类似的事情:

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

是定义明确数组大小的不良习惯。尝试使用常数。

,如@marged的评论中所述:

在C数组中以0

启动

b在声明时永远不会分配给任何有效的事物:

float *b,d;

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

我不知道lubksb功能是什么:

lubksb(a,n,indx,b);

但是b显然是一个无效的参数,因为您在调用此功能之前从未分配给它。

和此语句:

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

正如其他人指出的那样,数组索引从零开始。但是没有证据表明b无论如何都有三个长度。

最新更新