Const I = Func1(a) как?[Решено]

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

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

Const I = Func1(a) как?[Решено]

Сообщение Maxizar » 20.04.2011 18:41:06

Есть такой тип данных:
Код: Выделить всё
Type
    PComplex=^TComplex;
    TComplex = record
         Re,
         Im:Double;
     end;// TComplex = record 


Иногда необходимо именно Double, иногда можно обойтись и Single. В модуле есть пару функций написанных на ASM-е, в которых необходимо увеличить число согласно размеру TComplex, так как изначально используем типы размер которых есть степень двойки, то в процедурах использую что-то в виде:
Код: Выделить всё
shl EBX, 4 (для Double)
shl EBX, 3 (для Single)


Из-за чего модули плодятся в двойном размере :evil: Хотелось бы иметь константу скажем shlMnogitel , благодаря которому все 2 модуля сшились бы в один и имели нечто в этом роде:
Код: Выделить всё
shl EBX, shlMnogitel


Но как мне объявить такую константу?
если есть функция, которая вернет этот множитель
Код: Выделить всё
function Power2(N: Cardinal): Byte;
begin
  Result:=0;
   While N>1 do
   begin
     N := N shr 1;
     Inc(Result);
   end;
end;


Но объявление константы:
Код: Выделить всё
  const
         shlMnogitel=Power2(SizeOf(TComplex)); 

Не допустимы.... Можно ли как то это сделать по другому :?:
Последний раз редактировалось Maxizar 20.04.2011 19:31:44, всего редактировалось 1 раз.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Const I = Func1(a) как?

Сообщение Max Rusov » 20.04.2011 18:57:06

Код: Выделить всё
const
  {$Ifdef ComplexIsSingle}
    shlMnogitel = nn;  // Power2(SizeOf(TComplex)); 
  {$else}
    shlMnogitel = mm;  // -/-
  {$endif}

nn и mm забейте руками.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Const I = Func1(a) как?

Сообщение Maxizar » 20.04.2011 19:13:49

Блин работает спасибо.
А можно еще один уточняющий вопросик. У меня если написать так:
Код: Выделить всё
 
{$define ComplexIsSingle}
{$Ifdef ComplexIsSingle}
    shlMnogitel = 3;  // Power2(SizeOf(TComplex));
  {$else}
    shlMnogitel = 4;  // -/-
  {$endif}   

То в зависимости от того закоментирован или нет {$define ComplexIsSingle} константы разные, А можно ли это сделать не только в этом модуле, тоесть как сделать определение {$define ComplexIsSingle} глобальным? . тоесть я раскоментирую в одном модуле, а проверяю в другом. Если это возможно, то это просто супер...
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Const I = Func1(a) как?

Сообщение devels » 20.04.2011 19:22:57

Для этого все дефайны можно собрать в одном файле и подключать этот файл во всех исходниках, где нужны эти дефайны.

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

{$i 'defines.inc'}

...

devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Const I = Func1(a) как?

Сообщение Maxizar » 20.04.2011 19:31:24

Огромное Спасибо, Вы мне Америку открыли :D :D :D
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Const I = Func1(a) как?

Сообщение devels » 20.04.2011 20:20:42

Maxizar писал(а):Огромное Спасибо, Вы мне Америку открыли :D :D :D


По-моему в настройках проекта lazarus можно указать define'ы.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Const I = Func1(a) как?[Решено]

Сообщение MageSlayer » 20.04.2011 21:23:42

Можно я тоже добавлю веселья ? :)
Моя элементарная версия тоже самого, только с вычислением во время компиляции :)

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

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

type
  TRec = record
    i1, i2:Integer;
    //b:boolean;
    //i:array[0..127] of byte;
    //i:array[0..255] of byte;
    //i:array[0..511] of byte;
    //i:array[0..1023] of byte;
  end;


type
  TBinNum = (bn0 = 0, bn1 = 1, bn2 = 2, bn3 = 4, bn4 = 8, bn5 = 16, bn6 = 32, bn7 = 64, bn8 = 128 );

const
  BnSize1 = [ TBinNum( SizeOf(TRec) and $ff ) ];
  BnSize2 = [ TBinNum( SizeOf(TRec) shr 8 ) ];

  //максимальный размер записи - 65535 байт :)
  S = Integer(bn1 in BnSize1)*0 +
      Integer(bn2 in BnSize1)*1 +
      Integer(bn3 in BnSize1)*2 +
      Integer(bn4 in BnSize1)*3 +
      Integer(bn5 in BnSize1)*4 +
      Integer(bn6 in BnSize1)*5 +
      Integer(bn7 in BnSize1)*6 +
      Integer(bn8 in BnSize1)*7 +

      Integer(bn1 in BnSize2)*8 +
      Integer(bn2 in BnSize2)*9 +
      Integer(bn3 in BnSize2)*10 +
      Integer(bn4 in BnSize2)*11 +
      Integer(bn5 in BnSize2)*12 +
      Integer(bn6 in BnSize2)*13 +
      Integer(bn7 in BnSize2)*14 +
      Integer(bn8 in BnSize2)*15
    ;

  invalid = (1 shl S) <> SizeOf(TRec);
  {$if invalid}
    {$error SizeOf(TRec) is not power of 2}
  {$endif}

begin
  WriteLn( 1 shl S );
  WriteLn( SizeOf(TRec) );
end.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru