| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1787 人关注过本帖
标题:编译通过后,运行时出现问题?
只看楼主 加入收藏
fzyjane
Rank: 1
等 级:新手上路
帖 子:21
专家分:5
注 册:2009-7-30
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:8 
编译通过后,运行时出现问题?
运行时,出现下面的错误信息:
Error while dumping state<probably corrupted stack>
Segmentation fault <core dumped>

麻烦看一下哪里有问题。另外,我用的是GCC。谢谢。

#include <stdio.h>
#include <math.h>

main()
{
int idum, k,s;
double sigmae,sigmat;
double *mu, *u, *sigm,*sigmt;
double *vector(), ran1(), gasdev();

printf("Enter group number s:");
scanf("%d",&s);
sigmae=0.0;
sigmat=0.0;
sigm=vector(0,s);
sigmt=vector(0,s);


for (k=0; k<s; k++)
  {idum=-10*k*k-2+k;
   mu[k]=0.0; u[k]=0.0; sigm[k]=0.0;
   sigm[k]=sigmat+ran1(&idum)*(1.5-sigmat);
   u[k]=sigm[k]*gasdev(&idum);
   mu[k]+=u[k];
  }
}


/*        *************** VECTOR.C  **********    */
double *vector(nl, nh)
int nl, nh;
{  double *v;
   v = (double *)malloc((unsigned) (nh-nl+1) * sizeof(double));
   return v-nl;
}


/* ***************** NORMAL RANDOM GENERATOR: GASDEV.C *********** */
double gasdev(idum)
int *idum;
                   /* returns a normally distributed deviate with mean 0
                      and variance 1, using ran1(idum) as the source of uniform
                      deviates    */

{
    static int iset=0;
    static double gset;
    double fac,r,v1,v2;
    double ran1();

    if (iset == 0)  {
        do {
            v1=2.0*ran1(idum)-1.0;
            v2=2.0*ran1(idum)-1.0;
            r=v1*v1+v2*v2;
        } while (r >= 1.0 || r == 0.0);
        fac= sqrt(-2.0*log(r)/r);
        gset=v1*fac;
        iset=1;
        return v2*fac;
    }  else {
         iset=0;
         return gset;
    }
}


/* ******************** UNIFORM RANDOM NUMBER GENERATOR: RAN1.c ******* */
#include <stdlib.h>
#define M1 259200
#define IA1 7141
#define IC1 54773
#define RM1 (1.0/M1)
#define M2 134456
#define IA2 8121
#define IC2 28411
#define RM2 (1.0/M2)
#define M3 243000
#define IA3 4561
#define IC3 51349

double ran1(idum)
int *idum;

                    /* returns a uniform random deviate between 0.0 and 1.0.
                       Set idum to any negative value to initialize or
                       reinitialize the sequence  */

{
    static long ix1,ix2,ix3;
    static double r[98];
    double temp;
    static int iff=0;
    int j;
    void nrerror();

    if (*idum < 0 || iff == 0) {
         iff=1;
         ix1=(IC1-(*idum)) % M1;
         ix1=(IA1*ix1+IC1) % M1;
         ix2=ix1 % M2;
         ix1=(IA1*ix1+IC1) % M1;
         ix3=ix1 % M3;
         for (j=1;j<=97;j++) {
               ix1=(IA1*ix1+IC1) % M1;
               ix2=(IA2*ix2+IC2) % M2;
               r[j]=(ix1+ix2*RM2)*RM1;
           }
           *idum=1;
    }
    ix1=(IA1*ix1+IC1) % M1;
    ix2=(IA2*ix2+IC2) % M2;
    ix3=(IA3*ix3+IC3) % M3;
    j=1 + ((97*ix3)/M3);
    if (j > 97 || j < 1) nrerror("RAN1: This cannot happen.");
    temp=r[j];
    r[j]=(ix1+ix2*RM2)*RM1;
    return temp;
}

/*    *********************NRERROR.C ******************** */
void nrerror(error_text)
     /* prints an error message */

char error_text[];
{
   fprintf(stderr,"Numerical recipes run-time error...\n");
   fprintf(stderr,"%s\n",error_text);
   fprintf(stderr,"...now exiting to system...\n");
   exit(1);
}
搜索更多相关主题的帖子: 信息 include double number Enter 
2009-12-21 01:28
秋天的童话
Rank: 2
等 级:论坛游民
帖 子:33
专家分:92
注 册:2009-12-1
收藏
得分:2 
程序出现了段错误,段错误在编译时是检测不出来的,检查一下是不是越界访存了!
2009-12-21 11:07
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:0 
语法错误太多,先改好了再看看
2009-12-21 11:36
fzyjane
Rank: 1
等 级:新手上路
帖 子:21
专家分:5
注 册:2009-7-30
收藏
得分:0 
楼上的麻烦告诉一下主程序那里有错?还是......? 刚刚开始C, 谢谢了先
2009-12-21 11:53
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:0 
double *vector(), ran1(), gasdev();
我想你应该是要函数声明,格式应该为
返回类型 函数名(参数类型,参数类型,...);

但这里没法改,因为你函数定义的格式也错了...
只说其中一个
程序代码:
double *vector(nl, nh)
int nl, nh;
{  double *v;
   v = (double *)malloc((unsigned) (nh-nl+1) * sizeof(double));
   return v-nl;
}

函数定义格式应为
返回类型 函数名(参数类型 参数名,参数类型 参数名,...){
函数代码
}
目前应改为
程序代码:
double *vector(int nl,int nh)
{  double *v;
   v = (double *)malloc((unsigned) (nh-nl+1) * sizeof(double));
   return v-nl;
}

