<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>deadlime.project &#187; láncolt lista</title>
	<atom:link href="http://deadlime.hu/tag/lancolt-lista/feed/" rel="self" type="application/rss+xml" />
	<link>http://deadlime.hu</link>
	<description>squeezed out</description>
	<lastBuildDate>Tue, 24 Jan 2012 21:54:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Objektum-orientált C++ IV.</title>
		<link>http://deadlime.hu/2006/04/05/objektum-orientalt-cpp-4/</link>
		<comments>http://deadlime.hu/2006/04/05/objektum-orientalt-cpp-4/#comments</comments>
		<pubDate>Wed, 05 Apr 2006 20:17:38 +0000</pubDate>
		<dc:creator>kriz</dc:creator>
				<category><![CDATA[nincs kategória]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[láncolt lista]]></category>
		<category><![CDATA[objektum-orientált]]></category>

		<guid isPermaLink="false">http://deadlime.hu/2006/04/05/objektum-orientalt-cpp-4/</guid>
		<description><![CDATA[Abban a szerencsétlen helyzetben hagytuk abba legutóbb, hogy a left_insert() függvény hiányzott és a szegény objektumnak nem volt felhasználói felülete. De talán abban egyet érthetünk, hogy így is elég hosszúra nyúlt az előző bejegyzés, meg nekem se volt túl sok kedvem hajnali nem tudom hány órakor még a maradék részt kifejteni.Ami késik, gyakran múlik, de [...]]]></description>
			<content:encoded><![CDATA[<p>Abban a szerencsétlen helyzetben hagytuk abba legutóbb, hogy a <code>left_insert()</code> függvény hiányzott és a szegény objektumnak nem volt felhasználói felülete. De talán abban egyet érthetünk, hogy így is elég hosszúra nyúlt az előző bejegyzés, meg nekem se volt túl sok kedvem hajnali nem tudom hány órakor még a maradék részt kifejteni.<br/>Ami késik, gyakran múlik, de most kivételesen nem. Szóval itt az idő, itt a hely, hogy a félbehagyott osztály elnyerje (még messze nem) végleges formáját.</p><span id="more-28"></span>

<h3>Felhasználói felület</h3>

<p>Mint ahogy már az első bejegyzésben is elmeséltem, a <code>private</code> és <code>public</code> blokkok tárgyalásánál, a felhasználói felület jó dolog, mivel megszabhatjuk vele, hogy a felhasználó milyen módon férhet hozzá az objektum adataihoz, milyen módon használhatja magát az osztályt. Kezdjük a sort a már annyiszor emlegetett <code>left_insert()</code>-tel:</p>

<pre class="code prettyprint lang-c">void cList::left_insert(listNode* target, listNode* data)
{
    data-&gt;prev = target-&gt;prev;
    data-&gt;next = target;
    target-&gt;prev-&gt;next = data;
    target-&gt;prev = data;
    return;
}</pre>

<p><img id="image27" src="/wp-content/uploads/2006/04/oop-cpp-3.gif" alt="oop-cpp-3.gif" class="post-image image-right"/>Jaj, de jó. Ismét egy szép hosszú sor mutató állítgatás. Lehet sejteni, hogy mi is fog következni. Igen, rajzolni fogok. Vagyis már rajzoltam, az eredmény itt jobbra látható a zagyvaságom mellett (stílusosan, mivel ez egy balos beillesztés).<br/>Kis képmagyarázat mielőtt belevágnánk: minden két sor egy-egy sort valósít meg a kódból (a függvény megadását, a return; utasítást és a lezáró zárójelet kihagyva). A jobb felső elem, amihez képest balra szúrjuk be a jobb alsó elemet. Tehát, az első két (kód)sorban csak annyit csinálunk, hogy a beszúrandó listaelem két mutatóját (először a hátrafelé, aztán az előrefelé mutatót) ráállítjuk a célelem előtti elemre, illetve magára a célelemre. Aztán jön az izgi rész, amikor is megbontjuk magát a listát, és befűzzük az elemünket. Először a célelem visszafelé mutatója által mutatott objektum előrefelé mutató mutatóját állítjuk rá a befűzendő elemre, majd a célelem visszafelé mutatóját.<br/>Figyelem! A képen ez a két lépés (szándékosan) fel van cserélve, hogy rajzolási szempontból könnyebb legyen ábrázolnom a dolgot (így nem kellett kereszteznem két mutatót, ami még átláthatatlanabbá tenné az ábrát).</p>

<p>Huhh, haladunk ezerre. Következhet a <code>right_insert()</code>, ami nem okoz majd túl nagy meglepetéseket, ezért különösebb kommentárt nem is fűznék hozzá (igen, képet sem, szóval mindenki megkönnyebbülhet), beszéljen inkább a kód, meg talán az előző magyarázat/kép hatására egyértelmű is lesz a dolog:</p>

<pre class="code prettyprint lang-c">void cList::right_insert(listNode* target, listNode* data)
{
    data-&gt;prev = target;
    data-&gt;next = target-&gt;next;
    target-&gt;next-&gt;prev = data;
    target-&gt;next = data;
    return;
}</pre>

<p>Semmi meglepő, semmi meghökkentő. Jöjjön két függvény, amivel adatokat szedhetünk ki a listából ("név" szerint az első és az utolsó elemet):</p>

<pre class="code prettyprint lang-c">listNode *cList::get_first(void)
{
    if (list-&gt;next == list) throw E_INVALIDITEM();
    return Get(list-&gt;next);
}
listNode* cList::get_last(void)
{
    if (list-&gt;prev == list) throw E_INVALIDITEM();
    return Get(list-&gt;prev);
}</pre>

<p>Ismét látható, hogy mennyire hasznos tud lenni a kétirányú, ciklikus fejelemes lista. Rosszabb esetekben kénytelenek lennénk végigmenni az egész listán, hogy az utolsó elemet ki tudjuk szedni. Vagy kivételként kellene kezelni az utolsó elemet, mert a mutatója (vagy az egyik mutatója) nullpointer. De szerencsére nem kell, így meg is vagyunk a dologgal. Ezekkel az eszközökkel már nagyjából tudunk mit kezdeni a listával, de a felület a megvalósítandó feladattól függően változhat. Minden esetre én még írtam bele egy <code>Search()</code> függvényt is, biztos ami biztos:</p>

<pre class="code prettyprint lang-c">listNode* cList::Search(const int&amp; number)
{
    listNode* tmp = list-&gt;next;
    while (number != tmp-&gt;data &amp;&amp; tmp != list) {
        tmp = tmp-&gt;next;
    }
    if (tmp == list) throw E_INVALIDITEM();
    return tmp;
}</pre>

<p>A keresett elemre mutató mutatóval tér vissza, vagy egy kivételt dob, ha nem találja a megadott elemre. Nem egy lényeges dolog, főleg ha szükség sincs rá, mindenesetre sok vizet nem zavar. Jöjjön valami - relatíve - izgalmasabb dolog: újra operátorokat fogunk írni.</p>

<h3>Lista operátorok</h3>

<p>Mint azt az általános operátoros leírásnál említettem, mindig törekedjünk arra, hogy az operátor valami rá jellemző dolgot hajtson végre. Extrém példaként felhozhatnám azt, hogy mondjuk a - operátort és a + operátort a komplex számoknál felcseréli valaki. Szegény programozó, aki meg akarja használni az objektumot, csak les, hogy mi a fene van. Persze mindenki azt csinál, amit akar, de nem árt az ilyen íratlannak mondható "szabályokra" is ügyelni.</p>

<p>Elsőként a + operátor segítségével fogunk két listát összefűzni. A kód igazából nem olyan hatékony, mint amilyen lenni tudna. Ha például a másik objektumra nem lenne szükségünk, akkor egyszerűen a mi objektumunk végét megbontanánk és hozzácsatolnánk a másik objektumot, vigyázva arra, hogy a fejelemet ne vegyük bele a játékba. Így se lesz sokkal bonyolultabb, csak végigmegyünk a másik objektumon, és szépen hozzáadogatjuk a listánk végére az elemeket (hasonlít egy picit a dolog a copy konstruktorhoz):</p>

<pre class="code prettyprint lang-c">cList&amp; cList::operator+(const cList&amp; other)
{
    listNode* tmp = other.list-&gt;next;
    while (tmp != other.list) {
        listNode* node = new listNode(tmp-&gt;data);
        if (!node) throw E_OUTOFMEMORY();

        this-&gt;left_insert(this-&gt;list, node);
        tmp = tmp-&gt;next;
    }
}</pre>

<p>Következőnek jöhet az egyenlőség operátor. Működését tekintve csak annyit, hogy először kiürítjük a listát, majd a másik lista elemeit átmásoljuk a mi listánkba (copy konstruktorhoz és a + operátorhoz hasonlóan). Az első feltétel meg azért szükséges, hogy ha saját magát adjuk értékül a listának, akkor abból se legyen para.</p>

<pre class="code prettyprint lang-c">cList&amp; cList::operator=(const cList&amp; other)
{
    if (this == &amp;other) return *this;
    this-&gt;Destroy();

    listNode* tmp = other.list-&gt;next;
    while (tmp != other.list) {
        listNode* node = new listNode(tmp-&gt;data);
        if (!node) throw E_OUTOFMEMORY();

        this-&gt;left_insert(this-&gt;list, node);
        tmp = tmp-&gt;next;
    }
    return *this;
}</pre>

<p>Már csak két operátor van, amit meg fogok valósítani, a &lt;&lt; operátor és párocskája a &gt;&gt;. Lényegi haszna nem lesz egyiknek sem, tulajdonképpen csak hasznos álnevekként funkcionálnak majd a végére beszúrás és az utolsó elem kiszedése számára.</p>

<pre class="code prettyprint lang-c">cList&amp; cList::operator&gt;&gt;(int&amp; number)
{
    number = get_last()-&gt;data;
    return *this;
}
cList&amp; cList::operator&gt;&gt;(listNode* pointer)
{
    pointer = get_last();
    return *this;
}

cList&amp; cList::operator&lt;&lt;(const int&amp; number)
{
    listNode* tmp = new listNode(number);
    if (!tmp) throw E_OUTOFMEMORY();

    left_insert(list, tmp);
    return *this;
}
cList&amp; cList::operator&lt;&lt;(listNode* pointer)
{
    left_insert(list, pointer);
    return *this;
}</pre>

<p>A két plusz függvény tényleg csak a kódot teszi szemléletesebbé, átláthatóbbá. Bár ez a két dolog sosem lehet "csak" tényező. Legalább is nekem mindig fontos volt, hogy két-három hónap után is tudjam, hogy mit csinál az általam írt kód, és ezt eddig a Perl kivételével minden nyelvben sikerült is megtennem. :)<br/>Pár példa a használatra:</p>

<pre class="code prettyprint lang-c">cList lista;
lista &lt;&lt; 6 &lt;&lt; 7 &lt;&lt; 1 &lt;&lt; 12 &lt;&lt; 23;
int szam;
lista &gt;&gt; szam;</pre>

<p>Amint az látszik is, eléggé szemléletes. Először a 6-ot, 7-et, 1-et, 12-t, 23-at beletesszük a listába, majd kiszedjük az utolsó elemet (vagyis a szam értéke a végén 23 lesz).</p>

<p>Ezzel végére is értünk a mai napra rendelt dolgoknak. A sablonok ismét a csúszás áldozatává válnak, cserében viszont senki mással nem kell megosztaniuk majd a következő - szám szerint az ötödik - bejegyzést. Addig is további jó próbálkozást.</p>]]></content:encoded>
			<wfw:commentRss>http://deadlime.hu/2006/04/05/objektum-orientalt-cpp-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objektum-orientált C++ III.</title>
		<link>http://deadlime.hu/2006/04/05/objektum-orientalt-cpp-3/</link>
		<comments>http://deadlime.hu/2006/04/05/objektum-orientalt-cpp-3/#comments</comments>
		<pubDate>Wed, 05 Apr 2006 20:11:02 +0000</pubDate>
		<dc:creator>kriz</dc:creator>
				<category><![CDATA[nincs kategória]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[láncolt lista]]></category>
		<category><![CDATA[objektum-orientált]]></category>

		<guid isPermaLink="false">http://deadlime.hu/2006/04/05/objektum-orientalt-cpp-3/</guid>
		<description><![CDATA[Ahogy ígértem, itt a harmadik rész is. Mint már az előző ajánlóban említettem, egy adatok tárolására alkalmas szerkezetű objektumot fogunk elkészíteni. Hogy a jövőben elkerüljem az ilyen nyakatekert mondatokat, nevezzük csak a dolgot "láncolt listának". Így gondolom már több embernek ismerős lehet a dolog. Ismét hanyagolnám a további bevezető rizsázást, klattyanjunk a tovább gombra. Az [...]]]></description>
			<content:encoded><![CDATA[<p>Ahogy ígértem, itt a harmadik rész is. Mint már az előző ajánlóban említettem, egy adatok tárolására alkalmas szerkezetű objektumot fogunk elkészíteni. Hogy a jövőben elkerüljem az ilyen nyakatekert mondatokat, nevezzük csak a dolgot "láncolt listának". Így gondolom már több embernek ismerős lehet a dolog. Ismét hanyagolnám a további bevezető rizsázást, klattyanjunk a tovább gombra.</p><span id="more-26"></span>

<p><img id="image24" src="/wp-content/uploads/2006/04/oop-cpp-1.gif" alt="oop-cpp-1.gif" class="post-image image-left"/>Az első képen gyönyörűen látszik a tömb (felül) és a láncolt lista (alul). Mi is a gondunk a szimpla tömbbel? Csak fix méretben foglalhatjuk le. Annyira fix méretben, hogy már a fordításkor tudnunk kell, hogy mekkorát szeretnénk. De ez csak egy gond. Egy másik gond, hogy ha nem egy szimpla int-et vagy hasonlóan egyszerű objektumot, hanem valami szép nagy dolgot pakolunk bele, és azt szeretnénk rendezni, az ugye nem kis erőforrásigényű, ahogy cserélgeti az objektumokat a memóriaterületen, hogy sorban legyenek. Perszer erre lehet azt mondani, hogy a kriz az hülye, mert miért nem objektumokra mutató mutatókból csinál tömböt, és akkor csak a mutatókat kell mozgatnia. No igen, ez egy fokkal jobb ötlet, és azt a problémánkat is megolja, hogy fordítási időben kell tudnunk a tömb méretét. Elég a tömb lefoglalásakor akár dinamikusan egy változóban tudni a méretet. A probléma még mindig probléma, hogy ha azt a fix méretet túllépjük, akkor az gáz.</p>

<p>Itt jön a képbe a láncolt lista. A szerkezet lényege, hogy egy listaelem egy adatrészből és egy mutatórészből áll. Pontosítok: egy listaelem egy adatrészből és legalább egy mutatórészből áll. Miért jó ez? Egyrészről azért, mert a listaelemeket dinamikusan, a futási idő alatt foglalgatjuk le, felső határ csak a memória mérete, nem pedig egy előre meghatározott szám. Másrészről pedig itt is megvan az az előny, hogy csak a pointereket kell új címre állítani ahhoz, hogy rendezni tudjuk a listánkat. Izgi, mi? :)</p>

<p>Hogy ne legyen ilyen egyszerű a helyzet, mi egy fejelemes, kétirányú, ciklikus láncolt listát fogunk csinálni. ez azt jelenti, hogy a listaelemben két mutató van, amiből az egyik az előző, a másik a következő elemre fog mutatni (ezért kétirányú), a lista első eleme nem tartalmaz adatot, az csak azért van hogy az első elem beszúrása és az utolsó elem törlése jóval könnyebb legyen (tehát fejelemes) és az utolsó elem "következő elem" mutatója nem nullpointer, hanem a fejelemre mutat (ugyanígy a fejelem "előző elem" mutatója az utolsó elemre mutat). Kezdjük talán a dolog egyszerűbb végénél, a listaelem szerkezetének a megvalósításánál:</p>

<pre class="code prettyprint lang-c">struct listNode
{
    listNode* prev;
    listNode* next;
    int data;

    listNode()
    {
        next = prev = this;
    }
    listNode(const int&amp; num)
    {
        next = prev = this;
        data = num;
    }
};</pre>

<p>Csoddálatos. Értelem szerűen van egy prev mutató az előző elemre, egy next mutató a következő elemre és egy data, amiben az adatokat tároljuk. Itt az ideje, hogy magának a listának is nekiálljunk. A dolog végtelenül egyszerű, szükségünk lesz egy <code>listNode*</code> változóra, ami "tartani" fogja a lista fejelemét, egy befűző és egy kifűző függvényre, amivel új elemeket szúrhatunk be, illetve létezőket vehetünk ki.</p>

<pre class="code prettyprint lang-c">class cList
{
    private:
        // A lista fejelemére mutató pointer
        listNode* list;

        // Üres lista létrehozása
        void Create(void);

        // Lista kiürítése
        void Destroy(void);

        // target című elem törlése
        void Remove(listNode* target);

        // target című elem kifűzése
        listNode* Get(listNode* target);
    public:
        // Konstruktor
        cList(void);

        // Copy Konstruktor
        cList(const cList&amp; other);

        // Destruktor
        ~cList(void);

        // Kivétel osztályok
        class E_OUTOFMEMORY {};
        class E_INVALIDITEM {};

        void left_insert(listNode* target, listNode* data) {}
};</pre>

<p>Ennyi egyenlőre elég is lesz, bár az objektum kezelőfelülete még a tervezés szintjén sincs kész (a <code>left_join()</code>-t leszámítva, ami csak azér került bele (üresen), hogy leforduljon a kód, majd a negyedik részben lesz rendesen kifejtve), de azzal ráérünk később is foglalkozni. Kezdjük akkor sorban a megvalósítást, először a <code>Create()</code> függvénnyel, ami létrehozza az üres listát (amiben csak a fejelem van).</p>

<pre class="code prettyprint lang-c">void cList::Create(void)
{
    list = new listNode();
    if (!list) throw E_OUTOFMEMORY();

    list-&gt;next = list;
    list-&gt;prev = list;
    return;
}</pre>

<p>A <code>cList::</code> előtag annak köszönhető, hogy az osztály definícióján kívül van megvalósítva a függvény. Gondolom nem annyira ismeretlen eljárás ez. Az objektum szerkezete megy a fejelembe (.h vagy .hpp), a többi meg az ugyanolyan nevű .cpp fájlba. Áttérhetünk a <code>Destroy()</code> függvényre, ami a fejelemen kívül minden elemet töröl a listából.</p>

<pre class="code prettyprint lang-c">void cList::Destroy(void)
{
    while (list-&gt;prev != list) {
        Remove(list-&gt;prev);
    }
    return;
}</pre>

<p>Rettentő cselesen a <code>Remove()</code> függvényt használtam a dologhoz, így tulajdonképpen egyesével kifűzve az összes elemet a listából, mígnem a fejelem prev mutatója meg nem egyezik a lista fejelemének a címével. Ahogy illik, a <code>Remove()</code> megvalósításával folytatom a sort. Lassan, de biztosan közeledünk a vége felé... :)</p>

