<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=22979&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-04-03T07:38:04+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=22979&amp;mode</id>
<entry>
<author><name><![CDATA[abel11]]></name></author>
<updated>2020-04-03T07:38:04+01:00</updated>
<published>2020-04-03T07:38:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225821#p225821</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225821#p225821"/>
<title type="html"><![CDATA[Re: Wskaźnik i funkcja w strukturze]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225821#p225821"><![CDATA[
Otrzymałem odpowiedź w sprawie hex error, umieszczam ją tu dla porządku.<br /><br />Środowisko:<br />MPLAB X ver 5.30, kompilator XC16 ver 1.50<br /><br />Problem:<br />MPLAB X ver 5.30 po skopiowaniu projektu może generować błąd niewykonalnego/nieistniejącego hex'a.<br /><br />Rozwiązanie:<br />Zmusić MPLAB X do ponownego wygenerowania nbproject/Makefile-default.mk, np. poprzez usunięcie go lub przełączenie kompilatora na inną wersję (można wrócić do najnowszej po przeładowaniu projektu).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17861">abel11</a> — 3 kwi 2020, o 07:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[abel11]]></name></author>
<updated>2020-03-31T10:23:21+01:00</updated>
<published>2020-03-31T10:23:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225724#p225724</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225724#p225724"/>
<title type="html"><![CDATA[Re: Wskaźnik i funkcja w strukturze]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225724#p225724"><![CDATA[
O coś takiego mi chodziło tyle, że pomimo kompilacji bez błędów na koniec dostaje komunikat jak niżej - dlatego wcześniej odrzuciłem ten pomysł i poszedłem w wskaźniki (na których nie dostaje tego błędu). Może coś jest skopane w ustawieniach projektu, bo nie chce mi się wierzyć, że wpadłeś na identycznie błędny pomysł jak ja.<br />Sprawdzę ustawienia projektu i zobaczę czy dalej będzie generowało uszkodzonego hex'a.<br /><br /><a href="https://obrazkiforum.atnel.pl/17861/845798ccd65d25221fc99274a30d9c66.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/17861/845798ccd65d25221fc99274a30d9c66.png" alt="Obrazek" /></a><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 50 minutach ]</span></strong><br /><br />Na starszej wersji kompilatora rozwiązanie zaproponowane przez kolegę fofex działa poprawnie, na nowszej ciągle otrzymuje błąd z hex'em - poszedł ticket do MCP.<br />Dzięki za pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17861">abel11</a> — 31 mar 2020, o 10:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2020-03-31T09:51:05+01:00</updated>
<published>2020-03-31T09:51:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225723#p225723</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225723#p225723"/>
<title type="html"><![CDATA[Re: Wskaźnik i funkcja w strukturze]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225723#p225723"><![CDATA[
[syntax=c]struct Buffer;<br />    typedef struct Buffer{<br />       <br />...<br />       <br />        /// Read filtered sample function<br />        bool (*ReadFilteredSample)(signed _Fract* , struct Buffer*);<br />       <br />...<br />    }Buffer;[/syntax]<br /><br />lub<br /><br />[syntax=c]typedef struct Buffer Buffer;<br />struct Buffer{<br />       <br />...<br />       <br />        /// Read filtered sample function<br />        bool (*ReadFilteredSample)(signed _Fract* , Buffer*);<br />       <br />...<br />    };[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 31 mar 2020, o 09:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[abel11]]></name></author>
<updated>2020-03-31T09:41:09+01:00</updated>
<published>2020-03-31T09:41:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225722#p225722</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225722#p225722"/>
<title type="html"><![CDATA[Re: Wskaźnik i funkcja w strukturze]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225722#p225722"><![CDATA[
Dzięki za radę.<br />Niestety tą metodą otrzymam konflikt typów, przez słowo kluczowe typedef ta opcja nie wchodziła w gre wcześniej. Być może coś mi umknęło i da się to obejść w ten sposób tylko jeszcze nie wiem jak.<br /><br />[syntax=c]typedef struct Buffer_t Buffer_t;<br />typedef struct{<br />    <br />    /// Main buffer ptr (ISR editable)<br />    volatile unsigned _Fract * volatile buffer;<br />    <br />    /// Write, sample data pointer (ISR editable)<br />    volatile unsigned _Fract * volatile buffWritePtr;<br />    <br />    /// Read, sample data pointer (ISR non editable)<br />    volatile unsigned _Fract * volatile buffReadPtr;<br />    <br />    /// Number of filtered samples<br />    uint16_t numberOfFilteredSamples;<br />    <br />    /// Sample offset value<br />    unsigned _Fract sampleOffset;<br />    <br />    /// Read filtered sample function<br />    bool (*ReadFilteredSample)(signed _Fract* ,  Buffer_t*);<br />    <br />    /// Overflow flag (ISR editable)<br />    volatile bool bufferOverflow;<br />    <br />    /// Calculated buffer size<br />    volatile uint16_t buffSize;<br />    <br />}Buffer_t;<br />extern Buffer_t volatile DataSamplesL1;[/syntax]<br /><br />[syntax=c]mcc_generated_files/adc1.h:133:2: error: conflicting types for 'Buffer_t'<br />mcc_generated_files/adc1.h:106:25: note: previous declaration of 'Buffer_t' was here[/syntax]<br /><br />edit:<br />Nie dodałem w pierwszym poście informacji o C w wersji C99<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17861">abel11</a> — 31 mar 2020, o 09:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2020-03-31T09:17:11+01:00</updated>
<published>2020-03-31T09:17:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225721#p225721</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225721#p225721"/>
<title type="html"><![CDATA[Re: Wskaźnik i funkcja w strukturze]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225721#p225721"><![CDATA[
<div class="quotetitle">abel11 napisał(a):</div><div class="quotecontent"><br />czy da się to zrobić nieco prościej bez wskaźnika typu void i rzutowania różnych typów na siebie<br /></div><br />Deklarujesz typ przed jego definicją:<br /><br />[syntax=c]typedef struct Buffer Buffer;<br />typedef struct Buffer{<br />   <br />    /// Main buffer &lt;&lt;ISR editable&gt;&gt;<br />    volatile unsigned _Fract * volatile buffer;<br />   <br />    /// Write nacked data pointer &lt;&lt;ISR editable&gt;&gt;<br />    volatile unsigned _Fract * volatile buffWritePtr;<br /> <br />    /// Read filtered data pointer<br />    volatile unsigned _Fract * volatile buffReadPtr;<br />   <br />    /// Number of filtered samples<br />    uint16_t numberOfFilteredSamples;<br />   <br />    /// Sample offset value<br />    unsigned _Fract sampleOffset;<br />   <br />    /// Read filtered sample function<br />    bool (*ReadFilteredSample)(signed _Fract* , Buffer*);<br />   <br />    /// Overflow flag &lt;&lt;ISR editable&gt;&gt;<br />    volatile bool bufferOverflow;<br />   <br />    /// Calculated buffer size<br />    volatile uint16_t buffSize;<br />   <br />}Buffer;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 31 mar 2020, o 09:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[abel11]]></name></author>
<updated>2020-03-31T08:59:36+01:00</updated>
<published>2020-03-31T08:59:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225720#p225720</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225720#p225720"/>
<title type="html"><![CDATA[Wskaźnik i funkcja w strukturze]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22979&amp;p=225720#p225720"><![CDATA[
Hej wszystkim.<br /><br />Piszę program, w którym te same funkcje wykonują się wiele razy dla innych danych wejściowych, więc chce go nieco uprościć, wstawiając do struktur wskaźniki na funkcje (ala metody) oraz tworząc coś na kształt instancji. Tu pojawił się problem ponieważ z tego co wiem C nie wspiera tego typu operacji i trzeba to robić na piechotę.<br /><br />To co chce osiągnąć wyglądało by jak kod poniżej, gdyby nie to, że nie mogę wykorzystać typu Buffer_t jako argument wskaźnika na funkcję bool (*ReadFilteredSample)(signed _Fract* , Buffer_t*) w deklaracji struktury ponieważ to definicja Buffer_t więc kompilator nie będzie wiedział co tam wstawić.<br />[syntax=c]typedef struct{<br />    <br />    /// Main buffer &lt;&lt;ISR editable&gt;&gt;<br />    volatile unsigned _Fract * volatile buffer;<br />    <br />    /// Write nacked data pointer &lt;&lt;ISR editable&gt;&gt;<br />    volatile unsigned _Fract * volatile buffWritePtr;<br /><br />    /// Read filtered data pointer <br />    volatile unsigned _Fract * volatile buffReadPtr;<br />    <br />    /// Number of filtered samples<br />    uint16_t numberOfFilteredSamples;<br />    <br />    /// Sample offset value<br />    unsigned _Fract sampleOffset;<br />    <br />    /// Read filtered sample function<br />    bool (*ReadFilteredSample)(signed _Fract* , Buffer_t*);<br />    <br />    /// Overflow flag &lt;&lt;ISR editable&gt;&gt;<br />    volatile bool bufferOverflow;<br />    <br />    /// Calculated buffer size<br />    volatile uint16_t buffSize;<br />    <br />}Buffer_t;<br />extern Buffer_t volatile DataSamplesL1;[/syntax]<br /><br />Alternatywą jest przerobienie funkcji bool ReadFilteredSample(signed _Fract* , Buffer_t*) na bool ReadFilteredSample(signed _Fract* ,  void*) i rzutowanie wewnątrz funkcji wskaźnika void* na wewnętrzną zmienną typu Buffer_t*.<br />[syntax=c]typedef struct{<br />    <br />    /// Main buffer ptr (ISR editable)<br />    volatile unsigned _Fract * volatile buffer;<br />    <br />    /// Write, sample data pointer (ISR editable)<br />    volatile unsigned _Fract * volatile buffWritePtr;<br />    <br />    /// Read, sample data pointer (ISR non editable)<br />    volatile unsigned _Fract * volatile buffReadPtr;<br />    <br />    /// Number of filtered samples<br />    uint16_t numberOfFilteredSamples;<br />    <br />    /// Sample offset value<br />    unsigned _Fract sampleOffset;<br />    <br />    /// Read filtered sample function<br />    bool (*ReadFilteredSample)(signed _Fract* ,  void*);<br />    <br />    /// Overflow flag (ISR editable)<br />    volatile bool bufferOverflow;<br />    <br />    /// Calculated buffer size<br />    volatile uint16_t buffSize;<br />    <br />}Buffer_t;<br />extern Buffer_t volatile DataSamplesL1;[/syntax]<br /><br />Funkcja ReadFilteredSample wyglądał by tak:<br />[syntax=c]bool ReadFilteredSample(signed _Fract* sample, void* buffPtr){<br />    <br />    Buffer_t *buffer = buffPtr;<br />    <br />    if(buffer-&gt;bufferOverflow){<br />        // handle overflow condition<br />    }<br />    <br />    if(buffer-&gt;numberOfFilteredSamples &gt; 0 &amp;&amp; !buffer-&gt;bufferOverflow){<br />       // filter sample<br />        return true;<br />    }<br />    <br />    return false;<br />}[/syntax]<br /><br />Moje pytanie brzmi czy da się to zrobić nieco prościej bez wskaźnika typu void i rzutowania różnych typów na siebie - wydaje mi się że jest to mało bezpieczne rozwiązanie.<br /><br />Z góry dzięki za wszelkie rady!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17861">abel11</a> — 31 mar 2020, o 08:59</p><hr />
]]></content>
</entry>
</feed>