аналог #define

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

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

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

аналог #define

Сообщение sunjob »

добрый день!

на форумах советуют использовать (пишут, что это то-же самое)

Код: Выделить всё

const blah-blah-blah


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

спасибо
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение Vadim »

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

Re: аналог #define

Сообщение sunjob »

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

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

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

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

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

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

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

Re: аналог #define

Сообщение Vadim »

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

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

В свете вышеизложенного, никакой разницы с некоторыми современными прогерами нет... ;-)
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: аналог #define

Сообщение runewalsh »

Это то же самое, но при важном условии: если используется именно синтаксис

Код: Выделить всё

const X = 123;

Есть очень похожий, но означающий другую вещь:

Код: Выделить всё

const X: integer = 123;

Этот const и физически, и с точки зрения языка уже не const, а var (под {$WRITEABLECONST ON} так полный var), например, не подставится в места, принимающие настоящие константы, такие как значения меток case или параметров по умолчанию.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение Vadim »

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

В учебниках (по крайней мере ранешних) об этом пишут. ;-)
К истории вопроса. Такой синтаксис использовался для задания в Паскале типизированной константы. При этом, обращаю особое внимание, исключительно в Borland\Turbo Pascal и его наследниках. Почему не получалась при этом константы - мне неизвестно. Возможно следующее:
Точно такая же конструкция использовалась и для объявления инициализированных переменных. Опять же, из предположений - возможно мсье Кан таким образом просто решил два раза не вставать. Получилось, конечно, чёрте что, но в плане быстроты компиляции видимо время было сэкономлено... :D
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Re: аналог #define

Сообщение sunjob »

на ровном месте, блин... :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 12:08:25, всего редактировалось 1 раз.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение Vadim »

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

И, конечно же, всем всё стало понятно... :D
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Re: аналог #define

Сообщение sunjob »

под "не работает" - подразумевается очевидное :mrgreen: установка ширины секции статус-панели
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение Vadim »

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

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

А у меня - работает. И что будем делать дальше? ;-)
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Re: аналог #define

Сообщение sunjob »

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

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

могу скинуть проект, если пожелаете ткнуть в него палкой :oops:
Последний раз редактировалось sunjob 22.01.2022 12:16:57, всего редактировалось 1 раз.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение Vadim »

sunjob
Давайте начнём с простого - замените название "ID_NOTIFY" на что-нибудь менее распространённое...
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Re: аналог #define

Сообщение sunjob »

давайте ... попьем боржем потом поржем...
надеюсь, никто меня не заподозрит в подтасовке?

Код: Выделить всё

_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?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: аналог #define

Сообщение Vadim »

Боржом не помог, перейдём на Нарзан:
Перед тем как делать изменение 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.
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Re: аналог #define

Сообщение sunjob »

нарзан тоже не катит
что у Вас сидит в _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 13:21:01, всего редактировалось 6 раз.
Ответить