Консультация № 66348
10.12.2006, 14:21
0.00 руб.
0 10 2
Доброго дня суток, эксперты.

Не подскажет ли кто:
Возможно ли выполнить строковую переменную, на пример:

AnsiString s = "ShowMessage("Hello? World!")";
в стиле #define s ShowMessage("Hello? World!")

извините за не правильную постановку вопроса ))))

Обсуждение

Неизвестный
11.12.2006, 16:44
общий
это ответ
Здравствуйте, CjJoker!

Хмм, надеюсь я тебя правильно понял :)))
Имя макро-функции EXEC_STR_PER - от балды, придумай что-нибудь получше

Если ты напишешь:
EXEC_STR_PER(s, ShowMessage("Hello? World!"))

то препроцессор подставит то, чего ты и хотел:
AnsiString s = "ShowMessage("Hello? World!")";

Только учти: минздрав предупреждает, что использование макросов может испортить нервы

Приложение:
#define EXEC_STR_PER(X, Y) AnsiString X = #Y;
Неизвестный
12.12.2006, 12:55
общий
Хм, че-то не работает 8-)На всякий случай привожу пример:{ TStrings *s = new TStringList(); AnsiString A; if (FileExists(_PATH + "Setting.txt")) s->LoadFromFile(_PATH + "Setting.txt"); A = s->Values["DefaultAction"]; RUN_MACRO(A); // в этом месте надо выполнить ShowMessage("Hello? World!");}Еще идеи есть???? :))))
Неизвестный
12.12.2006, 23:40
общий
это ответ
Здравствуйте, CjJoker!
Хммм... Вам чтоли парсер нужен? Такой небольшой компилятор, заключенный в RUN_MACRO?
Ну если писать самому, на это могут уйти месяцы.
А если взять готовый, тоже придется повозиться.
Почитайте тут http://rsdn.ru/forum/Message.aspx?mid=1306051
Если же выражения для разбора всегда будут подобного рода (одна функция с одним параметром), и количество "узнаваемых" функций невелико, то тогда это легко сделать самому (никаких деревьев строить не надо). Ищите первую скобку, по ней разделяете имя функции от параметра, удаляете ненужные символы, в зависимости от имени функции передаете параметр в одну из реальных функций.
Успехов!
Неизвестный
13.12.2006, 13:36
общий
Ув. John ParamolПо идеи мне необходимо построить макрос а-ля:#define RUN_MACRO(Target_Function) Target_FunctionХм, и задача вроде простая, но решений простых не предвидиться. Поставлю вопрос по другому:Необходимо подставить в макрос строковую функцию, или как убрать кавычки :)#define RUN_MACRO(Target_Function) "ShowMessage("Hello? World!")" не работает (((#define RUN_MACRO ShowMessage("Hello? World!") работает// мне думаеться что это невозможно
Неизвестный
15.12.2006, 09:52
общий
Хм, вы меня еще больше запутали.Скажите, вам нужно следующее:AnsiString A = "Beep(1000,100)";RUN_MACRO(A); // и в этом месте должно бибикнуть?Или нет?
Неизвестный
16.12.2006, 09:51
общий
>>Хм, вы меня еще больше запутали.Ага!!!!Только я еще больше запутаный ))))
Неизвестный
16.12.2006, 14:17
общий
‘Ага‘, всмысле ‘да‘?Тогда, действительно, вам нужен парсер.Возможно, у вас перемешались представления о этапе трансляции и этапе выполнения программы.Строка "ShowMessage("Hello? World!")" это только область памяти, размером в 29 байт, в которой хранятся символы (причем даже без кавычек).Ничего больше.На этапе трансляции компилятор еще не знает, что эта строка собой представляет.Если вы хотите заставить эту строку выполняться,придется каким-то образом ее интерпретировать по ходу выполнения программы (этап выполнения), и совершать соответствующие действия.Надеюсь, понятно объяснил.А также, надеюсь, объяснил то, что требовалось.
Неизвестный
17.12.2006, 15:37
общий
Вот-вот, вот в этом то и вопрос как? Интерпретировать??
Неизвестный
17.12.2006, 22:06
общий
Уже создайте новую тему "как писать парсер".Вопрос объемный.А вообще-то я вас в самый первый раз послал куда надо, почему вы туда не сходили? (Я в хорошем смысле)
Неизвестный
19.12.2006, 09:56
общий
Фсем спасибо, понял ....
Форма ответа