但还有一个语法错误,你在定义这个函数之间没有#include <stdlib.h>

还有一个未定义行为(不是语法错误)
return v-n1
是在用指针的地址减一个数,得到的地址里存储的值是一个不可预知的值,可能会出现段错误
我不知道你要干什么,你只能自己改

现在根据vector()函数重新改一开始要做的函数声明
double *vector(int,int);

其他三个自己定义的函数都有定义格式不对的错误
2009-12-21 12:16
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:8 
程序代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define M1 259200
#define IA1 7141
#define IC1 54773
#define RM1 (1.0/M1)
#define M2 134456
#define IA2 8121
#define IC2 28411
#define RM2 (1.0/M2)
#define M3 243000
#define IA3 4561
#define IC3 51349


int main()
{
int idum, k,s;
double sigmae,sigmat;
double *mu, *u, *sigm,*sigmt;
double *vector(int,int);
double ran1(int *);
double gasdev(int *);


printf("Enter group number s:");
scanf("%d",&s);
sigmae=0.0;
sigmat=0.0;
sigm=vector(0,s);
sigmt=vector(0,s);


for (k=0; k<s; k++)
  {idum=-10*k*k-2+k;
   mu[k]=0.0; u[k]=0.0; sigm[k]=0.0;
   sigm[k]=sigmat+ran1(&idum)*(1.5-sigmat);
   u[k]=sigm[k]*gasdev(&idum);
   mu[k]+=u[k];
  }

  return 0;
}


/*        *************** VECTOR.C  **********    */
double *vector(int nl,int nh)
{  double *v;
   v = (double *)malloc((unsigned) (nh-nl+1) * sizeof(double));
   return v-nl;
}


/* ***************** NORMAL RANDOM GENERATOR: GASDEV.C *********** */
double gasdev(int *idum)
{
    static int iset=0;
    static double gset;
    double fac,r,v1,v2;
    double ran1(int *);

    if (iset == 0)  {
        do {
            v1=2.0*ran1(idum)-1.0;
            v2=2.0*ran1(idum)-1.0;
            r=v1*v1+v2*v2;
        } while (r >= 1.0 || r == 0.0);
        fac= sqrt(-2.0*log(r)/r);
        gset=v1*fac;
        iset=1;
        return v2*fac;
    }  else {
         iset=0;
         return gset;
    }
}


/* ******************** UNIFORM RANDOM NUMBER GENERATOR: RAN1.c ******* */





                    /* returns a uniform random deviate between 0.0 and 1.0.
                       Set idum to any negative value to initialize or
                       reinitialize the sequence  */
double ran1(int *idum)
{
    static long ix1,ix2,ix3;
    static double r[98];
    double temp;
    static int iff=0;
    int j;
    void nrerror(char *);

    if (*idum < 0 || iff == 0) {
         iff=1;
         ix1=(IC1-(*idum)) % M1;
         ix1=(IA1*ix1+IC1) % M1;
         ix2=ix1 % M2;
         ix1=(IA1*ix1+IC1) % M1;
         ix3=ix1 % M3;
         for (j=1;j<=97;j++) {
               ix1=(IA1*ix1+IC1) % M1;
               ix2=(IA2*ix2+IC2) % M2;
               r[j]=(ix1+ix2*RM2)*RM1;
           }
           *idum=1;
    }
    ix1=(IA1*ix1+IC1) % M1;
    ix2=(IA2*ix2+IC2) % M2;
    ix3=(IA3*ix3+IC3) % M3;
    j=1 + ((97*ix3)/M3);
    if (j > 97 || j < 1) nrerror("RAN1: This cannot happen.");
    temp=r[j];
    r[j]=(ix1+ix2*RM2)*RM1;
    return temp;
}

/*    *********************NRERROR.C ******************** */
void nrerror(char *error_text)
{
   fprintf(stderr,"Numerical recipes run-time error...\n");
   fprintf(stderr,"%s\n",error_text);
   fprintf(stderr,"...now exiting to system...\n");
   exit(1);
}

这是没有语法错误的代码,但会出现段错误,先把地址一类的问题改好,再用gdb调试.
2009-12-21 12:19
fzyjane
Rank: 1
等 级:新手上路
帖 子:21
专家分:5
注 册:2009-7-30
收藏
得分:0 
真的太感谢sidooh. 但是对于函数的定义,我觉得是两个不同的形式:一个是traditional form, 一个是prototype form.

在main 函数里,一旦加上下面两句以后,我本来的idum 值就变成了1,不知道哪里错? 谢谢大家的关注。

sigm[k]=sigmat+ran1(&idum)*(1.5-sigmat);
   u[k]=sigm[k]*gasdev(&idum);



2009-12-22 07:46
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:0 
在ran1()函数里有这么一行:
*idum=1;
会使idum的值变为1


函数原型一般是在头文件里才用到,我觉得你这种函数定义方式既不是函数原型也不是标准格式
2009-12-22 11:22
fzyjane
Rank: 1
等 级:新手上路
帖 子:21
专家分:5
注 册:2009-7-30
收藏
得分:0 
问题已经解决,忘记给 mu 和 u 分配空间。加上下面两句,就可以了。
mu=vector(0,s);
u=vector(0,s);

非常感谢sidooh. 以后有问题希望继续支持。我最近肯定会有很多问题,或许很低级,刚学C. :). 谢谢先。
2009-12-22 12:14
快速回复:编译通过后,运行时出现问题?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019886 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved