аналог #define

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

аналог #define

Сообщение sunjob » 22.01.2022 08:04:52

добрый день!

на форумах советуют использовать (пишут, что это то-же самое)
Код: Выделить всё
const blah-blah-blah


в свете редкого юзанья "микропаскаля для avr", хотелось бы еще раз уточнить, действительно ли это так?! по занимаемой памяти итд

спасибо
Аватара пользователя
sunjob
постоялец
 
Сообщения: 121
Зарегистрирован: 12.01.2011 15:19:54

Re: аналог #define

Сообщение Vadim » 22.01.2022 09:10:06

Если речь идёт о константе, которая применяется внутри Вашей программы, то пишут всё правильно.
В свете истории вопроса. У Си, в далёкие далёкие времена, вообще не было такого понятия как константа. Поэтому использовалась приблуда "#DEFINE", которая предназначалась для компилятора. В зависимости от того, что там объявлялось, компилятор подставлял объявляемое в программу заместо объявителя. Т.е. получался аналог константы. Чем древние программисты и пользовались. Проблема в том, что современные прогеры на Си от древних ушли недалеко, поэтому продолжают пользовать эту штукенцию и как объявление для компилятора и как константу. ;-)
Про занимаемую память в этом случае спрашивать бессмысленно, т.к. компилятор подставит ближайший тип, в который влезает эта "константа". А вот что с ней будет дальше - его совершенно не интересует. Поэтому можно запросто столкнутся с ситуёвиной, когда тип константы в сочетании с типом других данных даст Вам неправильный ответ. Как говорил в этом случае гениальный программист Владимир Ильич Ленин: "По форме верно, а по сути - издевательство". :-)
Vadim
долгожитель
 
Сообщения: 4087
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение sunjob » 22.01.2022 11:07:23

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

ой капец, щас свалюсь от смеха со стула... :mrgreen:

Про занимаемую память в этом случае спрашивать бессмысленно, т.к. компилятор подставит ближайший тип, в который влезает эта "константа". А вот что с ней будет дальше - его совершенно не интересует. Поэтому можно запросто столкнутся с ситуёвиной, когда тип константы в сочетании с типом других данных даст Вам неправильный ответ

хренасибе :roll:

... про ленина ...

там по моему, если мне не исменяет моя компсомольско-партийная память, шла речь о праститутках ... :D :D :D

ладушки, будет посмотреть и пошлепать на программу :D
Аватара пользователя
sunjob
постоялец
 
Сообщения: 121
Зарегистрирован: 12.01.2011 15:19:54

Re: аналог #define

Сообщение Vadim » 22.01.2022 11:14:24

sunjob писал(а):ой капец, щас свалюсь от смеха со стула...

Если Вы считаете, что я Вас обманываю, то зря. Нужно ли Вам, в подтверждение моих слов, приводить пример современных кодов на Си или сами посмотрите?
;-)
sunjob писал(а):там по моему, если мне не исменяет моя компсомольско-партийная память, шла речь о праститутках ...

В свете вышеизложенного, никакой разницы с некоторыми современными прогерами нет... ;-)
Vadim
долгожитель
 
Сообщения: 4087
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение runewalsh » 22.01.2022 11:17:19

Это то же самое, но при важном условии: если используется именно синтаксис
Код: Выделить всё
const X = 123;

Есть очень похожий, но означающий другую вещь:
Код: Выделить всё
const X: integer = 123;

Этот const и физически, и с точки зрения языка уже не const, а var (под {$WRITEABLECONST ON} так полный var), например, не подставится в места, принимающие настоящие константы, такие как значения меток case или параметров по умолчанию.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 571
Зарегистрирован: 27.04.2010 00:15:25

Re: аналог #define

Сообщение Vadim » 22.01.2022 11:24:28

runewalsh писал(а):Этот const и физически, и с точки зрения языка уже не const, а var

В учебниках (по крайней мере ранешних) об этом пишут. ;-)
К истории вопроса. Такой синтаксис использовался для задания в Паскале типизированной константы. При этом, обращаю особое внимание, исключительно в Borland\Turbo Pascal и его наследниках. Почему не получалась при этом константы - мне неизвестно. Возможно следующее:
Точно такая же конструкция использовалась и для объявления инициализированных переменных. Опять же, из предположений - возможно мсье Кан таким образом просто решил два раза не вставать. Получилось, конечно, чёрте что, но в плане быстроты компиляции видимо время было сэкономлено... :D
Vadim
долгожитель
 
Сообщения: 4087
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение sunjob » 22.01.2022 12:06:41

на ровном месте, блин... :twisted: это, блин, не программирование, а вылавливание блох, какойе-то :mrgreen:
Код: Выделить всё
const
ID_NOTIFY = 0;
ID_DEVICE = 1;

procedure TForm1.FormResize(Sender: TObject);
begin
StatusBar1.Panels.Items[ID_DEVICE].Width := StatusBar1.Width div 3; // не работает
StatusBar1.Panels.Items[0].Width         := StatusBar1.Width div 3; // работает
end;


ну во... а говорят, что си корявый язык! и че теперь делать?!
нужно именно в такой парадигме :P - использовать "константы", возможно, переопределяемые в процессе... (т.е. не в рантайм, а во время написания...)
да и с рантаймом не понятно так-же, сделал переменными и... тоже не работает

под "не работает" - подразумевается очевидное :mrgreen: установка ширины секции статус-панели
Последний раз редактировалось sunjob 22.01.2022 13:08:25, всего редактировалось 1 раз.
Аватара пользователя
sunjob
постоялец
 
Сообщения: 121
Зарегистрирован: 12.01.2011 15:19:54

Re: аналог #define

Сообщение Vadim » 22.01.2022 12:57:56

sunjob писал(а):// не работает

И, конечно же, всем всё стало понятно... :D
Vadim
долгожитель
 
Сообщения: 4087
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение sunjob » 22.01.2022 13:08:39

под "не работает" - подразумевается очевидное :mrgreen: установка ширины секции статус-панели
Аватара пользователя
sunjob
постоялец
 
Сообщения: 121
Зарегистрирован: 12.01.2011 15:19:54

Re: аналог #define

Сообщение Vadim » 22.01.2022 13:13:12

sunjob писал(а):подразумевается очевидное

Для Вас. И только для Вас. ;-)
Поверьте, писать нужно максимально подробно. Вы изначально знаете, что хотели сказать. Но никто об этом больше не знает. :D
По поводу
sunjob писал(а):// не работает

А у меня - работает. И что будем делать дальше? ;-)
Vadim
долгожитель
 
Сообщения: 4087
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение sunjob » 22.01.2022 13:14:11

ну чего чего? ... стреляться!!! я буду из ружжа, а вам достается... достается... рогатка! само то для ближнего боя :mrgreen:

п.с. не переживайте, у меня все "вот так", куда не копну - везде косяки и глюки! не жизнь а сплошной праздник и процесс познания неАпознаного :lol:

могу скинуть проект, если пожелаете ткнуть в него палкой :oops:
Последний раз редактировалось sunjob 22.01.2022 13:16:57, всего редактировалось 1 раз.
Аватара пользователя
sunjob
постоялец
 
Сообщения: 121
Зарегистрирован: 12.01.2011 15:19:54

Re: аналог #define

Сообщение Vadim » 22.01.2022 13:16:43

sunjob
Давайте начнём с простого - замените название "ID_NOTIFY" на что-нибудь менее распространённое...
Vadim
долгожитель
 
Сообщения: 4087
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение sunjob » 22.01.2022 13:20:39

давайте ... попьем боржем потом поржем...
надеюсь, никто меня не заподозрит в подтасовке?
Код: Выделить всё
_ID_NOTIFY_FY_ = 0;
_ID_DEVICE_FY_ = 1;

не работает :D

и так тоже не хочет (отладка ни чего особенного не дает, size считатется, но ... упс...
Код: Выделить всё
var size:Integer;
begin
size := StatusBar1.Width;
size := size div 3;
StatusBar1.Panels.Items[_ID_DEVICE_FY_].Width := size;



п.с. я тут параллельно пересобираю старые версии fpc/lazarus, что-бы в них протестить
у вас какие версии fpc/lazarus?
Аватара пользователя
sunjob
постоялец
 
Сообщения: 121
Зарегистрирован: 12.01.2011 15:19:54

Re: аналог #define

Сообщение Vadim » 22.01.2022 13:34:23

Боржом не помог, перейдём на Нарзан:
Перед тем как делать изменение Width, посмотрите, что у Вас сидит в _ID_NOTIFY_FY_
Код: Выделить всё
ShowMessage(IntToStr(_ID_NOTIFY_FY_));
StatusBar1.Panels.Items[_ID_NOTIFY_FY_].Width := StatusBar1.Width div 3;


Добавлено спустя 3 минуты 19 секунд:
FPC 3.3.1, Lazarus - 2.2.
FPC транковый, потому что релиз (3.2) не работает с текущей версией библиотеки OpenSSL.
Vadim
долгожитель
 
Сообщения: 4087
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение sunjob » 22.01.2022 13:57:06

нарзан тоже не катит
что у Вас сидит в _ID_NOTIFY_FY_

чЁ надо, то и сидит... :D (на всякий случай напишу что там сидит еденица, т.к. в "процессе" я поменял элементы :mrgreen: ... даже если развернуть - то все равно :mrgreen: и да... в статусбар добавлено два элемента :P )

fpc-3.2.2 lazarus-2.0.12
fpc-3.2.2 lazarus-2.2.0


остальные версии не проверил, т.к. доп. компоненты уже не собираются :P

а система у вас какая?

зю. весьма странный глюк, а вот так работает
Код: Выделить всё
size := StatusBar1.Width;
size := size div 3;
StatusBar1.Panels.Items[_ID_NOTIFY_FY_].Width := size;
StatusBar1.Panels.Items[_ID_DEVICE_FY_].Width := size;

короче, невнимательность отработала не отлично! всем спасибо за пендиль!
Последний раз редактировалось sunjob 22.01.2022 14:21:01, всего редактировалось 6 раз(а).
Аватара пользователя
sunjob
постоялец
 
Сообщения: 121
Зарегистрирован: 12.01.2011 15:19:54

След.

Вернуться в Free Pascal Compiler

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

Сейчас этот форум просматривают: Google [Bot] и гости: 1

Рейтинг@Mail.ru