В моей проге несколько файлов, они оба юзают windows.inc и проблема вот в чем: если вставлять 'include windows.inc' в один из файлов, то, ессно, не работает, а если в оба - то то тоже (компилер выдает 102 ошибки, все они в windows.inc, типа "non-benign structure redefinition: incorrect initializers : BITMAPINFO" (так он ругается на все структуры).). Сам windows.inc, конечно, правильный и рабочий. Как порешить эту проблему?
> если вставлять 'include windows.inc' в один из файлов, то, ессно, не работает Почему естно?, как раз всё должно работать, вот только нужно include прописывать в главном файле проекта.
гм.. На самом деле ситуация немного другая: в главном файле проекта (Main.asm) вызывается процедура, которая находится в другом файле (Funcs.asm) посредством invoke MyFunc, Param1, Param2 (Param1 и Param2 типа Dword и Char соответственно), а прототип процедуры MyFunc (т.е. MyFunc proto word, :Char) находится в еще одном файле (Incs.inc), как и другие прототипы других процедур. Чтобы в Incs.inc можно было написать прототип на MyFunc, в Incs.inc я includ'ю Funcs.asm и в нем же windows.inc. Ну а в Main.asm includ'ю сам Incs.inc. Но, посколько Funcs.asm тоже юзает windows.inc (который с свою очередь уже подключен в Incs.inc), в Funcs.asm я тоже includ'ю Incs.inc. В этом случае компилер ругается на windows.inc (из-за того, что он дублируется, как я понял). Если include windows.inc вынести в Main.asm, а из Incs.inc его убрать, то компилер будет ругаться на Funcs.asm, что там я зря подключаю Incs.asm (ну а если не подлючать, то тоже не работает из-за windows.inc , говорит "nesting level too deep". Вот такой бардак. P.S., ясен пень, что и без Invok'ов с прототипами обойтись можно, но ведь не рулит Да и прототип(ы) я вынес в отдельный файл для логичности кода, полагая, что этот файл можно будет подключать в любом другом файле, где нужен вызов процедуры другого файла (такая вот тавтология)...
Короче, не нужно страдать хернёй. В главном файле проекта прописываешь Код (Text): include windows.inc ...... ; some other include ...... include Incs.inc include Funcs.asm Во всех остальных файлах(Incs.inc, Funcs.asm,...) соответственно эти строчки убираешь.
NetSharp Наведи порядок. Все прототипы в FileName.inc, исходные тексты в FileName.asm, includ'ить только inc-файлы и только в asm'файлы, исключение - macros.asm, хотя и его по хорошему надо в inc переименовать. Windows.inc включать только в asm-файлы, лучше первым, как показал Asterix. Другое решение - воспользоваться аналогом Си'шного препроцессора. Прототипы в хедере обрамляют при помощи кода Код (Text): #ifndef _FILENAME_H_ #define _FILENAME_H_ 1 ... /* здесть прототипы */ #endif Надеюсь у тебя нет проблем с переводом этого на ассемблер.
Первый вариант работает, правда, наблюдаются несколько довольно странных артефактов, но не суть. А вот второй вариант, думаю, лучше будет, но перевести я не могу, Си не знаю...
Большое спасибо. Теперь немного другая проблемка: если в функции один аргумент, все хорошо, а если два - то компилер ругается: "conflicting parameter definition". (прототип: MyFunc proto WORD, :CHAR; функция: MyFunc proc uses esi ecx, Param1WORD, Param2:CHAR)
NetSharp Мой masm не ругается на такое Код (Text): .386 .model flat, stdcall .nolist include windows.inc .list MyFunc PROTO : DWORD, : CHAR .code even MyFunc proc uses esi ecx, Param1 : DWORD, Param2 : CHAR mov esi,Param1 mov cl,Param2 ret MyFunc endp end Наверное ты показал не то на что ругается компилятор. Asterix Мой masm прекрасно переваривает присутствие/отсутствие запятой. Из masmref.doc Код (Text): label [b]PROC[/b] [[distance]] [[langtype]] [[visibility]] [[<prologuearg>]] [[[b]USES[/b] reglist]] [[, parameter [[:tag]]]]... statements label [b]ENDP[/b]
Спасибо, этот баг я порешил Оказывается, фразой "conflicting parameter definition" компилятор намекал, что это конфликт имени функции...
NetSharp А что такое .nolist, .list и even? .nolist - директива компилятора - прекратить вывод листинга .list - директива компилятора - продолжить вывод листинга. even - директива компилятора - расположить следующую переменную или инструкцию по четному адресу. ps программисту не помешает иметь документацию по языку и средствам программирования