int main () работает постоянно - PullRequest
0 голосов
/ 28 марта 2011

Я новичок в c ++, поэтому я прошу прощения, если это глупый вопрос, но я не могу найти ответ на него.

Я уже некоторое время использую Processing и хотел быначните использовать c ++, потому что я слышал, что это быстрее, а созданная мною программа слишком длинная / плотная, чтобы обработка работала с разумной скоростью.

В обработке есть пустота настройки, которая запускается один раз, а затем ничья, котораяработает непрерывно после этого.Это то, к чему я привык, и он мне нужен, чтобы переделать программу на c ++ (шахматный ИИ).

Есть ли способ заставить int main работать непрерывно?Если нет, я могу вызвать функцию, которая будет работать непрерывно?

Также есть ли способ заставить всплывающее окно при запуске программы, к которой вы можете рисовать геометрию?(Мне нужно будет делать куски, которыми в идеале можно манипулировать с помощью мыши)

Кстати, я использую Xcode

Ответы [ 6 ]

2 голосов
/ 28 марта 2011

main() обычно следует выполнить настройку, а затем запустить основной цикл обработки сообщений, предоставляемый вашим инструментарием. Цикл обработки сообщений будет работать непрерывно до тех пор, пока пользователь не запросит ваше приложение на выход (или вы не попросите инструментарий завершить работу вашего приложения).

Ваш инструментарий будет вызывать вашу функцию рисования всякий раз, когда нужно окрасить ваше окно. Он будет вызывать другие функции, когда пользователь вводит, например, нажатия клавиш или щелчки мыши.

Например, если вы использовали набор инструментов GLUT (для OpenGL, очень популярного API рисования, поддерживаемого на Mac, Windows, Linux и многих мобильных устройствах), ваша основная функция может выглядеть следующим образом ( полное руководство здесь ):

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();
}

Для Какао, нативного API OSX, он может выглядеть следующим образом ( дополнительная информация и ссылки здесь ):

#import <Cocoa/Cocoa.h>

int main(int argc, const char** argv)
{
    return NSApplicationMain(argc,  argv);
}
1 голос
/ 28 марта 2011

Могу ли я предложить вместо того, чтобы задавать очень простые вопросы, подобные этим, в StackOverflow, вы идете и тратите свое время на чтение одного из тысяч вводных руководств по C ++, которые разбросаны по всей сети.

После нескольких часов чтения вы обнаружите, что ответы на подобные вопросы быстрее выполняются с помощью поиска в Google.

Удачи в изучении.

0 голосов
/ 28 марта 2011

Я бы рекомендовал взглянуть на Cinder или OpenFrameworks в качестве аккуратного перехода от Processing.org - особенно если вы планируете создавать мультимедийные приложения (которые, если выиспользовали Обработка, скорее всего)

Они оба предоставляют слой, очень похожий на слой Обработки, и несколько упростят ваше путешествие.

Вы также можете реализовать свою собственную базовую структуру поверх SDL , если вы чувствуете, что можете.

В качестве более общего ответа на ваш вопрос, функция main () в основном такая же, как функция setup () в Processing.org - сглавное отличие в том, что он должен вызывать (предоставляемую пользователем) функцию 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;
}

NB: вышеприведенное, вероятно, скомпилируется, но оно ничего не сделает , кроме цикла и, возможно, перегружает ваш компьютер, так как он не подключен к какой-либо графической библиотеке и не получает никакого пользовательского ввода для изменения quit boolean.

наконец, я процитирую раздел из часто задаваемых вопросов Cinder:

У меня есть опыт работы с Processing, но я думаю, что готовпопробуй что-нибудь новое.Подходит ли мне Синдер?

Очень возможно.Однако сначала убедитесь, что вам действительно нужно перейти к Cinder.Вы уже экспериментировали с использованием внешней IDE, такой как Eclipse?Вы используете родные вызовы OpenGL вместо PGraphics?А как насчет экспериментов с прекрасными библиотеками Toxi?Вы узнаете некоторые вещи, которые значительно облегчат возможный переход на Cinder, и, насколько мы находимся в C ++, легко недооценить, насколько далеко может уйти обработка.Все это говорит о том, что мы не будем отговаривать вас от этого - если вы взволнованы изучением Cinder, мы рады, что вы, и мы уверены, что вам будет легче начать, чем вы можете себе представить.

0 голосов
/ 28 марта 2011

Существует множество опций, касающихся графических библиотек;Вы можете использовать SDL, GLUT / OpenGL, DirectX и даже старый Win32.Тем не менее, для тех, кто относительно новичок в таких элементарных вещах, как циклы while, я советую немного поработать с C ++, поскольку есть много особенностей, которые могут оказаться огромными препятствиями.Если вам действительно нужна каждая унция скорости, я рекомендую вам создать DLL с вашими критичными ко времени алгоритмами и использовать ее в сочетании с более простым языком, который поддерживает DLL и обеспечивает относительно дружественный интерфейс для разработчиков.Game Maker сразу приходит на ум, хотя я уверен, что есть много вариантов.

Удачи.

0 голосов
/ 28 марта 2011

В C ++ каждая функция определяется ее вызовом и возвращением. Например:


void foo()
{
   cout << "hello world!";
   <b>return;</b>
}

int main()
{
    <b>foo();</b>
    return 0;
}

Когда foo () имеет значение и называется , она выполняется до оператора return . Если мы хотим, чтобы foo выполнялся какое-то неопределенное время, мы могли бы, например:

void foo()
{
   bool isExiting = false;
   char input;

   while( isExiting != true )
   {
       cout << "Exit? ";
       cin >> input;
       if ( input == 'y' )
       {
           isExiting = true;
       }

       return;
   }
}

int main()
{
    foo();
    return 0;
}

Это своего рода уродливый пример - использование cin для char и еще много чего - но это помогает понять идею. Цикл while будет работать вечно, и его внутренности (ну, во всяком случае, это логика) можно заменить тем, что нужно вашей программе.

Имеет смысл?

0 голосов
/ 28 марта 2011

Вы не должны пытаться заставить main () работать непрерывно.

Вместо этого вы можете сделать что-то вроде этого:

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

...