Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
15-1145525757
ZeFiR
2006-04-20 13:35
2006.05.14
Бесплатный(или почти бесплатный)хостинг с открытым fsockopen()


2-1145530972
Александр Б.
2006-04-20 15:02
2006.05.14
Изменение исходников


2-1146116926
tigra
2006-04-27 09:48
2006.05.14
TBLOBField


6-1137928873
Юрий Ж.
2006-01-22 14:21
2006.05.14
[?]NET SEND


4-1140595930
KonstantinM
2006-02-22 11:12
2006.05.14
Проблема с SetWindowsHookEx(WH_CallWndProc,...)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский