Перейти к содержанию
    

Структуры и CVAVR

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

 

typedef struct ww

{

int a;

int b;

} ww_t;

Изменено пользователем Pavel_Bor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно ли сделать структуру которую бы видели все файлы и могли ее менять (без указателей).?

 

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

 

H:
typedef struct {
...
} my_type;

extern my_type my_struct;

C:
my_type my_struct;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сделать структуру которую бы видели все файлы и могли ее менять (без указателей)
Может быть я не понять Вашу проблему... Ну, делов то: сделайте эту структуру глобальной.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например void function(RTC_BCD_t rtcTime); которая находится в lcd.h, выдает ошибку на undefined symbol.

При попытке описать структуру в lcd.h на первой строке объявления переменной пишет declaration syntax error.

Ну дык нужно в хедер включить хедер, и будет Вам щастье.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну дык нужно в хедер включить хедер, и будет Вам щастье.

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

 

при таком варианте тоже declaration syntax error(

хотя должно работать.

 

 

1. Где-то (в каком-то одном файле) ваша структура должна быть без extern

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

 

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

Изменено пользователем Pavel_Bor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не надо путать описание структуры и определение переменных.

Описываем в "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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в "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 вперед).

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо заработало.

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

 

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

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но все-таки пришлось убрать 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();  // <-- вызвать колбэк

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...