Макросы в FPC
Модератор: Модераторы
-
LuckyDevil
- новенький
- Сообщения: 12
- Зарегистрирован: 24.07.2005 12:33:16
SovNarKom , tut ya tebya podderju. Potomu kak takie konstrukcii i makrosami nasvat'to yazik ne povorachivaetsya.
vot eto makros, ot VC:
Raznica zametna?
Esli ya oshibayus', to popravti menya.
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]
- Контактная информация:
можно так:
Или я не догнал?
Макросы в С++ удачно заменяют функции, так как могут принимать параметры.
Однако, даже используя в FPC вид {$DEFINE RegType:=ggfgfgfgf} можно добиться хороших результатов.
Код: Выделить всё
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
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 ^.
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]
- Контактная информация:
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]
- Контактная информация:
А вообще можно:
Код: Выделить всё
procedure (var FM: _FastMutex); inline;
-
LuckyDevil
- новенький
- Сообщения: 12
- Зарегистрирован: 24.07.2005 12:33:16
-
LuckyDevil
- новенький
- Сообщения: 12
- Зарегистрирован: 24.07.2005 12:33:16
SovNarKom , oshibka v tom chto v pervoistochnike eto ukazatel'
sootvetsvenno
voobshe iz svoego opita, ya posovetoval bi pri peredache peremennih(out) v func/proc pol'sovat'sya ukazatelyami
obichno v Pascale
po moemu mneniyu nadejnei buset tak
(_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
Perviraz viju takoe obyavlenie direktiv, eto tochno rabotaet?{$DEFINE ExInitializeFastMutex:=
FM.Count:=1;
FM.Owner:=Nil; // А ошибку покажи, а то я в С++ не особо шпарю, особенно с указателями
FM.Contention:=0;
KeInitializeEvent(@FM.Event, SynchronizationEvent, FALSE);
}
-
SovNarKom
- постоялец
- Сообщения: 389
- Зарегистрирован: 28.05.2005 10:37:39
- Откуда: Воронеж [vrn] [36]
- Контактная информация:
Код: Выделить всё
(_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 как в документации!
LuckyDevil писал(а):ushakov ,kak ti dumaesh, chto luchshe, skorost' kompilyacii ili compactnii-bistrii kod?
Очень сомневаюсь, что он будет быстрым и компактным, а еще сомневаюсь, что такой код будет удобно отлаживать!
А скорость компиляции - соберите Lazarus (меньше минуты) и к примру tora (минут 15). Вот Вам и разница между Pascal и C++. А у меня есть и большие проекты и ходить курить в момент их полной сборки нет желания.
