Главная > Програмное обеспечение > для BBS >
MEX FAQ [1/2]

       ---¬   ---¬ -------¬ --¬  --¬          -------¬  -----¬   ------¬
       ----¬ ----¦ --г====- L--¬--г-          --г====- --г==--¬ --г===--¬
       --г----г--¦ -----¬    L---г-           -----¬   -------¦ --¦   --¦
       --¦L--г---¦ --г==-    --г--¬           --г==-   --г==--¦ --¦-- --¦
       --¦ L=- --¦ -------¬ --г- --¬          --¦      --¦  --¦ L------г-
       L=-     L=- L======- L=-  L=-          L=-      L=-  L=-  L==--=-

               Hаиболее часто задаваемые вопросы и ответы на них.
                      By Alex Shiloff, 2:5080/152@FidoNet

                           Редакция от 10.09.1998

   Последний вариант постится в SU.CBCS раз в две недели или по получению
                           интересного материала

---------       -------------------------------------------------------------¬
¦По сравнению с предыдущей версией дополнен вопрос 11                        ¦
L---------------------------------------------------------------      --------

                                Содержание
                                ==========

 1. Что же это вообще такое - MEX ?
 2. Что такое параметры и зачем их куда-то передавать?
 3. Как сделать, чтобы при вызове MEX проги она находила переданные ей пара-
    метры?
 4. Как из файла языковой поддержки *.MAD вызывать МЕХ программу?
 5. Запускаю МАКС с ключем -nX. Как в МЕX узнать номер задачи?
 6. Как запустить из под МЕХ Ехе-шник и батник?
 7. Как избежать переполнения сегмента данных?
 8. А есть ли ограничение по размеру программы на MEX?
 9. А нельзя ли запускать из МАКСа две МЕХ программы одновременно?
10. Можно ли переписать какой-нибудь символ на экране (или строку) не трогая
    все остальные.
11. Как из МЕХ сделать hangup юзера?
12. Как  добавить времени пользователю?
13. Почему при считывании функциональных клавиш коды, получаемые с локальной
    и удаленной консоли различаются?
14. Что такое #операторы?
15. Чем отличаются функции timeadjust() от timeadjustsoft() ?
16. Как мне унифицировать свою MEXу, чтобы она не была привязана, например, к
    конкретным каталогам?
17. Окей! Я написал программу на MEX, а при попытке откомпилировать ее
    компилятор выдал мне ошибку в строке 0. Он что, идиот? Ведь такой строки
    нет!!! Что делать?
18. Мне не нравится, что новым юзерам предоставляется слишком большая свобода
    в выборе параметров при начальной регистрации. Как-бы не дать им отвечать
    на все эти слишком умные для них вопросы?
19. Как можно не пyскать новых пользователей, y котоpых скоpость  ниже,
    чем , к пpимеpy, 21600, но пpи этом, чтобы стаpые заходили без  пpоблем,
    даже на 9600.
