windows - 控制台 textgame.exe 可在 Windows 7 上运行,但不能在 Vista 上运行...为什么?

标签 windows console compatibility

嘿,我使用 pdCurses 库和微软操作系统工具制作了一个文本游戏。以下是我的内容,请参阅下面的其他说明:

#include <iostream>
#include <time.h> // or "ctime"
#include <stdio.h> // for 
#include <cstdlib> 
#include <Windows.h> 
#include <conio.h>
#include<curses.h>
#include <algorithm>
#include <string>
#include <vector>
#include <sstream>
#include <ctime>

#include <myStopwatch.h> // for keeping times
#include <myMath.h>      // numb_digits() and digit_val();

myStopwath/Math.h 包括:

#include <stdio.h>
#include <math.h>
#include <tchar.h>

所以我在运行 Windows 7 的计算机上测试了该游戏(其中包括一个包含 .exe 和 pdcurses.dll 的文件夹),它运行得很好,但是当在另一台装有 Vista 或更旧版本的计算机上运行时,我的游戏出现了问题起来,但由于几乎立即失去了所有玩家的生命而立即结束......这怎么可能?

如果您想查看完整的源代码,请访问此 Link

谢谢!

最佳答案

在主游戏循环中,在将 coll 变量传递给 theScreen.check_collision() 之前,您不会对其进行初始化。如果玩家没有危险,则该函数不会更新该值。回到主循环,您不检查 check_collision() 的返回值,程序现在根据该变量中的任何未初始化值做出决策。欢迎来到未定义行为的广阔世界。

您在不同操作系统上看到的差异可能是由于不同堆管理器初始化内存页面的方式造成的。即使你的玩家在第一次碰撞后存活了一段时间,该内存位置现在保存着“X”,然后它就永远不会被清除,虽然结果仍然是“未定义”,但在大多数架构上,这将导致注册一个新的每次迭代时的碰撞,解释了为什么你的“生命”消失得如此之快。

要解决此问题,您需要做两件事:

  1. 通过 check_collision 的所有代码路径都必须写入“buff”输出参数。最简单的方法是在函数的第一行将其初始化为 0。 (或者,如果它打算作为输入/输出参数,那么您需要在调用 check_collision() 之前在主循环中初始化它)
  2. 根据 check_collision() 的返回值而不是 out 参数做出决定。 (或者,如果该返回值确实不重要,请将函数的返回类型更改为 void)

关于windows - 控制台 textgame.exe 可在 Windows 7 上运行,但不能在 Vista 上运行...为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6210178/

相关文章:

c++ - 如何读取 .obj 文件?

javascript - SoundCloud api-v2 是否已弃用?

windows - 限制鼠标在指定窗口句柄上移动

xcode - xcode 或 appcode 中的控制台输出过滤

C# .Net 6.0 App 的 Console.WriteLine 在 Linux 上未输出到/bin/bash

android - Google Play - 使用 Unity 制作的发布游戏出现兼容性错误

windows - 在没有cygwin的Windows 7中运行Hadoop-2.3 Mapreduce作业时获取访问被拒绝错误

java - 从控制台运行某些内容时遇到问题

html - 强制 IE 浏览器模式进入兼容模式?

java - Java 的 Groovy 超集