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

Вниз

Как работать с кардиналами ?   Найти похожие ветки 

 
Алекс А   (2004-05-10 04:56) [0]

Почему не работает цикл :


var
 i : Cardinal;
begin
 for i := 0 to 3600000000 -1 do begin
   ...
 end;
end;


В чём ошибка ? Число больше чем Integer, но меньше чем Cardinal. Значит должно работать, но не работает. Тоже самое происходит при попытке использовать циклы repeat и while, а также при сравнениях. Как быть ?


 
_Alanjuk   (2004-05-10 07:26) [1]

И что конкретно пишет?


 
Beglec   (2004-05-10 07:35) [2]

покажи внутренность цикла


 
Alex Konshin ©   (2004-05-10 07:35) [3]

Замени на LongWord


 
Beglec   (2004-05-10 07:36) [4]

у меня все оки работает данный цикл - смотри внутренности


 
Anatoly Podgoretsky ©   (2004-05-10 07:40) [5]

Видимо старая ошибка - литералы не более MaxInt


 
MBo ©   (2004-05-10 07:47) [6]

procedure TForm1.Button1Click(Sender: TObject);
var
ic,card,j:Cardinal;
begin
card:=3600000000 -1;
for ic:=0 to Card do
 j:=ic;
Caption:=inttostr(j);
end;


 
Alex Konshin ©   (2004-05-10 07:55) [7]

Ты уверен, что проблема возникает на D7?


 
default ©   (2004-05-10 09:20) [8]

давно я этот баг видел...ещё по-моему на Delphi 5(щас на 6-ой смотрел)
вместо for можешь что-то навроде этого использовать
var
i: Cardinal;
while i < 3600000000  do begin
<your code>
Inc(i);
end;


 
_Alanjuk ©   (2004-05-10 09:45) [9]

>Алекс А
Молчит партизан :)


 
default ©   (2004-05-10 09:56) [10]

да ничего не пишет - этот код просто не включается в конечный файл


 
Алекс А   (2004-05-11 01:36) [11]

Например :


procedure TForm1.Button1Click(Sender: TObject);
var
 i, j : Cardinal;
begin
 j := 0;
 for i := 0 to 3600000000 -1 do begin
   Inc(j);
 end;
 Caption := IntToStr(j);
end;


Результат выдаёт нулевой. Но если число уменьшить до диапазона Integer, то всё работает.


 
Alex Konshin ©   (2004-05-11 01:46) [12]

Ну так ты попробовал LongWord?
И действительно ли дело происходит на Delphi7?


 
Алекс А   (2004-05-11 01:47) [13]


> Alex Konshin ©   (10.05.04 07:55) [7]

Уверен. У меня Дельфи 7. А как вообще в этом вопросе можно ошибиться ?


> MBo ©   (10.05.04 07:47) [6]

Так работает. Только хотелось бы обходиться без трюков. Либо чтобы Дельфи ошибку выдавала, когда неможет правильно выполнить цикл.


 
Alex Konshin ©   (2004-05-11 01:57) [14]

Алекс А   (11.05.04 01:47) [13]
> Alex Konshin ©   (10.05.04 07:55) [7]
Уверен. У меня Дельфи 7. А как вообще в этом вопросе можно ошибиться ?

Тут народ разный бывает. Напишут одно, потом выясняется другое. Просто для данного вопроса это принципиально. Cardinal раньше был 31-битный, хотя и беззнаковый.


> MBo ©   (10.05.04 07:47) [6]
Так работает. Только хотелось бы обходиться без трюков. Либо чтобы Дельфи ошибку выдавала, когда неможет правильно выполнить цикл.

А warningов про расширение не дает?
Тогда очевидно, что так тоже будет работать:

i : LongWord
for i := 0 to LongWord(3600000000-1) do begin
Я все-таки порекомендовал бы не использовать Cardinal, т.к. этот тип менялся, и в других версиях Delphi это работать не будет, а так хоть сразу получите сообщение, что нет типа LongWord.



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

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

Наверх




Память: 0.5 MB
Время: 0.025 c
14-1083648492
Gorodov
2004-05-04 09:28
2004.05.23
Уменьшение размера программы


6-1080836272
AndersoNRules
2004-04-01 20:17
2004.05.23
IdTCPClient


3-1082892119
Vlad1
2004-04-25 15:21
2004.05.23
paradox в delphi8


1-1083964926
MAXHO-2
2004-05-08 01:22
2004.05.23
Как перехватить закрытие главного окна?


7-1081610499
Alexis
2004-04-10 19:21
2004.05.23
Вопрос о процессах и не только...