Макросы в FPC

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

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

Сообщение SovNarKom » 30.06.2005 12:18:00

Кто-нибудь знает, когда в FPC появятся нормальные макросы,
а то конструкцией вида {$define OPS:=A+B} полезного много не сделаешь?
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение LuckyDevil » 25.07.2005 22:03:45

SovNarKom , tut ya tebya podderju. Potomu kak takie konstrukcii i makrosami nasvat'to yazik ne povorachivaetsya.
vot eto makros, ot VC:
#if DBG
#define ExInitializeFastMutex(_FastMutex)                            \
    (_FastMutex)->Count = 1;                                         \
    (_FastMutex)->Owner = NULL;                                      \
    (_FastMutex)->Contention = 0;                                    \
    KeInitializeEvent(&(_FastMutex)->Event,                          \
                      SynchronizationEvent,                          \
                      FALSE);
#else
#define ExInitializeFastMutex(_FastMutex)                            \
    (_FastMutex)->Count = 1;                                         \
    (_FastMutex)->Contention = 0;                                    \
    KeInitializeEvent(&(_FastMutex)->Event,                          \
                      SynchronizationEvent,                          \
                      FALSE);
#endif // DBG

Raznica zametna?
Esli ya oshibayus', to popravti menya.
LuckyDevil
новенький
 
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

Сообщение SovNarKom » 26.07.2005 18:46:44

можно так:
Код: Выделить всё
procedure (var FM: _FastMutex);
begin
{$IFDEF DBG}
FM.Count:=1;                                        
FM.Owner:=Nil;                              
FM.Contention:=0;                              
KeInitializeEvent(@FM.Event, SynchronizationEvent, FALSE);
{$ELSE}
FM.Count:=1;                                        
FM.Contention:=0;                              
 KeInitializeEvent(@FM.Event, SynchronizationEvent, FALSE);
{ENDIF}
end;

Или я не догнал?

Макросы в С++ удачно заменяют функции, так как могут принимать параметры.

Однако, даже используя в FPC вид {$DEFINE RegType:=ggfgfgfgf} можно добиться хороших результатов.
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение LuckyDevil » 26.07.2005 20:17:52

SovNarKom , Da, imenno tak ya i postupayu, pishu func\proc, no chem horosh makros, ya ponyal tak, makros v C/C++ eto chasto povtoryayushegisya uchastok koda, v resultate snijaetsya kolichestvo vipolnyaemih instrukcii(push,pop), navernoe est' eshe ryad priimushestv
eshe v tvoei iterpritacii koda est' ser'esnay oshibka :).
[/quote]FM.Count:=1;
FM.Owner:=Nil;
FM.Contention:=0[quote]
eto -> na ^.
LuckyDevil
новенький
 
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

Сообщение SovNarKom » 27.07.2005 12:16:50

LuckyDevil
Кстати можно попробоваь так:
Код: Выделить всё

{$IFDEF DBG}
{$DEFINE  ExInitializeFastMutex:=
 (FM)^.Count:=1;                                        
 (FM)^.Owner:=Nil;  // А ошибку поправил, продолжаю не любить с++
 (FM)^.Contention:=0;  
 KeInitializeEvent(@(FM^).Event, SynchronizationEvent, FALSE);
}
{$ELSE}
{$DEFINE  ExInitializeFastMutex:=
 (FM^).Count:=1;                                        
 (FM^).Contention:=0;  
 KeInitializeEvent(@(FM^).Event, SynchronizationEvent, FALSE);
}
{$ENDIF}

а потом...

{$DEFINE FM:=MyMutex} ExInitializeFastMutex



От такой йзврат, им и подобие шаблонов делается... <_<
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение ushakov » 27.07.2005 13:20:31

Если сейчас начнем превращать FreePascal в C++, то и скорость компиляции у них сравняется!
ushakov
новенький
 
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение SovNarKom » 27.07.2005 14:07:23

А вообще можно:
Код: Выделить всё
procedure (var FM: _FastMutex); inline;
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение LuckyDevil » 27.07.2005 22:37:30

ushakov ,kak ti dumaesh, chto luchshe, skorost' kompilyacii ili compactnii-bistrii kod?
LuckyDevil
новенький
 
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

Сообщение LuckyDevil » 27.07.2005 22:54:26

SovNarKom , oshibka v tom chto v pervoistochnike eto ukazatel'
    (_FastMutex)->Count = 1;

sootvetsvenno
    (_FastMutex)^.Count = 1;   

voobshe iz svoego opita, ya posovetoval bi pri peredache peremennih(out) v func/proc pol'sovat'sya ukazatelyami
obichno v Pascale
fumction myFunc(Var i: MyRec): boolean

po moemu mneniyu nadejnei buset tak
fumction myFunc( i: PMyRec): boolean


{$DEFINE  ExInitializeFastMutex:=
FM.Count:=1;                                       
FM.Owner:=Nil;  // А ошибку покажи, а то я в С++ не особо шпарю, особенно с указателями
FM.Contention:=0; 
KeInitializeEvent(@FM.Event, SynchronizationEvent, FALSE);
}
Perviraz viju takoe obyavlenie direktiv, eto tochno rabotaet?
LuckyDevil
новенький
 
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

Сообщение SovNarKom » 28.07.2005 01:26:38

Код: Выделить всё
(_FastMutex)^.Count = 1;  

Понял.

Код: Выделить всё
fumction myFunc( i: PMyRec): boolean

Нет, обычно метод
Код: Выделить всё
fumction myFunc(Var i: MyRec): boolean

быстрее на 10% :ph34r:
Perviraz viju takoe obyavlenie direktiv, eto tochno rabotaet?

Поставь перед этим
Код: Выделить всё
{$MACRO ON} именно MACRO, а не MACROS как в документации!
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение ushakov » 28.07.2005 15:18:28

LuckyDevil писал(а):ushakov ,kak ti dumaesh, chto luchshe, skorost' kompilyacii ili compactnii-bistrii kod?

Очень сомневаюсь, что он будет быстрым и компактным, а еще сомневаюсь, что такой код будет удобно отлаживать!

А скорость компиляции - соберите Lazarus (меньше минуты) и к примру tora (минут 15). Вот Вам и разница между Pascal и C++. А у меня есть и большие проекты и ходить курить в момент их полной сборки нет желания.
ushakov
новенький
 
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев


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

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

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

Рейтинг@Mail.ru