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

 
 
 
Reply to this topicStart new topic
> Чет не понимаю, на что WinAVR ругается.
Igor_U
сообщение Jun 22 2006, 07:38
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141



Код
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

Че за анонимный тип?
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jun 22 2006, 07:44
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(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.
Go to the top of the page
 
+Quote Post
SergSit
сообщение Jun 22 2006, 08:05
Сообщение #3


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

Группа: Свой
Сообщений: 173
Регистрация: 9-12-05
Пользователь №: 12 031



Может ошибаюсь. Но "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 это тип который задает пользователь.
Go to the top of the page
 
+Quote Post
Igor_U
сообщение Jun 22 2006, 08:15
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141



Спасибо. Объявил static.
Но хотелось бы понять до конца. Если мне нужен будет доступ к этой структуре из других файлов, то мне нужно присвоить ей имя, например my_name, а обращатится к полю count - my_name::count. Так?
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jun 22 2006, 08:31
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(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
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jun 22 2006, 08:55
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Немножко проще - переменную структурного типа, объявить уже в заголовочнике и она будет видна везде, где заголовочник подключен. Инициализировать уже в тексте.
И еще - если это С++, оформить ее как класс (не забывая о public).


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
niccom
сообщение Jun 22 2006, 10:42
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 9-06-05
Пользователь №: 5 868



Цитата(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 - указатель), более понятен, чем тот же тип, записанный как указатель на некоторую сложную структуру.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:50
Рейтинг@Mail.ru


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