powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамический #define
25 сообщений из 88, страница 1 из 4
динамический #define
    #39987271
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, только не спрашивайте зачем мне эта хрень.... абсурд, конечно, но надо для решения одной задачи !

Итак, есть ли возможность создать define по алгоритму, если есть, то как?

скажем есть у меня простой дефайн:
Код: plaintext
1.
#define N 7



и мне необходимо создать другой дефайн пусть будет ему имя "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.
#define N 7
#define test /*тут какой хитрый код макроса*/

int main {
   test ; // test должен подменится на int i1, int i2,int i3,int i4,int i5,int i6,int i7;
}



на самом деле эта подмена кажется абсурдом и бестолковщиной, но я алгоритм подмены упростил, чтобы не сильно грузить. мне ценна суть реализации.
p.s. хотелось бы это в рамках Си без плюсов.
...
Рейтинг: 0 / 0
динамический #define
    #39987277
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andron81,
А как предполагается работать с определенным через макрос набором переменных?
Если n конечно то имхо данное объявление можно реализовать через #if и #elif продублировав столько раз сколько необходимо
...
Рейтинг: 0 / 0
динамический #define
    #39987279
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
#include <boost/preprocessor/repetition/repeat.hpp>

#define N 7

#define DECL(z, n, text) text ## n = n;
BOOST_PP_REPEAT(N, DECL, int i)


Код: plaintext
1.
int i0 = 0; int i1 = 1; int i2 = 2; int i3 = 3; int i4 = 4; int i5 = 5; int i6 = 6;
...
Рейтинг: 0 / 0
динамический #define
    #39987281
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81

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

Я думаю этого делать не нужно на дефайнах. Будешь долго мучится, а на выходе какое-то фуло выйдет. Лучше напиши кодогенератор на обычном Си и генерируй хоть чёрта лысого. Как два байта переслать.
...
Рейтинг: 0 / 0
динамический #define
    #39987334
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L.Otujktd

Если n конечно то имхо данное объявление можно реализовать через #if и #elif продублировав столько раз сколько необходимо


Разумеется N конечное оно задается в макросе я это писал. вот и мне интересно как циклом сконструировать дефайн )
...
Рейтинг: 0 / 0
динамический #define
    #39987335
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
Код: plaintext
1.
2.
3.
4.
5.
6.
#include <boost/preprocessor/repetition/repeat.hpp>

#define N 7

#define DECL(z, n, text) text ## n = n;
BOOST_PP_REPEAT(N, DECL, int i)


Код: plaintext
1.
int i0 = 0; int i1 = 1; int i2 = 2; int i3 = 3; int i4 = 4; int i5 = 5; int i6 = 6;



вот это наверно круто ! но подключить вот это:
boost/preprocessor/repetition/repeat.hpp

мне пока не по зубам. где вы это берёте ? что-то гугль не помогает
...
Рейтинг: 0 / 0
динамический #define
    #39987336
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
andron81

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

Я думаю этого делать не нужно на дефайнах. Будешь долго мучится, а на выходе какое-то фуло выйдет. Лучше напиши кодогенератор на обычном Си и генерируй хоть чёрта лысого. Как два байта переслать.


полагаю repeat.hpp это и есть кодгенератор ?
...
Рейтинг: 0 / 0
динамический #define
    #39987354
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор напиши на Python динамический фрагмент кода.
...
Рейтинг: 0 / 0
динамический #define
    #39987358
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Автор напиши на Python динамический фрагмент кода.


этого мне ещё не хватало. )))
ну емоё ведь пишут же "stdarg.h", а он на макросах
...
Рейтинг: 0 / 0
динамический #define
    #39987361
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

boost/preprocessor внутри использует собственный фреймворк для работы с кортежами лексем, ну а BOOST_PP_REPEAT помимо этого еще и реализован через копипаст сотен однотипных define, которые наверняка через вспомогательный генератор сделаны.

Поэтому сделать то же самое с нуля без внешнего генератора будет непросто.
Намного проще как выше советовали сделать генератор, который будет данный код генерить.

Ну и главное.
Зачем?
Ведь все это не нужно если применить массив.

Код: plaintext
1.
2.
3.
//int i0 = 0; int i1 = 1; int i2 = 2; int i3 = 3; int i4 = 4; int i5 = 5; int i6 = 6;
int a[N];
for (i = 0; i < N; i++) { a[i] = i; }
...
Рейтинг: 0 / 0
динамический #define
    #39987372
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky

Зачем?
Ведь все это не нужно если применить массив.

Код: plaintext
1.
2.
3.
//int i0 = 0; int i1 = 1; int i2 = 2; int i3 = 3; int i4 = 4; int i5 = 5; int i6 = 6;
int a[N];
for (i = 0; i < N; i++) { a[i] = i; }



я ожидал тут такие ответы. )))
Зачем ? ну затем . НАДО !
...
Рейтинг: 0 / 0
динамический #define
    #39987376
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

отбой . нашёл способ решения проблемы !
...
Рейтинг: 0 / 0
динамический #define
    #39987399
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

>Зачем?
>Ведь все это не нужно если применить массив.
+1
))
Если вам нужно много динамики или генератор, задумайтесь...) посчитайте до 10...отложите до утра...
...
Рейтинг: 0 / 0
динамический #define
    #39987402
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
mayton
Автор напиши на Python динамический фрагмент кода.


этого мне ещё не хватало. )))
ну емоё ведь пишут же "stdarg.h", а он на макросах

Я не уверен что юзкейс применения макросов "там" - тот что тебе нужен.

