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

 
 
> Как в 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
 
Start new topic
Ответов
a9d
сообщение Nov 27 2012, 19:49
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 1st August 2025 - 23:43
Рейтинг@Mail.ru


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