易码技术论坛

 找回密码
 加入易码
搜索
查看: 154056|回复: 4

[求助]错误的读写地址

[复制链接]
发表于 2005-5-30 16:43:00 | 显示全部楼层
直接看没错误~~不过有些语句写的很郁闷
if(ishuju[9]==1)
   {
   rx=ishuju[5]+ishuju[6]+1;
   ry=ishuju[4]+ishuju[7];
   }
  else if(ishuju[9]==2)
   {
   rx=ishuju[5]+ishuju[6]+1;
   ry=ishuju[4]+ishuju[7]+2;
   }
   else if(ishuju[9]==3)
   {
   rx=ishuju[5]+ishuju[6];
   ry=ishuju[4]+ishuju[7]+1;
   }
   else  if(ishuju[9]==4)
   {
   rx=ishuju[5]+ishuju[6];
   ry=ishuju[4]+ishuju[7]+1;
   }
把+1—1去掉,在if前加else可提不少速
[em01]
发表于 2005-5-30 09:36:00 | 显示全部楼层
代码不全。
发表于 2005-6-16 07:53:00 | 显示全部楼层
我看用switch来编写更好:
  switch(ishuju[9])
      {
       case 1:
                rx=ishuju[5]+ishuju[6]+1;ry=ishuju[4]+ishuju[7];break;
       case 2:
                rx=ishuju[5]+ishuju[6]+1;ry=ishuju[4]+ishuju[7]+2;break;
       case 3:
                rx=ishuju[5]+ishuju[6];ry=ishuju[4]+ishuju[7]+1;break;
       default:
                rx=ishuju[5]+ishuju[6]+2;ry=ishuju[4]+ishuju[7]+1;
       }
至于你说的那个错误我到是没看出来

      

      

发表于 2005-6-21 01:48:00 | 显示全部楼层
好老的帖子……

上面的代码越界的可能性不大,毕竟是分配以后的。

估计是因为某些原因在结构体中写入了坏数据造成的……

顺便在这里给大家提个醒

如果你的数组是在函数中申请的,请一定要注意:

数组一定要初始化!

因为第一次你跟踪的时候申请的数组中的所有元素肯定是0没错……不是教课书上说的随机数,Lava初始化的时候把整个内存区都清空了,所以这时候程序可能正确。

但是如果这个函数执行完了,出去兜了一阵回来(大多数是开始读入数据画图)这时候再执行回来这段数组中还剩什么就很难说了……计算结果还是有的,只是这个结果远远大于你的规定范围……

有经验的同志可以算一算如果一张40*40的地图你算出来的坐标是3000*3000是什么结果……放到画图函数里面不越界才怪~~

顺便说一句,在Lava里面数组是没有越界的概念的,比如在程序一开始,你申明

char a[10];

你写a[3000]一样不会出错……

另外在废话一点:

Lava的堆和栈是公用的,堆是从0开始放的(不过前面似乎还有什么东西)

栈是从最后开始倒着放的

与其他语言不同的是,系统结构(int,char什么的)是放在堆里而不是栈里,栈里只是存储函数的返回地址和参数(是不是放参数没有确认,不过根据“经验(呵呵)”应该是,但是也不确定啦,没时间研究,但是返回地址是确认的)也就是说函数调用层次越多,也会把内存消耗越多,这时候有几个现象值得大家去尝试一下:

1。使用递归算法把栈顶写到以分配的堆里……看看会不会有什么有趣的反应

2。经过精确计算,申明int a; a=20000;这个值是乱写的,反正就是栈的相应地址,然后……用*a把栈改掉,也就是把函数的返回地址改了,然后……你这个函数退出的时候……嘿嘿嘿

3。这个才是最有适用价值的。承接2,如果你可以明确地知道栈顶指针的存放点(可疑地点:栈底)你可以直接修改这个值(比如加上一点)然后再手工在栈顶写入你要退回的函数地址……退出的时候就会直接跳到这个函数了!

激动人心吧~但是事实上是不太可能的,因为:

1。栈顶指针很可能在20K以外(其他机型递减)这样写出来的程序不能通过验证……

2。也是最重要的一点……函数地址怎么确定?我不知道……我唯一想到的办法是在程序初始化的时候调用相应的函数(当让要加上一个参数,让程序知道不用真正执行,只是记录地址而已)然后再函数中执行一个地址记录函数,让这个地址记录函数读取栈顶数据,并且记录下来,这样或许能行……

顺便说一句,这些只是根据常识的一些估计方法,我也没有什么兴趣去尝试……有志愿者的话可以尝试一下,说不定明天的Lava高手就是你哦~~~因为你解决了在Lava里面实现函数指针的“伟大”课题!

什么?看不明白?我只是说说,何必那么认真呢?

什么?早就知道了?我只是说说~何必那么认真呢?
[em01][em01][em01]
[此贴子已经被作者于2005-6-21 2:02:39编辑过]

 楼主| 发表于 2005-5-29 17:52:16 | 显示全部楼层 |阅读模式
以下为代码

if(ishuju[9]==1)
   {
   rx=ishuju[5]+ishuju[6]+1;
   ry=ishuju[4]+ishuju[7]+1-1;
   }
   if(ishuju[9]==2)
   {
   rx=ishuju[5]+ishuju[6]+1;
   ry=ishuju[4]+ishuju[7]+2;
   }
   if(ishuju[9]==3)
   {
   rx=ishuju[5]+ishuju[6]+1-1;
   ry=ishuju[4]+ishuju[7]+1;
   }
   if(ishuju[9]==4)
   {
   rx=ishuju[5]+ishuju[6]+1+1;
   ry=ishuju[4]+ishuju[7]+1;
   }

这几句认证机说是错误的读写地址,
大侠帮我看看看看是怎么了

蛙蛙说是数组越界,可是我看了,没有啊.
以下是我给数组ishuju[]的定义:
int ishuju[21];//int数据;0为分配点,1为等级,2为门派,3为性别,4为地图x坐标,5为地图y坐标,
             //6为人物在地图上的x坐标,
             //7为人物在地图上的y坐标,
             //8为人物目前所在地图
             //9为主人公面部方向(1向上,2向下,3向左,4向右)
             //10-14为5件随身装备
             //15为任务进度
             //16为在什么商店
             //17为饰品为那个装备,写1-5装备号
             //18为防具为那个装备,写1-5装备号
             //19为武器为哪个装备,写1-5装备号



大侠们帮我看看啊!
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-29 12:40 , Processed in 0.013147 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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