【问题标题】:int main() running constantlyint main() 不断运行
【发布时间】:2023-03-12 02:20:02
【问题描述】:

我是 C++ 的新手,所以如果这是一个愚蠢的问题,我深表歉意,但我似乎找不到答案。

我使用 Processing 已经有一段时间了,现在想开始使用 c++,因为我听说它更快,而且我制作的程序太长/太密集,无法以合理的速度运行 Processing。

在 Processing 中有一个 setup void 运行一次,然后 draw void 在此之后连续运行。这是我习惯的,我需要它来用 c++ 重新制作一个程序(国际象棋 AI)。

有没有办法让 int main 连续运行?如果不能,我可以让它调用一个连续运行的函数吗?

还有一种方法可以在您运行可以绘制几何图形的程序时弹出一个窗口? (我将需要制作可以通过鼠标理想地操作的片段)

顺便说一下,我正在使用 Xcode

【问题讨论】:

  • 我记得有一个库与 Processing 的使用非常相似,但完全用 C++ 编写,但是为了我的生活,我不记得它的名字了..

标签: c++ processing


【解决方案1】:

main() 通常应该进行设置,然后启动工具包提供的主消息处理循环。消息处理循环将持续运行,直到用户请求您的应用程序退出(或您要求工具包关闭您的应用程序)。

您的工具包将在您的窗口需要绘制时调用您的绘图函数。当用户输入(例如按键或鼠标点击)发生时,它将调用其他函数。

例如,如果您使用 GLUT 工具包(用于 OpenGL,这是一种在 Mac、Windows、Linux 和许多移动设备上支持的非常流行的绘图 API),您的主要功能可能如下所示 (complete tutorial here):

void main(int argc, char **argv) 
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
  glutInitWindowPosition(100,100);
  glutInitWindowSize(500,500);
  glutCreateWindow("My First openGL Program");
  glutDisplayFunc(render);
  glutMainLoop();
}

对于 Cocoa,OSX 原生 API,它可能看起来像这样 (more information and links here):

#import <Cocoa/Cocoa.h>

int main(int argc, const char** argv)
{
    return NSApplicationMain(argc,  argv);
}

【讨论】:

    【解决方案2】:

    我建议您不要在 StackOverflow 上问这种非常基本的问题,而是花时间阅读散布在网络上的 C++ 入门教程thousands 之一。

    阅读几个小时后,您会发现通过 Google 搜索可以更快地回答此类问题。

    祝你学习顺利。

    【讨论】:

    • 我不确定这是否可行,Google 也没有提供帮助。我可能最终会买一本 C++ 书
    【解决方案3】:

    您不应该尝试让 main() 连续运行。

    您可以改为这样做:

    int main() {
    while (true) {
    //call functions here
    }
    return 1;
    }

    【讨论】:

    • 这行得通,而且看起来很快(我让它打印一个变量并将其打印到控制台)虽然我想知道如果它在一个 while 循环内,我是否能够稍后测试鼠标点击
    • 我建议你永远不要这样做,因为它会锤击它正在运行的任何线程。如果您执行此类操作,请在 while(true) // 每天迭代 1 中添加以下内容,以确保最小的 CPU 使用率 std::this_thread::sleep_for(std::chrono::hours(24));
    【解决方案4】:

    在 C++ 中,每个函数都由它的调用和返回定义。例如:

    
    void foo()
    {
       cout << "hello world!";
       return;
    }
    
    int main()
    {
        foo();
        return 0;
    }
    
    

    当 foo() 被调用时,它会一直运行到 return 语句。如果我们想让 foo 运行一段不确定的时间,我们可以,例如:

    无效的富() { bool isExiting = false; 字符输入; 而( isExiting != true ) { cout > 输入; 如果(输入=='y') { isExiting = true; } 返回; } } 主函数() { 富(); 返回0; }

    这是一个丑陋的例子 - 将 cin 用于 char 之类的 - 但它传达了这个想法。 while 循环将永远运行,并且它的内部(嗯,无论如何,它是逻辑)可以替换为您的程序需要执行的任何操作。

    有意义吗?

    【讨论】:

    • (另外,OJ在某种程度上是对的。你真的应该看看:parashift.com/c++-faq-lite
    • 这确实是有道理的,尽管我很惊讶似乎没有默认的连续空白。不过这应该可以(我会在将死或平局发生时结束程序)
    • 嗯,问题是,在你使用的语言中——我承认从未使用过——它基本上是在做同样的事情,但它对你隐瞒了这一点。它实现了一些让你调用的函数 foo(),它有一些循环,它会持续运行,直到某个退出标志触发它中断。你只是没有意识到它,因为它对你隐藏!
    【解决方案5】:

    就图形库而言,有很多选择;你可以使用 SDL、GLUT/OpenGL、DirectX,甚至是好的 Win32。但是,对于那些对 while 循环等初级事物相对较新的人来说,我建议您暂时不要使用 C++,因为有许多特性可能会成为巨大的障碍。如果你真的需要每一盎司的速度,我建议你用你的时间关键算法制作一个 DLL,并将它与支持 DLL 的更简单的语言结合使用,并提供一个相对开发人员友好的界面。 Game Maker 立即浮现在脑海中,尽管我确信那里有很多选择。

    祝你好运。

    【讨论】:

    • 我对编程结构并不陌生,只是 c++
    【解决方案6】:

    我建议您查看 CinderOpenFrameworks 作为从 Processing.org 的巧妙过渡 - 特别是如果您计划开发多媒体应用程序(如果您使用的是 Processing,很可能)

    它们都提供了与处理层非常相似的层,并且会在一定程度上简化您的旅程。

    如果您愿意,也可以在 SDL 之上实现自己的基本框架。

    作为对您问题的更一般的回答,main() 函数与 Processing.org 中的 setup() 函数基本相同 - 主要区别在于它必须调用(用户提供的)draw( ) 函数或等效函数。

    所以一个基本的等价物是:

    bool quit = FALSE;
    
    void setup() {
        // initialise the screen and so forth
    }
    
    void draw() {
        // perform some drawing and update tasks
    }
    
    int main(int argc, char *argv[]) {
        setup();
        while (!quit) {
            draw();
        }
        shutdown();
        return 0;
    }
    

    注意: 上面的代码可能会编译,但它什么都不做 除了循环并且可能会阻塞你的机器,因为它没有连接到任何图形库并且没有用户输入修改 quit 布尔值。

    最后,我将引用 Cinder 常见问题中的一段:

    我在处理方面很有经验,但我 我想我已经准备好尝试新的东西了。 Cinder 适合我吗?

    很有可能。 首先,请确保您确实需要 继续前进到 Cinder。你已经 尝试使用外部 IDE 像 Eclipse?你是用原生的吗 OpenGL调用而不是PGraphics? 用 Toxi 做实验怎么样? 优秀的图书馆?你会学到一些 最终会发生的事情 更容易过渡到 Cinder,并且 就像我们喜欢 C++ 一样,这很容易 低估处理距离 可以带你。说了这么多,别让 我们也劝你不要这样做——如果 你对学习 Cinder 很兴奋, 我们很高兴有你,我们打赌 你会发现上手更容易 超出你的想象。

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 2013-11-04
      • 2013-03-05
      • 2012-08-26
      • 2018-03-16
      • 1970-01-01
      相关资源
      最近更新 更多