Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чет не понимаю, на что WinAVR ругается.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Igor_U
Код
struct
    {
    uint16_t result_heater; // значение измерения ацп температуры нагревателя
    uint16_t result_compensation; // значение измерения ацп температуры компенсации
    uint16_t temperature_pid; // температура нагревателя для ПИД
    uint16_t temperature_dec; // температура нагревателя для вывода на индикатор
    uint8_t count; // подсчет циклов измерения
    }adc;


На объявление этой структуры WinAVR говорит:
Код
Variable.hpp:13: warning: non-local variable '<anonymous struct> adc' uses anonymous type

Че за анонимный тип?
_Bill
Цитата(Igor_U @ Jun 22 2006, 10:38) *
Код
struct
    {
    uint16_t result_heater; // значение измерения ацп температуры нагревателя
    uint16_t result_compensation; // значение измерения ацп температуры компенсации
    uint16_t temperature_pid; // температура нагревателя для ПИД
    uint16_t temperature_dec; // температура нагревателя для вывода на индикатор
    uint8_t count; // подсчет циклов измерения
    }adc;


На объявление этой структуры WinAVR говорит:
Код
Variable.hpp:13: warning: non-local variable '<anonymous struct> adc' uses anonymous type

Че за анонимный тип?

Это просто предупреждение. Переменная типа структуры объявлена как глобальная, а структура неименована. Ссылки на эту переменную из других модулей (файлов) невозможны. Нужно либо именовать струкутуру, либо объявить переменную как static.
SergSit
Может ошибаюсь. Но "adc' uses anonymous type" помойму значит пользовательский анонимный тип.
Поэтому , помойму, надо обьявлять так
struct type
{
uint16_t result_heater; // значение измерения ацп температуры нагревателя
uint16_t result_compensation; // значение измерения ацп температуры компенсации
uint16_t temperature_pid; // температура нагревателя для ПИД
uint16_t temperature_dec; // температура нагревателя для вывода на индикатор
uint8_t count; // подсчет циклов измерения
}adc;

Type это тип который задает пользователь.
Igor_U
Спасибо. Объявил static.
Но хотелось бы понять до конца. Если мне нужен будет доступ к этой структуре из других файлов, то мне нужно присвоить ей имя, например my_name, а обращатится к полю count - my_name::count. Так?
_Bill
Цитата(Igor_U @ Jun 22 2006, 11:15) *
Спасибо. Объявил static.
Но хотелось бы понять до конца. Если мне нужен будет доступ к этой структуре из других файлов, то мне нужно присвоить ей имя, например my_name, а обращатится к полю count - my_name::count. Так?

Лучше всего использовать typedef:
Код
typedef struct   {     // Определить новый тип
               ........
                 }
Tadc;

Это объявление лучше поместить в *.h файл. Далее, можно определить в нужном Си файле переменные этого типа:
Код
Tadc       adc;      // Объявление глобальной переменной

Если требуются ссылки к этой переменной, то ее нужно объявить как extern в том же *.h файле:
Код
extern Tadc    adc;        // Ссылка к переменной adc
beer_warrior
Немножко проще - переменную структурного типа, объявить уже в заголовочнике и она будет видна везде, где заголовочник подключен. Инициализировать уже в тексте.
И еще - если это С++, оформить ее как класс (не забывая о public).
niccom
Цитата(Igor_U @ Jun 22 2006, 11:38) *
Код
struct
    {
    uint16_t result_heater; // значение измерения ацп температуры нагревателя
    uint16_t result_compensation; // значение измерения ацп температуры компенсации
    uint16_t temperature_pid; // температура нагревателя для ПИД
    uint16_t temperature_dec; // температура нагревателя для вывода на индикатор
    uint8_t count; // подсчет циклов измерения
    }adc;


На объявление этой структуры WinAVR говорит:
Код
Variable.hpp:13: warning: non-local variable '<anonymous struct> adc' uses anonymous type

Че за анонимный тип?



/*Цитата из Кернигана Ритчи*/
// Рекомендую целиком книгу прочитать

6.7 Средство typedef
Язык Си предоставляет средство, называемое typedef, которое позволяет давать типам данных новые имена. Например, объявление

typedef int Length;

делает имя Length синонимом int. С этого момента тип Length можно применять в объявлениях, в операторе приведения и т. д. точно так же, как тип int:

Length len, maxlen;
Length *lengths[];

Аналогично объявление

typedef char *String;

делает String синонимом char *, т. e. указателем на char, и правомерным будет, например, следующее его использование:

String р, lineptr[MAXLINES], alloc(int);
int strcmp(String, String);
p = (String) malloc(100);

Заметим, что объявляемый в typedef тип стоит на месте имени переменной в обычном объявлении, а не сразу за словом typedef. С точки зрения синтаксиса слово typedef напоминает класс памяти - extern, static и т. д. Имена типов записаны с заглавных букв для того, чтобы они выделялись.

Для демонстрации более сложных примеров применения typedef воспользуемся этим средством при задании узлов деревьев, с которыми мы уже встречались в данной главе.

typedef struct tnode *Treeptr;

typedef struct tnode { /* узел дерева: */
char *word; /* указатель на текст */
int count; /* число вхождений */
Treeptr left; /* левый сын */
Treeptr right; /* правый сын */
} Treenode;

В результате создаются два новых названия типов: Treenode (структура) и Treeptr (указатель на структуру). Теперь программу talloc можно записать в следующем виде:

Treeptr talloc(void)
{
return (Treeptr) malloc(sizeof(Treenode));
}

Следует подчеркнуть, что объявление typedef не создает объявления нового типа, оно лишь сообщает новое имя уже существующему типу. Никакого нового смысла эти новые имена не несут, они объявляют переменные в точности с теми же свойствами, как если бы те были объявлены напрямую без переименования типа. Фактически typedef аналогичен #define с тем лишь отличием, что при интерпретации компилятором он может справиться с такой текстовой подстановкой, которая не может быть обработана препроцессором. Например

typedef int (*PFI)(char *, char *);

создает тип PFI - "указатель на функцию (двух аргументов типа char *), возвращающую int", который, например, в программе сортировки, описанной в главе 5, можно использовать в таком контексте:

PFI strcmp, numcmp;

Помимо просто эстетических соображений, для применения typedef существуют две важные причины. Первая - параметризация программы, связанная с проблемой переносимости. Если с помощью typedef объявить типы данных, которые, возможно, являются машинно-зависимыми, то при переносе программы на другую машину потребуется внести изменения только в определения typedef. Одна из распространенных ситуаций - использование typedef-имен для варьирования целыми величинами. Для каждой конкретной машины это предполагает соответствующие установки short, int или long, которые делаются аналогично установкам стандартных типов, например size_t и ptrdiff_t.

Вторая причина, побуждающая к применению typedef,- желание сделать более ясным текст программы. Тип, названный Тreeptr (от английских слов tree - дерево и pointer - указатель), более понятен, чем тот же тип, записанный как указатель на некоторую сложную структуру.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.