<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3867377</guid>
        <pubDate>Fri, 03 Jun 2022 10:00:03 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3867377</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427467&view=findpost&p=3867359'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>SOY &#064; <time class="tag-quote__quoted-time" datetime="2022-06-03T11:43:15+03:00">03.06.22, 08:43</time></span><div class='quote '>кому интересно сделал так:</div></div><br>
Можно вот так попробовать. Но я так не делал:<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">//Определим интерфейс:</div><div class="code_line">class I_interrupt</div><div class="code_line">{</div><div class="code_line">&nbsp;public:</div><div class="code_line">&nbsp;&nbsp;virtual void work (int intNum)=0;</div><div class="code_line">};</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">// определим указатель на интерфейс</div><div class="code_line">I_interrupt* pInt=NULL;</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">// установим адрес интерфейса:</div><div class="code_line">void Set_I_interrupt(I_interrupt* p)</div><div class="code_line">{</div><div class="code_line">&nbsp;pInt = p;</div><div class="code_line">}</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">//Далее короткие функции прерываний в стиле С:</div><div class="code_line">// не знаю, как для ARDUINO. Пусть для определённости будет так:</div><div class="code_line">interrupt [TIMER1_COMPB_vect] void t1_compb (void)</div><div class="code_line">{</div><div class="code_line">&nbsp;if(pInt) pInt-&#62;work(TIMER1_COMPB_vect);</div><div class="code_line">}</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">interrupt [TIMER1_COMPA_vect] void t1_compa (void)</div><div class="code_line">{</div><div class="code_line">&nbsp;if(pInt) pInt-&#62;work(TIMER1_COMPA_vect);</div><div class="code_line">}</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">//Пишем реализацию интерфейса для конкретного проекта:</div><div class="code_line">class IntProject : virtual public I_interrupt</div><div class="code_line">{</div><div class="code_line">&nbsp;public:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;virtual void work (int intNum);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;virtual void routine_TIMER1_COMPB_vect();</div><div class="code_line">&nbsp;&nbsp;virtual void routine_TIMER1_COMPA_vect();</div><div class="code_line">};</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">void IntProject::work (int intNum)</div><div class="code_line">{</div><div class="code_line">// тут возможно что-то общее для всех, если нужно</div><div class="code_line">&nbsp;switch(intNum)</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;case TIMER1_COMPB_vect: routine_TIMER1_COMPB_vect(); break;</div><div class="code_line">&nbsp;&nbsp;case TIMER1_COMPA_vect: routine_TIMER1_COMPA_vect(); break;</div><div class="code_line">&nbsp;}</div><div class="code_line">// тут возможно что-то общее для всех, если нужно</div><div class="code_line">}</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">void IntProject::routine_TIMER1_COMPB_vect()</div><div class="code_line">{</div><div class="code_line">// ...</div><div class="code_line">}</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">void IntProject::routine_TIMER1_COMPA_vect()</div><div class="code_line">{</div><div class="code_line">// ...</div><div class="code_line">}</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">// В результате работаем с прерываниями используя классы.</div><div class="code_line">// Возможны варианты.</div><div class="code_line">&nbsp;</div><div class="code_line">// используем:</div><div class="code_line">void main (void)</div><div class="code_line">{</div><div class="code_line">&nbsp;// ...</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;IntProject intObject; Set_I_interrupt(&amp;intObject);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;// ...</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
</div></div><br>
После таких мероприятий реализации можно менять &quot;как перчатки&quot;.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3867359</guid>
        <pubDate>Fri, 03 Jun 2022 08:43:15 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3867359</link>
        <description><![CDATA[SOY: кому интересно сделал так:<br>
<br>
файл _ISR.h<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef _ISR_H</div><div class="code_line">#define _ISR_H</div><div class="code_line">#if ARDUINO &#62;= 100</div><div class="code_line">&nbsp;#include &#60;Arduino.h&#62;</div><div class="code_line">#else</div><div class="code_line">#include &#60;WProgram.h&#62;</div><div class="code_line">#endif</div><div class="code_line">// ============================ КОНСТАНТЫ ==============================</div><div class="code_line">#define ISR_PIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2 //пин(менять перед объявлением библиотеки) </div><div class="code_line">&nbsp;</div><div class="code_line">#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)</div><div class="code_line">&nbsp;&nbsp; &nbsp;#if (ISR_PIN == PB2) || &nbsp;(ISR_PIN == B2) || &nbsp;(ISR_PIN == 2) || defined (ISR_PIN == 7)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EICRA &nbsp; _SFR_IO8(0x35)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISC00 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISC01 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EIMSK &nbsp; _SFR_IO8(0x3B)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define INT0 &nbsp; &nbsp;6</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EIFR _SFR_IO8(0x3A)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define INTF0 &nbsp; 6</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//OW Pin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PINS &nbsp; &nbsp;PINB</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN &nbsp; &nbsp; PINB2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PORT &nbsp; &nbsp;PORTB//_SFR_IO8(0x18)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define DDR &nbsp; &nbsp; DDRB</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN_INT ISR(INT0_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISR_INIT 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;#endif</div><div class="code_line">#elif defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)</div><div class="code_line">&nbsp;&nbsp; &nbsp;#if (ISR_PIN == PB2) || &nbsp;(ISR_PIN == B2) || &nbsp;(ISR_PIN == 2) || defined (ISR_PIN == 5)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EICRA &nbsp; _SFR_IO8(0x35)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISC00 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISC01 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EIMSK &nbsp; _SFR_IO8(0x3B)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define INT0 &nbsp; &nbsp;6</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define EIFR _SFR_IO8(0x3A)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define INTF0 &nbsp; 6</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//OW Pin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PINS &nbsp; &nbsp;PINB</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN &nbsp; &nbsp; PINB2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PORT &nbsp; &nbsp;PORTB//_SFR_IO8(0x18)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define DDR &nbsp; &nbsp; DDRB</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN_INT ISR(INT0_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISR_INIT 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;#endif</div><div class="code_line">#elif defined (__AVR_ATmega328P__)</div><div class="code_line">&nbsp;&nbsp; &nbsp;#if (ISR_PIN == 2) || (ISR_PIN == D2) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//OW Pin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PINS _SFR_IO8(0x09)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN &nbsp; PIND2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PORT _SFR_IO8(0x0B)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define DDR &nbsp;_SFR_IO8(0x0A)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN_INT ISR(INT0_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISR_INIT 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;#endif</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;#if &nbsp;(ISR_PIN == 3) &nbsp;|| (ISR_PIN == D3) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//OW Pin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PINS _SFR_IO8(0x09)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN &nbsp; PIND3</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PORT _SFR_IO8(0x0B)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define DDR &nbsp;_SFR_IO8(0x0A)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN_INT ISR(INT1_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define ISR_INIT 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#if defined ISR_INIT</div><div class="code_line">&nbsp;</div><div class="code_line">//OW Pin</div><div class="code_line">#define OW_PORT PORT //1 Wire Port</div><div class="code_line">#define OW_PIN PINS //1 Wire Pin as number</div><div class="code_line">#define OW_PORTN (1&#60;&#60;PIN) &nbsp;//Pin as bit in registers</div><div class="code_line">#define OW_PINN (1&#60;&#60;PIN)</div><div class="code_line">#define OW_DDR DDR &nbsp;//регистр направления</div><div class="code_line">#define SET_LOW {OW_DDR|=OW_PINN;OW_PORT&amp;=~OW_PORTN;} &nbsp;//установить линию 1-Wire на низкий уровень</div><div class="code_line">#define RESET_LOW {OW_DDR&amp;=~OW_PINN;} &nbsp;//установить вывод 1-Wire в качестве входа</div><div class="code_line">&nbsp;</div><div class="code_line">//Pin interrupt</div><div class="code_line">#define EN_INT {EIMSK|=(1&#60;&#60;INT0);EIFR|=(1&#60;&#60;INTF0);} &nbsp;//enable interrupt </div><div class="code_line">#define DIS_INT &nbsp;EIMSK&amp;=~(1&#60;&#60;INT0); &nbsp;//disable interrupt</div><div class="code_line">#define SET_RISING EICRA=(1&#60;&#60;ISC01)|(1&#60;&#60;ISC00); &nbsp;//set interrupt at rising edge</div><div class="code_line">#define SET_FALLING {EICRA &amp;= ~(1 &#60;&#60; ISC00);EICRA|=(1&#60;&#60;ISC01);} //set interrupt at falling edge</div><div class="code_line">#define SET_CHANGE {EICRA &amp;= ~(1 &#60;&#60; ISC01) ;EICRA|=(1&#60;&#60;ISC00);}//set interrupt at change edge</div><div class="code_line">#define CHK_INT_EN (EIMSK&amp;(1&#60;&#60;INT0))==(1&#60;&#60;INT0) //test if interrupt enabled</div><div class="code_line">&nbsp;</div><div class="code_line">class _ISR {</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; void proc();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; void(*CallbackCommand_)(uint8_t retv);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; friend void INTP();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_ISR();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;void begin(void (*callback)(uint8_t retv));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">};</div><div class="code_line">#endif</div><div class="code_line">#endif</div></ol></div></div></div></div><br>
<br>
файл _ISR.cpp<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &quot;Arduino.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">#include &quot;_ISR.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">/* Access variable for ISRs */</div><div class="code_line">static _ISR *instance = NULL;</div><div class="code_line">void (*p_function)(); &nbsp; // указатель на p_function</div><div class="code_line">_ISR::_ISR(){}// конструктор</div><div class="code_line">&nbsp;</div><div class="code_line">PIN_INT {//прерывание</div><div class="code_line">&nbsp;&nbsp;(*p_function)();</div><div class="code_line">}</div><div class="code_line">// спасибо Гайверу за универсальную функцию</div><div class="code_line">void attachFunction(void (*function)()) { // передача указателя на функцию</div><div class="code_line">&nbsp;&nbsp;p_function = *function;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void INTP(){</div><div class="code_line">&nbsp;&nbsp; &nbsp;instance-&#62;proc();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void _ISR::proc(){</div><div class="code_line">&nbsp;&nbsp; &nbsp;CallbackCommand_(0x01);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void _ISR::begin(void (*callback)(uint8_t retv)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;cli();//откл. глоб.прер.</div><div class="code_line">&nbsp;&nbsp; &nbsp;RESET_LOW;//пин на вход</div><div class="code_line">&nbsp;&nbsp; &nbsp;SET_FALLING;</div><div class="code_line">&nbsp;&nbsp; &nbsp;EN_INT;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sei(); // enable interrupts</div><div class="code_line">&nbsp;&nbsp; &nbsp;attachFunction(INTP);</div><div class="code_line">&nbsp;&nbsp; &nbsp;instance = this;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CallbackCommand_ = callback;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
файл tst_ISR_on_CLASS.ino<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;_ISR.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">_ISR tst;</div><div class="code_line">void INT(uint8_t retv);</div><div class="code_line">void setup() {</div><div class="code_line">&nbsp;&nbsp;Serial.begin(9600);</div><div class="code_line">&nbsp;&nbsp;tst.begin(&amp;INT);</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void loop() {</div><div class="code_line">&nbsp;&nbsp;// put your main code here, to run repeatedly:</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void INT(uint8_t retv){</div><div class="code_line">&nbsp;&nbsp;Serial.println(&quot;OK&quot;);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
код для второй ардуины для теста (просто шлем импульсы на вход прерывания второй ардуины<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#define INT 4</div><div class="code_line">void setup() {</div><div class="code_line">&nbsp;pinMode(INT, OUTPUT);</div><div class="code_line">&nbsp;pinMode(LED_BUILTIN, OUTPUT);</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void loop() {</div><div class="code_line">&nbsp;&nbsp;delay(1000);</div><div class="code_line">&nbsp;&nbsp;digitalWrite(INT,1);</div><div class="code_line">&nbsp;&nbsp;digitalWrite(LED_BUILTIN,1);</div><div class="code_line">&nbsp;&nbsp;delay(200);</div><div class="code_line">&nbsp;&nbsp;digitalWrite(INT,0);</div><div class="code_line">&nbsp;&nbsp;digitalWrite(LED_BUILTIN,0);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
тема закрыта, всем спасибо&#33;  :)]]></description>
        <author>SOY</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866542</guid>
        <pubDate>Thu, 26 May 2022 12:56:24 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866542</link>
        <description><![CDATA[Qraizer: AVR-ка да, недавно с нею разбирался. 2048 прерываний – настоящий монстр. Я-то думал, ARM жестокий, PPC по сравнению с ним просто чуточку неудобный.<br>
<strong class='tag-b'>SOY</strong>, простое решение вряд ли возможно будет найти. Насколько я понимаю, у тебя архитектура предусматривает по экземпляру класса на каждый обработчик. Тут надо как-то связать pin с этим экземпляром, + обеспечить корректную передачу this. Вариантов масса, включая бинд этих this в лямбды, которые уже несложно вызывать без параметров. Но я очень сомневаюсь, что компилятор сможет в исполнительном окружении обеспечить корректный вызов лямбд, учитывая, что это происходит асинхронно.<br>
Я бы всё-таки в подобных условиях сделал собственный диспетчер, который определял нужный экземпляр this по тому pin, который сработал. В той же AVR-ки иначе и никак не сделать-то. Та и в PPC архитектура внешних прерываний способствует этому же. Диспетчер же вполне можно сделать static, и пусть себе читает регистры и определяет pin.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866534</guid>
        <pubDate>Thu, 26 May 2022 09:12:54 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866534</link>
        <description><![CDATA[Dushevny: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;switch (Interrupt_pin) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case 2:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; EN_INT0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN_INT ISR(INT0_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case 3:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; EN_INT1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#define PIN_INT ISR(INT1_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return;</div></ol></div></div></div></div></div></div>Это работать не будет. Препроцессор работает до компилятора, он не видит switch и выдаст здесь что-то вроде &quot;macro PIN_INT redefined&quot;<br>
<br>
&quot;Подвесить&quot; функцию-член прямо на вектор прерывания невозможно. Просто потому что семантика вызова функции-члена другая - в момент вызова обработчика у ядра нет this. Для всяких Cortex-Mx можно &quot;подвесить&quot; на вектор статическую функцию - член, но ей все равно нужно откуда-то брать this для вызова уже собственно функции-члена для конкретного экземпляра класса. Для AVR даже это не работает из-за особого подхода к привязыванию функций-обработчиков к векторам через магические имена функций - все то, что скрыто внутри ISR(INT0_vect). На электрониксе обсуждали не так давно, в общем - не решается эта задача так, как вам хочется. Я бы использовал шаблон с номером вывода в качестве параметра. Чтобы не плодить кучу одинакового исполняемого кода - можно общую функциональность вынести в базовый класс, а в шаблоне реализовать только то, что зависит он номера вывода. Примерно так:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class int_pin_base</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; inline void hander();</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">tempalte&#60;uint8_t int_num&#62;</div><div class="code_line">class int_pin : public int_pin_base</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;enum class trigger</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LOW_LEVEL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ANY_EDGE,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FALLING_EDGE</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;RISING_EDGE</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;int_pin(trigger trigger) &nbsp; &nbsp; &nbsp; &nbsp;{ EICRA = (EICRA &amp; ~(0x03 &#60;&#60; 2 * int_num)) | (uint8_t(trigger) &#60;&#60; 2 * int_num);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void enable() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { EIMSK |= &nbsp; 1 &#60;&#60; int_num; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;void disable() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ EIMSK &amp;= ~(1 &#60;&#60; int_num); }</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">/* &nbsp; или так, если реализации сильно отличаются в зависимости от параметра шаблона</div><div class="code_line">template&#60;&#62;</div><div class="code_line">int_pin&#60;0&#62;::int_pin(trigger trigger)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;EICRA = (EICRA &amp; ~(1 &#60;&#60; (ISC01 | ISC00))) | (uint8_t(trigger) &#60;&#60; ISC00);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60;&#62;</div><div class="code_line">int_pin&#60;1&#62;::int_pin(trigger trigger)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;EICRA = (EICRA &amp; ~(1 &#60;&#60; (ISC11 | ISC10))) | (uint8_t(trigger) &#60;&#60; ISC10);</div><div class="code_line">}</div><div class="code_line">*/</div><div class="code_line">&nbsp;</div><div class="code_line">int_pin&#60;0&#62; Int0(ANY_EDGE);</div><div class="code_line">int_pin&#60;1&#62; Int1(RISING_EDGE);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">ISR(INT0_vect)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Int0.handler();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">ISR(INT1_vect)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Int1.handler();</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866492</guid>
        <pubDate>Wed, 25 May 2022 20:20:00 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866492</link>
        <description><![CDATA[Majestio: Я конечно соррь в ваших терках ... но, ЕМНИП, связывание идет на уровне линковки - а линкеру пофик ваши классы&#33; <br>И адреса метода в классе быть попросту не может. Есть адрес метода объявленного объекта. <br>Но есть одно &quot;но&quot;, на этапе компиляции - можно узнать позицию(индекс) виртуального метода в VMT.<br>На счет невиртуального метода - я ХЗ. Может кто-то разъяснит процедуру компиляции и линковки классов - я увы, пас.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866481</guid>
        <pubDate>Wed, 25 May 2022 17:36:06 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866481</link>
        <description><![CDATA[shm: <strong class='tag-b'>SOY</strong>, я не понимаю проблему, которую ты пытаешься решить. У тебя один источник прерывания и один класс, который его обрабатывает. Что тут еще изобретать? Если у тебя несколько источников прерываний и ты каждый из них хочешь обрабатывать в своем объекте, то создай глобальный контейнер указателей на объекты и по какому-нибудь критерию (номер прерывания, id устройства, и т.п.) доставай указатель и дергай через него метод. Только не забывай корректно синхронизировать доступ к контейнеру, иначе будут проблемы. Вангую, что ты хочешь аналог std::bind для прерываний, так его нет по причине слишком низкого уровня обработчика, но ты можешь сделать что-то подобное самостоятельно. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-05-25T17:38:58+00:00">25.05.22, 17:38</time></span></span><br>
И приведенный тобою фрагмент кода не является синглтоном. Более того, он потенциально опасен, а в обработчике прерывания опасен^2.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866475</guid>
        <pubDate>Wed, 25 May 2022 16:56:57 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866475</link>
        <description><![CDATA[SOY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427467&view=findpost&p=3866471'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2022-05-25T15:41:43+00:00">25.05.22, 15:41</time></span><div class='quote '>SOY, для обработки прерывания могу предложить только синглтон, причем создание инстанса должно быть до первого срабатывания.</div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Class OWSlvDevice {</div><div class="code_line">&nbsp;&nbsp; &nbsp;static OWSlvDevice * instances;</div><div class="code_line">&nbsp;&nbsp; &nbsp;static void ShllFnc() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (OWSlvDevice::instances != NULL)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;OWSlvDevice::instances -&#62;INT ();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;OWSlvDevice(byte Interrupt_pin) { // конструктор</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;byte Vctr = Itnrrpt.Pin(Interrupt_pin);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (Vctr != 0xFF) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pinMode (Interrupt_pin, INPUT_PULLUP);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;attachInterrupt (Vctr, ShllFnc, FALLING);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;instances &nbsp;= this;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp;private:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void INT() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (comm == SEARCH_DEVICE)CreateObject();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;void CreateObject() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;.</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;};</div></ol></div></div></div></div><br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Как вариант конечно можно использовать конструкцию attachInterrupt(pin, handler, mode);, но в моем случае это не айс, хотя работает</div></div><br>
<br>
shm,если есть другие варианты, то буду при много благодарен.]]></description>
        <author>SOY</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866471</guid>
        <pubDate>Wed, 25 May 2022 15:41:43 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866471</link>
        <description><![CDATA[shm: <strong class='tag-b'>SOY</strong>, для обработки прерывания могу предложить только синглтон, причем создание инстанса должно быть до первого срабатывания.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866470</guid>
        <pubDate>Wed, 25 May 2022 15:20:37 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866470</link>
        <description><![CDATA[SOY: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>Dushevny</span><div class='quote '>Может вы опишете задачу более подробно и мы посоветуем, как обойтись вообще без указателя на функцию-член?</div></div><br>
задача организовать аппаратное прерывание внутри класса.<br>
макросы: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#define EN_INT0 {EICRA &amp;= ~(1 &#60;&#60; ISC00);EICRA|= (1 &#60;&#60; ISC01);EIMSK|=(1 &#60;&#60; INT0);} </div><div class="code_line">#define EN_INT1 {EICRA &amp;= ~(1 &#60;&#60; ISC10);EICRA|= (1 &#60;&#60; ISC11);EIMSK|=(1&#60;&#60;INT1);}</div></ol></div></div></div></div><br>
В зависимости от используемого пина выбираем нужную установку регистров и вектор прерывания:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">byte Pin(const byte &nbsp;Interrupt_pin) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(Interrupt_pin==2){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; EN_INT0 </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; #define PIN_INT ISR(INT0_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;#elif defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(Interrupt_pin==2){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; EN_INT0 </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; #define PIN_INT ISR(INT0_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;#elif defined (__AVR_ATmega328P__)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;switch (Interrupt_pin) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case 2:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; EN_INT0 </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; #define PIN_INT ISR(INT0_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case 3:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; EN_INT1 </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; #define PIN_INT ISR(INT1_vect) &nbsp;// the interrupt service routine</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div> <br>
далее обработчик прерывания<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">PIN_INT{</div><div class="code_line">&nbsp;</div><div class="code_line">}</div></ol></div></div></div></div> <br>
надо использовать внутри класса. Однако это не удается без танцев с бубном. Либо объявлять все методы static в области public, либо вызывать методы по адресу функции, что я пытаюсь осуществить.<br>
Как вариант конечно можно использовать конструкцию attachInterrupt(pin, handler, mode);, но в моем случае это не айс, хотя работает,но, опять таки с танцем с бубном :wall: .]]></description>
        <author>SOY</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866436</guid>
        <pubDate>Wed, 25 May 2022 09:47:53 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866436</link>
        <description><![CDATA[Dushevny: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427467&view=findpost&p=3866398'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>SOY &#064; <time class="tag-quote__quoted-time" datetime="2022-05-25T06:16:22+00:00">25.05.22, 06:16</time></span><div class='quote '>Да, вот только вызов должен быть внутри класса</div></div>Сдается, вы пытаетесь в плюсах применить сишные навыки и вручную организовать виртуальные функции. Может вы опишете задачу более подробно и мы посоветуем, как обойтись вообще без укателя на функцию-член?]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866435</guid>
        <pubDate>Wed, 25 May 2022 09:39:54 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866435</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427467&view=findpost&p=3866398'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>SOY &#064; <time class="tag-quote__quoted-time" datetime="2022-05-25T06:16:22+00:00">25.05.22, 06:16</time></span><div class='quote '>но, как теперь вызвать ее внутри модуля, если метод вызывающий ее находится вне класса?</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427467&view=findpost&p=3866384'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-05-24T17:20:57+00:00">24.05.22, 17:20</time></span><div class='quote '>(shelezjaka.*ptrFnc)();</div></div>]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866398</guid>
        <pubDate>Wed, 25 May 2022 06:16:22 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866398</link>
        <description><![CDATA[SOY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427467&view=findpost&p=3866384'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-05-24T17:20:57+00:00">24.05.22, 17:20</time></span><div class='quote '>Вот так работать будет.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void (OWSlvDevice::*ptrFnc)();</div></ol></div></div></div></div><br>
</div></div><br>
Блин, как я об этом не подумал...<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427467&view=findpost&p=3866384'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-05-24T17:20:57+00:00">24.05.22, 17:20</time></span><div class='quote '>Но и вызывать придётся иначе. Нужно указывать экземпляр класса, чей метод дёргаешь. Логично ж?<br>
Что-то типа:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">OWSlvDevice shelezjaka(6);</div><div class="code_line"> </div><div class="code_line">/* ... */</div><div class="code_line">shelezjaka.*ptrFnc();</div><div class="code_line">OWSlvDevice::ptrFnc = OWSlvDevice::CreateObject;</div></ol></div></div></div></div><br>
</div></div><br>
Да, вот только вызов должен быть внутри класса, и к тому же при присвоении значения этой переменной <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">ptrFnc = &CreateObject;OWSlvDevice::ptrFnc = OWSlvDevice::CreateObject;</div></ol></div></div></div></div> компилятор опять злится: n file included from C:&#092;...&#092;...&#092;TX&#092;TX.ino:1:0:<br>
sketch&#092;OWSlvDevice.h: In member function &#39;void OWSlvDevice::begin(uint8_t)&#39;:<br>
OWSlvDevice.h:64:41: error: cannot convert &#39;OWSlvDevice::CreateObject&#39; from type &#39;void (OWSlvDevice::)()&#39; to type &#39;void (OWSlvDevice::*)()&#39;<br>
      OWSlvDevice::ptrFnc = OWSlvDevice::CreateObject;<br>
                                         ^~~~~~~~~~~~<br>
exit status 1<br>
cannot convert &#39;OWSlvDevice::CreateObject&#39; from type &#39;void (OWSlvDevice::)()&#39; to type &#39;void (OWSlvDevice::*)()&#39;<br>
за то вот так:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;ptrFnc = &CreateObject;</div></ol></div></div></div></div> работает,<br>
но, как теперь вызвать ее внутри модуля, если метод вызывающий ее находится вне класса?<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">PIN_INT{</div><div class="code_line">&nbsp;(OWSlvDevice.*ptrFnc)();</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>SOY</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866384</guid>
        <pubDate>Tue, 24 May 2022 17:20:57 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866384</link>
        <description><![CDATA[Qraizer: Типы не совпадают. И не могут совпадать. И не смогут никогда. :) Тип указателя на метод кардинально отличается от типа указателя на функцию.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void (OWSlvDevice::*ptrFnc)();</div></ol></div></div></div></div><br>
Вот так работать будет. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-05-24T17:23:32+00:00">24.05.22, 17:23</time></span></span><br>
Но и вызывать придётся иначе. Нужно указывать экземпляр класса, чей метод дёргаешь. Логично ж?<br>
Что-то типа:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">OWSlvDevice shelezjaka(6);</div><div class="code_line">&nbsp;</div><div class="code_line">/* ... */</div><div class="code_line">shelezjaka.*ptrFnc();</div></ol></div></div></div></div><br>
Возможно скобки забыл. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-05-24T17:38:06+00:00">24.05.22, 17:38</time></span></span><br>
P.S. Ну да, забыл. Вот так надо:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">(shelezjaka.*ptrFnc)();</div></ol></div></div></div></div>]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866379</guid>
        <pubDate>Tue, 24 May 2022 15:47:43 +0000</pubDate>
        <title>получить указатель на функцию внутри класса</title>
        <link>https://forum.sources.ru/index.php?showtopic=427467&amp;view=findpost&amp;p=3866379</link>
        <description><![CDATA[SOY: Прувет, народ&#33; Вопрос больше для ардуинщиков, но и относится к Си.<br>
Всю голову сломал, помогите, в поиске ответы уж очень заумные.<br>
Требуется вызвать функцию внутри класса по указателю. при попытке получить указатель компилятор ругается.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">uint8_t ADDR;</div><div class="code_line">void (*ptrFnc)();</div><div class="code_line">&nbsp;</div><div class="code_line">class OWSlvDevice {</div><div class="code_line">&nbsp;&nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;OWSlvDevice(byte Interrupt_pin){// конструктор</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Itrrpt.Pin(Interrupt_pin);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void begin(uint8_addr) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ADDR = addr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ptrFnc = CreateObject;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;private:</div><div class="code_line">&nbsp;&nbsp; &nbsp;void CreateObject(){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;//код</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
компилятор выдает ошибку:<br>
<br>
In file included from C:&#092;...&#092;...&#092;T...&#092;TX.ino:1:0:<br>
sketch&#092;OWSlvDevice.h: In member function &#39;void OWSlvDevice::begin(uint8_t)&#39;:<br>
OWSlvDevice.h:63:14: error: cannot convert &#39;OWSlvDevice::CreateObject&#39; from type &#39;void (OWSlvDevice::)()&#39; to type &#39;void (*)()&#39;<br>
       ptrFnc=CreateObject;<br>
              ^~~~~~~~~~~~<br>
exit status 1<br>
cannot convert &#39;OWSlvDevice::CreateObject&#39; from type &#39;void (OWSlvDevice::)()&#39; to type &#39;void (*)()&#39;<br>
Что не так, подскажите&#33;]]></description>
        <author>SOY</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	