proof 发表于 2024-4-12 09:41:45

求助: C++代码 无法通过


《游戏编程入门(第4版)》,下载的随书源码。
书内采用VS2013版本。DirectX版本未指明,我用的是DX9。

前10章的例程,经调试微改后,都成功执行。
但第11章的例程,新加入音频效果。编译错误。

源码度盘下载:pan.baidu.com/s/1sMdtAyVKXYgqGJcxvj6kCQ?pwd=744x

环境:C-Free 5.0 + DirectX 9.0
https://img.mydigit.cn/forum/202404/11/164025whzkz566wtoxb1w9.png
32,33,35,37行 分别报错。
error: expected primary-expression before ';' token

32    wc.hIcon         = NULL;
33    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
34    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
35    wc.lpszMenuName= NULL;
36    wc.lpszClassName = APPTITLE.c_str();
37    wc.hIconSm       = NULL;

问题是,这个MyWindows.cpp,和6~10章的MyWindows.cpp完全一样,一个字符不差。
前几章的,都编译通过,执行成功。根本没报这几行错误。

貌似是NULL定义问题,可是前几章完全相同的MyWindows.cpp为什么不报错?

FishC 发表于 2024-4-12 09:42:02

这个错误是因为在C-Free 5.0中,NULL可能没有正确定义。C-Free 5.0是一个免费的IDE,它的C++编译器版本较旧,所以会出现这种问题。在新版本的C++标准中,NULL已经被nullptr所取代。

解决方法是将NULL替换为nullptr,这样代码就可以正常编译通过了。请修改如下代码:

wc.hIcon = nullptr;
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = reinterpret_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
wc.lpszMenuName = nullptr;
wc.lpszClassName = APPTITLE.c_str();
wc.hIconSm = nullptr;

重新编译代码,应该就能通过了。

另外,建议您在学习游戏编程时使用更新的开发环境,例如Visual Studio 2019等,保持与书本一致的开发环境有助于避免不必要的问题和错误。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

proof 发表于 2024-4-12 09:43:21

之前也报错:sal.h: No such file or directory

百度原因:
  sal.h免费下载,使用DirectSound时用;C-Free编程时没有,只有安装VS后库里才有。
  C-Free编程时有时会缺少这个东西,安装VS库里才自带这个;可以下载后直接使用,省的安装VS。我从VS2017库里找到的。
  在网上下载sal.h文件并拷贝到所在目录(C:\Program Files\Microsoft SDKs\Include)即可。
  sal.h下载:pan.baidu.com/s/1hswd5tU

  于是下载了sal.h,放到lib或include里。
  貌似是NULL定义的问题。sal.h里面确实有很多null ,比如:
#define _$null      Null=SA_Yes
#define _$maybenull   Null=SA_Maybe
#define _$notnull   Null=SA_No
……
    #define __null                  __declspec("SAL_null")
    #define __notnull               __declspec("SAL_notnull")
    #define __maybenull             __declspec("SAL_maybenull")
……
    #define __null
    #define __notnull
    #define __maybenull

难道是这个原因?

FishC 发表于 2024-4-12 09:43:29

proof 发表于 2024-04-12 09:43
之前也报错:sal.h: No such file or directory

百 ...

是的,sal.h是一个表示函数参数和返回值的注解库,它用于帮助程序员更好地理解函数的预期行为。这个库在一些特定的编译环境中需要使用,但在其他环境下可能没有包含此文件。

在您的情况下,由于您在C-Free编程时缺少sal.h文件而导致了错误。解决方法是从网上下载sal.h文件,并将其放置在正确的目录中,如您所述的"C:\Program Files\Microsoft SDKs\Include"。

请确保下载的sal.h文件与您的编译器版本和开发环境兼容。如果您不确定,请尝试下载与您使用的Visual Studio版本相匹配的sal.h文件。

一旦您将sal.h文件放置到正确的位置,您的代码应该能够编译通过,并且可以正常使用DirectSound功能。祝您顺利实现音频效果!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

proof 发表于 2024-4-12 09:47:53

FishC 发表于 2024-4-12 09:42
这个错误是因为在C-Free 5.0中,NULL可能没有正确定义。C-Free 5.0是一个免费的IDE,它的C++编译器版本较旧 ...

第32行改成nullptr后,报错:

MyWindows.cpp:32: error: `nullptr' was not declared in this scope

是不是需要加一行头文件或库文件?

FishC 发表于 2024-4-12 09:48:05

proof 发表于 2024-04-12 09:47
第32行改成nullptr后,报错:

MyWindows.cpp:32: e ...

是的,您需要包含`<cstddef>`头文件来正确地使用`nullptr`。`<cstddef>`头文件定义了`nullptr`的宏。请在代码的开头添加以下行:#include <cstddef>这将解决`nullptr`未声明的错误,并使代码能够成功编译通过。如果还有其他问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

proof 发表于 2024-4-12 15:54:35

智能助理,您好,您的回答都没有解决问题。

哪位网友可否下载一楼的源码,在本地编译后,上传一个 test.exe ? (若不允许exe类型,可放入rar压缩包,上传)
看看是什么效果。

FishC 发表于 2024-4-12 15:55:02

proof 发表于 2024-04-12 15:54
智能助理,您好,您的回答都没有解决问题。

哪位网 ...

非常抱歉,由于我是一个智能助理程序,无法直接下载源码并生成可执行文件。但我可以帮助您分析代码和问题,并尝试提供解决方案。

根据您的描述,主要存在两个问题:NULL定义问题以及sal.h文件缺失问题。以下是对这两个问题的更详细解释和解决方案:

1. NULL定义问题:
   在C++11标准中,已经将NULL替换为nullptr,所以在C-Free 5.0中可能没有正确定义nullptr。解决方法是将所有的NULL替换为0,这样代码就可以正常编译通过了。请修改相应代码如下:

wc.hIcon = 0;
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = APPTITLE.c_str();
wc.hIconSm = 0;

2. sal.h文件缺失问题:
   sal.h是Microsoft's Source Annotation Language (SAL)的头文件,它用于对C或C++代码进行函数参数和返回值的注解。这个文件通常包含在Microsoft Windows SDK中。解决方法是安装合适版本的Microsoft Windows SDK,并将sal.h文件拷贝到正确的目录下(如您之前提到的"C:\Program Files\Microsoft SDKs\Include")。确保从可靠的来源下载sal.h文件,并验证其与您使用的编译器和开发环境兼容。

希望以上解决方案能够帮助您解决问题。如果还有其他问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助: C++代码 无法通过