【问题标题】:How to resolve Exception Error in C++ Builder如何解决 C++ Builder 中的异常错误
【发布时间】:2022-08-07 18:51:17
【问题描述】:

我正在将基于 DOS 的旧 16 位应用程序转换为当前的 Windows 控制台应用程序。每次在调试模式下运行应用程序时,我都会收到以下错误:

Project xxxx.exe raised exception class $C0000005 with message \'access violation at 0x004151f9: read of address 0x00000000\'.

以下是爆炸的代码行:

if ((argc < 1) || (strcmp(argv[1],\"/?\")) == 0) prg_syntax();

代码评估并应该运行该函数以显示程序语法,但不会,而是抛出错误。

我正在使用 C++ Builder 版本(11.1.5)。

我将不胜感激在哪里或如何克服的任何帮助。

谢谢, 肯特

  • 小测验:如果 argc 的值为 1,您希望 argv[1] 中的值是多少,为什么?这是一个技巧问题,在这种情况下没有argv[1]
  • 我正在将基于 DOS 的旧 16 位应用程序转换为当前的 Windows 控制台应用程序。-- 如果那是 16 位应用程序的实际代码,那么该应用程序从一开始就被破坏了。

标签: c++ c++builder


【解决方案1】:

按照惯例,argc 不能低于 1,因为它至少具有指向执行(二进制)文件的名称/符号链接。在没有参数传递给您的程序的情况下,它将尝试尊重 NULL 指针(argv[] 的最后一个元素)。

  if ((1 < 1) || (strcmp(NULL,"/?")) == 0) prg_syntax();

我相信你想做这样的事情:

  if ((argc < 2) || (strcmp(argv[1],"/?")) == 0) prg_syntax();

【讨论】:

  • “argc 不能低于 1”- 是错误的,所以可能不包括在内。
  • argv[0]通常保存可执行文件的名称/路径,但这不是保证.这是可能的以这样一种方式生成一个进程,即可执行文件的名称/路径不存在于解析为argv的命令行字符串中。但是,您必须竭尽全力才能做到这一点,如果您只是在 99.9999% 的时间内“正常”启动可执行文件,就不会发生这种情况。
  • 令人惊讶的是,旧的 BC 编译器从未发现此错误,而且一切似乎都运行良好。非常感谢大家。
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2012-01-12
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多