Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в IAR делать C классы ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
a9d
Решил повторить
http://www.codenet.ru/progr/cpp/oopc.php

Но IAR ругается на static в структуре и "Point2D_fn_Init Point2D :: Init = Point2D_method_Init;"


Как в IAR это оформляется?
andrew_b
Это не код на Си, а ХЗ что.
a9d
допустим это хз что. Но я уже не однократно слышал о подобии классов в си. Захотелось это попробовать.
InsolentS
Нельзя в Си объявить static поле в структуре.
CODE
enum TAGS {
t_Point2D,
t_Point3D
};

void Point2D_method_Draw(void* _this);
void Point2D_method_Init(void* _this);

typedef void (*Point2D_fn_Init)(void*);
typedef void (*Point2D_fn_Draw)(void*);

typedef struct
{
int tag;
float x,
y;

Point2D_fn_Init Init;
Point2D_fn_Draw Draw;
}Point2D;

void Point3D_method_Draw(void* _this);
void Point3D_method_Init(void* _this);

typedef void (*Point3D_fn_Init)(void*);
typedef void (*Point3D_fn_Draw)(void*);

typedef struct {
int tag;
float x,
y,
z;

Point3D_fn_Init Init;
Point3D_fn_Draw Draw;
}Point3D;

void Point2D_method_Init(void* _this)
{
Point2D* t = (Point2D*)_this;
t->tag = t_Point2D;
t->x = t->y = 0.0;
}

void Point2D_method_Draw(void* _this)
{
Point2D* t = (Point2D*)_this;
printf("Poin2D Draw ");
}

void Point3D_method_Init(void* _this)
{
Point3D* t = (Point3D*)_this;
t->tag = t_Point3D;
t->x = t->y = t->z = 0.0;
}

void Point3D_method_Draw(void* _this)
{
Point3D* t = (Point3D*)_this;
printf("Poin3D Draw ");
}

void DrawXObject(void* obj)
{
int tag_obj = *((int*)obj);
if(tag_obj == t_Point2D){
Point2D* p = (Point2D*)obj;
p->Draw(&p);
}
else if(tag_obj == t_Point3D){
Point3D* p = (Point3D*)obj;
p->Draw(&p);
}
}

int main( void )
{
Point2D p2d;
Point3D p3d;

p2d.Init = Point2D_method_Init;
p2d.Draw = Point2D_method_Draw;

p3d.Init = Point3D_method_Init;
p3d.Draw = Point3D_method_Draw;

p2d.Init(&p2d);
p3d.Init(&p3d);

DrawXObject(&p2d);
DrawXObject(&p3d);
}
shmur
По-моему, очень плохой пример вы нашли, лучше посмотрите исходники glib, там используется реальное ООП на С.
MrYuran
Цитата
Как и в прошлый раз BorlandC++Builder4.0

Ну и каким местом там чистый си?
Цитата
Point2D_fn_Init Point2D :: Init = Point2D_method_Init;
Point2D_fn_Draw Point2D :: Draw = Point2D_method_Draw;

Скажите аффтару, чтобы не морочил людям голову
InsolentS
Цитата(shmur @ Nov 27 2012, 11:29) *
По-моему, очень плохой пример вы нашли, лучше посмотрите исходники glib, там используется реальное ООП на С.

Или ffmpeg, libavcodec ..
MK2
вот очень неплохо разжеванный пример
только как сказали где-то в комментах на том же сайте, не заморачивайтесь этим на С, развития это не прибавит
a9d
Перелопатил кучу сайтов.

Есть два метода создания и работы с объектами в С.

1) По факту от функций ничем не отличается. Просто функции в аргументе постоянно передается адрес структуры которую теперь именуют объектом. В общем фигня.

2) Более менее похожий на C++

Заголовочный файл
Код
void os_crit_method_set(void* _this);
void os_crit_method_release(void* _this);

typedef void (*crit_fn_set)(void*);
typedef void (*crit_fn_release)(void*);


typedef struct{
  
  char state;
  
  crit_fn_set set;
  crit_fn_release release;
}CriticalSection;

void CriticalSection_new(void* _this);


Описание методов
Код
void os_crit_method_set(void* _this)
{
  CriticalSection *cs=_this;
  
  cs->state=__get_interrupt_state();
  __disable_interrupt();
}

void os_crit_method_release(void* _this)
{
  CriticalSection *cs=_this;
  
  __set_interrupt_state(cs->state);
}

void CriticalSection_new(void* _this)
{
  CriticalSection *cs=_this;
  
  cs->state=0;
  cs->set=os_crit_method_set;
  cs->release=os_crit_method_release;
}



Использование
Код
CriticalSection cs; CriticalSection_new(&cs);
  
  cs.set(&cs);



Можно сделать через "=" но тогда компилятор делает прошивку на 26 байт больше.



ЗЫ:

Можно сделать так

Код
CriticalSection CriticalSection_new()//void* _this)
{
  CriticalSection cs;//*cs=_this;
  
  cs.state=0;
  cs.set=os_crit_method_set;
  cs.release=os_crit_method_release;
  
  return cs;
}


И использование
Код
CriticalSection cs=CriticalSection_new();
  
  cs.set(&cs);
  
  CriticalSection cs1=CriticalSection_new();
  
  cs1.set(&cs1);


Дает немного хуже код. Зато привычно выглядит.
andrew_b
Цитата(a9d @ Nov 27 2012, 08:22) *
допустим это хз что. Но я уже не однократно слышал о подобии классов в си. Захотелось это попробовать.


Могу порекомендовать google://ooc.pdf
Сергей Борщ
Простите, не удержался.
Нажмите для просмотра прикрепленного файла

Зачем делать такой троллейбус на C, если есть специально заточенный под это C++?
a9d
К некоторым проектам невозможно прикрутить С++.
aley-vi
Цитата(a9d @ Nov 27 2012, 07:09) *
Решил повторить
http://www.codenet.ru/progr/cpp/oopc.php

Но IAR ругается на static в структуре и "Point2D_fn_Init Point2D :: Init = Point2D_method_Init;"


Как в IAR это оформляется?


Формально в IAR оформляется так:

typedef struct Point3D
{
int tag;
float x,y,z;

static Point3D_fn_Init Init;
static Point3D_fn_Draw Draw;
};

Вышеприведенный по ссылке пример после этой корректировки IARoм нормально компилируется.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.