<pre class="code prettyprint lang-c">void cList::Remove(listNode* target)
{
    listNode* tmp = Get(target);
    delete tmp;
    return;
}</pre>

<p>Ismét továbbadjuk a dolog megvalósítását egy másik függvénynek, a <code>Get()</code>-nek, ami így is, úgy is kifűzi az elemet, akkor miért ismételnénk meg ugyanazt a kódot még egyszer a <code>Remove()</code>-ban is? Tehát, a <code>Get()</code>-tel kifűzetjük, majd a kapott elemet töröljük. Nna, nézzük azt a <code>Get()</code>-et, ha már egyszer ennyi minden épül rá:</p>

<pre class="code prettyprint lang-c">listNode* cList::Get(listNode* target)
{
    target-&gt;prev-&gt;next = target-&gt;next;
    target-&gt;next-&gt;prev = target-&gt;prev;
    target-&gt;prev = target;
    target-&gt;next = target;
    return target;
}</pre>

<p><img id="image25" src="/wp-content/uploads/2006/04/oop-cpp-2.gif" alt="oop-cpp-2.gif" class="post-image image-left"/>Nos, ez egy nem egyszerű dolog. Igazából egyszerű, csak leírni lenne túl bonyolult, inkább veszem a bátorságot és rajzolok egy ábrát hozzá. Egy "jó" ábra felér egy bekezdésnyi szöveggel. Mindenesetre az ábrát is megmagyarázom inkább. Fő a biztonság. Szóval, a kép első sorában az alaphelyzetet látjuk. A második sor a függvény első sorának hatását hivatott szemléltetni, azaz a kifűzendő listaelem előtti elemnek a következő elemre mutató mutatóját átállítjuk a kifűzendő elem utáni elemre. A kép harmadik sorának lényege ugyanez, csak fordítva, mivel a kifűzendő elem utáni elem előző elemre mutató mutatóját állítjuk a kifűzendő elem előtti elemre. Így a lista maga már nem függ a kifűzendő elemtől, mindenesetre a biztonság kedvéért a két mutatóját saját magára állítjuk (a függvény utolsó két mutató állítása). Végül visszatérünk a kifűzött elem mutatójával. Ezzel le is tudtuk az objektum private részét, jöhet a public:</p>

