---¬ ---¬ -------¬ --¬ --¬ -------¬ -----¬ ------¬
----¬ ----¦ --г====- 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 Следущая >>>
|