|
динамический #define
|
|||
---|---|---|---|
#18+
Ой, только не спрашивайте зачем мне эта хрень.... абсурд, конечно, но надо для решения одной задачи ! Итак, есть ли возможность создать define по алгоритму, если есть, то как? скажем есть у меня простой дефайн: Код: plaintext 1.
и мне необходимо создать другой дефайн пусть будет ему имя "test" содержимое которого создавалось бы по алгоритму : при встрече в коде программы test подменится на int i1=0; int i2=0; int i3=0; int i4=0;... int iN=0; N раз Пример: при N=7 схематично код выглядел бы примерно вот так : Код: plaintext 1. 2. 3. 4. 5. 6.
на самом деле эта подмена кажется абсурдом и бестолковщиной, но я алгоритм подмены упростил, чтобы не сильно грузить. мне ценна суть реализации. p.s. хотелось бы это в рамках Си без плюсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 22:34 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81, А как предполагается работать с определенным через макрос набором переменных? Если n конечно то имхо данное объявление можно реализовать через #if и #elif продублировав столько раз сколько необходимо ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 23:35 |
|
динамический #define
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6.
→ Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 23:36 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81 на самом деле эта подмена кажется абсурдом и бестолковщиной, но я алгоритм подмены упростил, чтобы не сильно грузить. мне ценна суть реализации. Я думаю этого делать не нужно на дефайнах. Будешь долго мучится, а на выходе какое-то фуло выйдет. Лучше напиши кодогенератор на обычном Си и генерируй хоть чёрта лысого. Как два байта переслать. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 23:47 |
|
динамический #define
|
|||
---|---|---|---|
#18+
L.Otujktd Если n конечно то имхо данное объявление можно реализовать через #if и #elif продублировав столько раз сколько необходимо Разумеется N конечное оно задается в макросе я это писал. вот и мне интересно как циклом сконструировать дефайн ) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 08:45 |
|
динамический #define
|
|||
---|---|---|---|
#18+
a guest Код: plaintext 1. 2. 3. 4. 5. 6.
→ Код: plaintext 1.
вот это наверно круто ! но подключить вот это: boost/preprocessor/repetition/repeat.hpp мне пока не по зубам. где вы это берёте ? что-то гугль не помогает ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 08:55 |
|
динамический #define
|
|||
---|---|---|---|
#18+
petrav andron81 на самом деле эта подмена кажется абсурдом и бестолковщиной, но я алгоритм подмены упростил, чтобы не сильно грузить. мне ценна суть реализации. Я думаю этого делать не нужно на дефайнах. Будешь долго мучится, а на выходе какое-то фуло выйдет. Лучше напиши кодогенератор на обычном Си и генерируй хоть чёрта лысого. Как два байта переслать. полагаю repeat.hpp это и есть кодгенератор ? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 08:56 |
|
динамический #define
|
|||
---|---|---|---|
#18+
Автор напиши на Python динамический фрагмент кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 09:36 |
|
динамический #define
|
|||
---|---|---|---|
#18+
mayton Автор напиши на Python динамический фрагмент кода. этого мне ещё не хватало. ))) ну емоё ведь пишут же "stdarg.h", а он на макросах ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 09:53 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81, boost/preprocessor внутри использует собственный фреймворк для работы с кортежами лексем, ну а BOOST_PP_REPEAT помимо этого еще и реализован через копипаст сотен однотипных define, которые наверняка через вспомогательный генератор сделаны. Поэтому сделать то же самое с нуля без внешнего генератора будет непросто. Намного проще как выше советовали сделать генератор, который будет данный код генерить. Ну и главное. Зачем? Ведь все это не нужно если применить массив. Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 10:05 |
|
динамический #define
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Зачем? Ведь все это не нужно если применить массив. Код: plaintext 1. 2. 3.
я ожидал тут такие ответы. ))) Зачем ? ну затем . НАДО ! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 10:41 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81, отбой . нашёл способ решения проблемы ! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 10:50 |
|
динамический #define
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, >Зачем? >Ведь все это не нужно если применить массив. +1 )) Если вам нужно много динамики или генератор, задумайтесь...) посчитайте до 10...отложите до утра... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 11:43 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81 mayton Автор напиши на Python динамический фрагмент кода. этого мне ещё не хватало. ))) ну емоё ведь пишут же "stdarg.h", а он на макросах Я не уверен что юзкейс применения макросов "там" - тот что тебе нужен. Макросы - это вобщем-то самый простой механизм для расширения возможностей языка. Их специально сделали простыми. Без рекурсий и циклов в фазе трансляции. Твоя задача ... хм... в некотором роде выходит за рамки простой замены. И вызввает вопросы такие как "проблема остановки" и прочее. И если ты хочешь поверх макросов поднять новый язык программирования - то тебе точно не в макросы. Или в другие макросы. Там... макросы Lisp например. Но это далеко нас уводит от темы С++ ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 11:49 |
|
динамический #define
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Anatoly Moskovsky, >Зачем? >Ведь все это не нужно если применить массив. +1 )) Если вам нужно много динамики или генератор, задумайтесь...) посчитайте до 10...отложите до утра... задача такова , что мне надо прогнать кучу sscanf (string,pattern1, setofVar ); по циклу с разным параметром pattern1 (с его формированием проблем нет) и с соответствующим набором параметров setofVar . Проблема только в setofVar . мне этот набор надо задавать динамически исходя из параметра N. видимо это задача и не для макросов тоже. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 12:08 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81 petrav пропущено... Я думаю этого делать не нужно на дефайнах. Будешь долго мучится, а на выходе какое-то фуфло выйдет. Лучше напиши кодогенератор на обычном Си и генерируй хоть чёрта лысого. Как два байта переслать. полагаю repeat.hpp это и есть кодгенератор ? Ну... можно и так сказать. Но сделан он на таких жутких и противоестественных приёмах программирования — вы это даже представить себе не можете. Это не пример для подражания. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 12:09 |
|
динамический #define
|
|||
---|---|---|---|
#18+
petrav, весь этот "велосипед" исходя из условия задачи из K&R. а я дотошный как просят так выполняю. вот эта задача : "Перепишите основанную на постфиксной записи программу калькулятора таким образом, чтобы для ввода и преобразования чисел она использовала scanf и/или sscanf." как работает калькулятор ? он требует ввода от пользователя строки вида "10 30 + 90 70 - *" ,разносит числа в стек(на самом деле в массив) , а затем достает числа, производит операции и результат опять заносится в стек. более глубокие подробности не очень важны. Важно то, что теперь требуют использовать scanf и/или sscanf. то есть я полагаю, что необходимо считать строку scanf("%s",str), а потом "тупо" при помощи sscanf разнести по переменным (лучше всего в качестве переменных использовать элементы двух массивов с типами int (для чисел) и char (для +, *, / , -) ). как я вижу решение : 1. оговариваем сколько максимально параметров может быть . Пусть это дефайн N 2. нужно сформировать все различные паттерны исходя из N , скажем для примера это шаблон : "%d %d %c %d %d %c %c" и другие ... 3. затем подвергаем введенную строку анализу , для этого делаем череду : sscanf(s,pattern1, набор параметров исходя из pattern1 ) sscanf(s,pattern2, набор параметров исходя из pattern2 ) sscanf(s,pattern3, набор параметров исходя из pattern3 ) sscanf(s,pattern4, набор параметров исходя из pattern4 ) ... sscanf(s,patternU, набор параметров исходя из patternU ) эти sscanf можно прогонять в цикле пока какой-то из них даст что-то отличное от 0. проблема состоит лишь в третьем параметре - набор параметров. я этот набор не могу формировать динамически. Всё это безумие ? ДА. но так я вижу реализацию . так как требуют использовать sscanf и scanf. конечно, я могу сделать куда более рациональней и без всяких сложностей. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 12:55 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81Проблема только в setofVar . мне этот набор надо задавать динамически исходя из параметра N. Используй массив. Заодно избавишься от переменного числа параметров у функции. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 13:00 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81, обрати внимание что *scanf возвращает целое число - количество заполненных значений. Используй его. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 13:09 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81Всё это безумие ? ДА. но так я вижу реализацию . Этим и отличается нуб от опытного программиста. Первый видит одну реализацию и утыкается в неё, второй - несколько вариантов реализации и выбирает из них оптимальный. Подсказка: элементы строки не обязательно читать все за раз. scanf способен остановиться после первого и продолжить со второго при следующем вызове. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 13:10 |
|
динамический #define
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andron81Проблема только в setofVar . мне этот набор надо задавать динамически исходя из параметра N. Используй массив. Заодно избавишься от переменного числа параметров у функции. длина массива задается вверху макросом (#define N=123) и программа должно подстраиваться исходя из этого N а то, что массив надо использовать это однозначно. причем их должно быть в количестве 2. но в ссканф все равно статично придется статично подставлять его элементы. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 13:13 |
|
динамический #define
|
|||
---|---|---|---|
#18+
mayton andron81, обрати внимание что *scanf возвращает целое число - количество заполненных значений. Используй его. знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 13:14 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81длина массива задается вверху макросом (#define N=123) и программа должно подстраиваться исходя из этого N а то, что массив надо использовать это однозначно. причем их должно быть в количестве 2. но в ссканф все равно статично придется статично подставлять его элементы. Исходя из поставленной задачи: а) Программа не должна подстраиваться и макрос не нужен. б) Массива достаточно одного, причём лучше ему быть не массивом, а списком. в) Да. Причём это будет ровно один элемент: следующее значение операнда. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 13:23 |
|
динамический #define
|
|||
---|---|---|---|
#18+
andron81 petrav, весь этот "велосипед" исходя из условия задачи из K&R. а я дотошный как просят так выполняю. вот эта задача : "Перепишите основанную на постфиксной записи программу калькулятора таким образом, чтобы для ввода и преобразования чисел она использовала scanf и/или sscanf." Я даже не стал дочитывать постановку задачи. Керниган и Ритчи не могли предложить вам решать задачу таким способом как вы хотите. Вы что-то недопоняли в книге, нужно перечитать. И Сибиряков уже написал как нужно сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 13:24 |
|
динамический #define
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andron81Всё это безумие ? ДА. но так я вижу реализацию . Этим и отличается нуб от опытного программиста. Первый видит одну реализацию и утыкается в неё, второй - несколько вариантов реализации и выбирает из них оптимальный. Подсказка: элементы строки не обязательно читать все за раз. scanf способен остановиться после первого и продолжить со второго при следующем вызове. звучит годно , но он не продолжает, или я неверно тебя понимаю : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2020, 14:42 |
|
|
start [/forum/topic.php?fid=57&msg=39987358&tid=2017363]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 162ms |
0 / 0 |