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

Вниз

Типы данных, cardinal   Найти похожие ветки 

 
POP   (2006-11-18 20:49) [0]

Cardinal это - 0..4294967295

Тогда почему не работает такая конструкция:

var
Wor: dword;
Size: cardinal;

begin
Wor:= 65535;
Size:= Cardinal(Wor) * 65535;
..
if Size2 < Size then

Вылазит ошибка "Integer overflow".

Если операцию сравнения убрать то все работает.


 
Desdechado ©   (2006-11-18 20:53) [1]

Size2 как описан?
см неявное приведение типов в справке


 
Anatoly Podgoretsky ©   (2006-11-18 20:55) [2]

> POP  (18.11.2006 20:49:00)  [0]

Не указаная переменная Size2


 
palva ©   (2006-11-18 20:56) [3]

Пытается из Size2 вычесть Size и возникает переполнение. Видимо, Size2 очень большое по модулю отрицательное число.


 
POP   (2006-11-18 21:18) [4]

Size2 обьявлен также как и Size, то есть cardinal, я уже все перепробовал, разные приведения типов, не пойму как с большими целыми числами работать.

Вы попробуйте сами.


 
POP   (2006-11-18 21:22) [5]

Вот как точно выглядит:

var
Wor1, Wor2: dword;
Size1, Size2: Cardinal;

begin
Wor1:= 0
Wor2:= 65535;
Size:= Cardinal(Wor2) * 65535;
..
if Size2 < Size then Exit;


 
Anatoly Podgoretsky ©   (2006-11-18 21:24) [6]

> POP  (18.11.2006 21:22:05)  [5]

65535 это уже не Cardianal, а Integer


 
POP   (2006-11-18 21:25) [7]

Млять, опять ошибся, вот как выглядит:

var
Wor1, Wor2: dword;
Size1, Size2: Cardinal;

begin
Wor1:= 0
Wor2:= 65535;
Size1:= (Cardinal(Wor1) * 65535);
Size2:= (Cardinal(Wor2) * 65535);
..
if Size2 < Size then Exit;


 
Anatoly Podgoretsky ©   (2006-11-18 21:25) [8]

> POP  (18.11.2006 21:22:05)  [5]

И еще Size2 не инициализирован, а Size не известно как объявлен


 
POP   (2006-11-18 21:26) [9]


> 65535 это уже не Cardianal, а Integer


Но ведь я то произвожу операцию умножения, где один из операторов Cardinal, а значит и результат cardinal


 
Anatoly Podgoretsky ©   (2006-11-18 21:26) [10]

> POP  (18.11.2006 21:25:07)  [7]

Все равно Size неизвестно как объявлен.
Зачем обсуждать неизвестные данные.


 
Anatoly Podgoretsky ©   (2006-11-18 21:28) [11]

> POP  (18.11.2006 21:26:09)  [9]

C чего ты так решил, смотри АСМ код


 
POP   (2006-11-18 21:35) [12]


> Все равно Size неизвестно как объявлен.
> Зачем обсуждать неизвестные данные.


Как это неизвестно? Оба Size1 и Size2 это cardinal, ты посмотри, я исправил в следующей мессаге.


 
Kolan ©   (2006-11-18 21:36) [13]

> Size2 < Size then Exit;


 
Anatoly Podgoretsky ©   (2006-11-18 21:36) [14]

> POP  (18.11.2006 21:35:12)  [12]

Ты что думаешь я руками это пишу, я скопировал из твоего сообщения.
Код не позволяет обсуждать, поскольку есть неизвестные переменные или константы.


 
Kolan ©   (2006-11-18 21:37) [15]

> Size1:= (Cardinal(Wor1) * 65535);
> Size2:= (Cardinal(Wor2) * 65535);

А что просто нельзя:
Size1:= (Cardinal * 65535);
Size2:= (Cardinal * 65535);

?


 
Anatoly Podgoretsky ©   (2006-11-18 21:38) [16]

> Kolan  (18.11.2006 21:37:15)  [15]

65535 это Integer


 
POP   (2006-11-18 21:41) [17]


> А что просто нельзя:
> Size1:= (Cardinal * 65535);
> Size2:= (Cardinal * 65535);
> ?


А ты не ошибся случаем? Посмотри внимательно.

> Ты что думаешь я руками это пишу, я скопировал из твоего
> сообщения.
> Код не позволяет обсуждать, поскольку есть неизвестные переменные
> или константы.


Какие неизвестные переменные?

Wor1, Wor2 обяьвлены и инициализированы, Size1, Size2 обьявлены и далее им идет присваивание результат операции.


 
Kolan ©   (2006-11-18 22:05) [18]

Проверил код:
var
 Wor1, Wor2: dword;
 Size1, Size2: Cardinal;
begin
 Wor1:= 0;
 Wor2:= 65535;
 Size1:= (Cardinal(Wor1) * 65535);
 Size2:= (Cardinal(Wor2) * 65535);
 if Size2 < Size1 then Exit;
