Форум: "Основная";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
ВнизКак написать код с многими ifdef? Найти похожие ветки
← →
TUser © (2006-04-06 18:44) [0]Пока получается - без поллитры не разгребешь. Например, у меня только два символа проверяются, соотвественно возможно 4 разных варианта кода. Как бы это по-человечески оформить?
Можно придумать два варианта. 1. Все назвать классами и отнаследовать от единого предка. Мне не подходит, т.к. тогда в иерарции классов появится множественное наследование, которого в Delphi (7) нет. 2. Написать 4 inc-файла с полным кодом модуля для каждого варианта. Предвижу проблемы с модифицированием кода.
Что советуют делать умные люди?
Приведу пример модуля. Здесь есть два символа, но в пограмме символов порядка десяти. Некоторые участки читать просто нельзя.unit uPDBTools;
interface
uses uPDB2w1, uPDBBasics;
function GetSQRDistance (P1, P2: TSpacePoint
{$ifdef PDBINTEGERS}
; Discard: byte = 0
{$endif} ): TSquare; overload;
function GetSQRDistance (A1, A2: TAtom
{$ifdef PDBINTEGERS}
; Discard: byte = 0
{$endif} ): TSquare; overload;
procedure Atom2Point (A: TAtom; var P: TSpacePoint);
implementation
function DecreaseInt (I: integer; D: byte): integer;
begin
while D > 0 do begin
I := I div 10;
dec (D);
end;
result := I;
end;
function GetSQRDistance (P1, P2: TSpacePoint
{$ifdef PDBINTEGERS}
; Discard: byte = 0
{$endif} ): TSquare;
var i: TAxis;
j: TSquare;
begin
result := 0;
for i:=axX to axZ do begin
{$ifdef PDBINTEGERS}
j:=DecreaseInt (P1[i] - P2[i], Discard);
{$else}
j:= P1[i] - P2[i] ;
{$endif}
result := result + j * j;
end;
end;
function GetSQRDistance (A1, A2: TAtom
{$ifdef PDBINTEGERS}
; Discard: byte = 0
{$endif} ): TSquare;
var j: TSquare;
{$ifndef VERSION2}
i: TAxis;
{$endif}
begin
if (not assigned (A1)) or (not assigned (A2)) then begin
result:=high (int64);
exit;
end;
result := 0;
{$ifndef VERSION2}
for i:=axX to axZ do begin
{$ifdef PDBINTEGERS}
j:=DecreaseInt (A1.Point[i] - A2.Point[i], Discard);
{$else}
j:= A1.Point[i] - A2.Point[i];
{$endif}
result := result + j * j;
end;
{$else}
j := A1.PosX - A2.PosX; {$ifdef PDBIBTEGERS} j := DecreaseInt (j, Discard); {$endif}
result := result + j * j;
j := A1.PosY - A2.PosY; {$ifdef PDBIBTEGERS} j := DecreaseInt (j, Discard); {$endif}
result := result + j * j;
j := A1.PosZ - A2.PosZ; {$ifdef PDBIBTEGERS} j := DecreaseInt (j, Discard); {$endif}
result := result + j * j;
{$endif}
end;
procedure Atom2Point (A: TAtom; var P: TSpacePoint);
begin
{$ifdef VERSION2}
P[axX]:=A.PosX;
P[axY]:=A.PosY;
P[axZ]:=A.PosZ;
{$else}
P:=A.Point;
{$endif}
end;
end.
← →
Гаврила © (2006-04-07 00:09) [1]
> без поллитры не разгребешь
точно.
> т.к. тогда в иерарции классов появится множественное
> наследование, которого в Delphi (7) нет
Можно разрулить интерфейсами.
---
А вообще, ты не указал главного - что это такое и зачем такое нужно. Может быть, если ты приведешь условия задачи, кто-то что-то и подскажет. А так непонятно
← →
Tirael © (2006-04-07 01:26) [2]чесно говоря х-ня какаято! ifdef пользуются чтоб оперативно переключать контекст, при этом не нарушая ход процесса, а лишь дополняя и модифицируя, например ifdef _debug
ИМХО тут вообще различные задачи и правильнее было бы использую такую классную штуку как CTRL+С и CTRL+V разнести отдельные задачи по отдельным файлам и потом при необходимости менять их в проекте удобными кнопочками "добавить файл в проект" и "удалить из проекта"
если же предполагается использовать комбинации этих def одновременно,то это вообще пипец, разве ж тут упомнишь что там где одновременно переключится и какой эффект и побочные эффекты это произведет, просто нужно подумать и уяснить задачу, понять что именно требуется и остановится на чем то одном
← →
Германн © (2006-04-07 01:36) [3]
> Пока получается - без поллитры не разгребешь. Например,
> у меня только два символа проверяются, соотвественно возможно
> 4 разных варианта кода. Как бы это по-человечески оформить?
>
У меня их порой до десятка доходило. Правда в основном при отладке новых решений. И ничего справлялся. А насчет "читабельности", так тут стоит аккуратно оформлять текст. Мне например следущее "в упор" не понятно:
← →
Германн © (2006-04-07 01:42) [4]Сорри за предыдущий пост. Чёрт дёрнул нажать не на ту кнопку.
> Пока получается - без поллитры не разгребешь. Например,
> у меня только два символа проверяются, соотвественно возможно
> 4 разных варианта кода. Как бы это по-человечески оформить?
>
У меня их порой до десятка доходило. Правда в основном при отладке новых решений. И ничего справлялся. А насчет "читабельности", так тут стоит аккуратно оформлять текст. Мне например следущее "в упор" не понятно:
> function GetSQRDistance (P1, P2: TSpacePoint
> {$ifdef PDBINTEGERS}
> ; Discard: byte
> = 0
> {$endif} ): TSquare;
> overload;
> function GetSQRDistance (A1, A2: TAtom
> {$ifdef PDBINTEGERS}
> ; Discard: byte = 0
> {$endif} ): TSquare; overload;
>
>
Я бы написАл так:
{$IFDEF PDBINTEGERS}
function GetSQRDistance (P1, P2: TSpacePoint; Discard: byte = 0): TSquare; overload;
function GetSQRDistance (A1, A2: TAtom; Discard: byte = 0): TSquare; overload;
{$ELSE}
function GetSQRDistance (P1, P2: TSpacePoint): TSquare; overload;
function GetSQRDistance (A1, A2: TAtom): TSquare; overload;
{$ENDIF}
← →
han_malign © (2006-04-07 10:43) [5]Type Conditional compilation
Syntax {$ELSEIF}
Remarks
The $ELSEIF directive allows multi-part conditional blocks where at most one of the conditional blocks will be taken. $ELSEIF is a combination of a $ELSE and a $IF.
For example:
{$IFDEF foobar}
do_foobar
{$ELSEIF RTLVersion >= 14}
blah
{$ELSEIF somestring = "yes"}
beep
{$ELSE}
last chance
{$IFEND}
Of these four cases, only one will be taken. If none of the first three conditions is true, then the $ELSE clause will be taken. $ELSEIF must be terminated by $IFEND. $ELSEIF cannot appear after $ELSE. Conditions are evaluated top to bottom like a normal "if ... else if ... else " sequence. In the example above, if foobar is not defined, RTLVersion is 15, and somestring = "yes", only the "blah" block will be taken not the "beep" block, even though the conditions for both are true.
← →
TUser © (2006-04-07 10:47) [6]> Можно разрулить интерфейсами.
Забыл сказать - надо чтобы работало и на FreePascal.
Задача - этот модуль (точнее несколько модулей) используется в нескольких проектах. Есть некоторая иерархия из нескольких классов, и ею удобно пользоваться. Беда в том, что эти классы в разных проектах нужны почти одинаковые, но не совсем. Например, тип TSquare - квадрат числа, где-то он double, гду-то int64. Поэтому где-то исполдьзуется соотвктствующий ifdef. Ну и таких ситуаций несколько.
Кроме того, мысль - увы - не стоитна месте, появляется желание что-то переписать, по сохранить совместимость со старым кодом. Отсюда символы типа VERSION2.
← →
Palladin © (2006-04-07 10:59) [7]очень кстати придутся системы контроля версий и ветки версий в них
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c