Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.170] |
|
Страницы: (4) [1] 2 3 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Этот топик создан специально для опубликования багов в компиляторах паскаля, будь это Turbo/Borland Pascal, TMT Pascal, Free Pascal, Virtual Pascal или любой другой!
Есть две большие просьбы: [*] При указании бага обязательно указывайте название и версию компилятора, в котором Вы (или не Вы ) его нашли! [*] Не пишите сюда, если у Вас просто что-то не получается, пишите только если Вы уверены, что это глюк компилятора! Однако если Вы нашли что-то, что может вызвать ошибку в работе программы (например, как в п.4), пишите! Ну что? Начну 1. Всемизвестная ошибка Runtime error 200 в программах на Borland Pascal with Objects 7.0, в которых подключен модуль CRT, и неправильная работа процедуры Delay в Turbo/Borland Pascal 7.0, теперь легко исправимы. Просто >скачайте< исправленный модуль CRT (вместе с TPL) и замените его на старый (дополнительная информация >тут<). 2. Глюк в TMT Pascal 3.5: оказывается DWord((Data-4)^) и DWord(Pointer(Data-4)^) - две разные вещи, потому что DWord((Data-4)^) на самом деле компилируется как Byte((Data-4)^).... P.S. Здесь Data имеет тип Pointer. 3. Не работает Case с типом Boolean в TMT Pascal 3.9: Var X: Boolean; Begin Case X of True: WriteLn('Yes :)'); False: WriteLn('No :(') End End. Решение проблемы: нужно вместо Boolean писать Bool или заменить Case на If, т.е. переписать так: Var X: Boolean; Begin If X then WriteLn('Yes :)') else WriteLn('No :(') End. 4. У одного человека был найден глюк в Turbo Pascal 7.0. Вообще, я всегда раньше думал, что этот паскаль обнуляет переменные при старте программы, но оказалось, что не всегда. Проблема решилась после указания ключа компилятора {$O-} (у него этот ключ был включен).... Сейчас я попробовал включить этот ключ, но у меня всё работает нормально .... Почему? |
Сообщ.
#2
,
|
|
|
кажется я уже говорил об этом... однажды я вычислял такую вещь в Турбо Паскале 7:
var L: Longint; L := not A[1] + not A[2] * $100 + not A[3] * $10000; где A[i] - это байтовые порты Port[i] ну так вот там считывались 24 битное число из одного устройства. операция not была задана разработчиками устройства и я ничего не мог поделать. в какой-то момент в переменной L появлялись отрицательные числа. что не есть правда. так как это были реальные числа - количество физических объектов попавших в луч лазера. оказывается Турбо 7 все это каким-то образом переводил в целое со знаком (хотя считывал именно байты). преобразования типов Word(not A[i]) не помогали. не помогало и такое var W1, W2: Word; L: Longint; W1 := not A[1] + not A[2] * $100; W2 := not A[3] * $10000; L := W1 + W2; пришлось извращаться вот так var b: array[0..3] of Byte; L: Longint absolute b; b[1] := not A[1]; b[2] := not A[2]; b[3] := not A[3]; b[4] := 0; |
Сообщ.
#3
,
|
|
|
TMT PASCAL 3.9
Это не баг, а feature Название файла не должно совпадать ни с одним идентификатором, использованном в исходном коде. (С) Вадим Бодров То есть, не стоит называть файл, к примеру getpixel.pas, ежели в программе есть вызов оной функции. |
Сообщ.
#4
,
|
|
|
1. BP 7.0 говорит, что Error 22: Structure too large, если объявить пустую record или object без полей но с методами
(но без VMT, так что virtual методов и конструкторов быть не должно), а затем array[0..1] из них. Пример: Type rc1 = object Procedure DoSmth; end; ar1 = array[0..4] of rc1; Procedure rc1.DoSmth; begin end; begin end. 2. Баг не в компиляторе но в организации расцветки редактора в BP 7.0. В программе (*) asm Hello world end; (*) begin end. Hello world будет зеленым, хотя у паскаля это будут коментарии. 3. Ну и самое крутое. В BP 7.0 есть очень забавный баг, а именно следующая программа strange.pas компилируется весьма странно, вызывая Error 129 при первой попытке компиляции, но при второй все работает как нужно. Strange.pas Program Strange; uses U1; begin end. u1.pas {$I header.inc} unit U1; interface uses U2; {$I header.inc} implementation end. u2.pas unit U2; interface implementation uses U1; end. header.inc {$IFDEF P2} Const A = 1; {Here may be Error 129: ENDIF directive missing. } {$UNDEF P2} {$ELSE} {$DEFINE P2} {$ENDIF} Пока вроде бы все, может быть вспомню еще. |
Сообщ.
#5
,
|
|
|
To 31415: Твой object компилируется нормально....
Вспомнил ещё один баг в TP/BP 7.0.... Procedure X; assembler; Var Z: Word; Procedure Y; assembler; Asm mov ax,Z End; Asm mov ax,Z call Y End; Begin X End. После компиляции в процедуре X будет mov ax,[bp-2], в Y - тоже, хотя во второй должен быть mov ax,[bp+4], в итоге в ax будет занесено не то значение.... Не знаю, можно ли это считать багом.... скорее, это недочёт, либо наоборот фича такая. В TMT Pascal 3.5/3.9 процедуры Reset(F) и ReWrite(F), где F - переменная типа File открывают файл с длиной записи 1 байт, хотя TP/BP 7.0 - с длиной записи 128 байт. |
Сообщ.
#6
,
|
|
|
Ну не знаю, у меня object дает error 22 и все тут, причем, как я знаю, не только у меня.
|
Сообщ.
#7
,
|
|
|
Вот еще один баг. В TMT PASCAL 3.9.
Если сделать p:=@halt; (где р - pointer), то он это просто не компилирует! Говорит что @Halt = $FFFF :( Не знаю может оно так и было задумано, но это достаточно неудобно. |
Сообщ.
#8
,
|
|
|
ВНИМАНИЕ !!!
Вот >здесь< есть ещё дополнительная информация по багам (и багфиксы), так что качайте на здоровье! ;D |
Сообщ.
#9
,
|
|
|
У меня, если не сделать так: S:=''; То при BlockRead(F,S,1); в S всякий хлам оказывается.
Уточнение from vot: - это НЕ глюк, это недопонимание основ А ещё бывает, что структура: Repeat While KeyPressed do begin ReadKey; Write('A'); end; While not KeyPressed do begin Write('B'); end; Until False; Не работает, т.е. не происходит событие ни KeyPressed, ни not KeyPressed, пока не нажмёшь любую клавишу. Это бывает не всегда, больше в сложных программах. |
Сообщ.
#10
,
|
|
|
А Range Checking включен?
|
Сообщ.
#11
,
|
|
|
А как исправлять ошибку 200 в уже готовых программах? Я в ][akepe видел вариант - что-то найти и на что-то заменить, но у меня на одной проге это плохо сработало.
|
Сообщ.
#12
,
|
|
|
Сообщ.
#13
,
|
|
|
Цитата AZ, 19.12.02, 23:31:05 А как исправлять ошибку 200 в уже готовых программах? Я в ][akepe видел вариант - что-то найти и на что-то заменить, но у меня на одной проге это плохо сработало. Могу посоветовать резидентную программку.... >скачать< |
Сообщ.
#14
,
|
|
|
Хочу уточнить, что сообщение 8 от DimA2 не есть глюк. Т.е. конечно ф-ция KeyPressed не работает как положенно, однако виноват в этом не Pascal, а BIOS и его 16h прерывание, чей глюк и унаследовал BP7
|
Сообщ.
#15
,
|
|
|
GetActivePage под ТМТ 3.9 и ТМТ 4 (MS DOS mode) всегда выдает 0-вую страницу.
ТМТ 4 (WIN GUI/console) - Ok Program GetActivePageDemo; Uses Graph, Crt, Strings; BEGIN { Set 256-colours graphics mode } SetSVGAMode(640,480,8,LfbOrBanked); OutText('Current active page is '+IntToStr(GetActivePage)); SetActivePage(1); OutText('Current active page is '+IntToStr(GetActivePage)); SetVisualPage(1,True); ReadKey; { Get the key pressed } CloseGraph; { Return to the text mode } END. |