Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1163903847
Мальвина
2006-11-19 05:37
2006.12.10
Работа с микшером винды


2-1164256385
denand
2006-11-23 07:33
2006.12.10
Про иконки в Tlistview


15-1164182146
Уважаемый Ламер
2006-11-22 10:55
2006.12.10
Не работают breakpoints


15-1164052618
melkyi
2006-11-20 22:56
2006.12.10
Петр Дранго


15-1163687787
Calibr
2006-11-16 17:36
2006.12.10
Физикам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский