Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: -0.971 c
14-1083784211
lenny wolf
2004-05-05 23:10
2004.05.23
Помогите!


1-1083764799
Rusty
2004-05-05 17:46
2004.05.23
Открыто ли в приложении хотя бы одно окно модально?


3-1082961593
Andriy Tysh
2004-04-26 10:39
2004.05.23
CURSOR in Access?


3-1083074733
Twilight
2004-04-27 18:05
2004.05.23
Не работает, без делфи.


1-1084310707
ivan999
2004-05-12 01:25
2004.05.23
обработка сообщений




   Наверх