Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2020, 08:02

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: #define и __LINE__
СообщениеДобавлено: 19 май 2020, 19:07 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
Вопрос вроде не сложный...
Хочу подсчитать количество строчек на этапе компиляции. Или даже препроцессора.
Пытался сделать так
Код:
#define START __LINE__

//хочу получить кол-во строк вот тут!


#define STOP __LINE__
#define DIF (STOP-START)

но получил жирную дулю... Объясните пожалуйста почему и как можно решить эта задачку..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 19 май 2020, 19:11 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
Ничего у тебя так не получится, т.к. макрос не раскрывается!
Можно попробовать как-то так:
Код:
#define ALINE() __LINE__
#define START ALINE()
...


А, нет, так тоже нельзя! Как только ты пишешь #define, ничего особого не происходит. Разворачиваться макросы будут по мере их использования.


Последний раз редактировалось Eddy_Em 19 май 2020, 19:14, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 19 май 2020, 19:13 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3459
DIF <=> (__LINE__ - __LINE__)
что, внезапно, равно 0.

const int start = __LINE__;
...
const int stop = __LINE__;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 19 май 2020, 19:24 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
_pv писал(а):
DIF <=> (__LINE__ - __LINE__)
что, внезапно, равно 0.

const int start = __LINE__;
...
const int stop = __LINE__;


:) Да с переменными я догадался... А с дефайнами не получится?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 19 май 2020, 19:28 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
Кстати, какой смысл считать количество строчек, если там куча комментариев и пустых строк?
Если же хочется, то можно это сделать совсем элементарно:
Код:
wc -l *.[ch]
  103 cmdlnopts.c
   45 cmdlnopts.h
  144 daemon.c
  103 emulation.c
   30 emulation.h
  266 libsofa.c
   76 libsofa.h
  511 main.c
   43 main.h
  497 parseargs.c
  124 parseargs.h
  563 telescope.c
   39 telescope.h
  441 usefull_macros.c
  144 usefull_macros.h
3129 итого


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 19 май 2020, 19:32 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3459
а это число в результате нужно именно препроцессору?

типа:
#if DIF < 100500
#error("Солнце ещё высоко!")
#endif

или всё таки компилятору?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 09:58 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
_pv писал(а):
а это число в результате нужно именно препроцессору?

типа:
#if DIF < 100500
#error("Солнце ещё высоко!")
#endif

или всё таки компилятору?


Это число нужно на этапе компиляции.
Код:

//как-то получили число SIZE

int a[SIZE]



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 09:59 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
Eddy_Em писал(а):
Кстати, какой смысл считать количество строчек, если там куча комментариев и пустых строк?
Если же хочется, то можно это сделать совсем элементарно:
Код:
wc -l *.[ch]
  103 cmdlnopts.c
   45 cmdlnopts.h
  144 daemon.c
  103 emulation.c
   30 emulation.h
  266 libsofa.c
   76 libsofa.h
  511 main.c
   43 main.h
  497 parseargs.c
  124 parseargs.h
  563 telescope.c
   39 telescope.h
  441 usefull_macros.c
  144 usefull_macros.h
3129 итого


Пустые строки считать нет смысла. Там не пустые.. :)

например там могут быть строки. И надо например получить размер массива указателей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 10:18 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Размер массива получается через размер (ну хоть sizeof(массив)/sizeof(элемент)), __LINE__ совсем для других целей.

Вариант с const-переменными, кстати, сработает и переменных не создаст (оптимизация). Но тоже надо не через __LINE__.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 10:33 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
aamonster писал(а):
Размер массива получается через размер (ну хоть sizeof(массив)/sizeof(элемент)), __LINE__ совсем для других целей.

Вариант с const-переменными, кстати, сработает и переменных не создаст (оптимизация). Но тоже надо не через __LINE__.

Вы не совсем поняли - надо ОПРЕДЕЛИТЬ размер массива.. Т.е. определить то что будет подставлено в массив - массив[ определить эту константу!! ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 10:40 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
массив[] = { "a", "b", "c" }– не?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 10:51 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
aamonster писал(а):
массив[] = { "a", "b", "c" }– не?

Нет.
Есть набор входов АЦП для ДМА. Количество этих входов может меняться в зависимости от задачи. Значит длинна массива АЦП заранее не известна. Но поскольку в программе используются индексы это го массива то можно прописав их получить и длину массива.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 10:56 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Что значит неизвестна? У вас пачка строк с содержимым массива – нет разве?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 10:59 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
aamonster писал(а):
Что значит неизвестна? У вас пачка строк с содержимым массива – нет разве?


Не известна в том смысле что может меняться.
Все верно вы говорите их можно подсчитать и подставить в следующий дефайн. Хочется этот процесс автоматизировать - изменил кол-во строк - изменился дефайн ну или переменная. САМА! :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 11:10 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Так я ж говорю: sizeof(массив)/sizeof(элемент).
Хоть в дефайн, хоть в const.
int arr[] = { 1, 2, 3, 4 };
#define SIZE (sizeof arr/sizeof int)
Как-то так, проверять лень.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 11:23 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
aamonster писал(а):
Так я ж говорю: sizeof(массив)/sizeof(элемент).
Хоть в дефайн, хоть в const.
int arr[] = { 1, 2, 3, 4 };
#define SIZE (sizeof arr/sizeof int)
Как-то так, проверять лень.


Вы к сожалению идею не поняли. :)

