《3D游戏编程大师技巧》笔记(1)编译问题

《3D游戏编程大师技巧》是在VC++环境下写的,现在在VS.net学习代码,最新碰到的就是重新编译不断报错的问题。

最然按照作者的编译器设置章节进行了设置,可还是无法一次编译成功。

在此作个笔记,记录下来备查吧

一、无法找到<iostream.h>文件。

原因:现在的头文件改为<iostream.hpp>了

解决:将<iostream.hpp>替换为<iostream.>即可

二、error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)

原因:网上找的答案,见

error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)[转]

总结为一句话:dx9SDK提供的头文件<basetsd.h>没有定义POINTER_64。

解决:我的解决办法就是把dx9SDK\include下的basetsd.h改名为basetsd_bk.h。目前很顺利

三、index未定义

原因:index定义在        for (int index=0; index<2; index++){*****}中,而出错的地方index都在该特环体之外。

     就是说,现在的编译器对变量的作用域控制得更严格了

解决:把for(****)中的int index=0放到循环体之外,提升该变量的作用域范围。

四、错误 error LNK2019: 无法解析的外部符号 ,

原因:因为链接器未链接所需的链接库(*.lib)

解决:链接器属性设置的输入项中,在“附加依赖项”栏输入所用到的lib文件。或者在头文件中加入“#prgma comment(lib,”库文件.lib”)”

       1)__imp__mmioRead@12,该符号在函数 “int __cdecl DSound_Load_WAV(char *,int)” (?DSound_Load_WAV@@YAHPADH@Z) 中被引用 d:\我的文档\visual studio 2010\Projects\d3_2\t3dlib3.obj d3_2

对应的lib文件是 winmm.lib

五、Load_Bitmap_File()中_lseek(……)报错。

跟踪代码,到read.c中,发现是 _VALIDATE_CLEAR_OSSERR_RETURN((fh >= 0 && (unsigned)fh < (unsigned)_nhandle), EBADF, -1);抛出的异常。

fh是传入的句柄,与Load_Bitmap_File()中打开时生成的文件句柄的值(3XXX)一致,没问题

而_nhandle的值为32,所是(unsigned)fh < (unsigned)_nhandle),为否所引发的异常。可是_nhandle是什么,如何作用?找到不资料,也就无从下手改正了。

大的原因应是文件的IO操作引起。为了找到文件操作到底有何错。写了个控制台程序,运行到_lseek(),很正常汉有问题。

#include "stdafx.h"
#include <stdio.h>
#include <io.h>
#include <fcntl.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int file_handle;
	long fileSize;
	BITMAP_FILE_PTR bitmap = new BITMAP_FILE();

	if((file_handle = open("greengrid.bmp",O_RDONLY)) ==-1)
	{
		printf("Error");
		return 0;
	}
	fileSize = filelength(file_handle);
	printf("The file size in bytes is %ld\n",fileSize);

	fileSize = _lread(file_handle,&(bitmap->bitmapfileheader),sizeof(BITMAPFILEHEADER));
	printf("The bitmapFILEheader size in bytes is %ld\n",fileSize);

	_lread(file_handle, &(bitmap->bitmapinfoheader),sizeof(BITMAPINFOHEADER));
	printf("The bitmapINFOheader size in bytes is %ld\n",fileSize);

	fileSize = _lread(file_handle, &bitmap->palette,256*sizeof(PALETTEENTRY));
	printf("The bitmapINFOheader size in bytes is %ld\n",fileSize);

	_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);

	close(file_handle);
	getchar();
	return 0;
}

经对比原代码,发现Load_Bitmap_File()中是用WindowsAPI函数OpenFile()打开的文件,而我用的是C函数open(),

解决:于是果断用open()代替OpenFile(),此处过关。再次断点跟踪发现,open()后得到的file_handle的值尽然只有3,肯定小_nhandle啦。

参考网上搜到以下文章,

(原)错误修正:《Windows游戏编程大师技巧》demo7_10 – demo7_12…

Direct9+VS2005 读取bmp位图时,_lseek()函数断言报错分析

估计原因是这样:在古老的C环境或者是C库编写时的环境下,最多能同时打开文件有限,而_nhandle估计就是这个上限值

vc6.0时这个上限还没突破(又或是还没来得及改?)所以作者在vc6.0环境下,可以OpenFile()WinApi函数与C函数混用。

而VS.net环境下,这个值有了超常的提高(或许无限?没求证),并且微软的工程师重写了OpenFile(),分配一个超大的文件句柄,而这个句柄大超出了_nhandle的限定,所以当我们用VS重新编译前辈的代码时,就抛出了异常。

参考资料中用到_llseek()或许是微软工程师用来代替_lseek()以匹配更多的文件句柄的解决方案吧。

(估计后面还会跑到不少因库函数重写产的问题)

六、Load_Image_Bitmap()中memcpy(dest_ptr, source_ptr,image->width);又出错了。

    原文作者:游程编码问题
    原文地址: https://blog.csdn.net/aloneone/article/details/21245443
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