Compiling a Big QB program in FB
 

我们尝试在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多行不是很多变化...
请享用!