Макросы в FPC

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

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

Ответить
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

Кто-нибудь знает, когда в FPC появятся нормальные макросы,
а то конструкцией вида {$define OPS:=A+B} полезного много не сделаешь?
LuckyDevil
новенький
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

Сообщение LuckyDevil »

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.
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

можно так:

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

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} можно добиться хороших результатов.
LuckyDevil
новенький
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

Сообщение LuckyDevil »

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 ^.
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

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



От такой йзврат, им и подобие шаблонов делается... <_<
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

Если сейчас начнем превращать FreePascal в C++, то и скорость компиляции у них сравняется!
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

А вообще можно:

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

procedure (var FM: _FastMutex); inline;
LuckyDevil
новенький
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

Сообщение LuckyDevil »

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

Сообщение LuckyDevil »

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?
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

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

(_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 как в документации!
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

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

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

А скорость компиляции - соберите Lazarus (меньше минуты) и к примру tora (минут 15). Вот Вам и разница между Pascal и C++. А у меня есть и большие проекты и ходить курить в момент их полной сборки нет желания.
Ответить