Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Структуры и CVAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Pavel_Bor
К примеру существует main.c, lcd.h(описане прототипов) и lcd.c. Возможно ли сделать структуру которую бы видели все файлы и могли ее менять (без указателей).?

typedef struct ww
{
int a;
int b;
} ww_t;
Dog Pawlowa
Цитата(Pavel_Bor @ Jul 1 2011, 12:35) *
Возможно ли сделать структуру которую бы видели все файлы и могли ее менять (без указателей).?


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

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

extern my_type my_struct;

C:
my_type my_struct;
Палыч
Цитата(Pavel_Bor @ Jul 1 2011, 13:35) *
сделать структуру которую бы видели все файлы и могли ее менять (без указателей)
Может быть я не понять Вашу проблему... Ну, делов то: сделайте эту структуру глобальной.
Pavel_Bor
Цитата(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.
Dog Pawlowa
Цитата(Pavel_Bor @ Jul 1 2011, 12:52) *
Например void function(RTC_BCD_t rtcTime); которая находится в lcd.h, выдает ошибку на undefined symbol.
При попытке описать структуру в lcd.h на первой строке объявления переменной пишет declaration syntax error.

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


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


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


То есть если я создаю структуру в хидере. то там extern не должно быть?
Vitaly
Не надо путать описание структуры и определение переменных.
Описываем в "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
defunct
Цитата(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 вперед).

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

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

defunct
Цитата(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();  // <-- вызвать колбэк
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.