На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
  
> Сегмент данных в процедуре, Как получить сегмент данных в TMT Pascal?
    Вот тут у меня есть такая функция, которая должна возвращать текущую папку на текущем диске длинным именем:
    ExpandedWrap disabled
       
      function getcurdir:string;
      var
       dir:string;
       i:byte;
      begin
       clearrmregs(reg);
       dir:='';
       doserror:=0;
       reg.ax:=$7147;
       reg.ds:=seg(dir[1]);
       reg.si:=ofs(dir[1]);
       realmodeint($21,reg);
       if reg.flags and 1<>0 then doserror:=reg.al;
       if doserror<>0 then exit;
       reg.ah:=$19;
       realmodeint($21,reg);
       if reg.flags and 1<>0 then doserror:=reg.al;
       if doserror<>0 then exit;
       i:=1;
       while dir[i]<>#0 do inc(i);
       dir[0]:=chr(i-1);
       dir:=chr(reg.al+64)+':\'+dir;
       getcurdir:=dir;
      end;

    Если переделать ее под TP 7.0, все нормально, а в ТМТ она не работает, потому как, видите ли, "Obsolete function SEG always return 0". Что делать-то, или это невозможно исправить?
    Назад в MS-DOS
      В 16-разрядных адресах присутствуют Segment , Offset.
      А в 32-разрядных Segment отсутствует ("Obsolete function SEG" - "Устаревшая функция SEG").

      Добавлено в :
      В режиме платформы МС ДОС вряд ли ты добьёшься нормальной работы с длинными именами.
        Так это вообще невозможно исправить? Пробовал писать на асме, так оно возвращает в строке имя производителя моей видеокарты. А по-другому как? Не знаю. В документации вроде как ничего не сказано.
        Назад в MS-DOS
          В Windows используется модель памяти Flat. В этой модели не существует сегментов, вместо этого - только смещение. Размер (разрядность) смещения зависит от разрядности ОС (сейчас чаще всего используются 32-битные системы).

          Смысл ошибки, который выдает компилятор ровно об этом и говорит, что устарвшая функция SEG возвращает всегда ноль (в используемой модели памяти деления на сегменты-то не существует).
          Короче :)
          Пробуй написать вместо
          ExpandedWrap disabled
             reg.ds:=seg(dir[1]);

          вот это:
          ExpandedWrap disabled
             reg.ds:=0;


          А вообще Romtek прав, говоря о том, что вряд ли ты сможешь добиться нужной функциональности с длинными именами, работая под DOS.
          There're only 10 types of people - those who can understand binary and those, who can't.
            Сомневаюсь, что с таким компилятором ты этого добьёшься. Имхо, нужен ТМТ мультитаргет (платный), или другой компилятор (например, Free Pascal - мощный).

            Ты ведь используешь прерывания ДОС... В WinNT длинные имена ты так уже не получишь.
            Да и вообще, зачем страдать, когда есть готовое!.
            Бери бесплатный Free Pascal, и не мучайся.
              В функциях тмтшного стуба есть преобразование из защищённого селектор:смещение в реальный сегмент:смещение. Селектор для всей твоей программы один, и он уже находится в сегменте ds.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script Execution time: 0,0853 ]   [ 17 queries used ]   [ Generated: 20.10.18, 11:01 GMT ]