<?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=21615&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-12-04T20:16:29+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=21615&amp;mode</id>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-12-04T20:16:29+01:00</updated>
<published>2018-12-04T20:16:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214354#p214354</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214354#p214354"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214354#p214354"><![CDATA[
<div class="quotetitle">P3ndz3l3k napisał(a):</div><div class="quotecontent"><br />A apropo przekazania wskaźnika do całej struktury to musiał bym dużo kombinować bo mam w tej strukturze kopię wszystkich rejestrów tego układu TDA7418 a jest ich 14 każdy to uint8_t i do tego 10 intów do przechowywania wartości i zmiany.<br /></div><br />Wprawdzie nie znam szczegółów, ale wydaje mi się, że to raczej nie jest problem. Przecież i tak musisz pobrać adresy odpowiednich elementów struktury, więc czy zrobisz to przed wywołaniem funkcji, czy też dopiero wewnątrz funkcji nie powinno stanowić większej różnicy, a przekazanie całej struktury mogłoby rozwiązać problem kolejności argumentów i uczyniło funkcję bardziej uniwersalną.<br /><br />No ale mogę się mylić, bo nie znam dokładnie Twojej ogólnej koncepcji programu. Nie będę już w takim razie narzucał się ze swoją pomocą i psuł Ci frajdy z odkrywania zawiłości języka C oraz satysfakcji z samodzielnego napisania kodu.<br /><br />Życzę powodzenia w kodowaniu i pozdrawiam <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br />   Andrzej<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 4 gru 2018, o 20:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[P3ndz3l3k]]></name></author>
<updated>2018-12-04T19:23:55+01:00</updated>
<published>2018-12-04T19:23:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214347#p214347</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214347#p214347"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214347#p214347"><![CDATA[
No wiesz nie zabardzo chciałem zawracać głowy tym moim całym projektem ale jak go skończę to postaram sie opisać o co chodzi wstawić do DIY.<br />A także ciężko jednak pisząc przekazać dokładnie co się chce zrobić.<br />To jak pisanie 100 SMS-ów duzo szybciej można przekazać w 30s rozmowy.<br /><br />A apropo przekazania wskaźnika do całej struktury to musiał bym dużo kombinować bo mam w tej strukturze kopię wszystkich rejestrów tego układu TDA7418 a jest ich 14 każdy to uint8_t i do tego 10 intów do przechowywania wartości i zmiany.<br /><br />Jeszcze raz bardzo ci dziękuję fajnie, że masz wiedzę i chęć pomocy takim początkującym.<br /><br />Pozdrawiam Paweł.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3709">P3ndz3l3k</a> — 4 gru 2018, o 19:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-12-04T18:43:48+01:00</updated>
<published>2018-12-04T18:43:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214345#p214345</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214345#p214345"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214345#p214345"><![CDATA[
<div class="quotetitle">P3ndz3l3k napisał(a):</div><div class="quotecontent"><br />Nie pisałem tego wcześniej ale te zmienne mam umieszczone wewnątrz struktury ale z punktu widzenia wskaźników nie ma to znaczenia chyba?<br /></div><br />Obydwa argumenty są elementami tej samej struktury? A może chociaż takiej samej struktury? Można przecież przekazywać do funkcji wskaźnik(i) na całą strukturę i dopiero wewnątrz operować na konkretnych elementach struktury w zależności np. od wartości argumentu direction. Jeśli przekażesz do funkcji wskaźnik na strukturę, to typy poszczególnych jej elementów będą znane wewnątrz definicji funkcji. Przekazywane do funkcji wskaźniki są 16-bitowe niezależnie od tego, na co wskazują, więc nie wpłynie to jakoś niekorzystnie na rozmiar kodu czy szybkość wykonania.<br /><br />Niestety Twój opis jest zbyt ogólny, żeby doradzić coś konkretnego.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 4 gru 2018, o 18:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[P3ndz3l3k]]></name></author>
<updated>2018-12-04T17:53:00+01:00</updated>
<published>2018-12-04T17:53:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214342#p214342</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214342#p214342"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214342#p214342"><![CDATA[
Witaj<br /><br />Widzę, że jesteś już zaawansowanym programistą ja jak już pisałem uczę się i właśnie zaczynam używać wskaźników.<br />No i właśnie przyszedł mi taki pomysł z tymi różnymi typami bo Mirek zawsze w poradnikach mówi aby myśleć przyszłościowo i nie pisać <br />dziesięciu prawie jednakowych procedur a napisać jedną jak najbardziej uniwersalną.<br />Chyba chciałem za bardzo ją uniwersalną zrobić.<br />Z tąd ten pomysł, w moim programie gdzie potrzebuję użyć tej procedury będę wykorzystywał tylko dwa typy i aby nie kombinować, w wywołaniu tej procedury będę zamieniał poprostu miejscami te zmienne wstawiane jako argumenty.<br />A samą procedurę zadeklaruję poprostu na konkretne typy i będzie chulało.<br /><br />Nie pisałem tego wcześniej ale te zmienne mam umieszczone wewnątrz struktury ale z punktu widzenia wskaźników nie ma to znaczenia chyba?<br /><br />Bardzo ci dziękuję za wyjaśnienia.<br /><br />Pozdrawiam Paweł.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3709">P3ndz3l3k</a> — 4 gru 2018, o 17:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-12-04T09:13:34+01:00</updated>
<published>2018-12-04T09:13:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214312#p214312</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214312#p214312"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214312#p214312"><![CDATA[
<div class="quotetitle">P3ndz3l3k napisał(a):</div><div class="quotecontent"><br />Szkoda trochę bo przecież ta zmienna jest gdzieś w programie zdeklarowana więc kompilator powinien sobie znaleźć jej typ.<br /></div><br />A co jeśli np. wywołanie funkcji jest w innym pliku <strong><em>*.c</em></strong>. Pliki <strong><em>*.c</em></strong> śa kompilowane osobno do plików obiektowych, dopiero linker je łączy w jeden plik wykonywalny...<br />Nie tak łatwo wytłumaczyć, dlaczego tak się nie uda, a ja w tej chwili nie mam czasu, żeby się rozpisywać (może później). W każdym razie funkcja musi znać typ danych wewnątrz definicji, nie w momencie wywołania.<br />Jeśli chcesz ewentualnie zwiększyć funkcjonalność funkcji możesz użyć <strong><em>switch</em></strong> zamiast <strong><em>if</em></strong>:[syntax=c]void moje_obliczenia (void * input, void * output, uint8_t dir) {<br />   <br />union ptrs {<br />    uint8_t * ui8;<br />    int16_t * i16;<br />};<br />    union ptrs inp;<br />    union ptrs out;<br /> <br />    inp.ui8 = input;<br />    out.ui8 = output;<br /> <br />   switch (dir)<br />    {<br />        case 0:<br />            *inp.i16 = 10;              // zapis do zmiennej 16-bitowej<br />            *out.ui8 = 20 + *inp.i16;   // zapis do zmiennej  8-bitowej<br />            break;<br />        case 1:<br />            *inp.ui8 = 10;              // zapis do zmiennej  8-bitowej<br />            *out.i16 = 20 + *inp.ui8;   // zapis do zmiennej 16-bitowej<br />            break;<br />        // itd.<br />        default:<br />            break;<br />    }<br />}[/syntax]<br />Wtedy będziesz mógł przekazać więcej kombinacji różnych typów, ale tak czy inaczej to rozwiązanie dość kłopotliwe. Można też przekazać osobno typ każdego z argumentów.<br /><br />W przypadku stosunkowo prostych funkcji, można je zastąpić makrami (<em>function-like macro</em>):<br />[syntax=c]// bazując na Twoim przykladzie<br />#define moje_obliczenia(i,o) ({     \<br />                   i = 10;          \<br />                   o = 20 + i;      \<br />               })<br /><br /><br />    int input = 9;<br />    uint8_t output = 12;<br /><br />    // wywołanie<br />    moje_obliczenia(input, output);[/syntax]<br />Powinno zadziałać z (prawie) dowolnym typem (w tym przypadku kompilator będzie znał typ), ale takie rozwiązanie też ma swoje wady, jak np. to, że każde użycie takiego makra może znacząco zwiększać rozmiar kodu wynikowego. Makro działa trochę podobnie do funkcji inline, wstawiając za każdym razem kod w miejscu wywołania. Normalna funkcja to fragment kodu wielokrotnego użytku, dzięki czemu kod wynikowy jest zwykle mniejszy, szczególnie w przypadku częstego wywoływania takiej funkcji w różnych miejscach programu.<br /><br /><div class="quotetitle">Daro69 napisał(a):</div><div class="quotecontent"><br />zastanawiam się czy nie dałoby się coś pokombinować z sizeof.<br /></div><br />sizeof nic nie da w tym przypadku. Kompilator tutaj musi znać nie tylko rozmiar, ale dokładny typ zmiennych, bo (jeśli dobrze zrozumiałem) ma wykonywać na nich jakieś operacje arytmetyczne. Zmienne typu int32_t, uint32_t i float mają ten sam rozmiar, ale kompilator musi użyć innych algorytmów i instrukcji asm, żeby zrealizować operacje arytmetyczne na poszczególnych typach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 4 gru 2018, o 09:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[P3ndz3l3k]]></name></author>
<updated>2018-12-03T22:17:14+01:00</updated>
<published>2018-12-03T22:17:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214301#p214301</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214301#p214301"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214301#p214301"><![CDATA[
Poczytam jak działa sizeof ale on podaje chyba tylko rozmiar czyli ilość bajtów a nie typ.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3709">P3ndz3l3k</a> — 3 gru 2018, o 22:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2018-12-03T21:42:42+01:00</updated>
<published>2018-12-03T21:42:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214298#p214298</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214298#p214298"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214298#p214298"><![CDATA[
zastanawiam się czy nie dałoby się coś pokombinować z sizeof.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11549">Daro69</a> — 3 gru 2018, o 21:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[P3ndz3l3k]]></name></author>
<updated>2018-12-03T21:16:18+01:00</updated>
<published>2018-12-03T21:16:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214294#p214294</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214294#p214294"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214294#p214294"><![CDATA[
Witam kolegę<br /><br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Wskaźnik void to wskaźnik do zmiennej o nieokreślonym typie, więc również o nieokreślonym rozmiarze (w bajtach).<br /></div><br /><br />No widzisz bardzo mocno mi tym rozjasniłeś byłem święcie przekonany, że to void nie będzie wskaźnikiem na nieokreśloną zmienną ale, że własnie ten mój wskaźnik bedzie nieokreślonego typu i wtedy kiedy np. używając w pętli mojej procedury, będę mógł zrobić własnie rzutowanie dopasowane do mojej zmiennej czyli tak:<br /><br />[syntax=c]moje_obliczenia ( (int *) &amp;zmienna_a, (uint8_t *)&amp;zmienna_b);[/syntax]<br /><br />i wtedy kompilator by wiedział jaki typ zmiennej ale to nie działa niestety.<br /><br />Oczywiście tak jak mi napisałeś sposób z wewnętrznym rzutowaniem działa jednak w tym momencie procedura traci idee uniwersalności.<br /><br />Drugiego sposobu z podmianą typów jeszcze nie sprawdzałem ale napewno działa jednak dzięki temu można obsłużyć tylko 2 typy i podczas użycia tej procedury trzeba by było zawsze wybierać ten kierunek. Jak by dorzucić switcha to mozna by wszystkie typy uzywać ale wtedy to ta procedura by nieźle się rozrosła.<br /><br />Czyli generalnie mój pomysł z jakby automatycznym dopasowaniem typów jest nie wykonalny.<br /><br />Szkoda trochę bo przecież ta zmienna jest gdzieś w programie zdeklarowana więc kompilator powinien sobie znaleźć jej typ.<br />Mogło by być tak dafaultowo, że jesli nie rzutujemy wskaźnika na inny typ zawsze jest tym samym co zmienna.<br />Przecież podczas użycia normalnej zmiennej jako parametru nie trzeba podawać typu.<br /><br />Troche trudno mi opisać dokładnie co bym chciał zrobić.<br />Zawsze poczatkujący próbują zrobić coś czego nie da się zrobić bo nie widzą innego rozwiazania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3709">P3ndz3l3k</a> — 3 gru 2018, o 21:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-12-03T20:18:07+01:00</updated>
<published>2018-12-03T20:18:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214291#p214291</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214291#p214291"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214291#p214291"><![CDATA[
<div class="quotetitle">P3ndz3l3k napisał(a):</div><div class="quotecontent"><br />[syntax=c]void moje_obliczenia (void * input, void * output){<br /> <br />   *input = 10;                <br />   *output = 20 +  *input;<br />}[/syntax]<br /></div><br /><br />Postaram się wytłumaczyć jak najprościej. Wskaźnik void to wskaźnik do zmiennej o nieokreślonym typie, więc również o nieokreślonym rozmiarze (w bajtach). Kiedy przypisujesz zmiennej wartość 10 - <strong><em>*input = 10;</em></strong> - skąd kompilator ma wiedzieć do jakiego typu zmiennej wpisuje/czyta dane, czyli ile bajtów ma wpisać/wczytać?<br />Dereferencję powinieneś zrobić w ten sposób:[syntax=c]void moje_obliczenia (void * input, void * output){<br /> <br />   *( (int*)input ) = 10;                <br />   *( (uint8_t*)output ) = 20 +  *( (int*)input );<br />}[/syntax]<br />Jeśli chcesz natomiast, aby rzutować wskaźniki raz na jeden typ, a innym razem na drugi typ, musisz dodać argument, dzięki któremu funkcja będzie wiedziała jakiego rzutowania ma dokonać:<br />[syntax=c]void moje_obliczenia (void * input, void * output, uint8_t dir) {<br /><br />    if (dir)<br />    {<br />        *( (int*)input ) = 10;<br />        *( (uint8_t*)output ) = 20 + *( (int*) input );<br />    }<br />    else<br />    {<br />        *( (uint8_t*)input ) = 10;<br />        *( (int*)output ) = 20 + *( (uint8_t*) input );<br />    }<br />}[/syntax]<br /><br />By było czytelniej można użyć unii:<br />[syntax=c]void moje_obliczenia (void * input, void * output, uint8_t dir) {<br />    <br />union ptrs {<br />    uint8_t * ui8;<br />    int16_t * i16;<br />};<br />    union ptrs inp;<br />    union ptrs out;<br /><br />    inp.ui8 = input;<br />    out.ui8 = output;<br /><br />    if (dir)<br />    {<br />        *inp.i16 = 10;              // zapis do zmiennej 16-bitowej<br />        *out.ui8 = 20 + *inp.i16;   // zapis do zmiennej  8-bitowej<br />    }<br />    else<br />    {<br />        *inp.ui8 = 10;              // zapis do zmiennej  8-bitowej<br />        *out.i16 = 20 + *inp.ui8;   // zapis do zmiennej 16-bitowej<br />    }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 3 gru 2018, o 20:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[P3ndz3l3k]]></name></author>
<updated>2018-12-03T18:33:09+01:00</updated>
<published>2018-12-03T18:33:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214286#p214286</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214286#p214286"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214286#p214286"><![CDATA[
Dopiero z pracy wróciłem.<br /><br />      No więc doszedłem do tego, że prawidłowo powinno chyba być być tak:<br /><br />[syntax=c]void moje_obliczenia (void * input, void * output); // Deklaracja   <br /><br />void moje_obliczenia (void * input, void * output){ // Definicja <br />// jakieś obliczenia<br />}<br />     <br />moje_obliczenia ( &amp;zmienna_a, &amp;zmienna_b); // a w pętli używam np. tak<br /><br />// I już jest ok. kompiluje się[/syntax]<br /><br />Ale nie wiem teraz jak prawidłowo użyć tych wskaźników wewnątrz procedury: <br /><br />[syntax=c]// Jeśli używam tak <br /><br />void moje_obliczenia (void * input, void * output){ <br /><br />   *input = 10;                <br />   *output = 20 +  *input;<br />}<br />// To kompilator krzyczy:<br />/*<br />../TDA74xx/PB_TDA7418.c: In function 'moje_obliczenia':<br />../TDA74xx/PB_TDA7418.c:294:4: warning: dereferencing 'void *' pointer &#91;enabled by default&#93;<br />    *input = 10;<br />    ^<br />../TDA74xx/PB_TDA7418.c:294:4: error: invalid use of void expression<br />../TDA74xx/PB_TDA7418.c:295:4: warning: dereferencing 'void *' pointer &#91;enabled by default&#93;<br />    *output = 20 + *input;<br />    ^<br />../TDA74xx/PB_TDA7418.c:295:19: warning: dereferencing 'void *' pointer &#91;enabled by default&#93;<br />    *output = 20 + *input;<br />                   ^<br />../TDA74xx/PB_TDA7418.c:295:4: error: void value not ignored as it ought to be<br />    *output = 20 + *input;<br />    ^<br />../TDA74xx/PB_TDA7418.c:295:4: error: invalid use of void expression<br />make: *** &#91;TDA74xx/PB_TDA7418.o&#93; Błąd 1<br />*/<br /><br />// natomiast jeśli zamiast gwiazdek wstawię &amp;<br /><br />void moje_obliczenia (void * input, void * output){ <br /><br />   &amp;input = 10;                <br />   &amp;output = 20 +  &amp;nput;<br />}<br /><br />// To kompilator mi wywala<br /><br />/*<br />../TDA74xx/PB_TDA7418.c: In function 'moje_obliczenia':<br />../TDA74xx/PB_TDA7418.c:294:11: error: lvalue required as left operand of assignment<br />    &amp;input = 10;<br />           ^<br />../TDA74xx/PB_TDA7418.c:295:12: error: lvalue required as left operand of assignment<br />    &amp;output = 20 + &amp;input;<br />            ^<br />make: *** &#91;TDA74xx/PB_TDA7418.o&#93; Błąd 1<br />*/[/syntax]<br /><br />Już mi się zwoje mózgowe całkowicie poplątały.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3709">P3ndz3l3k</a> — 3 gru 2018, o 18:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-12-02T23:18:18+01:00</updated>
<published>2018-12-02T23:18:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214264#p214264</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214264#p214264"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214264#p214264"><![CDATA[
<div class="quotetitle">P3ndz3l3k napisał(a):</div><div class="quotecontent"><br />ale kiedy w programie próbuję użyć tak zadeklarowanej procedury to kompilator i tak się burzy.<br /></div><br />ale jak tak piszesz, to dokończ zawsze i napisz co to znaczy, że się burzy - czyli pokaż komunikat bo trudno się domyśleć .... a przecież tak może wyglądać nagłówek funkcji - w czym problem?<br /><br />[syntax=c]void fun( void *a, void *b, int a);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 gru 2018, o 23:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[P3ndz3l3k]]></name></author>
<updated>2018-12-02T22:24:32+01:00</updated>
<published>2018-12-02T22:24:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214262#p214262</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214262#p214262"/>
<title type="html"><![CDATA[Re: Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214262#p214262"><![CDATA[
Witam ponownie <br /><br />  Udało mi się napisać przeliczanie dzięki pomocy mojego kolegi który na co dzień programuje.<br />Samo przeliczanie okazało się bardzo proste, zupełnie jak przypuszczałem.<br />Jak skończę pisać program nie omieszkam się podzielić tu na naszym forum.<br /><br />Mam jeszcze jeden problem, ponieważ się uczę a do tej pory nie za bardzo używałem wskaźników.<br />Jedynie kopiowałem jakieś fragmenty kodów z Mirkowych programów i poradników i wszystko działało.<br />Choś nie zabardzo wiedziałem w jaki sposób.<br /><br />Pisząc swój program praktycznie zawsze ma się inny pomysł na to jak go napisać i okazuje się, że to co pokazał Mirek w poradniku owszem działa ale ja bym chciał zrobić to w troszkę innaczej i tu tworzą się schody.<br />Na początku chyba każdy kto uczy się programować nie widzi potrzeby używania wskaźników.<br />Ja generalnie zrozumiałem zasadę ich działania jednak do pełnych możliwości ich używania w swoich programach jeszcze mi dużo brakuje.<br /><br />Do czego zmierzam:<br />Mamy dwie zmienne a i b ale innych typów! <br />int zmienna_b<br /><br />Drugą <br /><br />uint8_t zmienna_a<br /><br />i teraz chciałbym napisać swoją uniwersalną procedurę do wykonywania obliczeń na tych zmiennych.<br />Jednak sama procedura ma być bardzo uniwersalna i chciałbym aby robiła operacje w obie strony.<br />Czyli mogła odczytywać i przypisywać wartości jednocześnie do obu zmiennych.<br /><br />Żaden problem  prawda?!<br />Normalnie każda procedura może zwrócić tylko jeden argument a ja bym chciał aby zwracała 2 i tu właśnie przydadzą się wskaźniki.<br /><br />[syntax=c]int        zmienna_b // deklaracja pierwszej zmiennej<br />uint8_t zmienna_a // deklaracja drugiej zmiennej<br /><br />void moje_obliczenia ( uint8_t * Var_in, int *Var_out, uint8_t direction);  // Deklaracja mojej funkcji<br /><br />void moje_obliczenia ( uint8_t * Var_in, int *Var_out, uint8_t direction){ // A tu definicja, obliczenia sa czyto fikcyjne tak aby pokazać o co mi chodzi<br /><br />if(!direction){ <br /><br />If( *Var_out &lt;= 0 ) *Var_out = -10;<br />If ( *Var_in &gt; 10 )   *Var_in   = 50;<br />If ( *Var_in &lt; 50 )   *Var_out = -20;<br /><br />}<br /><br /><br /><br />if(direction){ <br /><br />If( *Var_out == 0 ) *Var_out = 10;<br />If ( *Var_in &gt; 10 )   *Var_in   = 20;<br />If ( *Var_in &lt; 50 )   *Var_out = -40;<br /><br />}<br /><br /><br />}<br /><br /><br />// w pętli głównej wywołuję funkcję<br />moje_obliczenia( (uint8_t *)&amp;zmienna_a, (int *)&amp;zmienna_b, 0);[/syntax]<br /><br /><br />Później w samym programie piszę;<br />moje_obliczenia( (uint8_t *)&amp;zmienna_a, (int *)&amp;zmienna_b, 0);<br /><br />I taki kod działa prawidłowo kompiluje się bez problemu<br /><br />Jednak ja raz bym chciał podstawiać zmienną a typu uint8_t jako Var_in a następnym razem jako Var_out<br /><br />Czyli tak a wtedy kompilator od razu krzyczy.<br />Można chyba zadeklarować tą procedurę ze wskaźnikami void<br /><br /><br />Czyli tak:<br /><br /><br />[syntax=c]void moje_obliczenia ( void * Var_in,  void *Var_out,  uint8_t direction);[/syntax]<br /><br />ale kiedy w programie próbuję użyć tak zadeklarowanej procedury to kompilator i tak się burzy.<br /><br />Czy nie można jakby zadeklarować samej procedury z nieznanym typem wskaźnika czyli void a dopiero podczas jej użycia rzutować jego typu?????<br /><br />Kurczę nie wiem czy ktokolwiek zrozumie moje pytanie.<br />No chyba, że całkowicie nie rozumiem jak działa void?<br /><br />Pozdrawiam Paweł.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 13 minutach ]</span></strong><br /><br />Czy przypadkiem prawidłowo mozna zadeklarować <br /><br />[syntax=c]void moje_obliczenia (void * input, void * output);<br /><br />// a w pętli użyć<br /><br />moje_obliczenia ( &amp;zmienna_a, &amp;zmienna_b);[/syntax]<br /><br /><br />hmm????<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3709">P3ndz3l3k</a> — 2 gru 2018, o 22:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[P3ndz3l3k]]></name></author>
<updated>2018-11-25T19:16:30+01:00</updated>
<published>2018-11-25T19:16:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214052#p214052</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214052#p214052"/>
<title type="html"><![CDATA[Obsługa programowa procesora audio TDA7418]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21615&amp;p=214052#p214052"><![CDATA[
Witam wszystkich forumowiczów.<br /><br />    Robię sobie samemu wzmacniacz audio DIY w skład którego postanowiłem wmontować procesor audio oparty na powszechnie stosowanym wa radiach samochodowych układzie TDA7418 który posiada przełącznik wejść, regulację tonów wysokich, średnich, basów, loudness i 4 wyjścia plus wyjście dla subwoofer-a.<br /><br />Podglądając biblioteki arduino i inne w internecie napisałem swoja biblioteke do obsługi tego scalaka.<br />Samo wysyłanie i zmiana parametrów nie jest jakoś szczególnie skomplikowana ale pisząc sam program obsługi utknąłem na jednej rzeczy.<br /><br />Stanąłem na regulacji balansu oraz fadera czyli regulacji każdego z czterech kanałów wyjściowych.<br />O ile nie jest problemem zmienić głośność w którymkolwiek kanale osobno,<br />to już sterowanie i uzależnienie wszystkich kanałów od ustawienia balansu i fadera już nie jest takie proste.<br /><br />Chciałby zobaczyć jakie wy macie sugestie na temat takiej regulacji.<br />Nie chodzi mi o jakiś konkretny kod a jedynie o sposób realizacji czegoś takiego.<br /><br />Być może ktoś z was już się z tym spotkał i ma jakieś doświadczenia.<br /><br />Sama regulacja ma polegać na zmianie wartości odpowiednio czterech zmiennych przypisanych dla każdego z kanałów za pomocą dwóch zmiennych balans i fader o zakresie int przyjmujących wartości od -x przez 0 do x.<br /><br />Czyli każdy kanał może być przyciszony o wartość jego zmiennej 0 do np. 50 gdzie 0 to maksymalna głośność  a 50 to wyciszenie.<br />O ile nie ma najmniejszego problemu aby regulować na podstawie balansu czy faderu odpowiednie dwa kanały, <br />to już uzależnienie jednej regulacji od drugiej już nie jest dla mnie takie proste.<br />Czyli jeśli w faderze ustawimy pewne poziomy to w w balansie można tylko przyciszyć a nie można zgłośnić.<br /><br />Czekam na wasze sugestie i pozdrawiam Paweł.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3709">P3ndz3l3k</a> — 25 lis 2018, o 19:16</p><hr />
]]></content>
</entry>
</feed>