Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Создание диапазона длинных чисел

Автор: Unconnected 1.10.2009 18:46

Привет всем. У меня такая проблема: нужно сгенерировать и записать в файл диапазон телефонных номеров. Число после префикса выходит за рамки LongInt. Я попробовал представить число в виде массива цифр, только не очень работает..

var
Form6: TForm6;
ch,ch2:array[1..10] of byte;
f:textfile;
implementation

{$R *.dfm}

Function prov:boolean;
var k:byte;
begin
result:=true;
for k:=1 to 10 do
begin
if ch[k]<>ch2[k] then begin
result:=false;
break;
end;
end;
end;

function mas:string;
var j:byte;
begin
result:='';
for j:=1 to 10 do result:=result+inttostr(ch[j]);
end;

procedure TForm6.sButton1Click(Sender: TObject);
var d1,k2:byte;
begin
assignfile(f,sedit4.text+'.txt');
rewrite(f);
for d1:=1 to 10 do
begin
ch[d1]:=strtoint(form6.sEdit2.text[d1]);
ch2[d1]:=strtoint(form6.sEdit3.text[d1]);
end;
repeat
for k2:=10 downto 1 do
begin
writeln(f,form6.sedit1.text+mas);
if ch[k2]<>9 then inc(ch[k2]) else begin
ch[k2]:=0;
inc(ch[k2-1]);
break
end;
end;
until prov;



sedit4 - в этом поле записано имя создаваемого текстового файла, sedit2 - нижняя граница диапазона; sedit3 - верхняя граница диапазона, sedit1 - префикс номера, например, +7 для России, он будет одинаковым для каждого номера из диапазона. Мой код выдаёт AV даже при первой записи в файл..
Надеюсь, понятно обрисовал задачу. Наверное, можно было это сделать при помощи "длинной арифметики"..

Автор: Lapp 1.10.2009 19:13

А зачем вообще числа? Почему номер нельзя представлять строкой? Мне кажется, это естественнее. Телефонные номера никто же не складывает и не возводит в квадрат)). А ели нужно сравнение - пожалуйста, оно есть.

Автор: volvo 1.10.2009 22:07

Цитата
Число после префикса выходит за рамки LongInt.
Хотелось бы заметить, что LongInt - далеко не самый емкий целочисленный тип в Дельфи, есть еще Cardinal (который по размеру - такой же, как LongInt, но без возможности хранения отрицательных чисел, есть UInt64 - от 0 до 18446744073709551616)

Автор: Unconnected 1.10.2009 22:23

Цитата
Хотелось бы заметить, что LongInt - далеко не самый емкий целочисленный тип в Дельфи, есть еще Cardinal (который по размеру - такой же, как LongInt, но без возможности хранения отрицательных чисел, есть UInt64 - от 0 до 18446744073709551616)


Во, спасибо, а я велосипед изобретал:)


Автор: Unconnected 2.10.2009 0:14

И я опять в замешательстве. Следующий код:

var diap1,diap2:cardinal;
begin
diap1:=strtoint(copy(form1.sedit5.text,3,length(form1.sedit5.text)-2));
diap2:=strtoint(copy(form1.sedit6.text,3,length(form1.sedit6.text)-2));
end;


делает странные вещи. Поле form1.sedit5.text содержит значение +79030000000, трассировка вышеприведённого кода даже подтверждает это. Но тем не менее переменной diap1 всегда присваивается вместо 9030000000 значение 444208773! Что за феномен, кто-нибудь знает?

Автор: volvo 2.10.2009 1:24

9 миллиардов - очень много для Cardinal, он держит до 232, а это чуть больше 4 млрд... Используй Int64:

var diap1, diap2: int64;
begin
diap1:=strtoint64(copy(form1.sedit5.text,3,length(form1.sedit5.text)-2));
diap2:=strtoint64(copy(form1.sedit6.text,3,length(form1.sedit6.text)-2));
end;

Автор: Unconnected 3.10.2009 1:13

Помогло:) А если бы я внимательней прочитал пост №3, то помогло бы ещё раньше))