c - program.exe (C) 已停止工作

标签 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/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 的​​评论中所说:

In C arrays starts in 0

关于c - program.exe (C) 已停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46041298/

相关文章:

c - 交叉编译的根文件系统中未声明的变量

c - #define的替换和字符串化

c - 如何访问 C 中数组元素的个数?

c - 多个源目录和一个目标目录的 Makefile

c - 逐行读取文件并在c中进行比较

c - Flex 中的链接未完成问题

c - 当 -mavx2 打开时为 __builtin_popcount 生成臃肿的代码

c - 为什么这个泊松分布实现在 msvc 上返回 0

c - 优化搜索最大平方算法中的函数

将文件转换为大写并将行移至数组