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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-09-29T19:46:23+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16323&amp;mode</id>
<entry>
<author><name><![CDATA[HVM-a-C]]></name></author>
<updated>2016-09-29T19:46:23+01:00</updated>
<published>2016-09-29T19:46:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169914#p169914</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169914#p169914"/>
<title type="html"><![CDATA[Re: Tablica 2D z Flash (Vector)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169914#p169914"><![CDATA[
&quot;Zakładałem, że jako programista wiesz, co robisz ( podobnie jak twórcy &quot;C&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /> ).&quot; no to teraz dopiero dostałem motywator umieć tyle co twórcy C <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> wszystkim tego życzę ale zobaczymy co z tego wyjdzie , tak czy śmak dziękuje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10762">HVM-a-C</a> — 29 wrz 2016, o 19:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2016-09-29T19:19:11+01:00</updated>
<published>2016-09-29T19:19:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169909#p169909</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169909#p169909"/>
<title type="html"><![CDATA[Re: Tablica 2D z Flash (Vector)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169909#p169909"><![CDATA[
Witam ponownie.<br /><br />Kolego <strong>HVM-a-C</strong> miałem cytować fragmenty Twojego posta, ale za dużo by się tego zebrało, a zaraz muszę uciekać. Pytasz gdzie to można przeczytać ? W każdej książce, opisującej standard języka C, ot choćby: &quot;biblii&quot; B.W. Kernnghan, D.M. Ritchie - &quot;Język ANSI C programowanie&quot;. Moja odpowiedź była trochę natury ogólnej, zakładałem że potrzebujesz dostępu d dowolnego elementu tablicy wielowymiarowej z jakiejś tam funkcji, stąd takie a nie inne podejście. W aplikacji, którą obecnie kończę mam tablice 4 wymiarowe <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />. Dla tego konkretnego przypadku podejście Mirka ( tablica wskaźników na poszczególne elementy tablicy stringów ) jest oczywiście lepsze. Nie pisałem nic o typach - ot po prostu zrobiłem rzutowanie gdzie trzeba, aby &quot;uciszyć&quot; kompilator.<br />Zakładałem, że jako programista wiesz, co robisz ( podobnie jak twórcy &quot;C&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /> ). Dlatego też niczego nie pisałem o końcu stringa, niepotrzebnym kopiowaniu, itd. Myślałem po prostu, że to jest jakiś tam fragment testowy i tyle.<br />Jeśli to mają być faktycznie stringi w pamięci, gorąco polecam metodę Mirka i dokładne zapoznanie się z Jego postem.<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 29 wrz 2016, o 19:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[HVM-a-C]]></name></author>
<updated>2016-09-29T19:39:50+01:00</updated>
<published>2016-09-29T18:55:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169908#p169908</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169908#p169908"/>
<title type="html"><![CDATA[Re: Tablica 2D z Flash (Vector)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169908#p169908"><![CDATA[
Z początku się wystraszyłem tyle dostałem od Was długich podpowiedzi ze przez chwile skojarzyło mi sie to z wynikami badań w trakcie choroby. im bardziej chory pacjent tym więcej ma w karcie napisane <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> dobrze że chociaż w tym języku co potrzeba a nie po łacinie bo to by oznaczało że zaraz wyzionie ducha. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><br /><div class="quotetitle">QuadMan napisał(a):</div><div class="quotecontent"><br />Witam,<br /><br />skoro mądrzy ludzie nie chcą niczego napisać, to może ja spróbuję <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />. Przede wszystkim, moim zdaniem, wskaźniki na tablice ( mam na myśli konstrukcje typu: (*ptr_to_tab)[TIMER_STATES] ) wyglądają słabo... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />. Bo dla większej ilości wymiarów to już w ogóle masakra. Wystarczy zapamiętać fakt, że tablice <strong>wielowymiarowe zapamiętywane są w pamięci wierszami </strong>i tyle, wtedy to staje się proste dla tablicy o dowolnym rozmiarze.  Jeśli na przykład, dla tablicy dwuwymiarowej  potrzebujesz &quot;dobrać się&quot; do elementu (2,2) to jego adres będzie: 2+ 2*dlugosc_wiersza + adres poczatkowy. W Twoim przypadku to będzie tak:[syntax=c]////////////////////////////////////////////////////////////////////////<br />      ///                        BOOK DATABASE                                 ///<br />     ////////////////////////////////////////////////////////////////////////<br /><br />    const char Book1&#91;STR_LEN_COMAND&#93;&#91;STR_LEN_WORLD&#93; PROGMEM =<br />    {<br />    {&quot;ZBRODNIA.XXw&quot;},<br />{&quot;PAN.TADEUSZ&quot;},<br />{&quot;AVR.STUFF&quot;},<br />{&quot;PRZYKŁAD&quot;},<br />{&quot;MK.PASJA&quot;},<br />    };<br /><br />    ////////////////////// W MAIN.C ///////////////////////////////////<br />    int main( void )<br />    {<br /><br />   // USART0_Init( UART_BAUD , BIT_NUM ); // Initialize UART 0<br /><br />       for(;;)             /* FORever :D */<br />       {<br />            ChangeBAUD ( 4, STR_LEN_WORLD, (char*)Book1 );// Musisz zawsze podac tu dlugosc wiersza !!!!<br />            _delay_ms(1000);// zrób rzutowanie, aby kompilator sie odczepil<br /><br />        }<br /><br />    }<br /><br /><br />       ////////////////////// W BIBLIOTECE coscos.c //////////////////////<br />      ////////////////////////////////////////////////////////////////////////<br />     ///                 SEND VIA RS BOOK DATABASE                      ///<br />    ////////////////////////////////////////////////////////////////////////<br />    void ChangeBAUD (char num, char len, const char *str)<br />    {<br />    // const char* str - przekazujesz<br />            char buffer&#91;len&#93;;<br />            for (char j=0 ; j&lt;len ; j++)<br />            {<br /><br />                    buffer&#91;(uint8_t)j&#93; = pgm_read_byte( &amp;str&#91;j+num*len&#93; );// tu tez rzutowanie, bo masz j zadeklarowane jako char<br />                    <br />            }<br />            UART0_Sstring(buffer);<br />    }[/syntax]<br /><br />To w sumie wszystko, dla tablicy o dowolnym rozmiarze będzie tak samo. Ale uwaga: takie podejście jest potrzebne jedynie, jeśli chcesz przekazać adres tablicy jako parametr do funkcji, jeśli masz tablicę wewnątrz jakiejś tam funkcji, to możesz operować normalnie indeksami. To w sumie oczywiste, ale wolałem wspomnieć, by nie było nieporozumień. Jeśli czegoś nie rozumiesz to pisz.<br /><br />Pozdrawiam, QuadMan.<br /></div><br /><br />O Kurza twarz ! niech mnie dzwi ścisną jak Ty mądry nie jesteś !! coś nad czym siedziałem 3 dni (zliczyłem ilość przejrzanych stron: 543) z rezultatem zerowym a Tobie to zajęło może z 3hodziny bo tyle minęło czasu od wystawienia pytania na forum. Bardzo Ci dziękuje. Zadam pytanie skąd wiedziałeś że tak ma to wyglądać ? Gdzie o tym mogę poczytać ? <br /><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Przede wszystkim to źle definiujesz tablice stringów w pamięci flash, bo jak już to tak:<br /><br />Składnia: [ Pobierz ] [ Ukryj ]<br />język c<br /><br />    const char tb1[] PROGMEM = &quot;ZBRODNIA.XXw&quot;;<br />    const char tb2[] PROGMEM = &quot;PAN.TADEUSZ&quot;;<br />    const char tb3[] PROGMEM = &quot;AVR.STUFF&quot;;<br />    const char tb4[] PROGMEM = &quot;PRZYKŁAD&quot;;<br />    const char tb5[] PROGMEM = &quot;MK.PASJA&quot;;<br />     <br />    const char * const Book1 [] PROGMEM  = {<br />            tb1,<br />            tb2,<br />            tb3,<br />            tb4,<br />            tb5,<br />    };<br /><br />GeSHi<br /></div><br /><br />Rozumiem że mój sposób kategorycznie nie może być ? Widzę że mamy zaletę taką że ilość miejsca w flash jest dostosowywana za każdym razem do długości łańcucha + 0. Może w tym miejscu opisze jaki jest zamierzony cel całego programu w takich tablicach jak widzisz Mirku mieści się zbiór nazw książek program ma w łatwy sposób poprzez wpisanie komendy po RS (np nazwy książki) odnaleźć ją w tablicy i podać jej miejsce na regale.<br />to oczywiście program w wydaniu &quot;abstrakcja 2016&quot; jak sam podkreśliłeś , póki co mogę powiedzieć że znalazłem 1000 dróg którymi nie da się pójść.<br />Na pewno są inne drogi na konstrukcje tego programu pozostaje pytanie która droga jest dobra ? <br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Radzę ci hmmm może lepiej powiedzieć POLECAM CI, postaraj się zastosować do porad odnośnie stosowania odpowiednich typów to będziesz miał po stokroć mniej problemów - ten twój kod albo ci się kompilował z tysiącem warningów albo może korzystasz z kociego Atmel Studio z wyłączonymi warningami i nawet ich nie widziałeś .... <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /></div><br />heh tak to był , a nawet jest Atmel Studio i owszem masz racje był jeden alert tyczący się właśnie przekazywania tego przedziwnego wskaźnika do tablicy.<br />Co do typów tak oświeciło mnie w momencie gdy o tym przypomniałeś. Mój błąd. <br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Powiedz mi - tzn ok - jeśli to próbujesz robić TYLKO PO TO ŻEBY &quot;poczuć wskaźniki&quot; to ok jeszcze rozumiem - uczysz się - chociaż w rozwiązaniach idziesz totalnie złą drogą .... Jeśli chcesz napisać kawałek kodu który ci potrzebny to<br /></div><br />hmm no wiesz generalnie jak &quot;próbujesz&quot; coś robić to znaczy że z reguły nie czujesz gruntu pod nogami, Logika podpowiada -&gt; Move forward ale też jak widać jeden wcale nie umyślny błąd na początku i później rodzi sie cała seria reperkusji z nim związana.<br /><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />1. powiedz po jaki gwint wewnątrz tej funkcji kopiujesz znak po znaku z przekazanego stringu do bufora tworzonego wewnątrz funkcji (brrrr na stosie - fuuuj) ... ???? Zamiast wprost wyświetlić ten string z pamięci Flash a masz na to przecież KUPĘ przykładów w Bluebooku a widzę, że go masz przecież <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br />A to efekt szukania rozwiązania w pewnym momencie (chyba akt desperacji) zacząłem szukać problemu w przekazywaniu wartości z &quot;pgm_read_byte&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />2. ok jak już się uparłeś i tworzysz ten bufor - to znowu - nie doczytałeś a OPISUJĘ to pięknie (że tak nieskromnie powiem) w Bluebooku - jak działają funkcje - co się gdzie tworzy i jak ....<br /><br />twój buffer[] to zmienna lokalna/automatyczna - a więc? Co będą zawierały jej elementy po skreowaniu ? UWAGA! będą zawierały SIECZKARNIĘ - a na pewno nie same zera !!! Więc jeśli wkleisz znak po znaku nawet z tej nieszczęsnej tablicy przez salto mortale jakie próbujesz zrobić - to nie wkopiujesz ZERA przecież !!! a to co spowoduje ? Że nawet jeśli poprawnie uda ci się zapisać to salto mortale na wskaźnikach - to funkcja wysyłająca string będzie śmigała aż napotka zero w tej zmiennej buffer a że nie napotka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to będzie rąbała dalej po pamięci aż gdzieś tam napotka w końcu jakieś zero - zaś ty nawet nie zauważysz - nie zdążysz zauważyć że na początku miałeś napis ale później poleciały śmieci z pamięci i napis został przez nie zamieciony ... rozumiesz ?<br /></div><br /><br />Mirku możesz sie zaśmiać ale uwierz że o tym pamiętałem wiesz gdzie powstał dygres ? w momencie gdy stwierdziłem że jeśli wiem że mam odczytać np 10 bajtów to wypełniam je 10 odczytanymi bajtami. Zero śmieci po prostu czyste dane <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> czasem wolał bym dostać od kompilatora taki tekst który pamiętam z jednego z poradników video:  &quot;FIGA Z MAKIEM POWIEDZIAŁ KOMPILATOR , NIE SKOMPILUJE CI TEGO ...&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />i teraz na koniec uważaj <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo ci się to może przyda ... jeśli twoim celem było wysyłanie dowolnego stringa z tej twojej tablicy stringów, to jeśli ją zorganizujesz tak jak ci pokazałem wyżej jako tablicę wskaźników to możesz W OGÓLE pozbyć się tej twojej funkcji i zamiast niej w pętli głównej zrobić tak <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Składnia: [ Pobierz ] [ Ukryj ]<br />język c<br /><br />    for(;;)             /* FORever <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> */<br />            {<br />                UART0_Sstring_P( Book1[2] );<br />                _delay_ms(1000);<br />            }<br /><br />GeSHi<br /><br /><br />i co ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jak ci się to widzi ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... po co to przekazywanie w oddzielnych argumentach indeksu, albo już w ogóle niepotrzebnie długości stringa ?<br />Tylko zauważ że dodałem postfix _P do twojej funkcji czyli powinna ona być przerobiona na wysyłanie znaków ale z pamięci flash<br /></div><br /><br />Pięknie <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> muszę cześć programu przerobić bo nie wiedziałem że da się to zrobić jednowymiarowo to co ja robiłem 2wymiarowo.<br /><br />PS. Skoro mi było ciężko znaleźć coś o tym problemie może to właśnie jest dobry temat na kolejny video poradnik na temat wskaźników ? <br /><br />Pozdrawiam i Bardzo WAM dziękuje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10762">HVM-a-C</a> — 29 wrz 2016, o 18:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-09-29T01:51:28+01:00</updated>
<published>2016-09-29T01:51:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169841#p169841</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169841#p169841"/>
<title type="html"><![CDATA[Re: Tablica 2D z Flash (Vector)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169841#p169841"><![CDATA[
<div class="quotetitle">HVM-a-C napisał(a):</div><div class="quotecontent"><br />Jak przekazać do funkcji Tablice z Progmemu poprzez wskaźniki ?<br /></div><br /><br />Przede wszystkim to źle definiujesz tablice stringów w pamięci flash, bo jak już to tak:<br /><br />[syntax=c]const char tb1&#91;&#93; PROGMEM = &quot;ZBRODNIA.XXw&quot;;<br />const char tb2&#91;&#93; PROGMEM = &quot;PAN.TADEUSZ&quot;;<br />const char tb3&#91;&#93; PROGMEM = &quot;AVR.STUFF&quot;;<br />const char tb4&#91;&#93; PROGMEM = &quot;PRZYKŁAD&quot;;<br />const char tb5&#91;&#93; PROGMEM = &quot;MK.PASJA&quot;;<br /><br />const char * const Book1 &#91;&#93; PROGMEM  = {<br />        tb1,<br />        tb2,<br />        tb3,<br />        tb4,<br />        tb5,<br />};[/syntax]<br /><br />Po drugie tak jak kolega wyżej pisze - przekazywanie w takim przypadku całej tablicy do funkcji jako argument hmmm po co ? To tak jakbyś chciał się posługiwać nazwą zmiennej globalnej tej tablicy - więc po co tak przekazywać ? same komplikacje będą szczególnie właśnie przy tablicach wielowymiarowych - tak się nie robi. Na tym przykładzie wyżej widać jak na dłoni jak działa twoja tablica wskaźników do stringów w pamięci flash. Masz tablicę jednowymiarową wskaźników .... do stringów co tak na prawdę jest właśnie odpowiednikiem twojej tablicy<br /><br />[syntax=c]const char tab&#91;x&#93;&#91;y&#93; PROGMEM = ....[/syntax]<br /><br />tyle że w twoim wypadku źle zdefiniowanej i zdeklarowanej.<br /><br />Gdybyś chciał tą tablicę mieć w pamięci to problem byłby nieco mniejszy bo nie trzeba tam makr typu pgm_read_xxx()<br /><br />Mogłoby to wtedy wyglądać tak:<br /><br />[syntax=c]char ab1&#91;&#93; = &quot;ZBRODNIA.XXw&quot;;<br />char ab2&#91;&#93; = &quot;PAN.TADEUSZ&quot;;<br />char ab3&#91;&#93; = &quot;AVR.STUFF&quot;;<br />char ab4&#91;&#93; = &quot;PRZYKŁAD&quot;;<br />char ab5&#91;&#93; = &quot;MK.PASJA&quot;;<br /><br />char * Book3 &#91;&#93; =<br />{<br />        ab1,<br />        ab2,<br />        ab3,<br />        ab4,<br />        ab5,<br />};[/syntax]<br /><br />a funkcja tak:<br /><br />[syntax=c]void ChangeBAUD (char num, char len,  char **  bk )<br />{<br />        char buffer&#91;20&#93;;<br />        memset( buffer, 0, len+1);<br /><br />        for (uint8_t j=0 ; j&lt;len ; j++)<br />        {<br />        buffer&#91;j&#93; = *(*(bk+num)+j);<br />        }<br />        lcd_str(buffer);<br />}[/syntax]<br />(tylko twoją funkcję UART0_Sstring() zastąpiłem lcd_str() do testów u siebie ale robi to samo tyle że na LCD) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Tylko po choinkę takie triki karkołomne ? Tym bardziej że wewnątrz swojej funkcji zrobiłeś wg mnie KUPĘ BŁĘDÓW i nie wiem czy zdajesz sobie z tego sprawę - oto one (zaznaczam na czerwono)<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />void ChangeBAUD (<strong><span style="color: #FF0000">char </span></strong>num, <strong><span style="color: #FF0000">char </span></strong>len, const char **str)<br />{<br />        char buffer[len];<br />        for (<strong><span style="color: #FF0000">char </span></strong>j=0 ; j&lt;len ; j++)<br />        {<br /> <br />                buffer[j] = pgm_read_byte( (*(*(str+num) + j)) );<br />               <br />        }<br />        UART0_Sstring(buffer);<br />}<br /></div><br /><br />Radzę ci hmmm może lepiej powiedzieć POLECAM CI, postaraj się zastosować do porad odnośnie stosowania odpowiednich typów to będziesz miał po stokroć mniej problemów - ten twój kod albo ci się kompilował z tysiącem warningów albo może korzystasz z kociego Atmel Studio z wyłączonymi warningami i nawet ich nie widziałeś .... <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />krótkie przypomnienie <br /><br /><strong><span style="font-size: 200%; line-height: normal"><span style="color: #0080FF">char </span></span></strong>- ten typ stosuj tam gdzie będziesz miał do czynienia ze znakami <strong><span style="font-size: 200%; line-height: normal"><span style="color: #0080FF">ASCII </span></span></strong><br /><br /><strong><span style="font-size: 150%; line-height: normal"><span style="color: #408000">uint8_t, uint16_t, uint32_t</span></span></strong> - te typy stosuj dla zmiennych w których będziesz przechowywał tylko <strong><span style="font-size: 200%; line-height: normal"><span style="color: #408000">liczby </span></span></strong>!<br /><br />mówię ci zapamiętaj tę prostą zasadę .....<br /><br />Po drugie - to co wyprawiasz wewnątrz tej funkcji to już jest potrójne salto mortale z poczwórnym obrotem przez lewe ramię, a jak do tego dodać chęć przekazania całej tablicy z progmem przez wskaźniki tą metodą o jakiej piszesz to już jest takie salto że ciężko nawet je opisać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Powiedz mi - tzn ok - jeśli to próbujesz robić TYLKO PO TO ŻEBY &quot;poczuć wskaźniki&quot; to ok jeszcze rozumiem - uczysz się - chociaż w rozwiązaniach idziesz totalnie złą drogą .... Jeśli chcesz napisać kawałek kodu który ci potrzebny to<br /><br />1. powiedz po jaki gwint wewnątrz tej funkcji kopiujesz znak po znaku z przekazanego stringu do bufora tworzonego wewnątrz funkcji (brrrr na stosie - fuuuj) ... ???? Zamiast wprost wyświetlić ten string z pamięci Flash a masz na to przecież KUPĘ przykładów w Bluebooku a widzę, że go masz przecież <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />2. ok jak już się uparłeś i tworzysz ten bufor - to znowu - nie doczytałeś a OPISUJĘ to pięknie (że tak nieskromnie powiem) w Bluebooku - jak działają funkcje - co się gdzie tworzy i jak ....<br /><br />twój buffer[] to zmienna lokalna/automatyczna - a więc? Co będą zawierały jej elementy po skreowaniu ? UWAGA! będą zawierały SIECZKARNIĘ - a na pewno nie same zera !!! Więc jeśli wkleisz znak po znaku nawet z tej nieszczęsnej tablicy przez salto mortale jakie próbujesz zrobić - to nie wkopiujesz ZERA przecież !!! a to co spowoduje ? Że nawet jeśli poprawnie uda ci się zapisać to salto mortale na wskaźnikach - to funkcja wysyłająca string będzie śmigała aż napotka zero w tej zmiennej buffer a że nie napotka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to będzie rąbała dalej po pamięci aż gdzieś tam napotka w końcu jakieś zero - zaś ty nawet nie zauważysz - nie zdążysz zauważyć że na początku miałeś napis ale później poleciały śmieci z pamięci i napis został przez nie zamieciony ... rozumiesz ?<br /><br />po to w tej mojej funkcji pokazałem ci jak się taki bufor jak już się na niego upierasz wyzerować np funkcją memset()<br /><br /><br />i teraz na koniec uważaj <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo ci się to może przyda ... jeśli twoim celem było wysyłanie dowolnego stringa z tej twojej tablicy stringów, to jeśli ją zorganizujesz tak jak ci pokazałem wyżej jako tablicę wskaźników to możesz W OGÓLE pozbyć się tej twojej funkcji i zamiast niej w pętli głównej zrobić tak <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />[syntax=c]for(;;)             /* FORever :D */<br />        {<br />            UART0_Sstring_P( Book1&#91;2&#93; );<br />            _delay_ms(1000);<br />        }[/syntax]<br /><br />i co ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jak ci się to widzi ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... <span style="color: #0080FF">po co to przekazywanie w oddzielnych argumentach indeksu, albo już w ogóle niepotrzebnie długości stringa ? </span><br />Tylko zauważ że dodałem postfix _P do twojej funkcji czyli powinna ona być przerobiona na wysyłanie znaków ale z pamięci flash<br /><br />czyli coś w tym stylu:<br /><br />[syntax=c]void uart_puts_P( const char *s )// wysyła łańcuch z pamięci FLASH na UART<br />{<br />  register char c;<br />  while ((c = pgm_read_byte(s++))) uart_putc(c);// dopóki nie napotkasz 0 wysyłaj znak<br />}[/syntax]<br /><br />ale właśnie TO masz w bluebooku - czemu nie korzystasz z tego co masz pod ręką - tylko jak piszesz śmigasz po całym internecie szukając karkołomnych rozwiązań - mając je pod ręką i to jeszcze opisane , z przykładami itp itd<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 wrz 2016, o 01:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2016-09-28T23:40:11+01:00</updated>
<published>2016-09-28T23:40:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169837#p169837</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169837#p169837"/>
<title type="html"><![CDATA[Re: Tablica 2D z Flash (Vector)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169837#p169837"><![CDATA[
Witam,<br /><br />skoro mądrzy ludzie nie chcą niczego napisać, to może ja spróbuję <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />. Przede wszystkim, moim zdaniem, wskaźniki na tablice ( mam na myśli konstrukcje typu: (*ptr_to_tab)[TIMER_STATES] ) wyglądają słabo... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />. Bo dla większej ilości wymiarów to już w ogóle masakra. Wystarczy zapamiętać fakt, że tablice <strong>wielowymiarowe zapamiętywane są w pamięci wierszami </strong>i tyle, wtedy to staje się proste dla tablicy o dowolnym rozmiarze.  Jeśli na przykład, dla tablicy dwuwymiarowej  potrzebujesz &quot;dobrać się&quot; do elementu (2,2) to jego adres będzie: 2+ 2*dlugosc_wiersza + adres poczatkowy. W Twoim przypadku to będzie tak:[syntax=c]////////////////////////////////////////////////////////////////////////<br />      ///                        BOOK DATABASE                                 ///<br />     ////////////////////////////////////////////////////////////////////////<br /><br />    const char Book1&#91;STR_LEN_COMAND&#93;&#91;STR_LEN_WORLD&#93; PROGMEM =<br />    {<br />    {&quot;ZBRODNIA.XXw&quot;},<br />{&quot;PAN.TADEUSZ&quot;},<br />{&quot;AVR.STUFF&quot;},<br />{&quot;PRZYKŁAD&quot;},<br />{&quot;MK.PASJA&quot;},<br />    };<br /><br />    ////////////////////// W MAIN.C ///////////////////////////////////<br />    int main( void )<br />    {<br /><br />   // USART0_Init( UART_BAUD , BIT_NUM ); // Initialize UART 0<br /><br />       for(;;)             /* FORever :D */<br />       {<br />            ChangeBAUD ( 4, STR_LEN_WORLD, (char*)Book1 );// Musisz zawsze podac tu dlugosc wiersza !!!!<br />            _delay_ms(1000);// zrób rzutowanie, aby kompilator sie odczepil<br /><br />        }<br /><br />    }<br /><br /><br />       ////////////////////// W BIBLIOTECE coscos.c //////////////////////<br />      ////////////////////////////////////////////////////////////////////////<br />     ///                 SEND VIA RS BOOK DATABASE                      ///<br />    ////////////////////////////////////////////////////////////////////////<br />    void ChangeBAUD (char num, char len, const char *str)<br />    {<br />    // const char* str - przekazujesz<br />            char buffer&#91;len&#93;;<br />            for (char j=0 ; j&lt;len ; j++)<br />            {<br /><br />                    buffer&#91;(uint8_t)j&#93; = pgm_read_byte( &amp;str&#91;j+num*len&#93; );// tu tez rzutowanie, bo masz j zadeklarowane jako char<br />                    <br />            }<br />            UART0_Sstring(buffer);<br />    }[/syntax]<br /><br />To w sumie wszystko, dla tablicy o dowolnym rozmiarze będzie tak samo. Ale uwaga: takie podejście jest potrzebne jedynie, jeśli chcesz przekazać adres tablicy jako parametr do funkcji, jeśli masz tablicę wewnątrz jakiejś tam funkcji, to możesz operować normalnie indeksami. To w sumie oczywiste, ale wolałem wspomnieć, by nie było nieporozumień. Jeśli czegoś nie rozumiesz to pisz.<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 28 wrz 2016, o 23:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[HVM-a-C]]></name></author>
<updated>2016-09-28T20:03:18+01:00</updated>
<published>2016-09-28T20:03:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169831#p169831</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169831#p169831"/>
<title type="html"><![CDATA[Tablica 2D z Flash (Vector)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16323&amp;p=169831#p169831"><![CDATA[
Witam Wszystkich <br /><br />Jako że jestem w miarę nowy na forum i moja wiedza na temat konstrukcji argumentów funkcji z urzyciem wektorów jest wciąż za mała to postanowiłem starszym doświadczeniem osobą zadać pytanie:<br />Jak przekazać do funkcji Tablice z Progmemu poprzez wskaźniki ? <br />Przeszukałem dość sporo internet i możliwe ze coś przegapiłem natomiast wpadł mi w ręce taki oto dokument: Pana &quot;M.Piasecki: PODSTAWY PROGRAMOWANIA &quot; <br />(nawet z zbieżną nazwą pewnej książki którą mam)<br /><br /><a href="https://obrazkiforum.atnel.pl/10762/d3db7bfc2b7b25110aa530252b9c7879.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10762/d3db7bfc2b7b25110aa530252b9c7879.jpg" alt="Obrazek" /></a><br /><br />Widać tam serie rycin jak to działa oraz fragmęt kodu obsługi &quot;∗(∗(tabD+2) + 3) = 111 ; //   tabD[ 2 ][ 3 ] = 111 ; &quot; więc jeśli znaczy to że to jest to samo to dlaczego nie można tego przekazać do funkcji wbudowanej &quot;pgm_read_byte()&quot; ?<br /><br />Jeśli ktoś będzie chciał pomoc będę dozgonnie wdzięczny bo siedzę już nad tym pytanie 3ci dzień przeszukując &quot;na oślep&quot; poczęci jak lunatyk internet z zerowym rezultatem<br /><br />PS. Na prawdę dobrym tematem na Meeting (warsztaty) jest temat wetorów bo to jest temat moim zdaniem bardzo kluczowy ale również bardzo zawiły być może dlatego że jest chaos w przykładach z których przynajmniej ja sie najwięcej uczę. Do zobaczenia na warsztatach.<br /><br />Kod niedziałający poniżej, po odebraniu ramki uarta są same &quot;krzaczki&quot;<br /><br />[syntax=c]/*<br /> * Author : Tomek<br /> * <br /> * TEST - PROGMEM<br /> *<br /> * 18.432 MHz clock speed<br /> */ <br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br /><br />#include &quot;LIB/coscos.h&quot;<br />#include &quot;LIB/uart.h&quot;<br /><br />#define UART_BAUD 9600                   // UART BAUD<br />#define BIT_NUM 8                        // UART BIT DATA SIZE<br /><br />#define STR_LEN_COMAND 10                // COL. LENGHT IN LIBRARY &quot;Book1&quot;<br />#define STR_LEN_WORLD 15                 // ROW. LENGHT IN LIBRARY &quot;Book1&quot;<br /><br />   ////////////////////////////////////////////////////////////////////////<br />  ///                        BOOK DATABASE                                 ///<br /> ////////////////////////////////////////////////////////////////////////<br />const static char Book1 &#91;STR_LEN_COMAND&#93;&#91;STR_LEN_WORLD&#93; PROGMEM =<br />{<br />&quot;ZBRODNIA.XXw&quot;,         <br />&quot;PAN.TADEUSZ&quot;,            <br />&quot;AVR.STUFF&quot;,            <br />&quot;PRZYKŁAD&quot;,            <br />&quot;MK.PASJA&quot;,<br />};            <br /><br /><br />////////////////////// W MAIN.C ///////////////////////////////////<br />int main( void )<br />{<br /><br />USART0_Init( UART_BAUD , BIT_NUM ); // Initialize UART 0<br /> <br />for(;;)     /* FORever :D */<br />{<br />ChangeBAUD ( 4, 10, Book1 );<br />_delay_ms(1000);<br />}<br />}<br /><br /><br />   ////////////////////// W BIBLIOTECE coscos.c //////////////////////<br />  ////////////////////////////////////////////////////////////////////////<br /> ///                 SEND VIA RS BOOK DATABASE                      ///<br />////////////////////////////////////////////////////////////////////////<br />void ChangeBAUD (char num, char len, const char **str)<br />{<br />char buffer&#91;len&#93;;<br />for (char j=0 ; j&lt;len ; j++)<br />{<br /><br />buffer&#91;j&#93; = pgm_read_byte( (*(*(str+num) + j)) );<br /><br />}<br />UART0_Sstring(buffer);<br />}[/syntax]<br /><br />Pozdrawiam i z góry dziękuje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10762">HVM-a-C</a> — 28 wrz 2016, o 20:03</p><hr />
]]></content>
</entry>
</feed>