【问题标题】:Command Prompt Freezing on GCC compileGCC 编译时命令提示符冻结
【发布时间】:2014-02-10 02:24:15
【问题描述】:

我不是编程的超级初学者,但我对通过 windows 命令提示符窗口编译和运行代码比较陌生。

#include <stdio.h>
int main(){
double LATER = 0, EARLIER = 0, RESULT = 0; // Declare and initialize LATER and EARLIER
                                           //to store operands and RESULT to hold a 
                                           //calculated result. Declare as type double.
char COMMAND = ' ';         // Declare COMMAND to store the last entered character. 
return 0;}
/*
while !(COMMAND == 'q')
{
    printf("Please enter operand(s), and/or an operator. \n (For division and  subtraction, ensure that the numerator or minuend is entered first): \n");
    scanf("%lf %lf %c \n",&EARLIER,&LATER,&OPERATOR); // Read in large float values for EARLIER and LATER and a character value for OPERAND
    printf("= %.3lf", RESULT);
}
*/

每当我编译这个 (GCC) 并尝试运行它时,我的命令提示符都会冻结——也就是说,它不接受任何输入,只是作为黑屏徘徊(仍然显示之前的控制台输出)。有人知道我应该怎么做才能解决这个问题吗?

更新:尝试从 CodeBlocks 运行相同的东西并遇到相同的问题。弹出两个控制台窗口,一个运行代码并关闭,另一个卡在周围并且不会关闭。不重新启动仍然无法再次运行程序。

【问题讨论】:

  • 你的代码看起来很简单,对我来说运行良好。
  • 这不应该冻结你的命令提示符。它简单明了。
  • 分享完整的有问题的代码。
  • 这就是所有的代码。我不知道发生了什么。
  • 如果您从命令行窗口中的命令行运行它会发生什么?也许您看到的是 IDE 的被测程序启动器的行为。另外,请确保您确实在测试已发布的代码版本,而不是仍然在其中的 while() 循环中的一些较旧的、陈旧的版本。最后,您可以看看您的 IDE 是否可以让您轻松地在调试器下运行它(或者您可能已经在调试器下运行它,但调试控制窗口隐藏在某个地方,甚至没有创建)

标签: c windows gcc command-prompt freeze


【解决方案1】:

好问题。我坚信这是 GCC win32(在我的情况下为 MinGW)中的一个错误,尽管具体情况很难确定,所以我不确定是否有针对它的现有错误报告,或者我会在这里引用它。它似乎影响的人很少,因为我在其他地方没有看到过它。

证据我有一个复杂的运行应用程序,我已经开发了一段时间;但是时不时地,即使是微小的增量更改(一行,无错误),GCC 也会锁定在命令提示符中(具有管理员权限),有时可以关闭,而其他时候既不是关闭按钮也不是任务管理器Windows 关机也不能释放进程;尝试在另一个命令提示符下运行 GCC 也同样失败。然后我必须强制重启。重新启动后,某种缓存或 gcc 应用程序状态必须已被清除,因为编译会顺利进行。 gcc -v 返回:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32 --build=m
ingw32 --without-pic --enable-shared --enable-static --with-gnu-ld --enable-lto
--enable-libssp --disable-multilib --enable-languages=c,c++,fortran,objc,obj-c++
,ada --disable-sjlj-exceptions --with-dwarf2 --disable-win32-registry --enable-l
ibstdcxx-debug --enable-version-specific-runtime-libs --with-gmp=/usr/src/pkg/gm
p-5.1.2-1-mingw32-src/bld --with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --
with-mpfr= --with-system-zlib --with-gnu-as --enable-decimal-float=yes --enable-
libgomp --enable-threads --with-libiconv-prefix=/mingw32 --with-libintl-prefix=/
mingw --disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIME_T
Thread model: win32
gcc version 4.8.1 (GCC)

P.S. 根据this question,GCC 可能被锁定等待内核资源。这可能是由于它尝试访问 Windows 内核资源的方式与 Linux 相比,因为它是从后者移植而来的。

P.P.S. 如果这不是 GCC 错误,那么 OP 和我有一些共同的操作系统问题。

【讨论】:

  • 有趣。 OP发布的特定示例代码对您来说是否失败?此外,即使它们是不可预测的,失败似乎是确定性的吗?
  • @KyleStrand 我没试过那个代码;我只是顺便回答了这个问题。如果有任何方法可以知道 gcc 连接的是什么(例如通过日志文件等),我有兴趣研究这些。
【解决方案2】:

问题中的代码很简单:

  • 声明double变量LATEREARLIERRESULT
  • 将它们初始化为0
  • 声明一个char变量COMMAND
  • 将其初始化为单个空格字符。
  • 成功退出(返回值0

因此您看到的是一个空控制台。

查看相同代码的正确缩进列表。请注意,main() 函数在return 0; 之后的行结束,而且该行之后的所有内容都是多行注释,不会在输出二进制文件中生成其可执行指令。

#include <stdio.h>

int main()
{

    double LATER = 0, EARLIER = 0, RESULT = 0;
    // Declare and initialize LATER and EARLIER
    //to store operands and RESULT to hold a 
    //calculated result. Declare as type double.

    // Declare COMMAND to store the last entered character. 
    char COMMAND = ' ';

    return 0;
}

/*
   while !(COMMAND == 'q') {
    printf("Please enter operand(s), and/or an operator. \n"
           "(For division and  subtraction,"
           " ensure that the numerator or minuend is entered first):");

    // Read in large float values for EARLIER and LATER and a character value for OPERAND
    scanf("%lf %lf %c \n",&EARLIER,&LATER,&OPERATOR);

   printf("= %.3lf", RESULT);
}
*/

您需要按照以下代码行做一些事情,其中​​:

  1. 接受 3 个输入。

  2. 执行一些操作以获得结果。

  3. 如果第三个输入是字符“q”则退出,否则再次要求输入 3 个。

Step2 的代码丢失。它是你的 TODO ;-)

#include <stdio.h>

int main()
{

    // Declare and initialize LATER and EARLIER
    //to store operands and RESULT to hold a 
    //calculated result. Declare as type double.
    double earlier = 0, later = 0, result = 0;

    // Declare COMMAND to store the last entered character. 
    char cmd = ' ';

    while (cmd != 'q') {
        printf("Please enter the following 3\n"
               "< operand1 operand2 operator >\n"
               "(For division and  subtraction,"
               " ensure that the numerator or minuend is entered first):\n");

        // Read in large float values for EARLIER and LATER and a character value for OPERAND
        scanf("%lf %lf %c", &earlier, &later, &cmd);

        // TODO: Add code to calculate "result" here

        // Print "result"
        printf("result= %.3lf\n", result);
    }

    return 0;
}

【讨论】:

  • 我很欣赏你的努力,但问题不在于代码什么都不做——我非常清楚这一点。但是,当执行返回时,它不应该终止我的程序并允许我再次使用命令行吗?它没有这样做。相反,命令窗口不能与任务管理器交互甚至终止。它只是停留在那里。
  • 除非你在 cmd 中按“q”键,否则程序将永远运行。
  • @TheCodeArtist OP 并不是说​​ your 代码永远运行;问题是无所事事的代码一直在运行。显然,这不应该发生。
  • @DesertEagle_PWN,您应该编辑您的原始问题以澄清这就是您所说的“冻结”。 (是的,这就是人们应该期望冻结的意思,但有时人们会误用它,作为这里的新用户,您不太可能从怀疑中受益——例如,参见 Jongware 的(相当合理)评论。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2011-12-28
  • 2011-10-06
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多