2017-09-04 138 views
-1

我對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 <= sizeof(a); i ++) – RGarcia

+0

它以何種方式停止工作?我的意思是它凍結或崩潰或什麼?我懷疑它是因爲pvg和RGarcia提到的循環而凍結的。 – mikea

+0

是的,因爲是一個雙維,你需要這樣的東西:for(int i = 0; i RGarcia

回答

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

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