end;

Заметь я написал Size1, а у тебя Size(Телепатирую).
Все нормально ошибок нет.


> Size1:= (Cardinal * 65535);
> Size2:= (Cardinal * 65535);

Это конечно бред. Имелл в виду вот так:
var
 Wor1, Wor2: dword;
 Size1, Size2: Cardinal;
begin
 Wor1:= 0;
 Wor2:= 65535;
 Size1:= (Wor1 * 65535);
 Size2:= (Wor2 * 65535);
 if Size2 < Size1 then Exit
 else
   ShowMessage("");
end;


Тоже все ок. Что должно быть не так?


 
POP   (2006-11-18 22:36) [19]


> Заметь я написал Size1, а у тебя Size(Телепатирую).
> Все нормально ошибок нет.


Ну где же нормально? Ты запусти его, он компилируется но не выполняется, а вылетает с ошибкой на строке - Size2:= (Wor2 * 65535);


 
Kolan ©   (2006-11-18 22:38) [20]

var
 Wor1, Wor2: dword;
 Size1, Size2: Cardinal;
begin
 Wor1:= 0;
 Wor2:= 65535;
 Size1:= (Wor1 * 65535);
 Size2:= (Wor2 * 65535);
 if Size2 < Size1 then Exit
 else
   ShowMessage("");
end;


Прекрасно выполняется.. BDS2006


 
Anatoly Podgoretsky ©   (2006-11-18 22:45) [21]

> POP  (18.11.2006 21:41:17)  [17]

Неизвестная переменная/константа Size


 
POP   (2006-11-18 23:01) [22]


> Прекрасно выполняется.. BDS2006


Блин, а почему у меня не работает? У меня Delphi 7 SE.


> Неизвестная переменная/константа Size


Ты посмотри мое второе сообщение, там все определено.


 
sniknik ©   (2006-11-18 23:28) [23]

> Ты посмотри мое второе сообщение, там все определено.
второе твое сообщение, это четвертое по порядку т.е. POP   (18.11.06 21:18) [4], там вообще кода нет.

не говори загадками, показывай РЕАЛЬНЫЙ код, чтобы скопировал ... и получил ошибку. т.к. то что есть, приведено либо вообще не компилируется изза неизвестных переменных, либо компилируется и выполняется без ошибок правда приведено не тобой... (D7 Enterprise)


 
POP   (2006-11-18 23:56) [24]


> не говори загадками, показывай РЕАЛЬНЫЙ код, чтобы скопировал
> ... и получил ошибку. т.к. то что есть, приведено либо вообще
> не компилируется изза неизвестных переменных, либо компилируется
> и выполняется без ошибок правда приведено не тобой... (D7
> Enterprise)
>


А вот это что? Я этот код уже приводил

var
Wor1, Wor2: dword;
Size1, Size2: Cardinal;

begin
Wor1:= 0
Wor2:= 65535;
Size1:= (Cardinal(Wor1) * 65535);
Size2:= (Cardinal(Wor2) * 65535);
..
if Size2 < Size then Exit;

При выполнении сего кода вылазит ошибка Integer overflow на строке - Size2:= (Wor2 * 65535);

Если же убрать if Size2 < Size then Exit;, то все работает и ошибки не возникает.

Юзаю Delphi 7 SE


 
POP   (2006-11-18 23:57) [25]


> не говори загадками, показывай РЕАЛЬНЫЙ код, чтобы скопировал
> ... и получил ошибку. т.к. то что есть, приведено либо вообще
> не компилируется изза неизвестных переменных, либо компилируется
> и выполняется без ошибок правда приведено не тобой... (D7
> Enterprise)
>


Вот:

var
Wor1, Wor2: dword;
Size1, Size2: Cardinal;

begin
Wor1:= 0
Wor2:= 65535;
Size1:= (Cardinal(Wor1) * 65535);
Size2:= (Cardinal(Wor2) * 65535);
..
if Size2 < Size1 then Exit;

При выполнении сего кода вылазит ошибка Integer overflow на строке - Size2:= (Wor2 * 65535);

Если же убрать if Size2 < Size then Exit;, то все работает и ошибки не возникает.

Юзаю Delphi 7 SE


 
POP   (2006-11-18 23:58) [26]

Люди, выручайте, работа стоит, почему это работает на Delphi 2006 не знаю, у меня не работает.


 
Alexander Panov ©   (2006-11-19 00:05) [27]


> POP   (18.11.06 23:57) [25]


И в этом коде у тебя ошибка - не хватает ";" после Wor1:= 0

Но не суть важно.

Этот код после исправления выполняется без ошибок полностью в D6 и BDS2006.


 
Alexander Panov ©   (2006-11-19 00:06) [28]


> POP   (18.11.06 23:58) [26]
> Люди, выручайте, работа стоит, почему это работает на Delphi
> 2006 не знаю, у меня не работает.


