IF_P 1 28 июня, 2017 Опубликовано 28 июня, 2017 · Жалоба Вылетает ошибка "ERROR[PE147]...". В программе с ATMega128 все нормально работает. А здесь стоит ATMega16. Что ему не нравится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IF_P 1 29 июня, 2017 Опубликовано 29 июня, 2017 · Жалоба Выделил union в отдельный хидерный файл ("adc_union.h") и вставил его в программу - заработало: #include <iom16.h> #include <intrinsics.h> #include "adc_union.h" #include "adc_bits.h" #include "adc_16.h" А когда этот union находился в общем хидерном файле ("adc_16_old.h") - выскакивала ошибка. Хотя оно заработало, но хотелось бы все таки узнать причину ошибки, чтоб не наступать на грабли в будущем. Буду благодарен за информацию. adc_h.RAR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 29 июня, 2017 Опубликовано 29 июня, 2017 · Жалоба Вы объявили в заголовочном файле переменную безымянного типа. Полагаю, adc_16_old.h был включен более чем в один файл исходников, а adc_union.h вы включили только в один. Если вы включите свой adc_union.h более чем в один файл исходиков - должны получить такую же фигню. В заголовочном файле должны определяться типы, а не переменные. Переменные в заголовочных файлах только объявляются. Вот если бы вы в заголовочном файле написали typedef union { .... } data_modbus_in_type; extern data_modbus_in_type Data_ModBus_IN; а в каком-то одном из исходников написали (уже без extern!) data_modbus_in_type Data_ModBus_IN; ошибки бы не было. Еще почитайте про защиту от повторного включения заголовочных файлов, у вас ее нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IF_P 1 29 июня, 2017 Опубликовано 29 июня, 2017 · Жалоба Вы объявили в заголовочном файле переменную безымянного типа. Но у union есть имя. Полагаю, adc_16_old.h был включен более чем в один файл исходников, а adc_union.h вы включили только в один. Файл всего лишь один. Есть основная программа к которой подключен хидер. Больше его нигде нет. Я всего лишь разделил один хидер на два и последовательно их подключил, чтоб заработало. В другом проекте с ATMega128 объявление union в общем хидерном файле прекрасно работает. Вот поэтому я и не понимаю, в чем разница. Я просто скопировал с этого проекта и поменял ATMega128 на ATMega16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 30 июня, 2017 Опубликовано 30 июня, 2017 · Жалоба Но у union есть имя.Какое? Я вижу объявление переменной Data_ModBus_IN безымянного типа "union {...}" Файл всего лишь один. Есть основная программа к которой подключен хидер.Программа ваша. Вы можете писать ее как угодно, а можете писать сразу правильно. Наступить на лично заботливо разложенные грабли - ваше право. Когда у вас в программе появится второй-третий файл, использующий этот заголовочный - вы получите кучу ошибок, которые все-таки придется исправить. Больше его нигде нет. Я всего лишь разделил один хидер на два и последовательно их подключил, чтоб заработало.Чудес не бывает. Значит этот файл включается туда же через какой-то другой заголовочный файл. Люди не зря придумали защиту от повторного включения заголовочных файлов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IF_P 1 30 июня, 2017 Опубликовано 30 июня, 2017 · Жалоба Чудес не бывает. Значит этот файл включается туда же через какой-то другой заголовочный файл. Люди не зря придумали защиту от повторного включения заголовочных файлов. Что касается защиты от повторного включения, то я согласен. Просто это всегда остается "за кадром" - потом, потом...А в моем случае попробую на выходных выделить из программы необходимое, сделать тестовый пример и выложу сюда. Хотелось бы разобраться до конца. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться