На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
Страницы: (4) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
> Ищем глюки в компиляторах! :)
    Этот топик создан специально для опубликования багов в компиляторах паскаля, будь это Turbo/Borland Pascal, TMT Pascal, Free Pascal, Virtual Pascal или любой другой!



    Есть две большие просьбы:
    [*] При указании бага обязательно указывайте название и версию компилятора, в котором Вы (или не Вы :D) его нашли!
    [*] Не пишите сюда, если у Вас просто что-то не получается, пишите только если Вы уверены, что это глюк компилятора! Однако если Вы нашли что-то, что может вызвать ошибку в работе программы (например, как в п.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:
    ExpandedWrap disabled
      Var X: Boolean;
      Begin
         Case X of
            True: WriteLn('Yes :)');
            False: WriteLn('No :(')
         End
      End.
    Программа ничего не выводит независимо от значения X.
    Решение проблемы:
    нужно вместо Boolean писать Bool или заменить Case на If, т.е. переписать так:
    ExpandedWrap disabled
      Var X: Boolean;
      Begin
         If X then WriteLn('Yes :)') else WriteLn('No :(')
      End.



    4. У одного человека был найден глюк в Turbo Pascal 7.0. Вообще, я всегда раньше думал, что этот паскаль обнуляет переменные при старте программы, но оказалось, что не всегда. Проблема решилась после указания ключа компилятора {$O-} (у него этот ключ был включен).... Сейчас я попробовал включить этот ключ, но у меня всё работает нормально :o.... Почему?
      кажется я уже говорил об этом... однажды я вычислял такую вещь в Турбо Паскале 7:

      ExpandedWrap disabled
        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]) не помогали.

      не помогало и такое

      ExpandedWrap disabled
        var
          W1, W2: Word;
          L: Longint;
         
        W1 := not A[1] + not A[2] * $100;
        W2 := not A[3] * $10000;
        L := W1 + W2;


      пришлось извращаться вот так

      ExpandedWrap disabled
        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;
        TMT PASCAL 3.9
        Это не баг, а feature :)
        Название файла не должно совпадать ни с одним идентификатором, использованном в исходном коде. (С) Вадим Бодров
        То есть, не стоит называть файл, к примеру getpixel.pas, ежели в программе есть вызов
        оной функции.
        Сообщение отредактировано: ozzy -
          1. BP 7.0 говорит, что Error 22: Structure too large, если объявить пустую record или object без полей но с методами
          (но без VMT, так что virtual методов и конструкторов быть не должно), а затем array[0..1] из них. Пример:
          ExpandedWrap disabled
            Type
              rc1 = object
                Procedure DoSmth;
              end;
             
              ar1 = array[0..4] of rc1;
             
            Procedure rc1.DoSmth;
             
            begin
            end;
             
            begin
            end.

          2. Баг не в компиляторе но в организации расцветки редактора в BP 7.0. В программе
          ExpandedWrap disabled
            (*)
            asm
            Hello world
            end;
            (*)
             
            begin
            end.

          Hello world будет зеленым, хотя у паскаля это будут коментарии.

          3. Ну и самое крутое. В BP 7.0 есть очень забавный баг, а именно следующая программа strange.pas компилируется весьма
          странно, вызывая Error 129 при первой попытке компиляции, но при второй все работает как нужно.

          Strange.pas
          ExpandedWrap disabled
            Program Strange;
             
            uses U1;
             
            begin
            end.

          u1.pas
          ExpandedWrap disabled
            {$I header.inc}
            unit U1;
             
            interface
             
            uses U2;
            {$I header.inc}
             
            implementation
             
            end.

          u2.pas
          ExpandedWrap disabled
            unit U2;
             
            interface
             
            implementation
             
            uses U1;
             
            end.

          header.inc
          ExpandedWrap disabled
            {$IFDEF P2}
            Const A = 1;
            {Here may be
             Error 129: ENDIF directive missing.                                                
            }
            {$UNDEF P2}
            {$ELSE}
            {$DEFINE P2}
            {$ENDIF}

          Пока вроде бы все, может быть вспомню еще.
            To 31415: Твой object компилируется нормально....



            Вспомнил ещё один баг в TP/BP 7.0....

            ExpandedWrap disabled
              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 байт.
              Ну не знаю, у меня object дает error 22 и все тут, причем, как я знаю, не только у меня.
                Вот еще один баг. В TMT PASCAL 3.9.
                Если сделать p:=@halt; (где р - pointer), то он это просто не компилирует! Говорит что @Halt = $FFFF  :(
                Не знаю может оно так и было задумано, но это достаточно неудобно.
                  ВНИМАНИЕ !!!

                  Вот >здесь< есть ещё дополнительная информация по багам (и багфиксы), так что качайте на здоровье! ;D
                    У меня, если не сделать так: S:=''; То при BlockRead(F,S,1); в S всякий хлам оказывается.
                    Уточнение from vot: - это НЕ глюк, это недопонимание основ :)

                    А ещё бывает, что структура:

                    ExpandedWrap disabled
                      Repeat
                       
                      While KeyPressed do
                      begin
                        ReadKey;
                        Write('A');
                      end;
                       
                      While not KeyPressed do
                      begin
                        Write('B');
                      end;
                       
                      Until False;


                    Не работает, т.е. не происходит событие ни KeyPressed, ни not KeyPressed, пока не нажмёшь любую клавишу.
                    Это бывает не всегда, больше в сложных программах.
                      А Range Checking включен?
                        А как исправлять ошибку 200 в уже готовых программах? Я в ][akepe видел вариант - что-то найти и на что-то заменить, но у меня на одной проге это плохо сработало.
                            Цитата AZ, 19.12.02, 23:31:05
                            А как исправлять ошибку 200 в уже готовых программах? Я в ][akepe видел вариант - что-то найти и на что-то заменить, но у меня на одной проге это плохо сработало.

                            Могу посоветовать резидентную программку....
                            >скачать<
                            Сообщение отредактировано: 7in -
                              Хочу уточнить, что сообщение 8 от DimA2 не есть глюк. Т.е. конечно ф-ция KeyPressed не работает как положенно, однако виноват в этом не Pascal, а BIOS и его 16h прерывание, чей глюк и унаследовал BP7
                                GetActivePage под ТМТ 3.9 и ТМТ 4 (MS DOS mode) всегда выдает 0-вую страницу.
                                ТМТ 4 (WIN GUI/console) - Ok
                                ExpandedWrap disabled
                                  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.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0538 ]   [ 15 queries used ]   [ Generated: 6.12.24, 17:22 GMT ]