{"id":36,"date":"2007-12-08T04:14:43","date_gmt":"2007-12-08T03:14:43","guid":{"rendered":"http:\/\/netrix.org.pl\/index.php\/2007\/12\/08\/structreader\/"},"modified":"2011-02-12T02:47:35","modified_gmt":"2011-02-12T01:47:35","slug":"structreader","status":"publish","type":"post","link":"https:\/\/netrix.org.pl\/index.php\/2007\/12\/08\/structreader\/","title":{"rendered":"StructReader"},"content":{"rendered":"<p>Wpad\u0142em na pomys\u0142 prostego serializer&#8217;a, kt\u00f3ry by potrafi\u0142 czyta\u0107 dane z pliku podzielonego na sekcje i zapisywa\u0107 je do prostej struktury &#8211; agregata. Mia\u0142 by\u0107 to szablon funkcji, kt\u00f3ry pobiera\u0142by jako jeden z argument\u00f3w wska\u017anik do tej struktury, nast\u0119pnie wylicza\u0142 miejsce zmiennej w strukturze, na podstawie tablicy z typami (enum) i w ko\u0144cu zapisywa\u0142  przeczytane dane odpowiednio, sformatowane przez bibliotek\u0119 standardow\u0105. Niestety jak si\u0119 okaza\u0142o (czego do tej pory nie wiedzia\u0142em) miedzy sk\u0142adnikami klasy, struktury s\u0105 przerwy, wi\u0119c nie mo\u017cna skorzysta\u0107 z wska\u017anika, kt\u00f3rego chcia\u0142em przesuwa\u0107 o rozmiar przeczytanego typu, gdy\u017c spowoduje to b\u0142\u0119dy zapisu.<br \/>\nNa szcz\u0119\u015bcie rozwi\u0105zanie tego problemu okaza\u0142o si\u0119 bardzo proste i jest o wiele bardziej uniwersalne, ot\u00f3\u017c zamiast wska\u017anika na obiekt struktury, przekazuj\u0119 funkcji (poniewa\u017c szablon jest ju\u017c niepotrzebny) tablic\u0119 wska\u017anik\u00f3w do zmiennych i jej rozmiar. Dzi\u0119ki niej wiem gdzie w pami\u0119ci znajduje si\u0119 dana zmienna. Rozwi\u0105zanie to ma te\u017c inna zalet\u0119, poniewa\u017c do funkcji mog\u0119 przekaza\u0107 nie tylko obiekty struktury, ale r\u00f3wnie\u017c dowolne obiekty nienale\u017c\u0105ce do struktury.<\/p>\n<p>Oto przyk\u0142adowy plik cfg:<\/p>\n<pre line=\"1\" lang=\"text\">\r\nSekcja1{\r\n   \/\/ Komentarz\r\n}\r\n\/\/ Komentarz 2\r\nSekcja2\r\n{\r\n   zmienna1 = 3.14;     \/\/ Komentarz np. opisuje jaki to typ, tu float\r\n}\r\n<\/pre>\n<p>Jak wida\u0107 schemat jest prosty:<\/p>\n<ol>\n<li>Sekcje oznaczamy nazw\u0105 i klamerkami<\/li>\n<li>Komentarze tylko  po  \/\/, s\u0105 wa\u017cne do ko\u0144ca linii<\/li>\n<li>Nazwy zmiennych nie s\u0105 brane pod uwag\u0119, liczy si\u0119 znak &#8216;=&#8217;  i &#8216;;&#8217;, pierwszy rozpoczyna czytanie warto\u015bci, drugi ko\u0144czy.<\/li>\n<\/ol>\n<p>PS. Schemat pliku zmy\u015blony z Regedit&#8217;a :).<\/p>\n<p>W kodzie wygl\u0105da to tak:<\/p>\n<pre line=\"1\" lang=\"cpp\">\r\n\/\/ Tworzymy tablic\u0119 z typami\r\nint types[] = { TYPE_FLOAT };        \/\/ Przyk\u0142adowo float\r\n\r\n\/\/ Zmienna\r\nfloat temp;\r\n\r\n\/\/ Tablica ze wska\u017anikami\r\nvoid* pointers = { &amp;temp };\r\n\r\n\/\/ Odczyt z pliku\r\nFillUpStruct(\"nazwa_pliku_jako_string\", types, sizeof(types),  \"Sekcja2\", pointers, sizeof(pointers));\r\n<\/pre>\n<p>Wed\u0142ug mnie wygl\u0105da to \u0142adnie, i jest proste w u\u017cyciu, szczeg\u00f3lnie przydatne przy zapisie ustawie\u0144 np. urz\u0105dzenia DX.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wpad\u0142em na pomys\u0142 prostego serializer&#8217;a, kt\u00f3ry by potrafi\u0142 czyta\u0107 dane z pliku podzielonego na sekcje i zapisywa\u0107 je do prostej struktury &#8211; agregata. Mia\u0142 by\u0107 to szablon funkcji, kt\u00f3ry pobiera\u0142by jako jeden z argument\u00f3w wska\u017anik do tej struktury, nast\u0119pnie wylicza\u0142 miejsce zmiennej w strukturze, na podstawie tablicy z typami (enum) i w ko\u0144cu zapisywa\u0142 przeczytane [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[179,20,56],"_links":{"self":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/36"}],"collection":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/comments?post=36"}],"version-history":[{"count":10,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/36\/revisions"}],"predecessor-version":[{"id":803,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/36\/revisions\/803"}],"wp:attachment":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/media?parent=36"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/categories?post=36"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/tags?post=36"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}