program.exe(C)已停止工作

问题描述:

我对C非常陌生并且设法编译此程序,但exe停止运行。我真的不确定有什么问题。program.exe(C)已停止工作

#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; 
} 

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

原始代码带有从1开始的所有循环,这就是为什么我也以1开始循环的原因。我已经将所有循环从0改为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]; 
    } 
} 
+1

你可以试试吗: for(i = 0; i RGarcia

+0

它以何种方式停止工作?我的意思是它冻结或崩溃或什么?我怀疑它是因为pvg和RGarcia提到的循环而冻结的。 – mikea

+0

是的,因为是一个双维,你需要这样的东西:for(int i = 0; i RGarcia

这是一个二维数组,你是循环的它只是一个。你应该这样做:

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; 

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

我不知道lubksb的功能是什么:

lubksb(a,n,indx,b); 

b显然是一个无效的参数,因为你永远不调用此函数之前分配给它。

而与此声明:

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

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

+1

你错过了另一个明显的问题,'我= 3'是一个任务,而不是比较。 (因此程序挂起的原因) – Retr0id

+0

LOL。我不认为OP的程序可以保存... – selbie