А кто тебе может помочь, если у остальных все работает?
Садись за отладчик и пошагово смотри.


 
Anatoly Podgoretsky ©   (2006-11-19 00:24) [29]

> POP  (18.11.2006 23:01:22)  [22]

Второе сообщение от меня!
У тебя пока не вижу полного кода, который бы стоило обсуждать, в каждом неизвестные переменные, о чем вообще говорить? Ты код давай.


 
Anatoly Podgoretsky ©   (2006-11-19 00:24) [30]

> POP  (18.11.2006 23:56:24)  [24]

Ну вот опять неизвестная переменная Size


 
Anatoly Podgoretsky ©   (2006-11-19 00:26) [31]

> POP  (18.11.2006 23:57:25)  [25]

65535 это Integer


 
Anatoly Podgoretsky ©   (2006-11-19 00:27) [32]

> POP  (18.11.2006 23:58:26)  [26]

Еще вопрос, а что это такое dword - только не надо говорить, что это double word, это не совсем так и даже не понятно почему ты его используешь, а не Cardinal.


 
Anatoly Podgoretsky ©   (2006-11-19 00:34) [33]

> Alexander Panov  (19.11.2006 0:06:28)  [28]

CPU Windows успех в нем.


 
POP   (2006-11-19 00:40) [34]

Мля, вот полностью процедура, после вырезания всего левого кода, оставил только то что генерирует ошибку, эта процедура висит на обработчике нажатия кнопки:


procedure TForm1.Button24Click(Sender: TObject);
var
Wor1, Wor2: cardinal;;
Size1, Size2: cardinal;

begin

Wor1:= 0;
Wor2:= 65535;

Size1:= (Wor1 * 65535);
Size2:= (Wor2 * 65535);

if Size2 < Size1 then Exit;

end;


Повторюсь, если заремить if Size2 < Size1 then Exit; , то все выполняется без ошибок.


 
POP   (2006-11-19 00:42) [35]


> CPU Windows успех в нем.


Что это такое?


 
sniknik ©   (2006-11-19 00:52) [36]

> Мля, вот полностью процедура, после вырезания всего левого кода, оставил только то что генерирует ошибку ...
опять врешь, эта тоже не компилируется... с ошибкой компиляции Declarated expected but ....

по моему ты прикалываешся просто... копировать код их дельфи надо, а не прям тут придумывать...

> И в этом коде у тебя ошибка - не хватает ";" после Wor1:= 0
> Но не суть важно.
это важно, имхо, это показатель нереальности кода...


 
Anatoly Podgoretsky ©   (2006-11-19 00:55) [37]

> POP  (19.11.2006 0:42:35)  [35]

Ищи это в меню Дельфи, тогда сразу будет видно, что происходит.


 
Anatoly Podgoretsky ©   (2006-11-19 00:56) [38]

> sniknik  (19.11.2006 0:52:36)  [36]

О, я даже не стал анализировать код на вшивость.


 
POP   (2006-11-19 01:03) [39]


> по моему ты прикалываешся просто... копировать код их дельфи
> надо, а не прям тут придумывать...


Да не прикалываюсь я, убери лишний знак ; в Wor1, Wor2: cardinal;; и скомпилируется.

Тороплюсь потому что пока не поздно, пока народ отвечает.

Понял что такое CPU Window, это асмовский код, хоть я в асме и не мастак, но нашел место где на ошибку переходит. Ошибка возникает на Size2:= (Wor2 * 65535);

Выглядит это так:

xor eax, eax                   ; это занесение нуля в Wor1
mov edx, $0000ffff          ; это Wor2
imul eax, eax, $0000ffff    ; это Wor1 * 65535
jnb +$5
call Intover                   ; обработчик ошибки переполнения

imul edx, edx, $0000ffff    ; это Wor2 * 65535
jnb +$5
call Intover                   ; а вот тут этот обработчик ошибки получает управление

После операции умножения в edx результат $fffe0001 , что и правильно, это есть 65535 * 65535 , но почему тогда ошибка возникает?

И второе, посмотрел описание комманд, imul это операция умножения знаковых чисел, а меня ведь все беззнаковые, для беззнаковых используется команда mul


 
Anatoly Podgoretsky ©   (2006-11-19 01:08) [40]

> POP  (19.11.2006 1:03:39)  [39]

Сколько раз тебе говорить, что 65535 это Integer, чтобы ты это понял?



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

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

Наверх




Память: 0.56 MB
Время: 0.035 c
3-1160118569
logslava
2006-10-06 11:09
2006.12.10
Как узнать значение автоинкрементного поля


2-1164561641
Busik
2006-11-26 20:20
2006.12.10
Мой вопрос про изменение атрибутов файлов


2-1164018221
werb
2006-11-20 13:23
2006.12.10
Win32 console и сообщения


15-1163872173
POP
2006-11-18 20:49
2006.12.10
Типы данных, cardinal


2-1164479897
Ramzes35
2006-11-25 21:38
2006.12.10
DBGrid