Можно ли создавать операторы "C" во время выполнения и выполнять их? - PullRequest
1 голос
/ 11 февраля 2011

Моя проблема:

  • Программа принимает данные из файла {INFINITE, CMDSTART, 2, CMDPLAY, 4, CMDPAUSE, CMDSTOP}

  • Возможна любая комбинация вышеуказанных команд ввода.

  • Вывод программы предназначен для чтения вышеуказанного ввода и выполнения функций в порядке, определенном вводом.

  • Выше ввод должен привести к выполнению кода что-то вроде:

    while(true)
    {
        cmdStart();
        for(i=0;i<2;++i)
            cmdPlay();
        for(i=0;i<4;++i)
            cmdPause();
        cmdStop();
    }
    

Если бы у меня не было "INFINITE", то, вероятно, у меня был бы strcmp() и оператор switch для получения порядка выполнения. Но с бесконечным, я понял, я должен хранить эти указатели на функции в массиве в порядке ввода. После этого, через некоторое время (цикл), я должен вызвать эти указатели на функции. Любые интересные мысли о том, как еще это сделать.

Ответы [ 2 ]

3 голосов
/ 11 февраля 2011

Вам необходимо проанализировать информацию из файла в массив структур, которые описывают количество итераций и вызываемую функцию. Затем у вас есть некоторый код, который интерпретирует структуры и действует соответственно.

На самом деле генерация кода C во время выполнения возможна, но достаточно жесткая, чтобы я не беспокоился. Возможно, вы бы написали код C в исходный файл, скомпилировали его в динамически загружаемую библиотеку, а затем загрузили библиотеку перед ее выполнением. На ум приходит фраза о «кувалдах» и «орехах».

1 голос
/ 11 февраля 2011

Да, но вам нужен компилятор (или два), чтобы сделать это.По сути, вам нужно перевести ваш «мини-язык» на C, затем вызвать компилятор C, чтобы скомпилировать результат, а затем выполнить его.Вы (очевидно) ожидаете, что это будет выполнено в контексте родительской программы, поэтому для ее выполнения вы, как правило, захотите загрузить ее как разделяемую библиотеку или DLL или все, что ваша платформа предоставляет в этом направлении.

IMO, это довольно окольный способ сделать то, что вы ищете.Гораздо чаще встраивать какой-либо интерпретатор сценариев (например, lua ) в исполняемый файл и писать сценарии на этом языке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...