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];
}
}
答
这是一个二维数组,你是循环的它只是一个。你应该这样做:
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
的长度为三。
你可以试试吗: for(i = 0; i RGarcia
它以何种方式停止工作?我的意思是它冻结或崩溃或什么?我怀疑它是因为pvg和RGarcia提到的循环而冻结的。 – mikea
是的,因为是一个双维,你需要这样的东西:for(int i = 0; i
RGarcia