Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ощибка PE147, union и ATMega16
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
IF_P
Вылетает ошибка "ERROR[PE147]...". В программе с ATMega128 все нормально работает. А здесь стоит ATMega16. Что ему не нравится?
IF_P
Выделил 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_16_old.h был включен более чем в один файл исходников, а adc_union.h вы включили только в один. Если вы включите свой adc_union.h более чем в один файл исходиков - должны получить такую же фигню. В заголовочном файле должны определяться типы, а не переменные. Переменные в заголовочных файлах только объявляются. Вот если бы вы в заголовочном файле написали
CODE
typedef union
{
....
} data_modbus_in_type;
extern data_modbus_in_type  Data_ModBus_IN;

а в каком-то одном из исходников написали (уже без extern!)
CODE
data_modbus_in_type  Data_ModBus_IN;

ошибки бы не было.

Еще почитайте про защиту от повторного включения заголовочных файлов, у вас ее нет.
IF_P
Цитата(Сергей Борщ @ Jun 29 2017, 23:57) *
Вы объявили в заголовочном файле переменную безымянного типа.

Но у union есть имя.

Цитата(Сергей Борщ @ Jun 29 2017, 23:57) *
Полагаю, adc_16_old.h был включен более чем в один файл исходников, а adc_union.h вы включили только в один.


Файл всего лишь один. Есть основная программа к которой подключен хидер. Больше его нигде нет. Я всего лишь разделил один хидер на два и последовательно их подключил, чтоб заработало. В другом проекте с ATMega128 объявление union в общем хидерном файле прекрасно работает. Вот поэтому я и не понимаю, в чем разница. Я просто скопировал с этого проекта и поменял ATMega128 на ATMega16.

Сергей Борщ
QUOTE (IF_P @ Jun 30 2017, 02:21) *
Но у union есть имя.
Какое? Я вижу объявление переменной Data_ModBus_IN безымянного типа "union {...}"

QUOTE (IF_P @ Jun 30 2017, 02:21) *
Файл всего лишь один. Есть основная программа к которой подключен хидер.
Программа ваша. Вы можете писать ее как угодно, а можете писать сразу правильно. Наступить на лично заботливо разложенные грабли - ваше право. Когда у вас в программе появится второй-третий файл, использующий этот заголовочный - вы получите кучу ошибок, которые все-таки придется исправить.

QUOTE (IF_P @ Jun 30 2017, 02:21) *
Больше его нигде нет. Я всего лишь разделил один хидер на два и последовательно их подключил, чтоб заработало.
Чудес не бывает. Значит этот файл включается туда же через какой-то другой заголовочный файл. Люди не зря придумали защиту от повторного включения заголовочных файлов.
IF_P
Цитата(Сергей Борщ @ Jun 30 2017, 09:05) *
Чудес не бывает. Значит этот файл включается туда же через какой-то другой заголовочный файл. Люди не зря придумали защиту от повторного включения заголовочных файлов.

Что касается защиты от повторного включения, то я согласен. Просто это всегда остается "за кадром" - потом, потом...А в моем случае попробую на выходных выделить из программы необходимое, сделать тестовый пример и выложу сюда. Хотелось бы разобраться до конца.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.