PASCAL中的这个简短程序应该显示一个简单的文本,但我得到一个错误: “Project My Application在地址71002A95处提出异常类外部SIGSEGV”
PROGRAM chap5;
USES SDL,SDL_TTF;
VAR
screen, fontface:pSDL_SURFACE;
loaded_font:pointer;
colour_font, colour_font2:pSDL_COLOR;
i:BYTE;
BEGIN
SDL_INIT(SDL_INIT_VIDEO);
screen:=SDL_SETVIDEOMODE(400,200,32,SDL_SWSURFACE);
IF screen=NIL THEN HALT;
IF TTF_INIT=-1 THEN HALT;
loaded_font:=TTF_OPENFONT('C:\Windows\Fonts\Arial\ariblk.ttf',5);
NEW(colour_font);
NEW(colour_font2);
colour_font^.r:=255; colour_font^.g:=0; colour_font^.b:=0;
colour_font2^.r:=0; colour_font2^.g:=255; colour_font2^.b:=255;
fontface:=TTF_RENDERTEXT_SHADED(loaded_font,'HELLO',colour_font^,colour_font2^);
SDL_BLITSURFACE(fontface,NIL,screen,NIL);
SDL_FLIP(screen);
READLN;
DISPOSE(colour_font);
DISPOSE(colour_font2);
SDL_FREESURFACE(screen);
SDL_FREESURFACE(fontface);
TTF_CLOSEFONT(loaded_font);
TTF_QUIT;
SDL_QUIT;
END.
怎么了?
答案 0 :(得分:2)
您正在尝试加载不在您认为的位置的字体,因此TTF_OPENFONT
返回nil。然后,您不会对返回值进行错误检查,只是在代码的其余部分中盲目地使用loaded_font
,并使用无效值。
在我的Windows 7系统上,字体位于C:\Windows\Fonts\ariblk.ttf
;请注意,该路径名中没有Arial
个文件夹。
您需要实际检查任何函数调用的返回值,尤其是那些对外部API进行调用的函数,以确保它们成功。您还需要检查以确保文件在加载之前位于您认为的位置。
const
FontFileName = 'C:\Windows\Fonts\ariblk.ttf';
...
if not FileExists(FontFileName) then
begin
WriteLn('Font file doesn't exist in ' + FontFileName);
Halt;
end;
loaded_font := TTF_OPENFONT(FontFileName, 5);
if loaded_font = nil then
begin
WriteLn('TTF_OPENFONT failed!');
Halt;
end;
// Other code here - check the return values of the SDL functions!
您还有其他一些问题:
首先,您已声明了两个变量(colour_font' and
colour_font2 incorrectly. They shouldn't be pointers, but just references to
TSDK_Color`:
colour_font, colour_font2: TSDL_Color;
现在您不再需要对New
和Dispose
进行两次调用,因此请完全删除它们。
将您的代码更改为
colour_font.r := 255;
colour_font.g := 0;
colour_font.b := 0;
colour_font2.r := 0;
colour_font2.g := 255;
colour_font2.b := 255;
fontface :=TTF_RENDERTEXT_SHADED(loaded_font,
'HELLO',
colour_font, // Remove ^ - no longer needed
colour_font2);
在使用返回的值之前,再次检查所有函数调用的返回值。