Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как задать констату пользовательского типа?


TStas ©   (2005-05-29 01:59:00) 

Написал тип
type
   ImpossibleNumber = record
   modul:String;
   sign:Boolean; //Положительное - true
   end;
Это числа невозможной длинны. Работает все отлично, только не получается почему-то задать константы соответствующие 1 и 0.


Digitman   (2005-05-30 13:05:00) [1]


> TStas ©   (30.05.05 12:43) [13]


> ограничения на длинну числа


у числа нет понятия "длина".
у числа есть значение.

ты там что, звезды решил посчитать ?)

у массива байт тоже, считай, нет ограничений на число элементов
вот и храни в массиве байт свое число ! зачем хранить массив char'ов-то ? каковым по сути является string ?


Kolan   (2005-05-30 12:53:00) [2]

А ШО Extendedнехватает?


TStas   (2005-05-30 12:43:00) [3]

>divid
Именно так я и делал
>Digitman
Чтобы снять все ограничения на длинну числа


Digitman   (2005-05-30 12:28:00) [4]


> TStas ©   (30.05.05 12:24) [11]


а для чего вообще хранить свои числа в строковом представлении ?


TStas   (2005-05-30 12:24:00) [5]

function ImpNumToStr(ImN:ImpossibleNumber):String; //Так считываю
var
  i:Integer;
  b:Byte;
begin
if ImN.modul=Char(0) then
  begin
  Result:='0';
  exit;
  end;
Result:='';
for i:=1 to Length(ImN.modul) do
   begin
   b:=ord(ImN.modul[i]);
   Result:=Result+IntToStr(b);
   end;
Result:=invert(Result);
if not ImN.sign then Result:='-'+Result;
end;

function StrToImpNum(s:String):ImpossibleNumber; //А так заношу
var
  i:Integer;
  b:Byte;
begin
if s[1]='-' then
  begin
  Result.sign:=false;
  Delete(s, 1, 1);
  end
else Result.sign:=true;
if s[1]='+' then Delete(s, 1, 1);
Result.modul:='';
while ((s[1]='0') and (Length(s)>1)) do
     begin
     Delete(s, 1, 1);
     end;
for i:=1 to Length(s) do
   if isNumber(s[i]) then Result.modul:=Result.modul+s[i];
Result.modul:=invert(Result.modul); //Препеписывает в обратном порядке
for i:=1 to Length(Result.modul) do
   begin
   b:=StrToInt(Result.modul[i]);
   Result.modul[i]:=Char(b);
   end
end;

Попробовал написать то же самое, но в системе счисления по основанию 256, а потом устроил проверку на скорось. Получилось, что в 10-ном представлении числа обрабатываются как минимум в 10 быстрее, точно не измерял


vidiv   (2005-05-30 04:39:00) [6]

type
  ImpossibleNumber = record
  modul:String;
  sign:Boolean;
  end;

const A:ImpossibleNumber=(modul:'1';sign:true);
это вы имели ввиду?


Marser   (2005-05-29 23:41:00) [7]

Я хотел посмотреть, как Вы заносите и считываете числа. Кажется, Вы уже самостоятельно управились :-)


TStas   (2005-05-29 23:21:00) [8]

Сделал более экономное с моей точки зрения представление - в системе счисления по основанию 256, тогда байты используются полностью, очень сильно экономится память и быстрее обрабатываеться должно, ведь числа получаются намного короче.
>Marser
>Как это в коде выглядит?
Вы имеете в виду как выглядят константы 1 и 0? Сейчас уже исправил, задал, как написано в справке.
Вы имеете с виду как выглядят констаны или что?


Marser   (2005-05-29 10:22:00) [9]


> в которую в обратном порядке записал десятичные байты.

Это как? Оптимальным вариантом представления является выделение для одной десятичной цифры тетрады - четырёх бит. Таким же образом можно закодировать и HEX.


> Только с 0 и 1 проблема небольшая вышла. Пока в
> функциях вместо 1 пишу StrToImpNum('1'), но мне так не
> нравится.

Как это в коде выглядит?


TStas   (2005-05-29 10:17:00) [10]

То есть не ord(2), а Char(2), конечно.


TStas   (2005-05-29 10:15:00) [11]

Знак отвечает на вопрос положительное ли число. Задал так просто, кроме того так их проще сравнивать. При преобразовании в строку, естественно, плюс не появвляется. Знак добавлен отдельно, потому что для представления модулей чисел большой длины я использовал обычную строку, в которую в обратном порядке записал десятичные байты. Например 2 будет выглядить как ord(2). Все на самом деле получилось просто и быстро. Обрабатываются с очень хорошей скоростью.  Только с 0 и 1 проблема небольшая вышла. Пока в функциях вместо 1 пишу StrToImpNum('1'), но мне так не нравится.


Marser   (2005-05-29 10:03:00) [12]


> Гм... Обычно "Sign = true" знак есть, значит
> отрицательное.

Есть разные записи.
Но знак обычно - старший бит. Поэтому непонятно, зачем нужно добавлять булеву переменную и создавать запись, чтобы с ней иметь проблемы непонятного характера.


Defunct   (2005-05-29 04:49:00) [13]

TStas ©   (29.05.05 01:59)  

>  sign:Boolean; //Положительное - true

Гм... Обычно "Sign = true" знак есть, значит отрицательное.

234234
-324234

Вы же не пишете
+234234


Cobalt   (2005-05-29 03:09:00) [14]

2 TStas ©   (29.05.05 01:59)
Help по const в руки:
Delphi Language Reference, Record constants


lookin   (2005-05-29 02:12:00) [15]

Т.е.?


Наверх

Титульная страница Поиск, карта сайта Написать письмо