include windows.inc

Тема в разделе "WASM.WIN32", создана пользователем NetSharp, 18 дек 2004.

  1. NetSharp

    NetSharp New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    6
    Адрес:
    Russia
    В моей проге несколько файлов, они оба юзают windows.inc и проблема вот в чем: если вставлять 'include windows.inc' в один из файлов, то, ессно, не работает, а если в оба - то то тоже (компилер выдает 102 ошибки, все они в windows.inc, типа "non-benign structure redefinition: incorrect initializers : BITMAPINFO" (так он ругается на все структуры).). Сам windows.inc, конечно, правильный и рабочий. Как порешить эту проблему?
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    > если вставлять 'include windows.inc' в один из файлов, то, ессно, не работает



    Почему естно?, как раз всё должно работать, вот только нужно include прописывать в главном файле проекта.
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NetSharp

    несколько файлов ... оба юзают

    :0) Хорошо сказал!



    Ты свои файлы друг в друга не includ'ишь?
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ещё можно отделько компилить каждое файло, а потом объектники собирать вместе линкером.
     
  5. NetSharp

    NetSharp New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    6
    Адрес:
    Russia
    гм.. На самом деле ситуация немного другая: в главном файле проекта (Main.asm) вызывается процедура, которая находится в другом файле (Funcs.asm) посредством invoke MyFunc, Param1, Param2 (Param1 и Param2 типа Dword и Char соответственно), а прототип процедуры MyFunc (т.е. MyFunc proto :lol: 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'ов с прототипами обойтись можно, но ведь не рулит :dntknw: Да и прототип(ы) я вынес в отдельный файл для логичности кода, полагая, что этот файл можно будет подключать в любом другом файле, где нужен вызов процедуры другого файла (такая вот тавтология)...
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Короче, не нужно страдать хернёй.

    В главном файле проекта прописываешь
    Код (Text):
    1. include windows.inc
    2. ......
    3. ; some other include
    4. ......
    5. include Incs.inc
    6. include Funcs.asm


    Во всех остальных файлах(Incs.inc, Funcs.asm,...) соответственно эти строчки убираешь.
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NetSharp

    Наведи порядок.

    Все прототипы в FileName.inc, исходные тексты в FileName.asm, includ'ить только inc-файлы и только в asm'файлы, исключение - macros.asm, хотя и его по хорошему надо в inc переименовать. Windows.inc включать только в asm-файлы, лучше первым, как показал Asterix.



    Другое решение - воспользоваться аналогом Си'шного препроцессора. Прототипы в хедере обрамляют при помощи кода
    Код (Text):
    1. #ifndef _FILENAME_H_
    2. #define _FILENAME_H_ 1
    3. ... /* здесть прототипы */
    4. #endif
    Надеюсь у тебя нет проблем с переводом этого на ассемблер.
     
  8. NetSharp

    NetSharp New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    6
    Адрес:
    Russia
    Первый вариант работает, правда, наблюдаются несколько довольно странных артефактов, но не суть.

    А вот второй вариант, думаю, лучше будет, но перевести я не могу, Си не знаю...
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    NetSharp
    Код (Text):
    1. IFNDEF _FILENAME_INC_
    2.   _FILENAME_INC_ equ 1
    3. ENDIF
     
  10. NetSharp

    NetSharp New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    6
    Адрес:
    Russia
    Большое спасибо. Теперь немного другая проблемка: если в функции один аргумент, все хорошо, а если два - то компилер ругается: "conflicting parameter definition". (прототип: MyFunc proto :lol: WORD, :CHAR; функция: MyFunc proc uses esi ecx, Param1:lol: WORD, Param2:CHAR)
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Код (Text):
    1. ecx, Param1
    2.    ^ здесь запятой не должно быть
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NetSharp

    Мой masm не ругается на такое
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3.  
    4. .nolist
    5. include windows.inc
    6. .list
    7.  
    8. MyFunc PROTO : DWORD, : CHAR
    9.  
    10. .code
    11.   even
    12.   MyFunc proc uses esi ecx, Param1 : DWORD, Param2 : CHAR
    13.     mov esi,Param1
    14.     mov cl,Param2
    15.     ret
    16.   MyFunc endp
    17.  
    18. end
    Наверное ты показал не то на что ругается компилятор.



    Asterix

    Мой masm прекрасно переваривает присутствие/отсутствие запятой. Из masmref.doc
    Код (Text):
    1. label [b]PROC[/b] [[distance]] [[langtype]] [[visibility]] [[<prologuearg>]]
    2.     [[[b]USES[/b] reglist]] [[, parameter [[:tag]]]]...
    3.     statements
    4. label [b]ENDP[/b]
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    У меня тоже не ругается..

    Ну тогда я не знаю в чем дело %)
     
  14. NetSharp

    NetSharp New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    6
    Адрес:
    Russia
    А что такое .nolist, .list и even?
     
  15. NetSharp

    NetSharp New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    6
    Адрес:
    Russia
    Спасибо, этот баг я порешил :) Оказывается, фразой "conflicting parameter definition" компилятор намекал, что это конфликт имени функции...
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NetSharp

    А что такое .nolist, .list и even?

    .nolist - директива компилятора - прекратить вывод листинга

    .list - директива компилятора - продолжить вывод листинга.

    even - директива компилятора - расположить следующую переменную или инструкцию по четному адресу.



    ps программисту не помешает иметь документацию по языку и средствам программирования