![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как задать констату пользовательского типа?
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]Т.е.?