20. Kак дeфолтом юзвeрям Z-modem cтавить?
21. Как сделать в МЕКСе быстрое обновление информации о юзвере?
22. Люди!!!!!!!,как на mex`e прописать,чтобы времечко показывалось? Hе то
    которое осталось до конца сеанса,а реальное.
23. Почему-то MEX'ова функция readln(int, ref string); некорректно работает
    с файлами размером больше чем 32 кбайта. MAX v3.00.
24. Пример отслеживания наличия ANSI на удаленном терминале, с тем чтобы
    корректно отображать Logo.bbs
25. Числовые типы языка MEX (просто рекомендация, или обзор "камушков",
    чтобы вам не натыкаться на это в дальнейшем)
26. Как в Mex'е заставить ожидать нажатия на enter ? Или на другую конкретную
    клавишу?
27. Остроумный  пример  динамического  выбора  и  запуска  MEX  на  основе
    информации, полученной в MEX (фактически это почти MEX из MEX ;)
28. Как правильно употребить INPUT_DEFAULT?
29. Почему-то при выводе на экран из Мексов  все  через  строчку  пишется. =:(
    MAX/NT. В MAX/DOS все нормально.
30. Пример прикручивания АОH'а к Максу.

                                Вопросы и ответы
                                ================

- 1 -

Q: Что же это вообще такое - MEX ?
A: MEX - Maximus Extension Language  -  (язык  -  расширение  МАКСИМУСа)  -
   улучшенный язык, разработанный  для  взаимодействия  с  МАКСИМУС-CBCS  и
   обеспечивающий написание собственных программ. МЕХ состоит из компонент,
   набранных из разных  языков  программирования  -  C,  Pascal,  Basic.  В
   основном идеи MEX'а заимствованы из языка  C.  Примерно  90%.  Остальное
   (например знак присваивания) из Паскаля, и Бейсика.

- 2 -

Q: Что такое параметры и зачем их куда-то передавать (к вопросу #2) ?
A: Параметры передаются в  МЕХ  программу  из  оболочки  МАКСы  (обычно  ее
   представляет активное в данный момент меню или работающий МЕККА - скрипт
   Параметр - это такая штука, которая позволит вам разнообразить  действие
   вашей МЕХ'ы, не прибегая к созданию ее идентичных  копий,  использованию
   дополнительных файлов с данными (хотя это тоже неплохой выход). Параметр
   может быть чем угодно, то есть строкой, числом, буквой и  т.п.  -  любым
   понимаемым MEX'ом типом данных. Фактически вы наверняка уже сталкивались
   с параметрами,  когда  использовали  *.BAT  или  *.CMD  файлы.  Здесь  -
   практически то же самое.
   Единственная особенность связана с форматом CTL файла.  так  как  в  нем
   может быть только определенное количество колонок (а они  по  неписанным
   законам разделяются просто одним  или  кучей  символов  Space,  а  проще
   говоря пробелами), то непосредственно строка параметра не должна  давать
   повод думать, что она - уже следующая колонка.

   например:

колонка #1         колонка #2        колонка #3         колонка #4
тип команды    путь и имя команды   уровень доступа      описание

   MEX              M\MyProg            SysOp         "M - моя программа"

   Видим, что для программы MyProg параметры не передаются.  В случае, если
   нам требуется передать один или несколько параметров, следует писать:

   MEX              M\MyProg_Param1_Param2   SysOp    "M - моя программа"

   То есть разделителями должны служить символы  "_",  а  иначе  компилятор
   решит, что слово Param1 - уже  в  следующей  колонке  и  сопоставит  ему
   уровень доступа.

- 3 -

Q: Как сделать, чтобы при вызове  MEX  проги  она  находила  переданные  ей
   параметры?
A: В заголовке процедуры main прописать примерно следующее:

int main(string : my_parametr)
{
 ...
 print(my_parametr);
 return 1;
}
вместо string можно использовать любой нужный тип.

- 4 -

Q: Как из файла языковой поддержки *.MAD вызывать МЕХ программу?
A: Hикак. (ограничение производителя - Lanius)

- 5 -

Q: Запускаю МАКС с ключем -nX. Как в МЕX узнать номер таска?
A: Есть такая запись: id. вот в ней и надо смотреть, то есть:

   id.task_num - в ней хранится истинное значение номера задачи.

- 6 -

Q: Как запустить из под МЕХ Ехе-шник и батник?
A: Чтобы запустить EXE (COM) файл из МЕХ прописывается такая строка:

menu_cmd(MNU_XTERN_RUN,"parametrs");

   а для *.bat или стандартной комманды оболочки:

menu_cmd(MNU_XTERN_DOS,"parametrs");

A: (Fedor Lizunkov 2:5020/960)
   Еще существует очень хорошая функция

   int shell(int method, string: cmd); (*)

   Которая позволяет запускать программы (согласно константам method)
   - непосредственно (IOUTSIDE_RUN)
   - через комманднй процессор (IOUTSIDE_DOS)
   - с пересчитыванием после возвращения записи юзера (IOUTSIDE_REREAD)

   У нее есть очень хорошее свойство - она возвращает в качестве значения
   код выхода вынешней программы (aka ErrorLevel)

   (*) cmd - строка с путем, именем программы и передаваемыми параметрами.

- 7 -

Q: Как избежать переполнения сегмента данных? (к вопросу #8) ?
A: (Mike Petrov 2:5020/1413) Только экспортируя часть функций (а
   особенно относящихся к видео) в файлы *.mec (*.bbs в конечном случае)
   и вызывая их в нужных местах командой:

   display_file("имя_файла",nonstop);

- 8 -

Q: А есть ли ограничение по размеру программы на MEX?
A: Да, один сегмент данных для  ДОСового  МАКСА  -  то  есть  64кил.  После
   переполнения МАКС начнет выдавать ошибку типа:

   fatal cs:ffffffff: Patch bounds exception.
   fatal cs:000004bf: Out of string space.

- 9 -

Q: А нельзя ли запускать из МАКСа две МЕХ программы одновременно?
A: Увы, не только две программы, но и одну из другой запустить не удастся.

- 10 -

Q: Можно ли переписать какой-нибудь символ на экране (или строку) не трогая
   все остальные.
A: Вот таким способом:

print(AVATAR_GOTO,(char)<row>,(char)<column>,"что вы тут хотите");

где <row> - номер строки; <column> - номер столбца, откуда начинать.

- 11 -

Q: Как из МЕХ сделать hangup юзера?
A (Fedor Lizunkov 2:5020/960.1) : можно так:

   menu_cmd(MNU_GOODBYE,"");

  - как выяснили, это несколько некорректно,
  так как интересен _немедленный_ hangup.

A: а просто взять, да обнулить время юзеру, а потом МАКС сам доделает ;)

   Вот пример программы, автор Fedor Lizunkov (2:5020/960)

   #include <max.mh>

   #include <max.mh>

void main()
{
 long: time;
 time := timeleft();
 time := (time - (timeleft() * 2)) * 60;
 timeadjust(time);
 return;
}

A: (Alexander Shevelev 2:5015/65):
  легко...
  ну скажем так :
  создаешь hangupus.mec , в него пишешь

  _______cut_____________
  щас вешаю тpубу 8)
  [hangup]
  _______cut_____________

  конвеpтишь в hangupus.bbs
  далее в своем *.mex вызываешь этот mec(bbs)

  _______cut_____________
  display_file(prm_string(PRM_MISCPATH)+"hangupus.bbs",tempint);
  _______cut_____________

A: Самое изящное решение (Evgeniy Demenuk 2:5064/7.31)

  mdm_command("+++~~~~~~ATH0|~");

- 12 -

Q: Как добавить времени пользователю?
A: (Fedor Lizunkov 2:5020/960.1) Hапример так:

#include <max.mh>

int main()
{
long: delta;
delta := timeadjust(600);
}

A: можно использовать внешний (EXE) модуль и вызывать его из MEX программы.

- 13 -

Q: Почему при считывании функциональных клавиш коды, получаемые с локальной
   и удаленной консоли различаются?
A: Это происходит от того,  что  с  локальной  консоли  приходят  скан-коды
   клавиш, а с удаленной - в зависимости от  терминальной  программы.  Если
   терминальная программа старая или работает  в  режиме  DOORWAY,  то  она
   будет передавать то, что юзер ввел с клавиатуры, то  есть  те  же  самые
   скан коды.  Hовые терминалки преобразуют скан коды в ANSI коды  и  затем
   посылают их.  ANSI коды стрелок, например имют  вид:  [A,  [B,  [C,  [D.
   Поэтому при обслуживании функциональных клавиш следует  делать  "двойную
   проверку", то есть:

int keydet()                  // <-=1 ^=2 ->=3 v=4 Enter=5
{
 int: ch,chh,chl;
 while (1<>2)
  {
   ch:=input_ch(CINPUT_SCAN,"");
   chh:=((ch&0xFF00) shr 8);
   chl:=ch&0x00FF;
   if ((chl=91) or (chl=0)) {
      if (chl=91) chl:=input_ch(CINPUT_SCAN,"");
      if (chh=72 or chl=65) return 2; else
              ^^ скан   ^^ANSI
                 -код     -код  клавиши "стрелка вверх"

      if (chh=80 or chl=66) return 4; else
      if (chh=75 or chl=68) return 1; else
      if (chh=77 or chl=67) return 3;
   } else
   if (chl=124) return 5;
  }
}

- 14 -

Q: Что такое #операторы?
A: #операторы, а именно

    #define X Y
    #include <Z>

   являются стандартными  указаниями  компилятору  произвести  замену  всех
   найденных в тексте программы строк X на  строки  Y  и  приписать  текст,
   взятый из файла Z.  Смысловой нагрузки не несут и служат  для  повышения
   универсальности и удобочитаемости программы, так как  позволяют  разбить
   длинную  "портянку"  на  несколько  частей  и  создать  общие  модули  и
   библиотеки.

- 15 -

Q: Чем отличаются функции timeadjust() от timeadjustsoft() ?
A: Первая производит все операции, не учитывая ограничения  по  событиям  и
   ограничения, заданные в параметре МАКСа -t<TIME>, вторая - учитывает.

- 16 -

Q: Как мне унифицировать свою MEXу, чтобы она не была привязана, например, к
   конкретным каталогам?
A: Для этого есть специальные PRM-константы, которым сопоставляются
   строки из MAX.PRM файла, в том числе и стандартные МАКСовы каталоги,
   например:

   #include <prm.mh>
   print("А вот каталог МАКСА у нас: ",prm_string(PRM_SYSPATH));

   Таким образом, добраться до каталога с МАКСом, заранее не зная его и,
   например запустить вашу любимую дверку или батничек можно так:

   menu_cmd(MNU_XTERN_DOS,prm_string(PRM_SYSPATH)+"\\MYBATCH.BAT");

   ... А просмотреть MEККА-скрипт так:

   display_file(prm_string(PRM_MISCPATH)+"\\MYMECCA.BBS");

   Видим, что нигде не упоминается ни диск, не путь к файлам.

   Примечание1: эта система не распространяется на кривоположенные тупым
   ламером-сисопом файлы, и на те каталоги, которые не прописаны в PRM.
   Предполагается, что файл MAX.CTL составлен правильно. Hапример, если
   в качестве MISC прописан каталог MYMISCA, то в MAX.CTL должно быть
   следующее заявление:

   Path MISC    MYMISCA\

   Примечание2: каталог с МЕХ'ами в MAX.CTL не прописывается, поэтому его
   подстановка с помощью PRM-констант, увы, не пройдет.


Страница 1 2 Следущая >>>


Украинская Баннерная Сеть

Главная  Алфавитный индекс  Справка  Добавить FAQ  E-mail
Новости  Поиск по сайту

Copyright © 2001 - 2003 Olexandr Slobodyan.
Сайт создан в системе uCoz