我是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/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的评论中所述:
在C数组中以0
启动
b
在声明时永远不会分配给任何有效的事物:
float *b,d;
充其量是无效的或指向无效的内存地址:
我不知道lubksb
功能是什么:
lubksb(a,n,indx,b);
但是b
显然是一个无效的参数,因为您在调用此功能之前从未分配给它。
和此语句:
for(i = 1; i = 3; i++) {
printf("%.2f",b[i]);
}
正如其他人指出的那样,数组索引从零开始。但是没有证据表明b
无论如何都有三个长度。