Код:
strat
#define a 0
#define b 1
#define c 2
#define d 3
stop

#define sz (stop - start)
unsigend short ADC[sz ]

задача получить эти самые stop и start

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 12:17 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2867
Очень ненадежно, даже если бы так работало. Комментарий какой кто посредни этих дефайнов решит добавить и всё рухнет.
Я пробовал __LINE__ заставить генерить на строке, через "стрингификацию" и конкатенацию макроса (# и ##), но в итоге не нашел решения.
А у вашей задачи полно более корректных решений. Например, вот так:
Код:
#define NUMBERS 1, \
                2, \
                3
int x[] = { NUMBERS };
     → int x[] = { 1, 2, 3 };

И далее sizeof(x)/sizeof(int), как вам выше правильно написали, это уж вы не поняли.

Цитата:
С переменными должно бы прокатить но не понимаю как разрулить ситуацию с тем что этот файл подключается в нескольких местах и я получаю ошибку линкера - мултиплай

Нельзя определять переменные в .h файле, только объявлять. Сделайте объявление в .h файле как extern, а в одном из .c файлов, где они впервые используются, определите их со значениями.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 12:23 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Разрулить множественные определения просто – static.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 12:23 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
Задача - совершенно бессмысленная!
Если бы ТС получше техзадание разъяснил, может, что-то да удалось бы из него выжать. А так получается, что он просто дурью мается!
kos писал(а):
задача получить эти самые stop и start

Меня терзают смутные сомнения...
В дефайнах - элементы будущего массива?
Ну так тогда все элементарнейшим образом делается:
Код:
typeof array[] = {...};

А размер его брать как sizeof(array)/sizeof(typeof).
Цитата:
unsigend short ADC[sz ]

Вот все с него клещами надо вытаскивать — нет бы сразу спросил: как выделить массив под N каналов АЦП, если количество каналов заранее неизвестно?

Делается это в зависимости от контекста, поэтому сначала - сформулируй задачу полноценно!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 12:34 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
Eddy_Em писал(а):
Задача - совершенно бессмысленная!
Если бы ТС получше техзадание разъяснил, может, что-то да удалось бы из него выжать. А так получается, что он просто дурью мается!
kos писал(а):
задача получить эти самые stop и start

Меня терзают смутные сомнения...
В дефайнах - элементы будущего массива?
Ну так тогда все элементарнейшим образом делается:
Код:
typeof array[] = {...};

А размер его брать как sizeof(array)/sizeof(typeof).
Цитата:
unsigend short ADC[sz ]

Вот все с него клещами надо вытаскивать — нет бы сразу спросил: как выделить массив под N каналов АЦП, если количество каналов заранее неизвестно?

Делается это в зависимости от контекста, поэтому сначала - сформулируй задачу полноценно!


Нет это не элементы массива. Это индексы если интересно. Собственно в этом и задача - как выделить массив под N каналов АЦП, если количество каналов заранее неизвестно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 12:36 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 198
kos писал(а):
не понимаю как разрулить ситуацию с тем что этот файл подключается в нескольких местах и я получаю ошибку линкера - мултиплай....

Объявите их const static.

А ещё есть __COUNTER__. ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 12:39 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
NStorm писал(а):
Очень ненадежно, даже если бы так работало. Комментарий какой кто посредни этих дефайнов решит добавить и всё рухнет.
Я пробовал __LINE__ заставить генерить на строке, через "стрингификацию" и конкатенацию макроса (# и ##), но в итоге не нашел решения.
А у вашей задачи полно более корректных решений. Например, вот так:
Код:
#define NUMBERS 1, \
                2, \
                3
int x[] = { NUMBERS };
     → int x[] = { 1, 2, 3 };

И далее sizeof(x)/sizeof(int), как вам выше правильно написали, это уж вы не поняли.

Цитата:
С переменными должно бы прокатить но не понимаю как разрулить ситуацию с тем что этот файл подключается в нескольких местах и я получаю ошибку линкера - мултиплай

Нельзя определять переменные в .h файле, только объявлять. Сделайте объявление в .h файле как extern, а в одном из .c файлов, где они впервые используются, определите их со значениями.


К сожалению вариант который Вы указали не очень подходит потому что дефайни используются как индексы для доступа к значениям массива.

А про то что объявлять нельзя я знаю. :) Скажем так попытка от безисходности :) Но не проканало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 12:51 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2867
Цитата:
К сожалению вариант который Вы указали не очень подходит потому что дефайни используются как индексы для доступа к значениям массива.

Если вы не знаете даже их количество заранее, как вы их будете все использовать как индексы? )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 13:01 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 940
NStorm писал(а):
Цитата:
К сожалению вариант который Вы указали не очень подходит потому что дефайни используются как индексы для доступа к значениям массива.

Если вы не знаете даже их количество заранее, как вы их будете все использовать как индексы? )


Конечно на этапе разработки я знаю их количество. Но потом для того что б по этому количеству определить размер массива надо взять и... Блин!! Я просто долбанутый!! Все намного проще! Натолкнули на идею .

За деревьями леса не увидел!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #define и __LINE__
СообщениеДобавлено: 20 май 2020, 13:49 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Расскажите потом, пожалуйста. Интересно же (хоть и ожидаемо, раз мы все вашу нужду понять не смогли)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB