Перейти к содержанию
    

Ощибка PE147, union и ATMega16

Вылетает ошибка "ERROR[PE147]...". В программе с ATMega128 все нормально работает. А здесь стоит ATMega16. Что ему не нравится?

post-12772-1498632336_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выделил 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы объявили в заголовочном файле переменную безымянного типа. Полагаю, 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;

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

 

Еще почитайте про защиту от повторного включения заголовочных файлов, у вас ее нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы объявили в заголовочном файле переменную безымянного типа.

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

 

Полагаю, adc_16_old.h был включен более чем в один файл исходников, а adc_union.h вы включили только в один.

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но у union есть имя.
Какое? Я вижу объявление переменной Data_ModBus_IN безымянного типа "union {...}"

 

Файл всего лишь один. Есть основная программа к которой подключен хидер.
Программа ваша. Вы можете писать ее как угодно, а можете писать сразу правильно. Наступить на лично заботливо разложенные грабли - ваше право. Когда у вас в программе появится второй-третий файл, использующий этот заголовочный - вы получите кучу ошибок, которые все-таки придется исправить.

 

Больше его нигде нет. Я всего лишь разделил один хидер на два и последовательно их подключил, чтоб заработало.
Чудес не бывает. Значит этот файл включается туда же через какой-то другой заголовочный файл. Люди не зря придумали защиту от повторного включения заголовочных файлов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чудес не бывает. Значит этот файл включается туда же через какой-то другой заголовочный файл. Люди не зря придумали защиту от повторного включения заголовочных файлов.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...