Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.042 c
14-1116690237
Nikolay M.
2005-05-21 19:43
2005.06.14
Кто помнит, как добраться до места прошлогодней MMP?


14-1116913483
cyborg
2005-05-24 09:44
2005.06.14
Не включайте компьютер


1-1117114722
M_a_r_i_n_a
2005-05-26 17:38
2005.06.14
Адреса ячеек в Ворде


14-1116827557
syte_ser78
2005-05-23 09:52
2005.06.14
Проблемы с DrDivx 1.06


14-1116928330
Gero
2005-05-24 13:52
2005.06.14
Дожились





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский