2013-12-08 51 views
1

我正在嘗試使用LU分解和後置替換來解決線性方程組。然而,在編譯時存在一個問題,即:使用但未定義的標籤

87:2: error: label ‘a’ used but not defined 

你知道這意味着什麼嗎? 這裏是我的程序:

#include <stdio.h> 
#include <math.h> 
#include "nrutil.h" 
#include <stdlib.h> 
#define TINY 1.0e-20; 

void ludcmp(float **a, int n, int *indx, float *d) 
{ 
int i,imax,j,k; 
float big,dum,sum,temp; 
float *vv; 

vv=vector(1,n); 
*d=1.0; 
for (i=1;i<=n;i++) { 
    big=0.0; 
    for (j=1;j<=n;j++) 
     if ((temp=fabs(a[i][j])) > big) big=temp; 
    if (big == 0.0) nrerror("Singular matrix in routine ludcmp"); 
    vv[i]=1.0/big; 
} 
for (j=1;j<=n;j++) { 
    for (i=1;i<j;i++) { 
     sum=a[i][j]; 
     for (k=1;k<i;k++) sum -= a[i][k]*a[k][j]; 
     a[i][j]=sum; 
    } 
    big=0.0; 
    for (i=j;i<=n;i++) { 
     sum=a[i][j]; 
     for (k=1;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=1;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; 
    } 
} 
free_vector(vv,1,n); 
} 
#undef TINY 
void lubksb(float **a, 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]; 
} 
} 
int main(){ 
    float a[3][3], c[3][3], b[3], d; 
    int indx[3], i, j; 
    a[1][1]=1.00; a[1][2]=0.80; a[1][3]=0.64; 
    a[2][1]=1.00; a[2][2]=0.90; a[2][3]=0.81; 
    a[3][1]=1.00; a[3][2]=1.10; a[3][3]=1.11; 
b[0]=erf(0.80); 
b[1]=erf(0.90); 
b[2]=erf(1.10); 
ludcmp(&&a, 3, indx, &d); 
lubksb(&&a, 3, indx, b); 
for (i=0; i<=3; i++) 
printf("%f", b[i]); 
return 0; 
} 
+1

什麼是你想用'&&了'實現? – dasblinkenlight

+1

看看[這篇文章](http://stackoverflow.com/a/13915142/2386951)。 '&&'在你的代碼中沒有意義。 – Farzad

+0

對矩陣的思考我們應該寫雙重&符號。我應該寫什麼? – TheDorkSide

回答

3

也許

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

非常感謝,解決了我的問題 – TheDorkSide

+0

@ H2CO3你說得對 – TheDorkSide

4

&&元運算符不你認爲它。它用於'get the address of a label defined in the current function'

ludcmp(&&a, 3, indx, &d); 

沒有標籤a,因此錯誤。

如需解決,請參閱@ BLUEPIX的答案。你將不得不改變你的函數的簽名。

(注意,二元運算a && b是邏輯 '與')

+0

謝謝,這解決了問題,並且它已成功編譯。但是,在執行核心轉儲錯誤時彈出 – TheDorkSide

+1

哪一個更好? – TheDorkSide

+2

@damienfrancois類型爲float [3] [3]的數組衰減成類型爲float(*)[3]的指針,它與float **不兼容,因爲數組衰減爲指向它的第一個元素,在這種情況下,它是一個3'float'的數組,而不是指向'float'的指針。 – 2013-12-08 14:15:12