Карусель тем сервиса MYBB2.Ru
Ссылка на тему: http://softland.1bbs.info/viewtopic.php?t=2

WATCOM C/C++ FAQ: Q: Где взять документацию на Ватком? A: В поставке

 
WATCOM C/C++ FAQ:



Q: Где взять документацию на Ватком? A: В поставке. Все что есть в виде книжек включено в дистрибутив, кроме книги Страуструпа. Q: Как поставить Ватком версии 10 под пополамом, при установке в самом конце происходят странные вещи? A: Лучше всего провести установку (копирование файлов и создание каталогов) в досовской сессии, а потом пополамным инсталлером просто откорректировать конфиги и создать все необходимые установки. Q: В русифицированной WIN95 криво, устанавливается WATCOM. Не создает папки со своими иконками. A: Вот про папки скажу - сделать каталоги WindowsStart MenuPrograms (или как они в PE назывались - сам долго вспоминал) и переустановить ватком. потом перекинуть .lnk куда тебе нужно. При отсутствии нужных англоязычных папок ссылки улетают в никуда. Q: Он занял очень много места на диске, от чего можно избавиться? A: Если вы не предполагаете писать программы под какие-либо платформы, то не стоит устанавливать и библиотеки для них, если вы собираетесь работать под пополамом, можно смело прибить досовские и виндовозные хелпы, и программку для их просмотра. Кроме того, надо решить какой средой вы будете пользоваться, я, например, все программки компилирую в дос-боксе, поэтому, удалив пополамные версии компилятора и линкера я сэкономил несколько мегабайт. Но если вы собираетесь программировать под OS/2 PM, то так делать не следует. Пополамный компилятор ресурсов под досом очень слаб и сваливается по нехватке памяти даже на простых файлах. Более того есть мнение, что при компиляции в осевой сессии, по крайней мере линкер работает примерно в 3 раза быстрее. Q: Вот я его поставил, ничего не понятно, с чего начать? A: Прежде всего - почитать документацию, версия 10 поставляется с огромными файлами хелпа, если вы работаете под пополамом - используйте VIEW или иконки помощи в фолдере, если под Windows - соответственно программку WHELP для просмотра *.HLP, ну и под досом - аналогично, правда там вы не получите красивых окошек и приятной гипертекстовой среды Q: Где у него IDE, я привык, чтобы нажал кнопку, а оно откомпилировалось? A: IDE существует, но работает только под Windows или OS/2. Для работы в Досе используйте командную строку. Если вы так привыкли к IDE - поддержка Ваткома есть в MultiEdit, и комплект удобных макросов тоже. A2: Существует IDE под DOS - на ftp.simtel.com две штуки ... Q: С чего начать, чтобы сразу заработало?? A: Начни с простейшего: #include main() { puts("Hello, world"); } Для компиляции нужно использовать: wcl hello.c - для DOS/16 wcl386 /l=dos4gw hello.c - для DOS4GW Q: Я написал простейшую программку, а она внезапно повисает, или генерирует сообщение о переполнении стека, что делать? В то-же время когда я компилирую эту программку другим компилятором - все работает нормально? A: Желательно сразу после установки поправить файлики WLSYSTEM.LNK, поставив требуемый размер стека, по умолчанию там стоит 1 или 2 кб, чего явно недостаточно для программ, создающих пусть даже небольшие объекты на стеке. Для большинства применений достаточно размера стека в 16 или 32 килобайта. Если вы работаете под экстендером, можно поставить туда хоть мегабайт Q: Я столкнулся с тем, что Ватком ставит знак подчеркивания не в начало имени, а в конец, к чему-бы это? A: Положение знака подчеркивания говорит о способе передачи параметров в данную функцию, если его нет совсем, параметры передаются через регистры, если сзади - через стек. Q: Я написал подпрограмму на ассеблере, со знаком подчеркивания спереди, а Ватком ищет то же имя, но со знаком "_" сзади, как это поправить? A: Можно написать: #pragma aux ASMFUNC "_*"; и описывать все свои функции как: #pragma aux (ASMFUNC) foo; #pragma aux (ASMFUNC) bar; Причем, есть специальное значение - символ "^", который сигнализирует, что имя надо преобразовать в верхний регистр, например: #pragma aux myfunc "^"; приведет к появлению в объектном файле ссылки на "MYFUNC". Q1: Есть библиотека, исходники которой отсутствуют, как заставить Ватком правильно понимать имена функций и ставить знак "_" спереди а не сзади? Если менять руками - все равно не работает ;( A: Нужно в файле заголовка описать данные функции как cdecl, при этом параметры будут передаваться через стек и имя функции будет сформировано правильно. Q: Как сделать так чтоб в некоторых случаях Watcom передавал параметры не через регистры, а через стек? (в процедуру написанную на, например, tasme) A: Использовать cdecl. Например: extern void cdecl dummy( int ); Q: Как делать ассемблерные вставки в программу? A: Примерно так: unsigned short swap_bytes ( unsigned short word ); #pragma aux swap_bytes = "xchg ah, al" parm [ ax > value [ ax >; Слово parm определяет в каком регистре ты передаешь значение, слово value - в каком возвращаешь. Можно использовать метки. Есть слово modify - можно указать что твоя вставка (или функция) не использует память, а трогает только те или иные регистры. От этого оптимизатору клевше жить. Прототип не обязателен, но если есть, то компилер проверяет типы. Q: Надо слепить задачу под графику, простенькую, но нужны окошки и мышь. Тащить ли ZINC 3.5, или в графике описать что-нибудь свое (окна двигать вроде не надо). Может, под Ватком что-то есть более мощное и готовое ? A: Ничего лучше Зинки пока не знаю. Тащи лучше Зинку 4.0, она вроде по ватком лучше заточена. Q: при написании некоторых функций по видео-режимах вдруг захотелось мне сотворить нечто в виде драйверов (.DRV или .DLL файл), то бишь динамические библиотеки. Есть мысля генерить exe-файл а затем грузить его (разбирая по кускам и заполняя таблицу указателей функций) ? Если кто может чето подсказать? A: Использовать DOS4GW/PRO. Он вроде поддерживает DLL. Или пользоваться PharLap TNT, он тоже поддерживает. Грузить экзешник тоже можно, но муторно. Через DPMI аллоцируешь сегмент (сегменты) делаешь из них код и данные, читаешь экзешник и засовываешь код и данные из него в эти сегменты. Я использую TNT. > Q: Графическая библиотека ваткома отказывается переключать режимы/банки > или делает это криво >A: В результате ковыряния в библиотеке выяснилось, что криворукие >ваткомовцы >совершенно не задумываются ни о какой переносимости и универсальности их >библиотек. В результате, если видео-карта имеет в биосе прошитое имя >производителя или другую информацию о нем, то для нее будет вызываться >вместо >функции переключения банков через VESA, другая функция, работающая с >картой >напрямую (иногда даже через порты). >Единственная проблема, что у каждого производителя (ATI, в моем случае), >рано >или поздно выходят новые и продвинутые карты, раскладка портов в которых >может >отличаться от той, которая использовалась в старых моделях. В результате, >все >это свинство начинает глючить и иногда даже виснуть. >После того, как я руками заткнул ему возможность использовать "родные" >фишки >для конкретной карты и прописал пользоваться только VESA -- все работает >как из >пушки ) >Как затыкать -- а просто, есть переменная: _SVGAType, которую я >описывается >следующим образом: "extern "C" int _SVGAType;", и потом _перед_ (важно!) >вызовом _setvideomode нужно сказать "_SVGAType = 1;". Q: Как руками слинковать exe-файл? Командой WLINK, указав параметры. name ... system ... debug all option ... option ... - Этого может и не быть option .../ ... file ... file ... ... libpath ... - И этого тоже. library .../ например: wlink name myprog system dos4gw debug all file myprog Q: Что такое ms2vlink и зачем она нужна? A: Это для тех кто переходит с мелкософтовского С. Преобразователь команд LINK в WLINK. Q: И еще - что такое _wd_? В поставке я такого не нашел (watcom 9.5). A: Это отладчик, бывший WVIDEO, но с более удобным интерфейсом. Поставляется начиная с версии 10. Q: Вот нужно состряпать маленький NLMчик, а как сделать - ну полнейший чайник. Может кто кинет шаблончик, а то ни доки, ни хелпа. Всего то нужно запуститься выдать сообщение на заденный сокет и вывалиться. A: Видимо тебе нужен WATCOM 10.0. В него входит NLM SDK и вроде хелп к нему. Если WC <= 9.5 то нужен сам NLM SDK и документация. // Линковать : // (файл wclink.lnk например) // system netware // Debug all // opt scr Hello, world // OPT VERSION=1.0 // OPT COPYR Copyright (C) by me, 1994 #include void main( void ) { cprintf( "Hello, world! " ); ConsolePrintf( "Hello, World - just started! " ); RingTheBell(); } Q: Собираю программу под OS/2 16-бит, линкер не находит библиотеку DOSCALLS.LIB. Кто виноват и что делать? A: Никто не виноват. В поставке ваткома есть библиотека os2286.lib. Это она и есть. Ее надо либо переименовать в doscalls.lib, либо явно прилинковывать. Q: Что такое удаленная отладка через pipe? Как ею пользоваться под OS/2? A: В одной сессии запускается vdmserv.exe, потом запускается отладчик wd /tr=vdm и соединяется с vdmserv по пайпу, ну и рулит им. Как удаленная отладка через компорт работает знаешь? Вот тут так же, только через пайп. Q: собираю 32битный екзешник под PM с отладочной информацией (/d2), но после того как осевым rc пришпиливаю к нему ресурсы, отладочной информации - как не бывало . Это лечится как-нибудь ? A1: Откусываешь дебугинфу wstripом в .sym файл и потом присобачиваешь ресурсы. Если имя экзешника и имя .sym совпадают, дебаггер сам его подхватит. A2: Отладочную информацию надо сбрасывать в SYM-файл: wcl386 /d2 /"op symf" /l=os2v2_pm Q: WATCOM на 4мб компилирует быстрей чем на 8мб, а на 8мб быстрее чем на 16мб, почему? A: Чем больше памяти, тем лучше работает оптимизатор. Можно дать ему фиксированный размер памяти - SET WCGMEMORY=4096, и тогда он не будет пользоваться лишней памятью. Учтите, что для компиляции программ для Windows на С++ данного значения может не хватить. Q: когда компилится достаточно большое количество файлов, например собираю либу для цинка или кодебейс, то через 10-к файлов такая вот потеха.. =( или привелигерованная инструкция и трап (было в 10а) === Cut === **** Access violation **** OS=OS/2 BaseAddr=00080000 CS:EIP=005B:0008CC1A SS:ESP=0053:000380B0 EAX=00000036 EBX=000D1070 ECX=00000002 EDX=00000000 ESI=0004076E EDI=000AFFC2 EBP=000380D8 FLG=00012246 DS=0053 ES=0053 FS=150B GS=0000 ... A: Очень похоже на траблы с железом. У меня это вылечилось нормальным охлаждением машины и снижением разгона памяти. При повторном запуске ведь все нормально? Q: Есть такая штука - pipe в gcc и bcc. А вот в Watcom`e как перехватить выхлоп программы? A: В смысле забрать себе stdout и stderr? Дык как обычно - сдупить их куда-нибудь. Функцию dup() еще никто не отменял. Q: А есть ли способ перехватить ошибку по нехватке памяти? То есть какой-нибудь callback, вызываемый диспетчером памяти при невозможности удовлетворить запрос? A: В С++ есть стандартный - set_new_handler(). Q: Чем отличаются статические DLL от динамических? A: Разница в том, что ты можешь функи из DLL на этапе линковки в EXEшник собрать (static). А можешь по ходу работы проги DLL грузить и функи выполнять (dynamic). Q: Решил тут DLL под OS/2 создать -- ничего не вышло. A1: Ты динамически собираешься линковать или статически? Если статически, тогда тебе просто declare func сделать и включить dll в test.lnk. Если динамически, то ты должен прогрузить dll, получить адрес функи и только после этого юзать. Я, в свое время делал это через API OS/2: DosLoadModule DosQueryProcAddr DosFreeModule Вот, специально накропал за пять минут: exe.c: #define INCL_DOSMODULEMGR #include #define DLLNAME "DLL" PFN Dllfunc; char FuncName[>="RegardFromDll_"; char LoadError[100>; void main() { HMODULE MHandle; DosLoadModule( LoadError, sizeof( LoadError ), DLLNAME, &MHandle ); DosQueryProcAddr( MHandle, 0, FuncName, &Dllfunc ); (*Dllfunc)(); DosFreeModule( MHandle ); } -------------------------------------------------------- dll.c #include void RegardFromDll( void ) { printf( "This printed by function, loaded vs DLL " ); } ------------------------------------------------------- Dllка в текущей директории (которой, кстати в LIBPATHе) A2: Когда компиляешь свою DLL, то добавь свич -bd, который создаст в .obj такое дело, как __DLLstart_. После этого все заработает (во всяком случае у меня заработало): wpp386 -bd -4s -ox dll.cpp Q: Как подавить варнинги о неиспользованных аргументах? A1: Если используешь плюсовый компилер -- просто опускай имена параметров, например: void foo( int bar, char* ). A2: #pragma off(unreferenced) A3: Используй макрос: #ifndef NU #ifdef __cplusplus #ifdef __BORLANDC__ #define NU( ARG ) ARG #else #define NU( ARG ) (void)ARG #endif #else #define NU( ARG ) ARG=ARG #endif #endif A4: Для многих, особенно юниксового происхождения, компайлеров работает /*ARGSUSED*/ перед определением функции. Q: Подскажите плз, как в watcome увеличить число открытых файлов? A: См. TFM. _grow_handles( int newcount ). Q: Как заставить 16-ти битные OS/2 задачи видеть длинные имена файлов? A: Опция newfiles для линкера. Q: Что-то у меня Dev.Toolkit for OS/2 Warp к Ваткому WC10.0 прикрутить не получается. Говорит definition of macro _Far16 not identical previos definition. A1: Воткни где-нить определение __IBMCPP__ - или -D__IBMCPP__ в командной строке или #define перед #include . A2: Для ваткома 10.5a надо не просто -d__IBMCPP__, а -d__IBMCPP__=1 Q: Пишу: printf ( "*" );, а он сразу ничего не печатает. Что делать? A: В стандарте ansi, насколько я помню, чёткого определения как должны буферизовываться потоки stdin/stdout/stderr нет, если не изменяет мне память, то нормальным является поведение со строчной буферизацией stdout/stdin, всякие другие дос-компилеры обычно не буферизуют stdout совсем, что тоже нормально. Признаком конца строки в потоке является , именно при получении этого символа происходит flush для line buffered потока. Выходов два: отменить буферизацию или писать в нужных местах. Можно fflush(stdout) звать, тоже вариант. Буферизация отменяется setbuf(stdout,NULL) или setvbuf(stdout,NULL,_IONBF,0). Q: Где можно купить легальную копию WatcomC/C++ ? Говорят, что Ваткомовцы открыли в Москве свое представительство. Так ли это? A1: Россия, 123100 Москва, 1-й Красногвардейский проезд д. 9 Sybase CIS Тел.: +7(095)956-2016 Факс: +7(095)956-2041 e-mail: post@sybase.ru Менеджер отдела поддержки - Я (Владимир Сенков/Doctor Hangup) A2: Контора называется CPS, телефоны дали такие: 930-6203, 930-0591, 930-0516, в SyBase сказали, что там можно сделать Upgrade WC 10.0 сразу на WC 10.6 A3: Sybase в Украине : Киев тел/факс. 227-3230, 227-0177, 227-4344 e-mail: sybase@gu.kiev.ua --- экстендеры и связанные с ними проблемы ------- Q: Можно ли сделать встроенный в ехе-шник DOS4GW, как в D00M ? A1: Легально -- нет. Предыдущие версии позволяли просто скопировать: copy /b dos4gw.exe + a.exe bound.exe, но сейчас (начиная с версии 10.0а) это не работает и для этой цели нужно приобрести dos4gw/pro у фирмы Tenberry Software. A2: Нелегально - да. Существует утилита dos4g/link, написанная Сергеем Романовским (2:5020/236.12) для автоматизизованного выдирания и вклеивания экстендеров из/в EXE файлов. Помещалась в WATCOM.C в uuencode и доступна от автора. A3: Нужно взять не тот DOS4GW, что в комплекте (DOS4GW 1.97), а Pro-версию (DOS4GW Professional). Выдрать можно из DOOM, HERETIС, HEXEN, WARCRAFT2 и т.д., где он прибинден. Причем можно найти 2 разновидности Pro 1.97 - одна поддерживает виртуальную память, другая нет и еще что-то по мелочи. Различаются размерами (который с виртуалкой - толще, где-то 270 кил, точно не помню). Прибиндить можно разными тулзами, я пользуюсь PMWBIND из комплекта PMODE/W. A4: Способ 1. (без вспомогательной тулзы) Нужно отрезать у dos4gw.exe последние несколько байт с хвоста, содержащие строку WATCOM patch level [...>. Далее обычным бинарным копированием: copy /b dos4gw.exe myexe.exe mynewexe.exe. Работоспособно вплоть до версии DOS/4GW 1.95. В версии 1.97 введена проверка на внедренность linexe в хвост экстендера. Способ 2. (с использованием тулзы) Существует родной биндер для DOS/4GW (ссылки на него я слышал от Леника Теренина), в какой-то мере может помочь pmwbind.exe от PMODE/W (однако версия 1.16 не понимала каскадный формат DOS/4GW, работоспособна для одномодульного 4GW/PRO); решает проблему тулза dos4g/link, которая доступна у автора (see origin :-) или у модератора. Рекомендую попробовать 4GWPRO (выдрать из игрушек с помощью pmwbind.exe или dos4g/link), усеченный вариант DOS/4GW (в модулях 4grun.exe, wd.exe -- для ДОС), а также PMODE/W. A5: В поставке DOS4G есть 4GBIND.EXE (Но для этого надо купить или украсть DOS4G) Q: Как определить количество свободной памяти под dos4gw? Попытки использовать _memavl и _memmax не дают полную картину. A: Количество свободной памяти под экстендером - не имеет смысла, особенно если используется своппинг. Для определения наличия свободного RAM нужно использовать функции DMPI, пример использования есть в хелпе. Q: О моделях памяти. Как я понял из объяснений - для работы можно поставить /mf, после чего (т.к. указатели 32-битные) можно совершенно свободно делать new buffer[1 000 000 000>. (пробелы вписал я - т.е. хапаю памяти около метра). И что - потом адресация по данному буферу будет идти без геморроя ? A: Обычную, 16-ти битную смолл модель понимаешь? 64К там же легко адресуется? Ну и так же тут, только указатели уже 32-бита и пространство соответственно - 4GB. Q: И так только под flat, или можно на другие (кроме large) вешаться ? Т.е. - /ms, /mm, mc? A: /ms практически эквивалентно /mf. Medium & Compact точно так же как и в 16-ти битной модели, только оффсетная часть указателей - 32 разряда, а указатель целиком - 48 бит. Не знаю уж зачем такое можеть быть надо. Не могу представить задачу для которой может быть нужно более 4 Гиг кода и/или данных... Q: Как добраться до конкретного физического адреса под экстендером? A: Вспомни про линейную адресацию в dos4gw. Он в этом плане очень правильно устроен - например, начало сегмента 0xC000 находится по линейному адресу 0x000C0000. Вот примерчик, который печатает сигнатуру VGA биоса. #include #include #include void main( void ) { unsigned i; for( i = 0; i < 256; i++) { char c; c = *(char*)( 0x000C0000 + i ); putchar( isprint( c ) ? c: . ); } } Q: Как происходит обработка прерываний при работе под экстендером? A: У DOS4GW есть понятие autopassup range. Этот range простирается от номера 0x08 до 0x2E, кроме 0x21. Если ты установил PM обработчик в этом диапазоне, то неявно изменится и обработчик в RM. Он теперь будет показывать на некий код, который умеет переводить проц в PM и вызывать твой обработчик. Т.о. получается иллюзия того, что все прерывания обслуживаются одним обработчиком в PM. Прерывания не лежащие в этом диапазоне теряются, если процессор в этот момент находился в RM. Если процессор находился в PM, то при отсутствии PM обработчика прерывания передаются вниз в RM. Таким образом поддерживаются независимые системы прерываний для PM и RM. Обрати внимание, что даже для autopassup прерывания все равно происходит переключение режимов. Именно для этого бимодальные прерывания и придуманы. По своему опыту могу тебе сказать, что гораздо быстрее использовать бимодальные прерывания и трахаться с передачей данных через общий буфер в нижней памяти, чем позволять процу лишний раз щелкать режимом. Q: Может мне кто подскажет - как отлаживать программы, работающие в Pharlap режиме ? A: wd /tr=pls file.exe, для фарлапа или wd /tr=rsi file.exe для dos4gw Q: Какая разница между dos4gw и Pharlap ? Или это одно и то же ? A: Это разные экстендеры. Самая существенная для тебя разница - dos4gw входит в поставку ваткома, а фарлап - нет :-) Q: А что тогда такое RUN386.EXE? Вроде с его помощью можно пускать фарлаповые ехе-шники? A: Это рантайм фарлапа. Но он денег стоит :-) Q: DOS4GW такой огромный (больше 200к), что можно использовать вместо него, чтобы поменьше диска занимало? A: Существует шароварный экстендер PMODE, у которого есть версия, рассчитанная на Watcom - PMODE/W, ее можно использовать вместо DOS4GW, она занимает всего 9к, встраивается внутрь ехе-файла. Он не обрабатывает некоторые исключительные ситуации, поэтому отлаживать программу все-таки лучше с dos4gw, а встраивать pmode/w лишь в окончательный вариант. 100% совместимости c dos4gw никто, конечно, гарантировать не может, но говорят, что под ним удалось запустить даже D00M Более того, 100% совместимости просто нет - например, графические программы под DOS/4G в Цинке, которые определяют наличие DOS/4GW путем вызова int 21h, ah = 0xFF. При этом DOS/4GW и PMODE/W возвращают различный (хотя и похожий) результат. A2: А также DOS/4G "подобные": WDOSX ( последняя версия 0.94, size ~12Kb ) DOS32A ( ---------------- 4.30, size ~20Kb ) 1. В чем отличия между DOS4GW и DOS4GW PRO. DOS4GW - используется в виде отдельного .EXE модуля, имеет ограничения по размеру виртуальной памяти (16 Мб), ограничение по общей используемой памяти (32 Мб), отсутствует поддержка некоторых DPMI вызовов (например 303h - allocate callback), отсутствует возможность писать TSR-ы, отсутствует поддержка DLL, freeware. 4GWPRO - встраивается в исполняемую программу, ограничений в размере виртуальной памяти нет (*), полная поддержка DPMI 1.0 (*), поддержка DLL, поддержка TSR, стоит денег. DOS4G - в отличие от 4GWPRO не привязан к конкретному компилятору, возможен запуск нескольких .EXEшников под одним экстендером, поддержка DLL документирована, обильная документация, стоит больших денег. (*) В процессе экспериментов выяснилось, что поддержка виртуальной памяти ( VMM - virtual memory manager ) и поддержка полного набора DPMI вызовов присутствуют не во всех вариантах 4GWPRO. 2. Можно ли поиметь 4GWPRO даром. Да, можно. Для этого его надо вырезать из головы программы собраной с 4GWPRO. Обычно такая программа при запуске сама об этом сообщает. Однако не из любой программы можно получить полноценный экстендер. Ниже приведен список программ подвергшихся обрезанию и результаты. ACMAIN.EXE, DESCENT.EXE, HB5.EXE, HEROES.EXE дают версию 1.97 с полным набором прелестей. Размер: 217764 байта. ABUSE.EXE, BK.EXE, HEXEN.EXE, ROTT.EXE, TV.EXE (Terminal Velocity) дают версию 1.97 без VMM и поддержки расширенного набора DPMI. Размер: 157268 байт. ACRODOS.EXE (Acrobat reader for DOS) дает версию 1.97 с VMM но без расширенного набора DPMI. Размер: 203700 байт. D4GRUN.EXE (из Watcom 10.0а) дает версию 1.96 без VMM но с расширенной поддержкой DPMI ( но судя по надписям внутри это DOS4G а не 4GWPRO ). Размер: 154996 байт. DOOM2.EXE дает версию 1.95 без поддержек VMM и расширенного набора DPMI. Размер: 152084 байт. 3. Как переделать программу скомпилированную под DOS4GW для использования с полученным 4GWPRO. COPY /B 4GWPRO + OLD.EXE NEW.EXE 4. Почему полученый 4GWPRO не дает использовать VMM, или не дает больше 16 Мб. Ага, простое шаманство поможет: 00000247 бит 0-3 ??? 00000247: бит 4 1-VMM по умолчанию вкл., 0-выкл. 00000247: бит 5 ??? 00000247: бит 6 1-подавлять заставку при старте 00000247: бит 7 ??? Для 1.97 размером 217764 байта. 0001BFF8: (4 байта) размер виртуальной памяти по умолчанию. 5. Можно ли использовать DLL c DOS4GW? Можно, это обеспечивает утилита DLLPOWER. Ищите в SimTel-овских архивах файлы dllpr251.zip, dllpr254.zip и может быть уже есть более поздние. ------ следующая секция посвящена переходу из Борланда ------ Q: Я вся жизнь писал на Борланд-С, теперь решил перебраться на Ватком, как мне проще всего это сделать? A: Перенос ваших программ возможен, но скорее всего вам придется править ваш код. Подробности, как и что править смотрите в следующих вопросах. Начать можно с изменения int -> short Q: Ватком ругается на стандартные библиотечные функции, в то время как BC жует их нормально, что делать? A: Большинство программ, которые нормально работали под BC, будут нормально компилироваться и Ваткомом, нужно лишь немного изменить код, использующий специфичные функции, реализованные в BC, как расширение стандартной библиотеки. Для большинства таких функций есть аналогичная или подобная функция. Например, вместо gettime() следует использовать dos_gettime(), вместо findfirst - dos_find_first, и так далее. Обратитесь к хелпу по BC, вы наверняка найдете имена аналогичных функций, запросив помощь по тем именам, которые не устроили компилятор Ваткома. Кроме того, следует помнить, что например random(num) не является стандартной функцией, а это просто макрос из stdlib.h, и вместо него можно использовать конструкцию типа (rand() % num). Q: Можно ли перенести под Ватком программы, написанные с применением OWL или TVision? A: OWL -- скорее всего нет, поскольку он построен на расширениях синтаксиса, которые не обрабатывается компилятором Ватком. Для переноса TVision есть несколько вариантов, Существуют diffы для преобразования TV под GNU C++ (продукт называется GVISION. Это не решает разом все проблемы, естественно, но по крайней мере этот вариант TV заточен под 32 бита и флат модель. Совсем недавно стали доступны аж два порта TV под Watcom C++. Первый - это перенос под полуось и dos4gw TV 1.0, выполненный Ильфаком Гильфановым и доступный на 2:5020/758 под алиасом TVOS32. Второй доступен на Украине: 2:461/515 (9:00-18:00) (если есть Искра-2, то тел. (Сумы)06-297). Файл TVWATCOM.ZIP, 179k. Внутри ма-ахонькая дока и собственно сырец+makefile. Доку рекомендую внимательно прочесть - может пригодится при перекомпиляции ваших программ. Q: В моей программе используются inline ассемблер и псевдорегистры, смогу ли я заставить их работать под Ваткомом? A: Нет. Придется переписать на встроенном ассемблере, либо вынести в отдельный .asm модуль. A2: с 11 версии поддерживает стиль a la Borland : _asm { ... } Q: А нeльзя ли кaк-нибуть нa вaткoмe peaлизoвaть _AX из Borland? А тo пepeнoшу пoд нeгo библиoтeку, a тaм oни aктивнo юзaются. A: Если тебе _AX нужен на read-only, то можно сделать прозрачно: === Cut === short reg_ax ( void ) ; #define _AX reg_ax() #pragma aux reg_ax = value [ax> #if defined( __386__ ) || defined( __FLAT__ ) int reg_eax ( void ) ; #define _EAX reg_eax() #pragma aux reg_eax = value [eax> #define rAX reg_eax() // чтобы не задумываться об контексте #else #define rAX reg_ax() #endif === Cut === А если для модификации, то лучше не полениться и сделать как просит Ватком (то бишь оформи этот фрагмент как inline-asm). Q: Как мне отлаживать динамически подключаемую DLL в виндовом отладчике ? А то я уже упарился тыкать Alt+F после загрузки этой DLL. В глупом и глюкавом борланде это делалось простым добавлением нужной DLL в список модулей. A: А что, есть проблемы? Странно. Я сейчас винды не программирую, но когда-то он сам вполне цеплял DLL и выуживал отладочную информацию. Единственное, он не всегда сразу ее цепляет. Если вошел в DLL, а отладчик не видит сорса, попробуй не нервничать, а трассануть пяток инструкций. Он синхронизируется и покажет сорс. Q: Встречается проблема, когда надо собирать смешанный проект - часть модулей компилится Ваткомом, а часть Борландом (например ассемблером). Линкер падает по трапу, вываливается с бредовыми ошибками и вообще ведет себя плохо. A1: На худой конец есть способ: борландовый obj->wdisasm->.asm->wasm->ваткомовский obj А дальше это отдавать как обычно wlinkу. A2: Есть еще народное средство - нужно взять tasm 3.2, а еще лучше tasm 4.0, последний хорош тем, что имеет режимы совместимости по синтаксису со всеми своими предками... Или TASM32 5.0 с патчем ( обязательно 32 bits !!! ) ------ Optima (Watcom в упаковке для виндов) ------ Q: Optima++ 1.0. При задании надписей заголовков окон, меню, кнопок и т.п. на русском языке все прекрасно видно пока я нахожусь в режиме дизайнера. Стоит только запустить созданную аппликуху - кириллица исчезает напрочь. A: Я писал - заменил WRC.DLL из поставки Optima 1.0 на WRC.EXE из поставки Watcom 11.0 и все пришло в норму.

Ссылка на тему: http://softland.1bbs.info/viewtopic.php?t=2



Внимание! Если вы считаете, что темы с вашего форума не должны присутствовать в карусели тем или в карусели присутствует содержимое, нарушающее нормы общепринятой морали, либо действующего законодательства - напишите нам на abusereport@mybb2.ru
 

создать форум