声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2792|回复: 11

[C/C++] 自己写的一个算法的程序,内存不能为written

[复制链接]
发表于 2011-1-6 18:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
  1. #include <time.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <iostream.h>
  6. #define pi 3.1415926
  7. #define N 50000
  8. void main()
  9. {
  10.         double t[100][100];
  11.         int s[1000];
  12.         int z[7]={0,0,0,0,0,0,0};
  13.         long a[100000];
  14.         int m=0,n;
  15.         double x;
  16.         double b[1000];
  17.         double DET=0,MTBT;
  18.         for (int j=0;j<N;j++)
  19.         {
  20.                 for (int i=0;i<7;i++)
  21.                 {
  22.                         time_t T;
  23.                         time(&T);
  24.                         srand(T);
  25.                         double b1,c1;
  26.                         double a1=(rand()/(RAND_MAX*1.0));
  27.                         switch (i)
  28.                         {
  29.                         case 0:
  30.                                 t[i][j]=-2500*log(a1);
  31.                                 break;
  32.                         case 1:
  33.                                 b1=(rand()/(RAND_MAX*1.0));
  34.                                 c1=(sqrt((-2)*log(a1)))*sin(2*pi*b1);
  35.                                 break;
  36.                         case 2:
  37.                                 t[i][j]=-2500*log(a1);
  38.                                 break;

  39.                         case 3:
  40.                                 t[i][j]=-2500*log(a1);
  41.                                 break;
  42.                         case 4:
  43.                             b1=(rand()/(RAND_MAX*1.0));
  44.                                 c1=(sqrt((-2)*log(a1)))*sin(2*pi*b1);
  45.                                 break;
  46.                         case 5:
  47.                                 t[i][j]=-2500*log(a1);
  48.                                 break;
  49.                         case 6:
  50.                                 t[i][j]=-2500*log(a1);
  51.                                 break;
  52.                         }
  53.                         for (int k=0;k<7;k++)
  54.                         {
  55.                                 for (int l=k;l<=k;l++)
  56.                                 {
  57.                                         z[l]=1;
  58.                                         s[l]=(z[1]&&z[2]||z[3])&&z[6]||((z[4]||z[5])&&z[7]);
  59.                                         if(s[l]==1)
  60.                                         {
  61.                                                 a[m]=l;
  62.                                                 b[m]=t[l][j];
  63.                                                 m++;
  64.                                         }
  65.                                 }
  66.                         }
  67.                         for (k=0;k<m-2;k++)
  68.                                 if (b[k]<b[k+1])
  69.                                 {
  70.                                         x=b[k];
  71.                                         b[k]=b[k+1];
  72.                                         b[k+1]=x;
  73.                                         n=a[k];
  74.                                         a[k]=a[k+1];
  75.                                         a[k+1]=n;
  76.                                 }
  77.                 }
  78.         }
  79.         DET=+b[0];
  80.         MTBT=DET/N;
  81.         cout<<MTBT<<endl;
  82. }

复制代码
帮忙看一下,出错的地方啊...
回复
分享到:

使用道具 举报

发表于 2011-1-6 23:53 | 显示全部楼层
回复 1 # 有梦的人 的帖子

把出错提示贴出来。。。
 楼主| 发表于 2011-1-7 10:24 | 显示全部楼层
本帖最后由 有梦的人 于 2011-1-7 10:25 编辑


是一个控制台程序,没有警告和报错,只是运行通不过,不知道怎么回事
未命名.jpg
发表于 2011-1-7 22:32 | 显示全部楼层
本帖最后由 wqsong 于 2011-1-7 22:35 编辑

回复 3 # 有梦的人 的帖子

第64行,m一直自加下去,a,b会越界的,最早应该是b越界,所以会提示那内存错误。。。
应该是这里的问题,没看明白你想干什么,自己根据意思修改。。。
发表于 2011-1-7 22:37 | 显示全部楼层
本帖最后由 wqsong 于 2011-1-7 22:38 编辑

回复 3 # 有梦的人 的帖子

还有就是54行的k,和68行的k,这种写法是不符合C++标准。
应该是有的编译器能通过,有的编译器通不过。
建议:把k定义到外面,或者68行也写成int k。。。。
 楼主| 发表于 2011-1-8 18:56 | 显示全部楼层
wqsong 发表于 2011-1-7 22:32
回复 3 # 有梦的人 的帖子

第64行,m一直自加下去,a,b会越界的,最早应该是b越界,所以会提示那内存错 ...

我觉得应该不会的,m自加,但它会在执行一次if语句后自动跳出,再进行下次循环,然后再判断的啊
 楼主| 发表于 2011-1-8 18:57 | 显示全部楼层
wqsong 发表于 2011-1-7 22:37
回复 3 # 有梦的人 的帖子

还有就是54行的k,和68行的k,这种写法是不符合C++标准。

第二个k不能定加int,如果加了,就表示重新定义了一次了,这样不是重复定义了吗?
发表于 2011-1-8 19:38 | 显示全部楼层
本帖最后由 wqsong 于 2011-1-8 19:43 编辑

回复 6 # 有梦的人 的帖子

第一个问题,跳出去以后,下次循环的m不是在上次循环的结果基础上加的吗,外循环20次以后的某次肯定越界。20*7*7=980,会不会自己再想想。。。
发表于 2011-1-8 19:42 | 显示全部楼层
本帖最后由 wqsong 于 2011-1-8 20:08 编辑

回复 7 # 有梦的人 的帖子

第二个问题,在进入一个block时候局部auto变量是在栈中开辟的,等离开这个block时候要还原栈。
找本书,看看block或者scope的意义。
 楼主| 发表于 2011-1-8 21:18 | 显示全部楼层
wqsong 发表于 2011-1-8 19:42
回复 7 # 有梦的人 的帖子

第二个问题,在进入一个block时候局部auto变量是在栈中开辟的,等离开这个blo ...

谢谢主任啦,呵呵,我初学者啊...有问题还会请教的啊
发表于 2011-1-8 22:24 | 显示全部楼层
回复 10 # 有梦的人 的帖子

也就是说,在早期的C++编译器中,for后面括号定义的变量生命期是与for平行的;而后来C++标准要求for后面括号定义的变量生命期是要比for低一级。
早期C++编译器


  1. something begin{
  2.         for(int i = 0; i < 5; ++i){
  3.                 //do something
  4.         }
  5.         // i 可见
  6. }
复制代码
比较新的编译器
  1. something begin{
  2. for(int i = 0; i < 5; ++i){
  3.                 //do something
  4. }
  5. // i 不可见
  6. }
复制代码

客气,共同进步。。。

评分

1

查看全部评分

发表于 2011-1-9 15:05 | 显示全部楼层
呵呵,C/C++就是把双刃剑,用好了削铁如泥,用不好可能会伤了自己。

点评

赞成: 5.0
赞成: 5
嗯,说得好。。。  发表于 2011-1-10 10:08

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-9 03:22 , Processed in 0.258262 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表