На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
  
> Как работать с 32-битными целыми без знака в VP , VP
    Здравствуйте,
    В VP, кажется, нет 32-битных целых беззнаковых (LongWord компилятор не знает, а тип Cardinal имеет диапазон 0 — $FFFFFF). Мне надо переменную для накопления натуральных значений максимально допустимого размера.
    Кто-нибудь может посоветовать как поступить в данной ситуаци?
      Используй Use32 и (по уверению хелпа) будет тебе счастье:
      Цитата
      Use32 also redefines Word to be 32 bit.
        Нет в жизне щастия :(
        Не компилируется, загаза…
        ExpandedWrap disabled
          uses Use32;
          var C:cardinal;
          begin
          C:=4294967294;
          end.


        pS. Спасибо за ответ
          Если тебе только в качестве счетчика - то воспользуйся старым проверенным трюком:
          ExpandedWrap disabled
            uses Use32;
            var C: comp;
            begin
              C := 4294967294.0;
              C := C + 1;
              WriteLn(C:0:0);
            end.
          , ибо
          Цитата
          The Comp type is a 64-bit integer capable of holdin an integer value between-2x1063 +1 and 2x1063-1.
          . Но, естественно, это не полноценный integer type, поэтому его нельзя использовать, скажем, как переменную цикла:
          Цитата
          It is regarded as a floating point type since it can not be used in contexts where integer and ordinal types are accepted.
            AGRY-DILETANT, может стоило объявлять С как word, если после Use32 он имеет размерность 32 бита, и забыть про cardinal?
              Цитата Vesper @
              если после Use32 он имеет размерность 32 бита
              Не имеет. Заявлено, что имеет, но этого не происходит. С беззнаковыми типами в VP вообще что-то непонятное творится после подключения Use32:

              ExpandedWrap disabled
                var C:word;
                begin
                  writeln(high(C), ' ', low(C));
                end.

              выдает:
              ExpandedWrap disabled
                65535 0

              Все логично. Однако:

              ExpandedWrap disabled
                uses Use32;
                var C:word;
                begin
                  writeln(high(C), ' ', low(C));
                end.

              , и логика уже отдыхает:
              ExpandedWrap disabled
                2147483647 -2147483648


              P.S. Хм... В контекстной помощи написано
              Цитата
              * In Use32+ state word is currently equivalent to LongInt and thus actually a signed 32 bit integer.
              , и согласно информации из этого файла (Ctrl+F1) в VP действительно нет возможности работать с беззнаковым целым размером 32 байта. Кстати, Cardinal изначально заявлен, как 31-битный ( :blink: ) тип с интервалом значений 0 .. 2147483647, так что в него в любом случае не запихать 4294967294.

              AGRY-DILETANT, зачем тебе VP понадобился, расскажи? Проект не поддерживается уже давно, может лучше на другой компилятор пересесть, на FPC, скажем? Там таких проблем с типами я что-то не припоминаю. Хоть DWord, хоть QWord - и тот и тот беззнаковый, и размер - как и был заявлен.
                Цитата volvo877 @
                AGRY-DILETANT, зачем тебе VP понадобился, расскажи? Проект не поддерживается уже давно, может лучше на другой компилятор пересесть, на FPC, скажем? Там таких проблем с типами я что-то не припоминаю. Хоть DWord, хоть QWord - и тот и тот беззнаковый, и размер - как и был заявлен.

                Большое всем спасибо, я понял что, надо использовать Word вместо Cardinal, а SmallWord вместо Word, когда Интернет был уже недоступен. Пойду попробую переделать.

                Цитата
                AGRY-DILETANT, зачем тебе VP понадобился, расскажи? Проект не поддерживается уже давно, может лучше на другой компилятор пересесть, на FPC, скажем? Там таких проблем с типами я что-то не припоминаю. Хоть DWord, хоть QWord - и тот и тот беззнаковый, и размер - как и был заявлен.


                У VP — меньший размер дистрибютива, пользовательский интерфейс "по-дружелюбнее": прилагаемая IDE с поддержкой буффера обмена, документация в виде двух красиво оформеленных pdf-файлов, исходники юнитов. Отсутсвие служебной информации в консоле программы при запуске из IDE. Проще синтаксис и благодаря этому большая вероятность перекомпилировать код на других 32-битных компилятрах с поддержкой синтаксиса Delphi.
                  Цитата AGRY-DILETANT @
                  Проще синтаксис и благодаря этому большая вероятность перекомпилировать код на других 32-битных компилятрах с поддержкой синтаксиса Delphi.

                  FreePascal совместим с Delphi.
                  А в качестве IDE можешь взять Dev Pascal.
                    Цитата AGRY-DILETANT @
                    прилагаемая IDE с поддержкой буффера обмена
                    У FPC - тоже, если что.

                    Цитата AGRY-DILETANT @
                    документация в виде двух красиво оформеленных pdf-файлов
                    Угу, удивил. У FPC - семь файлов. Тоже PDF. И тоже оформленных красиво :)

                    Цитата AGRY-DILETANT @
                    исходники юнитов
                    И чего? Скачал я себе исходники FPC - у меня тоже теперь исходники всех юнитов есть. Так что все вышеприведенное - не выигрывает у FPC.

                    Цитата AGRY-DILETANT @
                    Проще синтаксис и благодаря этому большая вероятность перекомпилировать код на других 32-битных компилятрах с поддержкой синтаксиса Delphi.
                    Ага. Но сначала помучаться, пытаясь имитировать поведение, скажем, DWord, или еще какого типа. Ты ,кажется, уже имеешь такое счастье? Чего с FPC в принципе не бывает.

                    Цитата AGRY-DILETANT @
                    У VP — меньший размер дистрибютива
                    Неизменяющегося дистрибутива, заметь :) Как "завис" проект 13 мая 2004 года, так на том же уровне и висит. "В то время, как космические корабли бороздят просторы Большого Театра" (С).

                    Хотя чего это я. Ты свой выбор сделал, пользуйся VP. Не буду тебя переубеждать. Все вышесказанное - только для тех, кто зайдет почитать тему, и действительно может подумать, что в IDE FPC нет возможности работы с буфером обмена, и хелпа нормального нет, и еще там много чего ты написал.
                      Цитата
                      Хотя чего это я. Ты свой выбор сделал, пользуйся VP. Не буду тебя переубеждать. Все вышесказанное - только для тех, кто зайдет почитать тему, и действительно может подумать, что в IDE FPC нет возможности работы с буфером обмена, и хелпа нормального нет, и еще там много чего ты написал.

                      Ну знаете, на сегодняшний день, убеждать в удобстве пользования подглючиващей фрипаскалевсой средой разработки, в которую невозможно скопировать данные из буффера обмена Виндовс, и ограниченным по объему руководством, разбросанным по 6 файлам — это уже откровенное фарисейство.

                      Как крайний вариант, после завершения прожекта может перекомпилирую и отлажу его еще и на FPC (хотя проектик небольшой, а после компиляции на фриипаскале, как и на Дельфи, размер экзешника получается в 4 раза больше и работает пока непредсказуемо), чтобы использовать нормальный Cardinal.

                      Конкретно вопрос, код более-менее на FPC компилируется, за исключением невозможности изменить в цикле счетчик этого цикла. Может кто подскажет, предусмотрена ли на этот случай какая-то деректива процессора?

                      Зы.
                      Цитата
                      Используй Use32 и (по уверению хелпа) будет тебе счастье:
                      Это — намек на то, что по-немецки "счатье" звучит как "дас Глюк"?:)
                        Цитата AGRY-DILETANT @
                        Конкретно вопрос, код более-менее на FPC компилируется, за исключением невозможности изменить в цикле счетчик этого цикла. Может кто подскажет, предусмотрена ли на этот случай какая-то деректива процессора?

                        Нет, такой возможности нет. Мне кажется, что менять счётчик цикла в теле цикла - моветон.
                        Цитата из Руководство по языку B.Pascal 7 & Objects/LR:
                        "Если оператор, содержащийся в теле оператора for, изменяет значение управляющей переменной, то это является ошибкой. После выполнения оператора for значение управляющей переменной становится неопределенным, если только выполнение оператора for не было прервано с помощью оператора перехода."

                        Если нужно выйти из цикла - используй оператор Break, если на следующую итерацию (т.е. i:=i+1) - оператор Continue. Если твой случай иной - или пересмотри подход к организации цикла (алгоритм) или воспользуйся другим циклом (repeat или while).
                          Цитата AGRY-DILETANT @
                          Ну знаете, на сегодняшний день, убеждать в удобстве пользования подглючиващей фрипаскалевсой средой разработки, в которую невозможно скопировать данные из буффера обмена Виндовс,

                          Да что ты говоришь? Я похоже, неправильно делаю, что пользуюсь последней версией IDE, а не версией четырехлетней давности, которая не умела работать с буфером обмена. А потом - я не навязывал никому стандартную IDE, хотя и она тоже кое-что умеет (см. аттач №1). А есть еще и альтернативные способы работы с этим компилятором (см. аттач №2)...

                          Цитата AGRY-DILETANT @
                          и ограниченным по объему руководством, разбросанным по 6 файлам
                          То есть, скомканное непонятно как в два файла руководство - это прекрасно, а разложенное по 6-ти - это плохо? Если я хочу описание RTL или FCL - то открываю соответствующий файл, но если мне надо работу с IDE - на фига мне открывать какой-то файл, в котором все скомкано, начиная от синтаксиса языка, и невнятного описания типов (которое кстати, с реальным положением дел в VP не совпадает ни на йоту, в чем ты уже имел возможность убедиться)? Я открываю user.PDF и смотрю то, что мне нужно. Так что ты сначала инструмент со всех сторон рассмотри, и поработай с ним, а потом будешь что-то о нем высказывать. "Не читал, но осуждаю" (С) мы уже проходили. Разговор с тобой в этой теме окончен. Удачно тебе отладить проект в твоем распрекрасном VP... А мы уж как-нибудь в FPC, куда нам до вас...

                          Ограниченное по объему? Это ты мне будешь говорить, после того, как я посмотрел это жалкое полуторамегабайтное VP-шное подобие хелпа? А в FPC как-то раз в 8 больше (почти 13 Мб, если что). Так где после этого руководство-то ограниченное? Ась?

                          Цитата AGRY-DILETANT @
                          Это — намек на то, что по-немецки "счатье" звучит как "дас Глюк"?
                          Это намек на то, что я процитировал Хелп, который тебе настолько нравится (файл vp21user.pdf, стр. 81). Он все еще тебе нравится? Лови счастье (a.k.a. Glück) дальше.

                          Прикреплённый файлПрикреплённый файлfp_ide.PNG (23,2 Кбайт, скачиваний: 511)
                          Прикреплённый файлПрикреплённый файлother.PNG (31,01 Кбайт, скачиваний: 495)
                            Цитата Федосеев Павел @
                            Цитата AGRY-DILETANT @
                            Конкретно вопрос, код более-менее на FPC компилируется, за исключением невозможности изменить в цикле счетчик этого цикла. Может кто подскажет, предусмотрена ли на этот случай какая-то деректива процессора?

                            Нет, такой возможности нет. Мне кажется, что менять счётчик цикла в теле цикла - моветон.
                            Цитата из Руководство по языку B.Pascal 7 & Objects/LR:
                            "Если оператор, содержащийся в теле оператора for, изменяет значение управляющей переменной, то это является ошибкой. После выполнения оператора for значение управляющей переменной становится неопределенным, если только выполнение оператора for не было прервано с помощью оператора перехода."

                            Если нужно выйти из цикла - используй оператор Break, если на следующую итерацию (т.е. i:=i+1) - оператор Continue. Если твой случай иной - или пересмотри подход к организации цикла (алгоритм) или воспользуйся другим циклом (repeat или while).

                            А в FPC?
                            Если так, то данная проблема толко прихоть создателей компилятора :(, поскольку итератор можно легко изменить с помощью ассемблерной вставки (компилируется и работает).
                            zB
                            ExpandedWrap disabled
                              var i:word;
                              begin
                              for i:=0 to 1000 do if i=12 then
                               begin
                               asm
                               INC i
                               end;
                               break;
                               end;
                              end.


                            volvo877
                            В у меня в About среды написано Version 1.0.10 2007.09.09, она с Виндовским буффером обмена не работает…,
                            а у тебя какая?


                            Зы. Сорри за задержку. Строил, строил и наконец построил Бета-версию, теперь можно будет попробовать перекомпилировать на FPC.
                            Сообщение отредактировано: AGRY-DILETANT -
                              Цитата
                              Если так, то данная проблема толко прихоть создателей компилятора , поскольку итератор можно легко изменить с помощью ассемблерной вставки (компилируется и работает).

                              На самом деле всё делается куда проще: создаётся указатель на итератор, с которым можно делать совершенно всё.
                              ExpandedWrap disabled
                                var i:integer;
                                    pi:pinteger;
                                begin
                                  pi:=@i;
                                  for i:=1 to 15 do
                                  begin
                                    if i=3 then pi^:=9;
                                    writeln(i);
                                  end;
                                  readln;
                                end.


                              Проблема может возникнуть при оптимизации, но не в данном случае.
                              ExpandedWrap disabled
                                1
                                2
                                9
                                10
                                11
                                12
                                13
                                14
                                15
                              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0482 ]   [ 17 queries used ]   [ Generated: 14.05.24, 17:12 GMT ]