Макросы - это вобщем-то самый простой механизм для расширения возможностей языка.
Их специально сделали простыми. Без рекурсий и циклов в фазе трансляции.

Твоя задача ... хм... в некотором роде выходит за рамки простой замены. И вызввает
вопросы такие как "проблема остановки" и прочее. И если ты хочешь поверх макросов
поднять новый язык программирования - то тебе точно не в макросы.

Или в другие макросы. Там... макросы Lisp например. Но это далеко нас уводит от темы С++
...
Рейтинг: 0 / 0
динамический #define
    #39987406
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Anatoly Moskovsky,

>Зачем?
>Ведь все это не нужно если применить массив.
+1
))
Если вам нужно много динамики или генератор, задумайтесь...) посчитайте до 10...отложите до утра...




задача такова , что мне надо прогнать кучу sscanf (string,pattern1, setofVar ); по циклу
с разным параметром pattern1 (с его формированием проблем нет) и с соответствующим набором параметров setofVar .

Проблема только в setofVar . мне этот набор надо задавать динамически исходя из параметра N.
видимо это задача и не для макросов тоже.
...
Рейтинг: 0 / 0
динамический #define
    #39987407
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
petrav
пропущено...

Я думаю этого делать не нужно на дефайнах. Будешь долго мучится, а на выходе какое-то фуфло выйдет. Лучше напиши кодогенератор на обычном Си и генерируй хоть чёрта лысого. Как два байта переслать.


полагаю repeat.hpp это и есть кодгенератор ?

Ну... можно и так сказать. Но сделан он на таких жутких и противоестественных приёмах программирования — вы это даже представить себе не можете. Это не пример для подражания.
...
Рейтинг: 0 / 0
динамический #define
    #39987424
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. конечно, я могу сделать куда более рациональней и без всяких сложностей.
...
Рейтинг: 0 / 0
динамический #define
    #39987430
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81Проблема только в setofVar . мне этот набор надо задавать динамически исходя из параметра N.

Используй массив. Заодно избавишься от переменного числа параметров у функции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
динамический #define
    #39987437
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81, обрати внимание что *scanf возвращает целое число - количество заполненных значений. Используй его.
...
Рейтинг: 0 / 0
динамический #define
    #39987438
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81Всё это безумие ? ДА. но так я вижу реализацию .

Этим и отличается нуб от опытного программиста. Первый видит одну реализацию и утыкается в
неё, второй - несколько вариантов реализации и выбирает из них оптимальный.

Подсказка: элементы строки не обязательно читать все за раз. scanf способен остановиться
после первого и продолжить со второго при следующем вызове.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
динамический #define
    #39987439
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81Проблема только в setofVar . мне этот набор надо задавать динамически исходя из параметра N.

Используй массив. Заодно избавишься от переменного числа параметров у функции.


длина массива задается вверху макросом (#define N=123) и программа должно подстраиваться исходя из этого N
а то, что массив надо использовать это однозначно. причем их должно быть в количестве 2.
но в ссканф все равно статично придется статично подставлять его элементы.
...
Рейтинг: 0 / 0
динамический #define
    #39987440
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
andron81, обрати внимание что *scanf возвращает целое число - количество заполненных значений. Используй его.


знаю.
...
Рейтинг: 0 / 0
динамический #define
    #39987445
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81длина массива задается вверху макросом (#define N=123) и программа должно подстраиваться
исходя из этого N а то, что массив надо использовать это однозначно. причем их должно быть
в количестве 2.
но в ссканф все равно статично придется статично подставлять его элементы.

Исходя из поставленной задачи:
а) Программа не должна подстраиваться и макрос не нужен.
б) Массива достаточно одного, причём лучше ему быть не массивом, а списком.
в) Да. Причём это будет ровно один элемент: следующее значение операнда.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
динамический #define
    #39987446
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
petrav,

весь этот "велосипед" исходя из условия задачи из K&R. а я дотошный как просят так выполняю.
вот эта задача :

"Перепишите основанную на постфиксной записи программу калькулятора таким
образом, чтобы для ввода и преобразования чисел она использовала scanf и/или sscanf."

Я даже не стал дочитывать постановку задачи. Керниган и Ритчи не могли предложить вам решать задачу таким способом как вы хотите. Вы что-то недопоняли в книге, нужно перечитать. И Сибиряков уже написал как нужно сделать.
...
Рейтинг: 0 / 0
динамический #define
    #39987496
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81Всё это безумие ? ДА. но так я вижу реализацию .

Этим и отличается нуб от опытного программиста. Первый видит одну реализацию и утыкается в
неё, второй - несколько вариантов реализации и выбирает из них оптимальный.

Подсказка: элементы строки не обязательно читать все за раз. scanf способен остановиться
после первого и продолжить со второго при следующем вызове.


звучит годно , но он не продолжает, или я неверно тебя понимаю :



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#define _CRT_SECURE_NO_WARNINGS 1
#define N 10

int main()
{
	int numb[N] = {0};
	char oper[N] = { '\0' };
	char str[] = "10 30 + 90 70 - *";
	int result = 0;
	int indexNumb = 0;
	int indexOper = 0;
	int curentnumValue = 0; 
	char curentchrValue = 0;

	for (int i = 0; i < N; i++)
		if ((sscanf(str, "%d", &numb[indexNumb])) > 0) indexNumb++;  
	else 
		if ((sscanf(str, "%s", &oper[indexOper])) > 0)   indexOper++;
}
...
Рейтинг: 0 / 0
25 сообщений из 88, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамический #define
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]