Форум: "Прочее";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизТипы данных, 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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.046 c