Lineárny zoznam, triedy cNode, cList – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Lineárny zoznam, triedy cNode, cList – C / C++ – Fórum – Programujte.comLineárny zoznam, triedy cNode, cList – C / C++ – Fórum – Programujte.com

 

Xgamer0
Duch
8. 3. 2011   #1
-
0
-

Zdravím už zopár dní bojujem zo zadaním z C++. A už som fakt zúfalý :( Mojou ulohou je dorobiť danú šablonu. Tu su zdrojáky:

main.c

#include <iostream>

#include "cList.h"
using namespace std;

int main()
{
cout << "Linked List" << endl;
cout << "--------------" << endl;
cNode* n1 = new cNode("1");
cNode* n2 = new cNode("2");
cNode* n3 = new cNode("3");

cList zoznam;
zoznam.append(n1);
zoznam.append(n2);
zoznam.append(n3);
zoznam.append(new cNode(*n1));
zoznam.append(new cNode(*n1));
zoznam.append(new cNode(*n1));
zoznam.printContents();

cNode* n4 = new cNode("4");
cNode* n2_5 = new cNode("2.5");
zoznam.insert(n4, 10);
zoznam.insert(n2_5, 2);
zoznam.deleteNode(1);
zoznam.deleteNode(0);
zoznam.deleteNode(10);
cout<<"---------------------------"<< endl;
zoznam.printContents();

cList zoznam2 = cList(zoznam);
zoznam2.deleteNode(0);
zoznam2.deleteNode(0); // nezmaže mi nultý prvok vidim to na problem s kopirovacím konštruktorom
cout<<"------------Zoznam 1 - original---------------"<< endl;
zoznam.printContents();
cout<<"------------Zoznam 2 - kopia---------------"<< endl;
zoznam2.printContents();

delete n1; // hádže segmantation fault
delete n2;
delete n3;
delete n4;
delete n2_5;

return 0;
}


Problémový kod z cList.cpp

#include "cList.h"


using namespace std;
cList::cList()
{
first = NULL;
}

cList::cList(const cList &oldList) // kopíruje aj to čo už nemá byť v pamäti, predpokladám že preto mi nemaže to čo by malo
{

first = NULL;

if (oldList.getLength() > 0)
{
first = new cNode(oldList.first->getData());

cNode *tmp = first, *tmp2;

for (int i = 0; i < oldList.getLength(); i++)
{
tmp2 = new cNode(oldList.getNode(i)->getData());

tmp->setNext(tmp2);

tmp = tmp2;
}
}
}

cList::~cList() // tento deštruktor asi sposobuje segmentation fault
{
for(int i = 0;i < getLength();i++)
{
cNode *tmp = getNode(i); // funkcie getNode vráti uzol na danom indexe, funguje v iných častiach kodu, v nej by problem byť nemal
delete tmp;
}
delete first;
}


Ostátne časti kodu zatial nebudem posielať.. :). Dufam že tieto časti budu stačiť. Som si na 99% istý že problem je v tomto kode. Pridal som do zdrojaku komentáre že čo nefunguje. Pri kopirovaní celeho zoznamu sa skopiruje aj to čo by tam už nemalo byť neviem prečo:( V tom deštruktore idem asi zle na to uvolnovanie pamäte.. ale zase keď nemam v tom deštruktore nič tak mi to počas delete sekcie v main.c vypiš random vypis pamäte... Ďakujem :)

Nahlásit jako SPAM
IP: 195.178.88.–
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #2
-
0
-

a to je jako spojovej seznam?

    for(int i = 0;i < getLength();i++)

{
cNode *tmp = getNode(i); // funkcie getNode vráti uzol na danom indexe, funguje v iných častiach kodu, v nej by problem byť nemal
delete tmp;
}
delete first;

je vesmes nazorna ukazka "rezat si pod sebou vetev" pokud ano


kopirovani byt spatne nutne nemusi.. otazkou je, jak se chovas k tomu "co uz v pameti nema byt"
jestli hodis jen delete tak odkazy zustanou.. valgrind ti nahlasi ze pristupujes kdo vi kam
a destruktor nejspis hodi segfault kdyz se snazis o delete nad tim, co uz "uvolneny" (nikoliv smazany) bylo


Takze na 100% bude chyba nejmene v tom mazani prvku + destruktor.. obzvlaste pokud pouzivas stejne blbej pristup

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Xgamer0
Duch
8. 3. 2011   #3
-
0
-

Ok no c++ mam prvý semester takže nie som v tom vobec doma, cvičiaci nam to tiež moc nevysvetlil, tak sa to snažim sam pochopiť. No ale to bokom tu je funkcia na mazanie:



void cList::deleteNode(int index)
{
if(first == NULL) // ak je zoznam prazdny
cout <<"Zoznam je prazdny!"<< endl;

if(index < getLength())
{
if(index == 0)
{
cNode *tmp = first;
first = first->getNext();
delete tmp;
}
else
{
cNode *tmp = getNode(index);
getNode(index-1)->setNext(tmp->getNext());
delete tmp;
}
}
}


Ako blbý pristup? pravdepodobne tomu nerozumiem.. .lebe kedže mi vrati funkcia getNode uzol na danom indexe tak ked mi ho najde tak ho chcem uvolnit a potom postupovat dalej... až dokedy ich neuvolnim všetky. Možno keby je to tmp inicializované mimo toho cyklu? Mohol by si mi načrtnut ako by si riešil to uvolnovanie ty? Ďakujem

Nahlásit jako SPAM
IP: 195.178.88.–
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #4
-
0
-

Blby pristup ze v tom prvku, ktery mazes, mas i odkaz, kde je dalsi prvek.. pak prochazis hromadu uz nealokovanych prvku (ktere v pameti jeste byt muzou ale taky nemusi)
a hlavne ta slozitost.. kvadraticka nebo dokonce exponencialni?

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #5
-
0
-

delete node by mohlo i fungovat..

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Xgamer0
Duch
8. 3. 2011   #6
-
0
-

Ďakujem:) už som to nejako rozbehal ale chcem sa spýtat ešte ako si možem otestovať či to miesto v pamäti bolo skutočne uvolnene? if ... != NULL?

Nahlásit jako SPAM
IP: 195.178.88.–
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #7
-
0
-

uvolneni nemusi a nejspis ani nijak nezmeni mazany pointer... bude ukazovat furt na stejne misto, to se akorat muze zmenit nebo alokovat necim jinym


na otestovani pameti pouzivam zasadne nastroj valgrind

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

Podobná vlákna

Linearny zoznam — založil Grungy

Zoznam — založil CJ

Zoznam funkcii — založil Milan

Jednosmerny zoznam — založil Grungy

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý