易码技术论坛

 找回密码
 加入易码
搜索
查看: 167968|回复: 2

关于批量法画图

[复制链接]
发表于 2006-3-12 20:42:00 | 显示全部楼层
在看过余海林的文章以后,我对他所讲的方法却是一片茫然,不知是他讲得不够清楚还是我的理解能力太差了,总之我是没看懂的,在他的文章是有一段讲述的是文曲星内存的结构,根据这个原理我作了大量的实验,最终弄懂了,下面我来给大家讲解一下吧!
一,文曲星中的变量:
    在文曲星中,使用变量时系统会做两件事,第一,将变量中的数据记录下来,第二将变量的属性记录下来.下面我们慢慢看:
    举个例来说明吧:比如一个商场的仓库新进了一批彩电,在入库时会进行登记,我们会把这些彩电的品牌,规格,数量,存放的位置记录下来,再把货物放到相应的地方就OK了,等我们要用这个彩电时就可以根据登记册上所登记的内容来找到我们要提取的货物,所以就能方便的找到我们入库时所存入的彩电.
    和这个差不多,在文曲星中也是这样的,比如,我们运行下面这个程序时:
10 A$="ABC"
   其实系统做了这两件事:
1, 把变量的类型(字符串类型的代码是64)记录下来,把变量名(A的ASCII码是65)记录下来,把字符串的长度3记录下来,再把这个变量的存放的首地址(我们假设记录在8816这个地址中)记录下来(其中地址是分成两个字节来存放的,称高位地址和低位地址,高位地址*256+低位地址=地址:例如,高位地址为25,低位地址为192,那么实际地址就为25*256+192=6592)也就是说,每次使用一个变量时,系统会自动开辟五个字节的空间来存放一个变量的属性,(我们把这个内存地址称作登记册)
2,在指定的地址开始存放这个变量中的数据.(我们把这个内存地址称作仓库)
      就这样,一个变量就被存下来了.当我们要取这个变量时,系统会根据"登记册"中记录的一址中取出相应长度的数据出来.但如果我们把登记册中的数据的长度和地址改掉,那么系统取出来的数据就不是我们存入时的数据了.比如我们存入的是ABC三个字节的字符串,现在我们把它的长度改成100,地址改成6592,那我们使用这个变量时系统就会到6592这个地址开始取出100个数据,我们知道6592是图形缓冲区的开始地址.如果用PEEK(6592)~PEEK(8191)一共要循环1600次,而现在用这个变量来取就只须循环16次.
      那么具体要怎么执行呢?由于PC1000和CC800的方法已经被大多的人掌握了,下面我就说说PC1010/PC2000/NC2000/NC2600/NC3000的方法吧.首先,这些机型的"登记册"是浮动的,在不同的程序当中所在的位置都是不同的,所以我们一开始就必须先找到这个登记册的地址,我发现,上述这些机型的字符串的处理能力为最大128字节.那么1600个字节我们就要用16个变量*每个变量100字节来读取,知道了这些我们再来作下一步的打算.
    我们先编一段程序"
10 A$=" ":B$=" ":C$=" ": D$=" ":E$=" ":F$=" ":G$=" ":H$=" "
20 I$=" ":J$=" ":K$=" ": L$=" ":M$=" ":N$=" ":O$=" ": P$=" "//定义要使用的变量
30 FOR I=8000 TO 10000
40 IF PEEK(I-2)=64 AND PEEK(I-1)=65 AND PEEK(I)=1 THEN P=I:60//寻找"登记册"的地址
50 NEXT
60 CLS
70 FOR I=0 TO 15
80 PA=(I*100+6592)/256
90 PB=INT(PA)//高位地址
100 PC=(PA-PB)*256//低位地址
110 POKE I*5+P,100//修改字符串的长度
120 POKE I*5+P+2,PB//修改高位地址
130 POKE I*5+P+1,PC://修改低位地址
140 NEXT
好了,这样就把这些变量规定到图形缓冲区中去了.这时你可以画图了.如果我们要保存图片的就运行下面的程序吧
1000 OPEN "DAT" FOR OUTPUT AS #1:CLOSE #1//清空文件
1010  OPEN "DAT" FOR RANDOM AS #1 LEN=100
1020 FIELD #1,100 AS X$
1030 LSET X$=A$: PUT #1,1//将各个变量的内容存入随机文件
1040 LSET X$=B$: PUT #1,2
1050 LSET X$=C$: PUT #1,3
1060 LSET X$=D$: PUT #1,4
1070 LSET X$=E$: PUT #1,5
1080 LSET X$=F$: PUT #1,6
1090 LSET X$=G$: PUT #1,7
1100 LSET X$=H$: PUT #1,8
1110 LSET X$=I$: PUT #1,9
1120 LSET X$=J$: PUT #1,10
1130 LSET X$=K$: PUT #1,11
1140 LSET X$=L$: PUT #1,12
1150 LSET X$=M$: PUT #1,13
1160 LSET X$=N$: PUT #1,14
1170 LSET X$=O$: PUT #1,15
1180 LSET X$=P$: PUT #1,16
1190 CLOSE #1
好了,保存好了,不到一秒就OK了.
下面我们再来看一下要怎么读取了.先首还是要先定义16个变量名.并规定到图形缓冲区.
10 A$=" ":B$=" ":C$=" ": D$=" ":E$=" ":F$=" ":G$=" ":H$=" "
20 I$=" ":J$=" ":K$=" ": L$=" ":M$=" ":N$=" ":O$=" ": P$=" "//定义要使用的变量
30 FOR I=8000 TO 10000
40 IF PEEK(I-2)=64 AND PEEK(I-1)=65 AND PEEK(I)=1 THEN P=I:60//寻找"登记册"的地址
50 NEXT
60 CLS
70 FOR I=0 TO 15
80 PA=(I*100+6592)/256
90 PB=INT(PA)//高位地址
100 PC=(PA-PB)*256//低位地址
110 POKE I*5+P,100//修改字符串的长度
120 POKE I*5+P+2,PB//修改高位地址
130 POKE I*5+P+1,PC://修改低位地址
140 NEXT
150 OPEN "DAT" FOR RANDOM AS #1 LEN=100
160 FIELD #1,100 AS X$
170 GET #1,1: LSET A$=X$//将随机文件中的各个记录中的数据写入各个变量
180 GET #1,2: LSET B$=X$
190 GET #1,3: LSET C$=X$
200 GET #1,4: LSET D$=X$
210 GET #1,5: LSET E$=X$
220 GET #1,6: LSET F$=X$
230 GET #1,7: LSET G$=X$
240 GET #1,8: LSET H$=X$
250 GET #1,9: LSET I$=X$
260 GET #1,10: LSET J$=X$
270 GET #1,11: LSET K$=X$
280 GET #1,12: LSET L$=X$
290 GET #1,13: LSET M$=X$
300 GET #1,14: LSET N$=X$
310 GET #1,15: LSET O$=X$
320 GET #1,16: LSET P$=X$
330 CLOSE #1
好了,数据读出来了.并且放到了图形缓冲区当中了!

8020_36495_4803.rar

29 KB, 下载次数: 467

 楼主| 发表于 2006-3-25 20:28:00 | 显示全部楼层
好长,要好好研究了。
 楼主| 发表于 2006-3-10 21:25:22 | 显示全部楼层 |阅读模式
[face=楷体_GB2312]基本原理了解了个大概,但是在画图时依然不知道图片数据是从第几个内存还是读,根据8192+文件长度弄不出来,到底应该怎么弄啊?[/face][em06]
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-5-10 18:43 , Processed in 0.011450 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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