proof1 发表于 2024-4-11 16:42

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

本帖最后由 proof1 于 2024-4-11 20:53 编辑

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

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

百度网盘下载:https://pan.baidu.com/s/1sMdtAyVKXYgqGJcxvj6kCQ?pwd=744x

环境:C-Free 5.0 + DirectX 9.0

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完全一样,一个字符不差。
前几章的,都编译通过,执行成功。根本没报这几行错误。

问题出在哪?



思考者的迷 发表于 2024-4-11 17:06

NULL宏没定义好吧

proof1 发表于 2024-4-11 17:16

本帖最后由 proof1 于 2024-4-12 15:49 编辑

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

兔耳僵尸 发表于 2024-4-11 17:25

是cstddef 吗?

精钢魔像 发表于 2024-4-11 17:26

proof1 发表于 2024-4-11 17:16
这个还需要用户参与吗?

在哪个位置? 库叫什么名字?
windows下开发windows的程序最好用微软的vs,自动配置各种东西
社区版的vs是免费的

asbboy 发表于 2024-4-12 01:56

看上去是NULL不识别吗?把它改成0

—— 来自 S1Fun

根正苗红 发表于 2024-4-12 03:38

本帖最后由 根正苗红 于 2024-4-12 03:42 编辑

NULL不是c++关键字。是巨硬库里的历史遗留。要么#include <windows.h>,要么换成nullptr

proof1 发表于 2024-4-12 08:18

本帖最后由 proof1 于 2024-4-12 09:40 编辑

根正苗红 发表于 2024-4-12 03:38
NULL不是c++关键字。是巨硬库里的历史遗留。要么#include ,要么换成nullptr之前也报错: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下载:http://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


难道是这个原因?


proof1 发表于 2024-4-12 09:49

根正苗红 发表于 2024-4-12 03:38
NULL不是c++关键字。是巨硬库里的历史遗留。要么#include ,要么换成nullptr

第32行改成nullptr后,报错:
MyWindows.cpp:32: error: `nullptr' was not declared in this scope

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

五月之雨 发表于 2024-4-12 09:57

改成0, nullptr是c++11之后才有的

tsubasa9 发表于 2024-4-12 10:20

自学不建议学c++11前的各种教材,现在的c++标准和以前的大相径庭,而且dx9早就退环境了,为啥不学dx12和vulkan
至于CFree的最新5.0版都是2010年的东西了,早就进坟墓了

流缨 发表于 2024-4-12 10:41

有种我上大学时候强行TURBO C的感觉

何必非要找过期教材学屠龙术呢

消亡值语义 发表于 2024-4-12 10:58

dx12 马上快10年了,也不知道dx13还会不会有

微软说有几个头文件有NULL宏,具体没说哪个,不行就自己#define

proof1 发表于 2024-4-12 11:12

消亡值语义 发表于 2024-4-12 10:58
dx12 马上快10年了,也不知道dx13还会不会有

微软说有几个头文件有NULL宏,具体没说哪个,不行就自己#defi ...

#define 容易吗?可否给出代码行?

Jet.Black 发表于 2024-4-12 11:14

有功夫发帖,装个visualstudio不行么,服了

Existinghomes 发表于 2024-4-12 11:16

lz和之前的python侠是同一个人吗

根正苗红 发表于 2024-4-12 11:19

本帖最后由 根正苗红 于 2024-4-12 11:25 编辑

proof1 发表于 2024-4-12 09:49
第32行改成nullptr后,报错:
MyWindows.cpp:32: error: `nullptr' was not declared in this scope


编译器需要支持c++11。装个vs吧。调Windows的API和用DirectX,不用vs是给自己找不自在。反正vs自用也是免费的。

消亡值语义 发表于 2024-4-12 11:22

本帖最后由 消亡值语义 于 2024-4-12 11:40 编辑

proof1 发表于 2024-4-12 11:12
#define 容易吗?可否给出代码行?
1,这个可能报错:
#ifndef NULL
#define NULL ((void*)0)
#endif

2,能把NULL 改成 MYNULL,最安全
#ifndef MYNULL
#define MYNULL ((void*)0)
#endif

3,我目前用vs 2019 可以正常:
#ifndef NULL
#define NULL 0
#endif

4,正常2
#undef NULL
#define NULL 0

viruswho 发表于 2024-4-12 11:28

直接原因是 NULL 未定义,实际原因是有哪个 *.h 头文件没有引入,更深是配置错误头文件路径少了什么,更可能是有个必须的库(里面有*.h)没有安装。

自己定义 NULL 解决不了问题的,后面还会报啥啥未定义.

tsubasa9 发表于 2024-4-12 11:38

Existinghomes 发表于 2024-4-12 11:16
lz和之前的python侠是同一个人吗

是古董侠,天天折腾上个世纪软硬件

すぴぱら 发表于 2024-4-12 12:12

小野賢章 发表于 2024-4-12 14:36

安装 Visual Studio 2022 生成工具,然后用 VSCode 写就行了,不需要 Visual Studio

https://visualstudio.microsoft.com/zh-hans/downloads/

proof1 发表于 2024-4-12 15:50

viruswho 发表于 2024-4-12 11:28
直接原因是 NULL 未定义,实际原因是有哪个 *.h 头文件没有引入,更深是配置错误头文件路径少了什么,更可 ...

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

CyanCloverFern 发表于 2024-4-12 17:57

兔耳僵尸 发表于 2024-4-11 17:25
是cstddef 吗?

不,是win32子系统

CyanCloverFern 发表于 2024-4-12 18:05

本帖最后由 CyanCloverFern 于 2024-4-12 18:08 编辑

遇见null直接写0,微软官方推荐的那本win32编程指南里windows class的注册里填的都是0


给你个工具链,里面是binutils + gcc + mingw-w64-crt + libstdcpp + glfw + glad,可能还有乱七八糟的。没有gnu make。

链接:https://pan.baidu.com/s/1P9jk2_TPe0QMgFgvbFOnwg
提取码:pxan
--来自百度网盘超级会员V8的分享

兔耳僵尸 发表于 2024-4-12 18:52

本帖最后由 兔耳僵尸 于 2024-4-12 21:40 编辑

偷懒用msys2编译过了,就改了个dxerr9.h头文件名称


g++ *.cpp -mwindows -ld3dx9 -ld3d9 -lwinmm -ldinput8 -ldxguid -ldsound -luuid -o test.exe


proof1 发表于 2024-4-13 12:37

兔耳僵尸 发表于 2024-4-12 18:52
偷懒用msys2编译过了,就改了个dxerr9.h头文件名称

看到了截图,不错。
可否上传,可独立运行的exe文件?(不让收传exe的话,放到压缩包里上传)

兔耳僵尸 发表于 2024-4-13 13:15

proof1 发表于 2024-4-13 12:37
看到了截图,不错。
可否上传,可独立运行的exe文件?(不让收传exe的话,放到压缩包里上传) ...

这两天摸不到电脑
环境是msys2 ucrt64,编译就是那行代码

proof1 发表于 2024-4-13 17:00

兔耳僵尸 发表于 2024-4-13 13:15
这两天摸不到电脑
环境是msys2 ucrt64,编译就是那行代码不好意思。
我只用过 集成开发环境(IDE)
msys2 ucrt64 不懂,编译没用过命令行。

等摸到电脑,麻烦上传一下。

兔耳僵尸 发表于 2024-4-14 16:18

上传了

proof1 发表于 2024-4-14 22:17

感谢
页: [1]
查看完整版本: 求助: C++代码 无法通过