我们尝试在FreeBasic中编译一个大(4000+行)的图形化QB程序,以了解FB与QB的兼容性。
作为一个例子,我将使用Jark的TCRay,它是一种具有二次,三次和二次形状的极光线追踪器,在2004年编程了perlin噪声。你可以从中获得TCRay.zip
http://www.mandelbrot-dazibao.com/Programs/Programs.htm
注意TCRay是一个QB4.5解释程序,Jark从来没有耐心编辑他的工作,
他只是测试了它解释,并继续添加功能。
该程序由3个文件组成:
TcRay21C.bas - 主文件。
TcLib17L.bas - SVGA图形库。
Tclib17.bi - 图书馆的包含文件。
移植TCLib17.bas
在TCLib17.bas它是一个“纯QB”SVGA库。它的大部分功能由FB实现,因为它们被实现为QB样式的关键字。我有分享开发这个lib,所以你可以相信我这个部分;)
注释ClearScreen子目录的内容并添加
CLS
注释出Point24子的内容并添加:
a& = Point(x%,y%)
red% = a& Shr 16
green% = (a& Shr 8) And 255
blue% = a& And 255
注释出Pset24 sub的内容并添加:
PSet (x%,y%), red% Shl 16 Or green Shl 8 Or blue
注释截图的内容,并添加:
BSave Name$+".bmp"
注释出SelectVga子的内容,我们将使用固定大小的大多数pc将支持。注释出SetText sub的内容,我们可以在HiRes图形中输出文本,因此不需要模式切换。
注释掉SetVGA Sub的内容,不包括最后两个计算的权力,并添加以下四行:
Screen 20,32 '1024x768, 32 bits
scrheight=768
scrwidth=1024
Fullscreen
在TCRay17.bas添加一个SetSVGA作为菜单子菜单中的第一行(我们不是切换模式,所以在输出文本之前必须设置模式),
编译好的,停止信任我,现在你可以开始尝试编译。你会收到一些错误。
编译:
fbc -s gui -w 1 -lang qb TcRay21C.bas TcLib17L.bas
我警告你需要的所有更改,除了两个来自FB语法中的一些(明智的)限制:
- 变量名称不能是关键字加上类型后缀
- 一个简单的变量不能与数组相同
和TCLib17.bi错误:重复定义,找到“RGB”(
RGB是FB中的关键字)
加:
#undefine RGB之前给出错误。
错误:重复的定义,发现'ScreenRes'(
ScreenRes是FB中的关键字)
加:
#undefine ScreenRes之前给出错误。
错误:重复定义,找到“名称”(
名称是QB中的关键字)
加
#undefine Name之前给出错误。
在TCRay17.bas错误:重复定义,发现“Acos”(
ACOS是QB中的关键字)
加
#undefine Acos之前给出错误。
错误:参数计数不匹配FB中不需要清除(
明确),该关键字已被重用(不是一个聪明的决定))
“评论CLEAR
错误:在InitCubic()的参数2(类型)(
类型是QB中的关键字)中的非法规范)
我们可以取消定义,因此搜索并将
type$替换为
_type$
错误:预期'END IF',找到'END'END FUNCTION
这是由FB引入的怪癖引起的错误。单行
If在THEN后有一个冒号需要一个ENDIF,它与宏有关...什么原因让杰克把冒号从他的THEN逃走了。QB根本不需要它们,并且FB按照预期没有它们。删除THEN关键字后的所有冒号。搜索并替换
THEN : 为
THEN
错误:数组访问,索引预期,在'='xn = x * x - y * y + zx0之前
我们有一个数组名称xn和一个名为xn的变量。在尝试编译时用错误的行替换xn与_xn。
与x0相同的错误,我们有一个名为x0的数组。
在尝试编译时用错误的行替换xo。
错误:数组访问,索引预期,在'*'之前dadY = Amplitude * dAdR * drdY。幅度相同的问题。
用_Amplitude替代幅度,当您尝试编译时出错。
Ok.此时所有模块都将进行编译。我们现在要修复一些链接器错误。
链接器错误编译链接后,使用运行时库绑定所有模块,找到每个子/函数的最终地址,并用这些地址替换调用中的标签。如果代码中调用了一个子/函数,并且无法找到该链接,则链接器会向我们提供有问题的功能的名称。它不能给我们的行号(链接器不能与源),所以我们将不得不做一个文本搜索找到问题发生在哪里。注意,链接器给我们“mangled”函数名称(和号,传递的参数的大小被添加到结尾),只要忽略&符号和后面的内容。
TcRay21C.o:fake :( .text + 0x174d):未定义的引用“LINE24 @ 20”
在程序中调用了一个未定义的Line24子程序,您可以在T.Axis中找到这个调用,在TCRay21.bas中,这是一个从未被调用的子类(您可以搜索confirrm它)
也许QB4.5编译器也会抱怨这个。(记住:这个程序从来没有在QB4.5中编译)只需注释掉Sub Draw.Axis的内容
TcRay21C.o:fake :( .text + 0x181b3):未定义的引用“FFIX @ 0”
Ffix是有用的v1ctor的QB 4.5浮点补丁。FreeBASIC不需要它只需在tcray21c.bas中声明之后注释掉该行
这就是程序的编译和工作。4000多行不是很多变化...
请享用!