繁体   English   中英

C ++:使用枚举类型进行迭代

[英]C++: Iterate using enum type

我有以下代码:

for (i = 0; i <= WND_WRL; i++) {
   syslog(LOG_ERR, "TESTE i=%d WND_WRL=%d", i,WND_WRL);
}

for (i = 0; i <= WND_WRL; i++) {
   syslog(LOG_ERR, "OnScrDsp for i=%d WND_WRL=%d", i,WND_WRL);
   m_pWnd[i] = gtk_window_new(GTK_WINDOW_POPUP);
   assert(m_pWnd[i]);
}

首先只是为了解释我的问题。 第二个确实是我的问题。

第二个代码的源代码可以在这里找到: https : //github.com/HuayraLinux/intel-classmate-function-keys/blob/master/OnScrDsp.cpp

问题:

WND_WRL变量来自

typedef enum {
    WND_BRG,
    WND_DSP,
    WND_WRL,
} WND_ID;

结构。

在第一个代码中,我可以看到i进行迭代直到2(0,1,2),并且WND_WRL始终为2。问题在第二个代码中:即使WND_WRL也曾经输出2值,因此它将迭代i直到接收到SIGV信号(11)并中断我的应用程序(此处以i = 384停止)。 我能理解为什么384,我对此并不担心。

我不明白的是为什么相同的条件提供不同的方式。 如果我将WND_WRL更改为数字2,则会得到正确的代码并正确执行应用。

我的第一个想法是第二个块,可能会更改WND_WRL值,但没有发生。

我可以理解这段代码是否在错误的内存位置中写入,但是我始终看到WND_WRL具有2值。

解决方案:

将表达式“ i <= WND_WRL”更改为“ i <WND_WRL”,因为m_pWnd的大小。 它解释了SIGV,但没有解释为什么即使2 <= 2条件匹配也要继续直到收到SIGV。 我们知道的覆盖内存可以破坏很多事情,但是常量和代码是只读的堆栈内存区域,因此访问m_pWnd [3]和其他i ++无法解释为什么不停止。

变量m_pWnd在源代码中定义为指针数组,大小为2,因此有效索引为0或1。

GtkWidget *m_pWnd[WND_WRL];

但是您的循环进入i <= WND_WRL ,所以i=2情况将崩溃

m_pWnd[i] = gtk_window_new(GTK_WINDOW_POPUP);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM