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

Вниз

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

 
TStas ©   (2005-05-29 01:59) [0]

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


 
lookin ©   (2005-05-29 02:12) [1]

Т.е.?


 
Cobalt ©   (2005-05-29 03:09) [2]

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


 
Defunct ©   (2005-05-29 04:49) [3]

TStas ©   (29.05.05 01:59)  

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

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

234234
-324234

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


 
Marser ©   (2005-05-29 10:03) [4]


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

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


 
TStas ©   (2005-05-29 10:15) [5]

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


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

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


 
Marser ©   (2005-05-29 10:22) [7]


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

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


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

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


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

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


 
Marser ©   (2005-05-29 23:41) [9]

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


 
vidiv ©   (2005-05-30 04:39) [10]

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

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


 
TStas ©   (2005-05-30 12:24) [11]

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 быстрее, точно не измерял


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


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


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


 
TStas ©   (2005-05-30 12:43) [13]

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


 
Kolan ©   (2005-05-30 12:53) [14]

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


 
Digitman ©   (2005-05-30 13:05) [15]


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


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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
1-1117344819
Андрей Молчанов
2005-05-29 09:33
2005.06.14
Чтение файлов недоступных для чтения


9-1111060381
Серый
2005-03-17 14:53
2005.06.14
Где найти путные md2 модели


1-1117132916
Nikitian
2005-05-26 22:41
2005.06.14
findcomponent - неясна работа


3-1115374915
vic1
2005-05-06 14:21
2005.06.14
текст в ADODataset


4-1114097458
netmouse
2005-04-21 19:30
2005.06.14
Как послать клавиатурное сочетание