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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-05-07T19:03:55+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3055&amp;mode</id>
<entry>
<author><name><![CDATA[toch88]]></name></author>
<updated>2013-05-07T19:03:55+01:00</updated>
<published>2013-05-07T19:03:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3055&amp;p=36406#p36406</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3055&amp;p=36406#p36406"/>
<title type="html"><![CDATA[Dynamiczna alokacja pamięci]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3055&amp;p=36406#p36406"><![CDATA[
Chciałbym uczulić na pewną sprawę bo sam do nie dawna nie zdawałem sobie z niej sprawy - mianowicie należy zwrócić uwagę na zwalnianie pamięci z nieużywanych już zmiennych niby sprawa błaha, ale w moim projekcie nie jest tak do końca to proste.<br /><br />mamy sobie STRUKTURE<br /><br />[syntax=c]typedef unsigned char uint8_t;<br /><br />typedef struct TPARSER{<br />uint8_t ElementsOfTab;<br />uint8_t ElementsOfFunc;<br />uint8_t nbOfChild;<br />uint8_t childId;<br />uint8_t thisId;<br />char *string&#91;10&#93;;<br />struct TPARSER **child;<br />struct TCMD **commands;<br />}TPARSER;[/syntax]<br /><br />teraz zauważmy że posiadam tablice wskaźników do wskaźnika struktury, co to za ustrojstwo sobie pomyślicie, za chwilę się wszystko wyjaśni.<br /><br />teraz mamy sobie sparsować tekst :<br /><br />[syntax=c]char string&#91;&#93;=&quot;Silnik 3,5;Silnik 3,4;Silnik 3,2;LOOP 5*Silnik 3,45;&quot;;[/syntax]<br /><br />tak aby to posegregować na człony funkcjonalne.<br /><br />no dobra:<br /><br />[syntax=c]TPARSER*par;<br /><br />par=(struct TPARSER*)malloc (sizeof(TPARSER));<br />initParser(par, string,&quot;*&quot;); //najpierw dzielimy pomiędzy występujące gwiazdki<br />                                   //otrzymamy po przejściu przez funkcję inicjalizacyjną par-&gt;string&#91;0&#93; =&#93;Silnik 3,5;Silnik 3,4;Silnik 3,2;LOOP 5<br />                                   // oraz par-&gt;string&#91;1&#93;=Silnik 3,45;<br /><br />createChild(par, &quot;;&quot;); // na podstawie każdego ze stringów (struktury) zostaną stworzone dzieci<br />                             // z par-&gt;string&#91;0&#93; powstanie par-&gt;child&#91;0&#93;, par-&gt;child&#91;1&#93;, przy czym <br />                             // par-&gt;child&#91;0&#93; będzie posiadał string par-&gt;child&#91;0&#93;-&gt;string&#91;0&#93;=Silnik 3,5, <br />                             // a następny par-&gt;child&#91;0&#93;-&gt;string&#91;1&#93;=Silnik 3,4itd<br />                             // natomiast następne dziecko bd miało  par-&gt;child&#91;1&#93;-&gt;string&#91;0&#93;=Silnik 3,45<br />//no dobrze wszystko ładnie pięknie, ale jeżeli ten algorytm miałby się powtórzyć, np przy odbiorze nowego ciągu do parsowania, trzeba by było zwolnić zasoby i wyzerować wskaźniki<br /><br />free(par-&gt;child); //NO WŁAŚNIE TO BYŁ MÓJ BŁĄD, gdyż teraz należałoby oczyścić każdy element z tej tablicy wskaźników <br /><br />free(par-&gt;child&#91;0&#93;);<br />free(par-&gt;child&#91;1&#93;);<br />free(par-&gt;child);<br />free(par);<br /><br />// oczywiście u mnie robi to teraz funkcja, ale dopiero po takim zabiegu program się nie wiesza[/syntax]<br /><br /><br />Pewnie dla wielu osób spraw oczywista ,ale uważam że kiedyś komuś może się przydać.<br /><br />Jeżeli chciałby ktoś zobaczyć funkcje initParser oraz createChild to mogę wrzucić.<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1138">toch88</a> — 7 maja 2013, o 19:03</p><hr />
]]></content>
</entry>
</feed>