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

 
 
 
Reply to this topicStart new topic
> Как в IAR делать C классы ?
a9d
сообщение Nov 27 2012, 03:09
Сообщение #1


Местный
***

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



Решил повторить
http://www.codenet.ru/progr/cpp/oopc.php

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


Как в IAR это оформляется?
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Nov 27 2012, 04:19
Сообщение #2


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Это не код на Си, а ХЗ что.
Go to the top of the page
 
+Quote Post
a9d
сообщение Nov 27 2012, 04:22
Сообщение #3


Местный
***

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



допустим это хз что. Но я уже не однократно слышал о подобии классов в си. Захотелось это попробовать.
Go to the top of the page
 
+Quote Post
InsolentS
сообщение Nov 27 2012, 05:20
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Нельзя в Си объявить 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);
}


Сообщение отредактировал IgorKossak - Nov 27 2012, 07:51
Причина редактирования: [codebox] для длинного кода!!!


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
shmur
сообщение Nov 27 2012, 05:29
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553



По-моему, очень плохой пример вы нашли, лучше посмотрите исходники glib, там используется реальное ООП на С.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 27 2012, 06:10
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата
Как и в прошлый раз BorlandC++Builder4.0

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

Скажите аффтару, чтобы не морочил людям голову


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
InsolentS
сообщение Nov 27 2012, 07:22
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



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

Или ffmpeg, libavcodec ..


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
MK2
сообщение Nov 27 2012, 17:51
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535



вот очень неплохо разжеванный пример
только как сказали где-то в комментах на том же сайте, не заморачивайтесь этим на С, развития это не прибавит
Go to the top of the page
 
+Quote Post
a9d
сообщение Nov 27 2012, 19:49
Сообщение #9


Местный
***

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



Перелопатил кучу сайтов.

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

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);


Дает немного хуже код. Зато привычно выглядит.

Сообщение отредактировал a9d - Nov 27 2012, 20:08
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Nov 28 2012, 04:13
Сообщение #10


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



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


Могу порекомендовать google://ooc.pdf
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 28 2012, 07:02
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Простите, не удержался.
Прикрепленное изображение


Зачем делать такой троллейбус на C, если есть специально заточенный под это C++?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
a9d
сообщение Nov 28 2012, 11:59
Сообщение #12


Местный
***

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



К некоторым проектам невозможно прикрутить С++.
Go to the top of the page
 
+Quote Post
aley-vi
сообщение Mar 15 2013, 14:42
Сообщение #13





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



Цитата(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м нормально компилируется.
Go to the top of the page
 
+Quote Post

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

 


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


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