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

 
 
 
Reply to this topicStart new topic
> Структуры и CVAVR
Pavel_Bor
сообщение Jul 1 2011, 09:35
Сообщение #1


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

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



К примеру существует main.c, lcd.h(описане прототипов) и lcd.c. Возможно ли сделать структуру которую бы видели все файлы и могли ее менять (без указателей).?

typedef struct ww
{
int a;
int b;
} ww_t;

Сообщение отредактировал Pavel_Bor - Jul 1 2011, 09:36
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 1 2011, 09:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Pavel_Bor @ Jul 1 2011, 12:35) *
Возможно ли сделать структуру которую бы видели все файлы и могли ее менять (без указателей).?


А что, там настолько необычный С? Или в школку не ходили? wink.gif

Код
H:
typedef struct {
...
} my_type;

extern my_type my_struct;

C:
my_type my_struct;


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 1 2011, 09:49
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Pavel_Bor @ Jul 1 2011, 13:35) *
сделать структуру которую бы видели все файлы и могли ее менять (без указателей)
Может быть я не понять Вашу проблему... Ну, делов то: сделайте эту структуру глобальной.
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 1 2011, 09:52
Сообщение #4


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

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Цитата(Dog Pawlowa @ Jul 1 2011, 12:48) *
А что, там настолько необычный С? Или в школку не ходили? wink.gif

Код
H:
typedef struct {
...
} my_type;

extern my_type my_struct;

C:
my_type my_struct;


писал точно также:

Код
typedef struct {
    uint8_t seconds;
    uint8_t minutes;
    uint8_t hours;
    uint8_t day;
    uint8_t month;
    uint16_t year;
      
} RTC_BCD_t;

extern RTC_BCD_t rtcTime;


вызов из-того же файла идет нормальный но вот из любого другого.. Например void function(RTC_BCD_t rtcTime); которая находится в lcd.h, выдает ошибку на undefined symbol.
При попытке описать структуру в lcd.h на первой строке объявления переменной пишет declaration syntax error.

Сообщение отредактировал Pavel_Bor - Jul 1 2011, 09:53
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 1 2011, 10:00
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Pavel_Bor @ Jul 1 2011, 12:52) *
Например void function(RTC_BCD_t rtcTime); которая находится в lcd.h, выдает ошибку на undefined symbol.
При попытке описать структуру в lcd.h на первой строке объявления переменной пишет declaration syntax error.

Ну дык нужно в хедер включить хедер, и будет Вам щастье.
Или (для извращенцев) соблюсти последовательность включения хедеров в файл С.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 1 2011, 10:21
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Pavel_Bor @ Jul 1 2011, 13:52) *
писал точно также:
Код
extern RTC_BCD_t rtcTime;

вызов из-того же файла идет нормальный но вот из любого другого.. Например void function(RTC_BCD_t rtcTime); которая находится в lcd.h, выдает ошибку на undefined symbol. При попытке описать структуру в lcd.h на первой строке объявления переменной пишет declaration syntax error.


1. Где-то (в каком-то одном файле) ваша структура должна быть без extern
2. Поместить #include "lcd.h" после директив включения/вставки стандартных h-файлов (как минимум того, где определены uint8_t, uint16_t)
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 1 2011, 10:30
Сообщение #7


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

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Цитата(Dog Pawlowa @ Jul 1 2011, 13:00) *
Ну дык нужно в хедер включить хедер, и будет Вам щастье.
Или (для извращенцев) соблюсти последовательность включения хедеров в файл С.


при таком варианте тоже declaration syntax error(
хотя должно работать.


Цитата
1. Где-то (в каком-то одном файле) ваша структура должна быть без extern
2. Поместить #include "lcd.h" после директив включения/вставки стандартных h-файлов (как минимум того, где определены uint8_t, uint16_t)


То есть если я создаю структуру в хидере. то там extern не должно быть?

Сообщение отредактировал Pavel_Bor - Jul 1 2011, 10:32
Go to the top of the page
 
+Quote Post
Vitaly
сообщение Jul 1 2011, 11:03
Сообщение #8


Участник
*

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



Не надо путать описание структуры и определение переменных.
Описываем в "lcd.h" тип

Код
#ifndef _LCD_H_
#define _LCD_H_
typedef struct
{
int a;
int b;
} type_lcd;
#endif

в "main.c" определяем переменную и пользуемся
#include "lcd.h"
type_lcd var_lcd

в "lcd.c" используем ту же самую переменную
#include "lcd.h"
extern type_lcd var_lcd
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 1 2011, 11:08
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Vitaly @ Jul 1 2011, 14:03) *
в "lcd.c" используем ту же самую переменную
#include "lcd.h"
extern type_lcd var_lcd[/code]

достаточно написать
extern type_lcd var_lcd
в хидер файле который подключается ко всем C файлам (напр lcd.h или global.h), и эту переменную будет видно во всех C файлах.


Цитата
в "main.c" определяем переменную и пользуемся
#include "lcd.h"
type_lcd var_lcd

Хлам набрасывать в main не есть гут. Эта переменная относится к LCD, самое место объявить ее не в main.c, а в lcd.c

итого правильный вариант будет таким:

1. в lcd.h описываем тип.
2. в lcd.c объявляем переменную этого типа.
3. во все C файлы которые будут использовать lcd - подключаем include "lcd.h"
4. в конце lcd.h делаем объявление переменной с ключем extern (копи-паст объявления из C файла, и слово extern вперед).

Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 1 2011, 11:18
Сообщение #10


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

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Спасибо заработало.
Но все-таки пришлось убрать uint8_t хотя они в данном случае и не нужны.

В обычном с++ есть конструкторы и деструкторы, есть ли они под CVAVR?
можно ли писать функции внутри структуры?

Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 1 2011, 11:35
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Pavel_Bor @ Jul 1 2011, 14:18) *
Но все-таки пришлось убрать uint8_t хотя они в данном случае и не нужны.

в global.h или types.h (который добавляется во все без исключения файлы)
опишите типы которые вам всегда нужны:

Код
typedef unsigned char U8, uint8_t;
typedef unsigned short U16, uint16_t;
typedef unsigned long U32, uint32_t;
typedef unsigned long long U64, uint64_t;

typedef signed char S8, int8_t;
typedef signed short S16, int16_t;
typedef signed long S32, int32_t;


и т.д.
и будет щастье, таскайте его потом за собой во все проекты.

Цитата
есть ли они под CVAVR

Есть ли C++ в CVAVR? Пользуйте нормальный компилятор (IAR / WinAVR) и будет.


Цитата
можно ли писать функции внутри структуры?

в C можно использовать callback'и

Код
typedef struct tagSOME_CONEXT
{
     void (*OnRead)(struct tagSOME_CONTEXT *);  
     void (*OnWrite)(struct tagSOME_CONTEXT *);
     void (*DoSmthSimple)(void);

} TSOME_CONTEXT, *PSOME_CONTEXT;

TSOME_CONTEXT someContext;

void BlinkLed(void)
{
    PORTB = 0xff;
    delay_ms(10);
    PORTB = 0x0;
}

someContext.DoSmthSimple = BlinkLed;  // <- назначить колбэк
someContext.DoSmthSimple();  // <-- вызвать колбэк
Go to the top of the page
 
+Quote Post

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

 


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


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