【问题标题】:"Scoping" C ++ compilation Error“作用域”C++ 编译错误
【发布时间】:2015-05-22 11:30:20
【问题描述】:

我似乎无法弄清楚导致以下错误的原因:

trainLine.cpp:108:错误:“i”的名称查找已更改为新的 ISO“for”范围

trainLine.cpp:98:错误:在“i”处使用过时的绑定

这是导致错误的代码:

int main()
{
  pthread_t tidArray[NUM_TRAINS];
  Train* trainArray[NUM_TRAINS];

  for (int i = 0; i < NUM_TRAINS;  i++)
    trainArray[i] = new Train(TRAIN_NAME_ARRAY[i], TRAIN_TRANSIT_TIME_MSECS[i]);

  int trainInd = 0;

  pthread_create(&tidArray[i], NULL, initiallyNorthernly,(void*)&trainArray[i]);

  pthread_create(&tidArray[i], NULL, initiallySouthernly,(void*)&trainArray[i]);

  for  (int i = 0; i < NUM_TRAINS;  i++)
    trainArray[i] = NULL;

  pthread_join(tidArray[i], (void**)&trainInd);

  return(EXIT_SUCCESS);
}

我提前道歉,但我对 C/C++ 很陌生,没有什么对我来说是错误的。可能没有在 for 循环语句周围放置括号?提前感谢您的帮助。

【问题讨论】:

  • 您认为i 会在这些循环之外做什么?
  • 你可能忘记了创建复合语句的大括号:for(...) { trainArr[i] = ...; pthread_create(...); } 另外,你为什么要在同一个对象中创建两个线程tidArray[i],这是不正确的
  • 是的,正如您所怀疑的那样,“不在 for 循环语句周围放置括号”。 (但显然并没有尝试做任何事情。)
  • 有趣的是,您对 C 还不够了解,以至于不知道在 {/} 循环的复合块中包含语句(我猜还有其他控制结构),但是你已经潜入pthreads了吗?看来您至少会在“hello world”和多线程 C 之间完成一个示例程序。

标签: c++ compiler-errors pthreads


【解决方案1】:

行内:

pthread_join(tidArray[i], (void**)&trainInd);

您引用的 i 超出了范围。我猜你实际上希望这成为循环的一部分,例如

for (int i = 0; i < NUM_TRAINS; ++i)
    pthread_join(tidArray[i], (void**)&trainInd);

【讨论】:

    【解决方案2】:

    您的变量 i 仅存在于 for 循环内,但您试图在循环外使用它。

    这样的事情可以解决问题,而不会改变代码的效果:

      // ...
      int i = 0; // i is now accessible outside the loop as well
      for  (;  i < NUM_TRAINS;  i++)
        trainArray[i] = new     Train(TRAIN_NAME_ARRAY[i],TRAIN_TRANSIT_TIME_MSECS[i]);
    
      // use i, which is equal to NUM_TRAINS at this point
    

    【讨论】:

    • 这当然不是他想要的,因为这样他的后续访问就超出了范围。
    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多