Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Как написать код с многими 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.041 c
8-1134761568
Expl
2005-12-16 22:32
2006.05.14
движение TLabel


2-1145793355
inri13666
2006-04-23 15:55
2006.05.14
System menu


2-1146167624
Alecs
2006-04-27 23:53
2006.05.14
Excel Delphi работа с уже открытым файлом


15-1145451368
lookin
2006-04-19 16:56
2006.05.14
С команд будут снимать очки за расистские выходки фанатов


2-1145728865
html
2006-04-22 22:01
2006.05.14
чем отобразить?