标签已使用但未定义

时间:2013-12-08 13:49:54

标签: c

我正在尝试使用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;  
}

2 个答案:

答案 0 :(得分:4)

&&一元运算符不符合您的想法。它用于'get the address of a label defined in the current function'

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

没有标签a,因此错误。

有关修复,请参阅@ BLUEPIX的答案。你必须改变你的功能的签名。

(请注意,二元运算符a && b是逻辑'和')

答案 1 :(得分: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);