主题:子程序参数问题
阿木Lee
[专家分:80] 发布于 2009-03-25 20:00:00
在定义子程序时,用变量类型符号代替声明关键字可以么?
如:
SUB PTRCHR(X%,Y%)
……
END SUB
代替
SUB PTRCHR(X AS INTEGER,Y AS INTEGER)
……
END SUB
如果可以,那我在传参的时候,系统检测到的X 参数为整型,但值却是单精度了……
parameter of type: INTEGER
variable of type: SINGLE precision
而我使用关键字声明就没了这问题。
我知道在最前面加: DEFINT A-Z就可以了,但这是为什么呢……
谢谢回答
最后更新于:2009-03-25 20:02:00
回复列表 (共9个回复)
沙发
moz [专家分:37620] 发布于 2009-03-25 21:52:00
1.使用DEFINT A-Z就把所有没加后类型后缀的变量全部默认为短整形,如果没有这一句,就默认为单精度类型。
2.在SUB的定义中,可以使用后缀来代替AS语句.
3.当形参与实参类型不一致时,如果没有溢出,就会按(数)值四舍五入转换.
4.你的程序里如果提示了类型不一致,应该不是出现在传值过程中,而应该是在程序的声明语句里.
QBX的编辑器,会在程序的保存过程中,自动把你的子过程参数表在主程序里进行声明:
比如是DECLARE SUB PTRCHR(X!, Y!)
而你真正的子过程却已经是把它们改成了短整形了.
所以解决办法很简单,你把带DECLARE这一行删除后再保存一次,便会自动生成一行新的声明语句了.
板凳
阿木Lee [专家分:80] 发布于 2009-03-26 07:40:00
谢谢回答`
MOZ兄~~~~
你看下我这程序,问题还存在:
DECLARE SUB printchar (Char$, X%, Y%, Forecolor%, Bright%, Backcolor%, Bbright%)
CLS
CALL printchar("Hello", 3, 3, 2, 1, 0, 0)
SUB printchar (Char$, X%, Y%, Forecolor%, Bright%, Backcolor%, Bbright%)
DIM PtchrChradd AS INTEGER, PtchrChr AS STRING * 1, PtrchrChrASCII AS INTEGER
DIM PtchrColoradd AS INTEGER, PtchrColorattrib AS INTEGER
DIM PtchrStartadd AS INTEGER, i AS INTEGER
DEF SEG = &HB800
PtchrColorattrib = Forecolor * 1 + Bright * 8 + Backcolor * 16 + Bbright * 128
PtchrStartadd = (X + (Y - 1) * 80) * 2 - 2
PtchrChradd = PtchrStartadd
FOR i = 1 TO LEN(Char$)
PtchrChr$ = MID$(Char$, i, 1)
PtchrChrASCII = ASC(PtchrChr$)
PtchrColoradd = PtchrChradd + 1
POKE PtchrChradd, PtchrChrASCII
POKE PtchrColoradd, PtchrColorattrib
PtchrChradd = PtchrChradd + 2
NEXT i
DEF SEG
END SUB
现在运行是不成的,我把SUB第一行改成:
SUB printchar (Char$, X AS INTEGER, Y AS INTEGER, Forecolor AS INTEGER, Bright AS INTEGER, Backcolor AS INTEGER, Bbright AS INTEGER)
就可以了。
或者我在子程序中添加:DEFINT A-Z也能运行。
这是为什么呢~~~
parameter of type: INTEGER
variable of type: SINGLE precision
这是我在子程序里参数上按F1后的提示。
麻烦你了,MOZ~
3 楼
moz [专家分:37620] 发布于 2009-03-26 19:11:00
其实很简单,
在你的子过程里,
X 和 X% 是两个不同的变量.
因为你没有使用过DEFINT A-Z
所以 X 这个变量默认为单精度,跟短整形的 X% 是没有任何关系的.
所以你把所有 X 和 Y 加上后缀%就解决问题了.
假如你使用过 DEFINT A-Z 的话, X 和 X% 就变成了同一个变量了.
4 楼
强强 [专家分:4740] 发布于 2009-03-26 19:58:00
你好,MOZ,看到你的讲解感觉真是亲切啊,还记得以前曾经问过你关于数独的问题吗?看到你写的那个解数独的程序开始我就非常佩服你,后来不断看到你的帖子更让我觉得你是个水平挺高的人.牛年一切顺利.
5 楼
moz [专家分:37620] 发布于 2009-03-26 20:38:00
唉,别抬举我了.也别要佩服我了.
我现在可是惭愧失落的想死.
但又已经过了想自杀的年龄了,已经没有那个胆量了.
嗯,谢谢你,我也希望牛年可以顺利活过去,虽然希望并不大.
6 楼
moz [专家分:37620] 发布于 2009-03-26 21:57:00
嗯,当年那个什么数独还是什么九宫格吧,我有没有向你解释过了?
按道理,我那么哆嗦的人,应该会跟你解释的,但我好像已经找不到了.
我的记忆力早已大不如前了.
7 楼
强强 [专家分:4740] 发布于 2009-03-27 19:06:00
为什么你这么悲观?其实我现在也挺郁闷的,生活中有许多不顺利的事,我想咱们都能挺过去.有什么的,哈哈.那个九宫格程序带给我最大的收获就是让我决定一定要也编一个解数独的程序,不久前终于实现了这个愿望,虽然效率不怎么高,希望咱们大家共同努力吧
8 楼
阿木Lee [专家分:80] 发布于 2009-03-30 07:18:00
恩,差不多了,谢谢。
但~~~
在形参定义时,用类型符就没意义了嘛……,和子程序里的变量没关?
那为什么我用关键字定义就可以了呢?
9 楼
moz [专家分:37620] 发布于 2009-03-30 20:56:00
X 和 X% 是两个不同的变量.
因为你没有使用过DEFINT A-Z
所以 X 这个变量默认为单精度,跟短整形的 X% 是没有任何关系的.
所以你把所有 X 和 Y 加上后缀%就解决问题了.
假如你使用过 DEFINT A-Z 的话, X 和 X% 就变成了同一个变量了.
我来回复