IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Создание диапазона длинных чисел
сообщение
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Привет всем. У меня такая проблема: нужно сгенерировать и записать в файл диапазон телефонных номеров. Число после префикса выходит за рамки 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 даже при первой записи в файл..
Надеюсь, понятно обрисовал задачу. Наверное, можно было это сделать при помощи "длинной арифметики"..


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






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


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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


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



--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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

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! Что за феномен, кто-нибудь знает?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 22.10.2020 19:30
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name