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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-11-30T16:21:28+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=13704&amp;mode</id>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2015-11-30T16:21:28+01:00</updated>
<published>2015-11-30T16:21:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146744#p146744</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146744#p146744"/>
<title type="html"><![CDATA[Re: Jak bliczać sumę kontrolnej na wskaźnikach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146744#p146744"><![CDATA[
Witam ponownie,<br /><br />1. Co do funkcji strcat(.....), to sam sobie w sumie odpowiedziałeś. Prototyp funkcji wygląda następująco:[syntax=c]char * strcat(char *  dest, const char* src)[/syntax]<br /><br />Zamieniałeś stringi: źródłowy z docelowym .Tak nawiasem mówiąc w WIN_AVR masz manuala z opisem funkcji bibliotecznych (..../WinAVR-20100110/doc/avr-libc/avr-libc-user-manual/index.html).<br /><br /><div class="quotetitle">iwi napisał(a):</div><div class="quotecontent"><br />*** dopisano później<br />trochę sam sobie odpowiadam na jedno z pytań dotyczące funkcji strcat<br />znalazłem w końcu przykład i chyba już wiem o co chodzi - po prostu źle ją wywoływałem - co prawda on jest na tablicy a nie na wskaźniku, ale może jakoś to przejdę.<br />[syntax=c]char tekst&#91;80&#93;;<br />strcat ( tekst , &quot; ala &quot; ) ;<br />strcat ( tekst , &quot; ma &quot; ) ;<br />strcat ( tekst , &quot; kota &quot; ) ;<br />lcd_puts ( tekst ) ;[/syntax]<br /></div><br /><br />Jak już Ci pisałem, tablice można reprezentować i przetwarzać za pośrednictwem arytmetyki wskaźników. Jednak, jeśli chcesz wykonać operacje jak w przykładzie powyżej, to <strong>musisz </strong> w jakiś sposób zarezerwować obszar pamięci na Twojego stringa wynikowego i to właśnie robi definicja: [syntax=c]char tekst&#91;80&#93;;[/syntax] No bo jeśli zrobisz coś takiego:[syntax=c]char* tekst[/syntax] to jest to jedynie deklaracja wskaźnika do obiektu typu char, ale kompilator nie przydzieli obszaru pamięci na ten obiekt ( obiekty ). Oczywiście można to zrobić inaczej, nie definiując tablicy, na przykład za pośrednictwem np. funkcji malloc(....), ale to trochę wyższa szkoła jazdy i nie będę Ci mieszał.<br /><br /><div class="quotetitle">iwi napisał(a):</div><div class="quotecontent"><br />.....Druga sprawa to ciągle wskaźniki - jest sobie coś takiego<br />[syntax=c]dane_gps_header = strtok_r(pBuf, &quot;,&quot;, &amp;reszta);[/syntax]<br />tutaj chciałbym coś dopytać<br />składnia jest taka [syntax=c]char *strtok_r(char *s, const char *delim, char **ptrptr);[/syntax]<br />reszta zadeklarowana jest jako char * reszta;<br />w funkcji wywołujemy to jako &amp;reszta. No i tutaj wszystko się <br />przykład z postu marmura<br />[syntax=c]uint8_t zmienna = 5; // wypisujac zmienna otrzymasz wartosc 5<br />uint8_t* wsk = &amp;zmienna; // wypisujac wsk otrzymasz adres np. 0x02341dc[/syntax]<br />ale tutaj mamy inny przykład bo nasza zmienna nie jest zwykłym char tylko wskaźnikiem.<br />co wtedy robi znak &quot;&amp;&quot; - skoro &quot;reszta&quot; jest wskaźnikiem to dlaczego nie jest wywołanie przez &quot;reszta&quot; <br />zapewne chodzi o te 2 gwiazdki w funkcji **ptrptr. No i tutaj jest zaplątanie.<br />Gdyby w funkcji było zapytanie oz końcówką char *ptrptr to znaczy że mamy do czynienia ze wskaźnikiem. Skoro są ** to pewnie chodzi o wskaźnik do wskaźnika - ale co to takiego w ogóle jest.<br />Załóżmy że <br />char znak = &quot;procesor&quot;;<br />char *wsk = &amp;znak - tzn że pod zmienną wsk przechowujemy adres pamięci jakiś 2 bajtowy.<br />char **wskwsk = no właśnie co to w ogóle nam da - adres do adresu?<br />przepraszam że takie pytania, ale o ile wskaźniki do jednej kropeczki można zrozumieć, to to już jest pogmatwane.<br /></div><br /><br />1. <strong>Nie możesz tego tak robić !!!!</strong>: <br /><br />[syntax=c]char znak = &quot;procesor&quot;;[/syntax]<br /><br />bo zapis char znak = &quot;abcdefgh&quot; nie ma sensu !!!!. Przecież char to jest typ zmiennej prostej - czyli jednego elementu, a Ty usiłujesz przypisać do niego łańcuch tekstowy. jeśli już to tak:<br /><br />[syntax=c]char znak&#91;&#93; = &quot;procesor&quot;[/syntax]<br /><br />czyli inaczej mówiąc, musisz zadeklarować <strong>tablicę</strong> na &quot;procesor&quot;, a kompilator sam policzy jej rozmiar, uwzględniając znak \0 i sam ten znak umieści na końcu. Można też tak:<br />[syntax=c]char* znak=&quot;procesor&quot;[/syntax] i to dokładnie zadziała tak samo, jak to powyżej. Cały problem polega chyba na tym, że Kolega <strong>marmur</strong> pisał o odnosząc się do zmiennych prostych, a Ty nie potrafisz tego przenieść na zmienne tablicowe. W przypadku tablic, czy wskaźników do elementów stringa będzie w sumie analogicznie ale z pewnymi niuansami: [syntax=c]char* wsk = znak  // patrz definicja powyżej<br />                                                                                                  // to już będzie adres zerowego elementu tego stringa &quot;procesor&quot;[/syntax]<br /><br />A teraz wskaźnik do wskaźnika, czyli to: **ptr. Brzmi trochę przerażająco, ale w sumie nie jest wcale takie trudne. Załóżmy, że mamy 3 zmienne proste : x,y,z. Wtedy:[syntax=c]// Deklaracje naszych zmiennych <br />char   x;<br />char*  y;<br />char** z;<br /><br />        x = 'a';// To jest zmienna typu char<br /><br />y = &amp;x;// y wskazuje na na zmienna<br />// typu char - czyli jest adres zmiennej x<br /><br />z = &amp;y;// A teraz idziemy dalej: z kolei zmienna z<br />// wskazuje na adres zmiennej y <br />// I TO JEST WLASNIE WSKAZNIK DO WSKAZNIKA ![/syntax]<br /><br />Można oczywiście pójść dalej: wskaźnik do wskaźnika do wskaźnika ( char*** ) itd. i wcalę nie żartuję, nieraz się to przydaje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" />. Pewnie teraz zastanawiasz się, dlaczego takie kombinacje ? Przyjrzyjmy się na chwilę prototypowi funkcji strtok_r(.......):<br />[syntax=c]char * strtok_r(char* string, const char* delim, char** last)[/syntax]<br /><br />Funkcja ta wymaga dwóch parametrów wejściowych: wskaźnika na string do obróbki, wskaźnika na separator ( który też może być stringiem ) i ma zwrócić jeden parametr wyjściowy. To też ma być w sumie wskaźnik na tego Twojego stringa &quot;reszta&quot;, ale przecież funkcja nie wiedziała by, gdzie ma tego stringa umieścić !!! Konstrukcja: char** last w tym wypadku rozwiazuje problem, na bo musimy podać adres do miejsca w pamięci, od którego to miejsca ta funkcja ma umieścić tego stringa, dlatego jako parametr musimy podać:  &amp;reszta ( i to będzie właśnie ten wskaźnik do wskaźnika! - popatrz an to, co napisałem powyżej ), przy założeniu, że reszta jest typu char*. Oczywiście zastosowań tego mechanizmu jest więcej, np. tablice wskaźników do wskaźników ( masz np. elementy menu o różnej długości i chcesz w prosty sposób je wyświetlać ), itd.<br />Przetraw <strong>dokładnie</strong> to co napisałem, bo  jeśli to załapiesz, to będziesz dokładnie wiedział, jak korzystać ze wskaźników. Najważniejsze moim zdaniem, abyś zrozumiał dokładnie ścisły związek ( wręcz nawet analogię ) między wskaźnikami i tablicami.<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 30 lis 2015, o 16:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2015-11-30T02:30:12+01:00</updated>
<published>2015-11-30T02:30:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146710#p146710</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146710#p146710"/>
<title type="html"><![CDATA[Re: Jak bliczać sumę kontrolnej na wskaźnikach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146710#p146710"><![CDATA[
Dziękuję - no nie powiem że wszystko jasne, ale po Twoich podpowiedziach mam już obliczanie sumy kontrolnej zrobione i działa jednak mam takie pytania<br />pierwsze<br />mam w jednej zmiennej prawie cały łańcuch do obliczenia sumy kontrolnej<br />(wszystko oprócz pierwszych 6 znaków &quot;GPRMC,&quot;<br />jest funkcja łączenia znaków [syntax=c]strcat (&quot;GPRMC,&quot;, gprmc);[/syntax] ale ona nie działa i w zasadzie wiesza mi uP.<br />napisałem sobie funkcję która oblicza mi sumę kontrolną<br />[syntax=c]uint8_t sum_kon_XOR (char * text) {<br />uint8_t liczba=0, i;<br />for (i=0; i&lt;strlen(text); i++) {<br />liczba ^= text&#91;i&#93;;<br />}<br />return liczba;<br />}[/syntax]<br />ale do niej muszę podstawić wszystkie znaki a mi brakuje z przodu przedrostka.<br /><br />Druga sprawa to ciągle wskaźniki - jest sobie coś takiego<br />[syntax=c]dane_gps_header = strtok_r(pBuf, &quot;,&quot;, &amp;reszta);[/syntax]<br />tutaj chciałbym coś dopytać<br />składnia jest taka [syntax=c]char *strtok_r(char *s, const char *delim, char **ptrptr);[/syntax]<br />reszta zadeklarowana jest jako char * reszta;<br />w funkcji wywołujemy to jako &amp;reszta. No i tutaj wszystko się <br />przykład z postu marmura<br />[syntax=c]uint8_t zmienna = 5; // wypisujac zmienna otrzymasz wartosc 5<br />uint8_t* wsk = &amp;zmienna; // wypisujac wsk otrzymasz adres np. 0x02341dc[/syntax]<br />ale tutaj mamy inny przykład bo nasza zmienna nie jest zwykłym char tylko wskaźnikiem.<br />co wtedy robi znak &quot;&amp;&quot; - skoro &quot;reszta&quot; jest wskaźnikiem to dlaczego nie jest wywołanie przez &quot;reszta&quot; <br />zapewne chodzi o te 2 gwiazdki w funkcji **ptrptr. No i tutaj jest zaplątanie.<br />Gdyby w funkcji było zapytanie oz końcówką char *ptrptr to znaczy że mamy do czynienia ze wskaźnikiem. Skoro są ** to pewnie chodzi o wskaźnik do wskaźnika - ale co to takiego w ogóle jest.<br />Załóżmy że <br />char znak = &quot;procesor&quot;;<br />char *wsk = &amp;znak - tzn że pod zmienną wsk przechowujemy adres pamięci jakiś 2 bajtowy.<br />char **wskwsk = no właśnie co to w ogóle nam da - adres do adresu?<br />przepraszam że takie pytania, ale o ile wskaźniki do jednej kropeczki można zrozumieć, to to już jest pogmatwane.<br /><br />*** dopisano później<br />trochę sam sobie odpowiadam na jedno z pytań dotyczące funkcji strcat<br />znalazłem w końcu przykład i chyba już wiem o co chodzi - po prostu źle ją wywoływałem - co prawda on jest na tablicy a nie na wskaźniku, ale może jakoś to przejdę.<br />[syntax=c]char tekst&#91;80&#93;;<br />strcat ( tekst , &quot; ala &quot; ) ;<br />strcat ( tekst , &quot; ma &quot; ) ;<br />strcat ( tekst , &quot; kota &quot; ) ;<br />lcd_puts ( tekst ) ;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 30 lis 2015, o 02:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2015-11-29T02:23:56+01:00</updated>
<published>2015-11-29T02:23:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146644#p146644</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146644#p146644"/>
<title type="html"><![CDATA[Re: Jak bliczać sumę kontrolnej na wskaźnikach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146644#p146644"><![CDATA[
Witam,<br /><br />to :[syntax=c]char gps1;<br />    gps1 = *dane_gps0;<br />    lcd_str(gps1);[/syntax]<br /><br />działa zgodnie z oczekiwaniami, znaczy zerowy element stringa umieszcza w zmiennej typu char, ale później funkcja:<br />[syntax=c]lcd_str(gps1);[/syntax]<br /><br />oczekuje wskaźnika: <strong>adresu </strong>do stringa !!! tekstowego, a więc takiego, który jest zakończony znakiem \0 ( po prostu zero jest jej ostatnim elementem. To co funkcja lcd_str(...) Ci wyświetla, to adres zmiennej gps1 jako 2 znaki ascii !!!<br /><br />Drugie, co próbujesz w ogóle nie ma sensu, jak napiszę resztę, to myślę, że zrozumiesz dlaczego.<br /><br />1. Nazwa tablicy - jakiejkolwiek, także literału napisowego jest adresem jej <strong>zerowego</strong> elementu!!!!<br /><br />2. Zapisy: postaci:[syntax=c]char* tab_test = &quot;Ala ma kota&quot;[/syntax] i [syntax=c]char tab_test1&#91;&#93; = &quot;Ala ma kota&quot;[/syntax] są dla Ciebie praktycznie równoważne. Piszę tu, że praktycznie równoważne, coby puryści się nie czepiali, bo są pewne różnice, ale na tym etapie w sumie nieistotne.<br /><br />3. Oba oznaczają definicję stringa tekstowego w pamięci ( a więc takiego, na którego końcu jest to nieszczęsne zero ), czyli gdybyś chciał wyświetlić to na LCD, musiałbyś wywołać:<br />[syntax=c]lcd_str(tab_test)[/syntax] i identycznie:[syntax=c]lcd_str(tab test1)[/syntax], albo też:<br />[syntax=c]lcd_str(&amp;tab_test1&#91;0&#93;)[/syntax]<br />Pomyśl chwilę nad ostatnim wywołaniem funkcji lcd_str(....). Przypominam, funkcja lcd_str oczekuje wskaźnika początku napisu, który ma wyświetlić !!!<br /><br />4. W &quot;C&quot; nie da się wprost kopiować tablic ( a więc i stringów tekstowych ) poprzez proste przypisanie !!! Można to zrobić którąś z funkcji bibliotecznych, na początek polecam, abyś użył memcpy(). Załóżmy, że masz wskaźnik do stringa postaci: ggmmss, czyli :<br />[syntax=c]char* tab_test2 = &quot;123456&quot;[/syntax]<br />i chcesz go &quot;rozbić&quot; na 3 oddzielne elementy ( a więc też stringi ), które będą zawierały po 2 elementy. Musisz więc powołać 3 tablice 3 o rozmiarze, który pomieści 3 elementy: zerowy i pierwszy z tab_test2 skopiować do 1 z tablic pomocniczych, ale że chcesz by to był też string tekstowy, więc jako ostatni element pierwszej z tablic pomocniczej musisz umieścić zero. I tak z kolejnymi elementami tablicy test_tab 2 i kolejnymi tablicami pomocniczymi. Czy to jest jasne ? No dobra, teraz kod, bo już mnie to pisanie wyczerpało:[syntax=c]/* To dla memcpy(....)<br /> * <br /> */<br />#include &lt;string.h&gt;<br />// Tu masz te tablice<br />char * tab_test2 = &quot;123456&quot;;<br />char godz&#91;3&#93;;<br />char min&#91;3&#93;;<br />char sek&#91;3&#93;;<br /><br />// Kopiujemy pierwsze 2 elementy<br />memcpy(godz, &amp;tab_test2&#91;0&#93;, 2);<br /><br />/* Tu zakańczamy string znakiem \0. W tym konkretnym przypadku możemy sobie<br /> * to darowac, bo tablice pomocnicze są globalne, ale gdybys je zrobil <br /> * lokalnymi, to wtedy musisz koniecznie !!!<br /> */<br />godz&#91;2&#93;=0;<br /><br />memcpy(min, &amp;tab_test2&#91;2&#93;,2);<br />min&#91;2&#93;=0;<br /><br />/* Tu, zeby bylo ciekawiej, przeanalizuj i zobacz opis funkcji memcpy(.....)<br /> * <br /> */<br />memcpy(&amp;sek&#91;0&#93;, tab_test2+4,2);<br />sek&#91;2&#93;=0;[/syntax]<br /><br />No dobra, dosyć przynudzania. Myślę, że teraz trochę więcej zrozumiesz ze wskaźników i operacji na stringach. Umieściłem tu kod bez testowania, więc być może gdzieś się pomyliłem, ale jeśli nawet, to myślę, że teraz sam dasz radę go w razie czego poprawić.<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 29 lis 2015, o 02:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2015-11-28T16:58:53+01:00</updated>
<published>2015-11-28T16:58:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146602#p146602</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146602#p146602"/>
<title type="html"><![CDATA[Re: Jak bliczać sumę kontrolnej na wskaźnikach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146602#p146602"><![CDATA[
Dzięki za wyjaśnienia. Trochę pomogło tylko że dalej nie działa. Dla uproszczenia na początek tylko jedną zmienną chcę przemienić ze wskaźnika na daną tzn<br />[syntax=c]char gps1;<br />gps1 = *dane_gps0;<br />lcd_str(gps1);[/syntax]<br />jak wyświetlam stringa danegps0 to wyświetla np $GPGGA a jak wyświetlę gps1 to wyświetla 44 - więc to nie to<br />jeżeli tak ją zadeklaruje<br />[syntax=c]char gps&#91;&#93;;<br />// to wtedy <br />gps = *dane_gps0;[/syntax] nie przechodzi przy kompilacji<br /><br />na tej sumie kontrolnej mi nie zależy - to jest tylko w ramach &quot;uczenia&quot; się i sprawdzania czy to można obliczyć, ale zależy mi na podzieleniu zmiennej ggmmss na gg, mm i ss - a to jak ruszyć?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 28 lis 2015, o 16:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marmur]]></name></author>
<updated>2015-11-28T10:35:35+01:00</updated>
<published>2015-11-28T10:35:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146578#p146578</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146578#p146578"/>
<title type="html"><![CDATA[Re: Jak bliczać sumę kontrolnej na wskaźnikach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146578#p146578"><![CDATA[
Kurczę ale pomieszanie z poplątaniem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Masz duże tyły w operowaniu wskaźnikami z tego co widzę.<br /><br />Zapamiętaj coś takiego<br /><br />To jest zwykła zmienna przechowująca jakąś wartość np. może to być liczba 5<br />[syntax=c]uint8_t zmn[/syntax]<br /><br />To jest zmienna przechowująca wskaźnik, czyli adres w pamięci, gdzie wartość się znajduje - adres zazwyczaj jest w postaci hexadecymalnej np. 0x08a22c<br />[syntax=c]uint8_t* wsk[/syntax]<br /><br />Liczbę zmyśliłem, ale jak widać jest znaczna różnica.<br /><br />To jest operator pobrania adresu zmiennej &amp;:<br />[syntax=c]wsk = &amp;zmn // do zmiennej wskaznikowej wsk na typ uint8_t przypisz adres zmiennej uint8_t zmn[/syntax]<br /><br />W tej chwili w zmiennej wsk masz <span style="text-decoration: underline">ADRES</span> do pamięci gdzie znajduje się wartość zmiennej zmn, nie jest to absolutnie wartość którą możesz od tak sobie wyświetlać na lcd czy robić na niej działania bo zawsze skończy się to różnymi błędami.<br /><br />A teraz uwaga, ja wyciągnąć (wyłuskać) wartość zmiennej zmn poprzez wskaznik wsk? Użyjemy operatora *, ktory teraz mozesz interpretowac jako &quot;wyciagnij wartosc ze wskaznika&quot;<br />[syntax=c]uint8_t wyciagnietaWartoscZmiennej = *wsk;[/syntax]<br /><br />Innymi slowy oznaczo to &quot;wyciągnij wartość z pod adresu pamięci ktory przechowuje zmienna wsk oraz zapisz do wyciagnietaWartoscZmiennej&quot;<br /><br />Sam miałem na początku problemy z tym z racji jakby dwojakiego znaczenia operatora *.<br />Zasada jest prosta, gdy deklarujesz zmienną, * przy typie oznacza że chcesz utworzyć zmienna wskaźnikową.<br />Z kolei gdy * umieścisz przy zmiennej wskaxnikowej już w jakiejś instrukcji, otrzymasz wyciagnieta wartość z pod adresu na ktory zmienna ta wskazuje <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />Podsumowując, działanie np. takie jak<br />[syntax=c]suma_kontrolna = &amp;dane_gps0 ^ &amp;dane_gps1[/syntax]<br /><br />Kończą się błędem, bo do zwykłej zmiennej chcesz zapisać adres do zmiennej wskaznikowej, ktora tez przechowuje jakis adres i jeszcze do tego chcesz jakieś działania na tym robić <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> Niezły koktajl <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><br />[syntax=c]uint8_t zmienna = 5; // wypisujac zmienna otrzymasz wartosc 5<br />uint8_t* wsk = &amp;zmienna; // wypisujac wsk otrzymasz adres np. 0x02341dc<br /><br /><br />uint8_t wartoscWskazana = *wsk; //wypisujac wartoscWskazana otrzymasz rowniez 5<br /><br />//jakies instrukcjie[/syntax]<br /><br />Myślę że wiele się wyjaśni w tym i znajdzie się odpowiedź na Twoje pytania <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10570">marmur</a> — 28 lis 2015, o 10:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2015-11-28T03:50:52+01:00</updated>
<published>2015-11-28T03:50:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146571#p146571</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146571#p146571"/>
<title type="html"><![CDATA[Jak bliczać sumę kontrolnej na wskaźnikach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13704&amp;p=146571#p146571"><![CDATA[
Witajcie.<br /><br />Mam kilka prostych pytań dotyczących wskaźników bo nie mogę tego ogarnąć. Pociągnąłem sobie dane z GPSa i są zapisane jako wskaźniki do pamięci <br />[syntax=c]char *ggmmss;[/syntax]<br />oraz mam zmienne tablicowe<br />[syntax=c]char gg&#91;3&#93;;<br />char mm&#91;3&#93;;<br />char ss&#91;3&#93;;<br />char t_ggmmss&#91;7&#93;[/syntax]<br />Pierwsze pytanie -jak mam to podzielić na 3 zmienne gg[], mm[] i ss[]<br />Próbowałem na różne sposoby i niby proste, ale nie do końca<br />np gg wyciągnąłem funkcją skracającą string ale mm i ss nie ma jak wyciągnąc. Nie wiem dlaczego skoro  wskaźnik jest liczbą wskazującą w pamięci na początek stringa to nie mogę do niej dodać np 4 żeby wyciągnąć sekundy np lcd_str(ggmmss+4);<br />inna metoda np strcpy (t_ggmmss , ggmmss);<br />i teraz wyswietlając lcd_int(t_ggmmss[0]) pokazuje godzinę poprawnie oprócz zera za zero podstawia krzaki.<br />moze są jakieś inne metody <br />np ta też nie działa: t_ggmmss = &amp;ggmmss;<br /><br />Drugie pytanie - Chciałbym obliczyć sumę kontrolna - znalazłem taką definicję<em><br />Sumę kontrolną stanowią zawsze dwie liczby (w systemie heksadecymalnym) poprzedzone znakiem gwiazdki. <br />Obecność znaku gwiazdki jednoznacznie wskazuje  początek  sumy  kontrolnej. <br />Suma  kontrolna  wyznaczana  jest  za  pomocą  operacji XOR  na  wszystkich  znakach  od  początku  linii  (za  wyjątkiem  znaku  $)  do  samej  sumy <br />kontrolnej (bez sumy kontrolnej i znaku *), <br />np. linia: $GPGLL,3907.360,N,12102.481,W,183730,A*33<br />ma sumę kontrolną równą 33 (51 w systemie dziesiętnym) obliczoną na podstawie operacji <br />XOR na znakach:<br />GPGLL,3907.360,N,12102.481,W,183730,A</em><br /><br />jak tego dokonać skoro każdą z tych danych mogę przechowywać pod zmienną wskaźnikową<br />zadeklarowałem <div class="codetitle"><b>Code:</b></div><div class="codecontent">uint8_t suma_kontrolna;</div> i teraz<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">suma_kontrolna = &amp;dane_gps0 ^ &amp;dane_gps1 itd</div> - otrzymuje komunikat invalid operands to binary ^ (have 'char **' and 'char **')<br />co z tym zrobić?<br /><br />a trzecie pytanie - może zamiast liczyć sumę kontrolną może możnaby policzyć przecinki - a dlaczego o to pytam - bo czasami nie przylatuje w sygnala jakaś ramka i wszystko się przesuwa o jeden w lewo - chcę się zabezpieczyć przed takim czymś.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 28 lis 2015, o 03:50</p><hr />
]]></content>
</entry>
</feed>