реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
IF_P
сообщение Jun 28 2017, 06:46
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Вылетает ошибка "ERROR[PE147]...". В программе с ATMega128 все нормально работает. А здесь стоит ATMega16. Что ему не нравится?
Эскизы прикрепленных изображений
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 87%
Прикрепленное изображение
1280 x 1024 (50.08 килобайт)
 
Go to the top of the page
 
+Quote Post
IF_P
сообщение Jun 29 2017, 17:09
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Выделил 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 ( 1.09 килобайт ) Кол-во скачиваний: 9
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 29 2017, 20:57
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

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

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IF_P
сообщение Jun 29 2017, 23:21
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



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

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

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


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

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 30 2017, 06:05
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IF_P
сообщение Jun 30 2017, 07:10
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



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

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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 21:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016