<pre class="code prettyprint lang-c">cList::cList(void)
{
    Create();
}</pre>

<p>Egyszerűbb nem is lehetne, csak a <code>Create()</code>-et hívjuk, meg hogy legyen egy üres listánk. Nézzük a copy konstruktort:</p>

<pre class="code prettyprint lang-c">cList::cList(const cList&amp; other)
{
    Create();

    listNode* tmp = other.list-&gt;next;
    while (tmp != other.list) {
        listNode* node = new listNode(tmp-&gt;data);
        if (!node) throw E_OUTOFMEMORY();

        this-&gt;left_insert(this-&gt;list, node);
        tmp = tmp-&gt;next;
    }
}</pre>

<p>Lényegében az értékül adott listán végigmegyünk és egyesével beszúrjuk az elemeit a saját listánkba. Mint említettem annak idején, a copy konstruktor fontos dolog. Gondoljunk csak bele, hogy mi történne akkor, ha nem írnánk sajátot. Az objektum változóinak értéke szépen átmásolódna. Tehát ha B objektumnak adjuk kezdőértékül A objektumot, akkor B objektum list változója ugyanoda fog mutatni, mint az A objektum list változója, tehát ha az A objektumot megszüntetjük, akkor a B objektum tulajdonképpen a "semmibe" fog mutatni. De ha B objektum listáján változtatunk (kifűzünk, befűzünk), akkor A objektum listája is változik.<br/>A <code>left_insert()</code> az első paraméterként kapott pointer által mutatott listaelemhez képest balra fűz be egy elemet. Mivel esetünkben a lista fejelemét kapja meg a függvény, és mivel a lista fejelemének bal oldalra mutató mutatója (azaz a prev) a lista utolsó elemére mutat, ez azt jelenti, hogy a lista végére fűzzük be az elemet. Jöjjön végül, de nem utolsó sorban a destruktor:</p>

<pre class="code prettyprint lang-c">cList::~cList(void)
{
    Destroy();
    delete list;
}</pre>

<p>Nem meglepő módon a destruktor (ami ugyebár a konstruktor úgymond ellentéte, és akkor fut le, amikor az objektum megszűnik) a <code>Destroy()</code> függvénnyel kiüríti a listát, majd a list változó segítségével megszünteti a fejelemet is.<br/>Asszem ennyi elég is lesz mára. Az objektum felhasználói felületét (a public függvények, mint például a <code>left_insert()</code>) és néhány operátort a következő részben fogunk megírni, és ha nem nyúlik túl hosszúra a dolog (mint ahogy most), akkor végre a sablonokat is kitárgyaljuk.</p>]]></content:encoded>
			<wfw:commentRss>http://deadlime.hu/2006/04/05/objektum-orientalt-cpp-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

