Forum huvudsida -> Programmering -> C++: Hjälp med en övning, någon?
olle | 01:31 - 24:e Juli 2006 | Post #1 | |
Medlem Inlägg: 57 Skicka PM |
Hej igen! Håller på och gör en övning från en gamma kurs jag läste förut. Men jag tror att några av funktioner jag definerat i "group.cpp" är fel. När jag kompilerar min projekt med "make" så får jag inget fel. Men när exekverar filen så kommer det upp en ruta som det ska. Men efter det så krashar programmet. Jag får meddelandet "Avbruten (SIGABRT)" Verkar som det har med minneshanteringen och göra eller något som ni kanske kan lista ut? Här har jag en bild på själva uppgiften om ni har lust och kolla. http://img228.imageshack.us/img228/6748/groups1oz8.jpg http://img157.imageshack.us/img157/6586/groups2qj0.jpg Här kommer källkoden: ps: Ni kan ej kompilera det pga att den behöver lite saker och är ett projekt ( make etc ) Sen tar jag inte med alla includerings filer som ej berör uppgiften shape.h
rect.h
ellipse.h
circle.h
square.h
group.h
Detta är vad jag behöver hjälp med. group.cpp
grouptest.cpp
Alla andra klasser såsom shape, circle, rectangle, square etc fungerar utmärkt om jag tex skapar vanligt utan att använda group objekt. Min clone funktion fungerar i alla klasser förutom kanske i Group. Tror man måste göra om den lite grann. Sen är jag nästan osäker på alla funktioner jag gjort i Group. Destruktorn vet jag ej hur man skulle gå tillväga. Man ska tydligen göra den virtual i Shape klassen och definera den i resternade subklasserna. move funktionen har jag skippat så länge tills jag får allt annat och fungera. Tar med en av andra klasser ifall någon ville se. Alla andra ser nästan likadana ut.
Hehe detta blev rätt så mycket. Hoppas jag ej är till stor besvär..De enda som är fel ligger i group.cpp. Tack i förhand Ha de gött ps: Som sagt får inget kompilerings fel. Utan blir fel i själva exekveringen. Tror minneshantering. operator+= och koperingskonstruktorn är nog fel. ------------------------- Ingen signatur! Senast redigerad 01:47 - 24:e Juli 2006 |
Independence | 07:36 - 24:e Juli 2006 | Post #2 | |
Administratör Inlägg: 1800 Skicka PM |
Man brukar få "Segfault" när det är fel på minneshanteringen tror jag. "Sigabrt" låter som "signal abort", dvs att någon sa till programmet att stänga av sig. Vet inte riktigt vad det betyder dock Kan vara så att OSet stängde av programmet för att det drog för mycket minne kanske? Edit: TheShapeList[i+1] Borde väl fungera antar jag, lägger till ett element sist i listan. Som jag kommer ihåg att man brukar göra är dock TheShapeList.append(sp.clone()); eller nåt i den stilen. Kan iofs vara att jag blandar ihop det med något annat dock ------------------------- Vi är riddarna som säger fiskbulle! Senast redigerad 07:41 - 24:e Juli 2006 |
Nissebosselasse | 08:18 - 24:e Juli 2006 | Post #3 | |
Medlem Inlägg: 490 Skicka PM |
Har bara ögnat igenom det jättesnabbt, men ska du inte göra en push_back istället för TheShapeList[i+1], eftersom det är en std::vector? Den enda containerklass som jag vet som stödjer sådant, är std::map. Ang. SIGABRT: mjukvarusignaler (som finns i signal.h) genereras av funktionen raise, och det finns olika signaler beroende på vilken typ av signal man vill åtstadkomma (SIGINT, SIGTERM, etc.). Just SIGABRT kommer från att någon antagligen har anropat funktionen abort; eftersom du använder ett tredjepartsbibliotek (QT), så är väl risken att det är något däri som spökar (såvida det inte är din vektor som spökar med minnet). Läs mer om SIGABRT här: http://msdn2.microsoft.com/en-us/library/k089yyh0.aspx ------------------------- http://pushingcows.se Gula Nallen |
olle | 11:35 - 24:e Juli 2006 | Post #4 | |
Medlem Inlägg: 57 Skicka PM |
Testade och skriva
Men fick felmdeddelade: group.cpp: In member function `Group& Group::operator+=(Shape&)': group.cpp:59: no matching function for call to `Vector<Shape*>::push_back(Shape&)' vector.h:99: candidates are: void Vector<Object>::push_back(const Object&) [with Object=Shape*] Vad jag vet så ska QT fungera utmärk. Pga att jag har gjort denna övning tidigare ( 2år sen ). Det som är fel är själva funktiionen operator +=. Tar jag bort denna rad så får jag ej SIGABRT. ( grouptest.cpp ) (((g += e) += s) += c) += r; Sen kanske mer funktioner i group.cpp är fel. Begriper inte varför den gör abort på själva processen. Tack för att ni försöker hjälpa mig. ------------------------- Ingen signatur! |
Nissebosselasse | 12:50 - 24:e Juli 2006 | Post #5 | |
Medlem Inlägg: 490 Skicka PM |
Du kan inte göra så eftersom argumentet till operator+= är en referens (Shape &), medan vektorn innehåller pekare (Shape *). Borde fungera:
Alternativt borde det här också fungera, d.v.s., ta ut adressen till referensen:
Jag gjorde ett litet test med det sista alternativet, och det fungerade bra. Men nu kanske detta inte är det enda problemet i programmet... Tänkte på raden (((g += e) += s) += c) += r;, det är kanske något av resultaten (d.v.s. av de överlagrade operator+=) som returnerar en NULL-pekare. ------------------------- http://pushingcows.se Gula Nallen |
olle | 13:41 - 24:e Juli 2006 | Post #6 | |
Medlem Inlägg: 57 Skicka PM |
Tack för hjälpen. Nu fungerar raden (((g += e) += s) += c) += r; Nästa steg jag testade var och se om jag kunde göra en kopia av g till en annan Group objekt:
Men när jag kompilerar och kör så ritar den inte upp nåt. Verkar som Group::clone() funktionen inte är riktigt rätt. I uppgifter står det att man ska utnyttja kopieringskonstruktorn i definitionen av Group::clone(). Tror jag ej använder det riktigt. För kopieringskonstruktorn anropas endast när man skapar en ny objekt och gör själva tilldelning. Tycker jag gjort rätt eller?
Borde man inte använda "this" någonstans här med clone() funktionen för respektiv Objekt som redan är definerad beoende på vilken typ det är?? Men nu kom jag på att man ska göra på detta sätt: Men detta är fel oxo. Pga att den gör en clone av själva gp.
Kör jag programmet så får jag "Segmenteringsfel". Så nu kan man säga att det är minneshanteringen. Måste nog fixa destruktorn. För jag har inte deallokerat någonstans och vet ej hur definitionen ska se ut i just den funktionen. Man ska tydligen ha virtual ~Shape = 0. Sen definera det i subklasserna. Tack till Nissebosselasse och Independence som hjälper till. Hoppas jag ej är till besvär som sagt ------------------------- Ingen signatur! Senast redigerad 14:37 - 24:e Juli 2006 |
olle | 14:58 - 24:e Juli 2006 | Post #7 | |
Medlem Inlägg: 57 Skicka PM |
Står att man ska använda kopykonstruktorn när man gör Group::clone(). Men hur fixar man så att den gör en kopia av den objekt som anroper clone() funktionen? Man borde använda "this" isåfall ? Sen kanske jag måste använda push_back i definitionen av kopykonstruktorn?
I funktionen Group::clone() så undrar jag vad man ska skriva i själva argumentet när man försöker använda kopykonstruktorn
Uppskattas all hjälp ------------------------- Ingen signatur! Senast redigerad 15:01 - 24:e Juli 2006 |
Nissebosselasse | 16:17 - 24:e Juli 2006 | Post #8 | |
Medlem Inlägg: 490 Skicka PM |
Först och främst om clone-funktionen:
När avslutas funktionen? Aldrig! Du skapar ett nytt objekt, anropar dess clone-funktion, som i sin tur skapar ett nytt objekt och därefter anropar sin clone-funktion, som skapar ett nytt objekt och därefter anropar... I evighet. Jag får återkomma med det andra - du kanske rent av kommer på en lösning under tiden! ------------------------- http://pushingcows.se Gula Nallen |
olle | 17:48 - 24:e Juli 2006 | Post #9 | |
Medlem Inlägg: 57 Skicka PM |
Hehe nu när du säger det så är det logiskt att man anropar samma funktion som en loop. Försöker lista ut vad man ska göra när man skapar en Group g(?) med vilken argument i Group::clone() funktionen. Sen när det gäller kopieringskontruktorn så har jag nu precis felsökt genom att skriva:
Tydligen fel i kopieringskonstruktorn. Ska försöka testa med push_back() istället. Verkar som jag inte begriper nåt heh, får inte till det o fungera med push_back. Säkert nåt fel jag gör. ------------------------- Ingen signatur! Senast redigerad 18:15 - 24:e Juli 2006 |
Nissebosselasse | 19:06 - 24:e Juli 2006 | Post #10 | |
Medlem Inlägg: 490 Skicka PM |
Så här gjorde jag med min kopieringskonstruktor:
Eller, det är två varianter egentligen. Den första använder sig av push_back, och den andre använder en av STL-bibliotekets algoritmer (std::copy), samt std::back_inserter, som allokerar minne automatiskt för varje nytt element som ska sättas in (annars hade man fått reservera minne först innan anropet till std::copy, så att det garanterat fick plats). EDIT: ska kanske visa Group.h också:
------------------------- http://pushingcows.se Gula Nallen Senast redigerad 19:14 - 24:e Juli 2006 |
olle | 19:57 - 24:e Juli 2006 | Post #11 | |
Medlem Inlägg: 57 Skicka PM |
Lägger jag in din kod i group.h och group.cpp så får jag In file included from ../../sources/grouptest.cpp:12: ../../sources/include/group.h:24: syntax error before `::' token ../../sources/include/group.h:25: ISO C++ forbids defining types within return type ../../sources/include/group.h:25: syntax error before `::' token make: *** [binaries/grouptest.o] Error 1
Innan har jag använd egen vector.h fil som man får med i själva övningen. Den ser ut såhär.
Vad är de för fel nu då? ------------------------- Ingen signatur! |
Nissebosselasse | 20:03 - 24:e Juli 2006 | Post #12 | |
Medlem Inlägg: 490 Skicka PM |
Alltså, först och främst: det var aldrig tänkt att du skulle klippa & klistra in min kod i ditt projekt rakt av; jag visade bara min kopieringskonstruktur så att du skulle få lite idéer hur du kunde implementera det själv i din kod. ------------------------- http://pushingcows.se Gula Nallen |
olle | 20:07 - 24:e Juli 2006 | Post #13 | |
Medlem Inlägg: 57 Skicka PM |
aha ok. Grejen e den att jag använder en egen vector.h fil. Den jag har har inte funktioner som begin() och end(). Men ska försöka fixa på något annat sätt och få inspiration från din kod. Måste man includera något speciellt när man använder iterator? Tror den klagar på nåt pga det, är ej säkert ------------------------- Ingen signatur! |
Nissebosselasse | 20:13 - 24:e Juli 2006 | Post #14 | |
Medlem Inlägg: 490 Skicka PM |
Så länge du använder STL-biblioteket (Standard Template Library), så följer sådana saker automatiskt med. Mitt tips: skippa egna varianter på STL-grejerna (som Vector i ditt fall), och kör på STL:s egna. Jag skapade en ny tråd ("Gratis böcker om..."), ladda ner dom två böckerna om C++ ("Thinking in C++ (vol 1 och vol 2)"). Det är jävligt bra böcker som beskriver STL och alla dess nyttiga grejer. ------------------------- http://pushingcows.se Gula Nallen |
olle | 20:23 - 24:e Juli 2006 | Post #15 | |
Medlem Inlägg: 57 Skicka PM |
Ska nog använda STL bibliotek som du säger. Men som jag har förstått så är denna en av STL. #include<vector> Men varför klagar kompilator om att typen vector ej finns när jag har includerat den?? group.h:27: 'vector' is used as a type, but is not defined as a type. make: *** [binaries/grouptest.o] Error 1 Hoppas jag ej är för jobbig nu hehe edit: Den klagar inte på vector längre. Så det är lungt tack igen för allt ------------------------- Ingen signatur! Senast redigerad 20:43 - 24:e Juli 2006 |
Nissebosselasse | 21:34 - 24:e Juli 2006 | Post #16 | |
Medlem Inlägg: 490 Skicka PM |
STL:s vector-klass (eller template, som det är) ligger i namnrymden ("namespace") std. Och vad jag kan utläsa från t.ex. group.h, så använder du varken ett using-direktiv, eller prefixet std::, varför kompilatorn inte "vet" vad en vector är. Du måste t.ex. göra (bland annat):
EDIT: såg att det löste sig, va bra! Och oroa dig inte för att posta frågor, det är ju det forumet är till för ------------------------- http://pushingcows.se Gula Nallen |
olle | 22:20 - 24:e Juli 2006 | Post #17 | |
Medlem Inlägg: 57 Skicka PM |
Tack för svaret igen Lika bra jag ställer en till nu när jag är igång hehe Börjar få lite panik när jag ser att jag ej förstår vad kompilator säger: ../../sources/group.cpp: In copy constructor `Group::Group(const Group&)': ../../sources/group.cpp:41: passing `const Group' as `this' argument of ` __gnu_cxx::__normal_iterator<Shape**, std::vector<Shape*, std::allocator<Shape*> > > Group::beginIterator()' discards qualifiers ../../sources/group.cpp:44: passing `const Group' as `this' argument of ` __gnu_cxx::__normal_iterator<Shape**, std::vector<Shape*, std::allocator<Shape*> > > Group::endIterator()' discards qualifiers make: *** [binaries/group.o] Error 1 Har försökt utgå från din kod för att göra kopykonstruktorn Pga att jag ej kommer på en annan lösning.
Vad är det som är felet här? uppskattas verkligen med all hjälp ------------------------- Ingen signatur! |
Nissebosselasse | 23:18 - 24:e Juli 2006 | Post #18 | |
Medlem Inlägg: 490 Skicka PM |
Jag upptäckte också det felet innan när jag först gjorde koden, och kom fram till att det ligger i Group (const Group &);. Som du ser i min förra post (eller, förr-förra, eller vad det nu blir), så uteslöt jag const, eftersom kompilatorn klagade på att det inte gick, men så fort jag tog bort const, så fungerade det. ,,ndringen jag gjorde nu var att dels lägga till const igen (som du har det), och dels i kopieringskonstruktorn göra mig av med const:en (brrrr-tsch! ): group.cpp
Känns lite dumt att man inte kan förklara varför - men, men, man kan ju inte veta allt! ------------------------- http://pushingcows.se Gula Nallen |
olle | 10:54 - 25:e Juli 2006 | Post #19 | |
Medlem Inlägg: 57 Skicka PM |
Vad hade jag gjort utan dig. ...terigen så fixade du problemet Nu fungerar kopykonstruktorn, tackar. Har gjort nu Group::clone() funktionen där jag använt mig av kopykonstruktorn enligt övningen.
Tycker detta ser korrekt ut? Eller så är jag helt fel ute. Såhär ser group_test.cpp ut. Kanske klonar jag på felsätt när jag ska testa det.
Tack för all hjälp som sagt ------------------------- Ingen signatur! |
Nissebosselasse | 12:18 - 25:e Juli 2006 | Post #20 | |
Medlem Inlägg: 490 Skicka PM |
Inget jag testat, men jag funderade på:
En viktig regel dock att komma ihåg: allt du new:ar, ska tas bort med delete, annars får du minnesläckor. EDIT: testade det nu, och det fungerade. ------------------------- http://pushingcows.se Gula Nallen Senast redigerad 12:29 - 25:e Juli 2006 |
olle | 13:03 - 25:e Juli 2006 | Post #21 | |
Medlem Inlägg: 57 Skicka PM |
Nu fungerar Group::clone() oxo Tackar Har nu oxo gjort funktionen Group::move() där man tydligen skulle göra shape:s move till virtual så att Shape pekaren ska kunna använda Group::move() ifall typen är av Group i vectorn.
Denna fungerar utmärkt. Men som vanligt min första version så tog jag ej med (*this) och det blev fel. Så man kan lungt säga att jag har problem när man använder "this" eller inte. Vet vad det är men andå har jag problem med det. this är väl den objekt som har anropat funktionen eller? Men varför räcker det inte och köra utan this när man andå använder TheShapeList attributen till den objekt som ska flyttas i funktionen Group::move() ? Tror det är nåt som jag ej förstår Men nu har du iallfall hjälpt mig med denna övning som är nästan färdig. Bara Destruktorn kvar. Ska se om jag kan lösa den innan jag frågar dig igen Tack hemskt mycket för all hjälp ------------------------- Ingen signatur! |
Nissebosselasse | 14:27 - 25:e Juli 2006 | Post #22 | |
Medlem Inlägg: 490 Skicka PM |
this är en pekare till instansen av klassen. Och som med alla pekare, så gäller även här att en asterisk (*) före pekaren returnerar själva objektet. Här kan du läsa mer om this-pekaren: http://msdn2.microsoft.com/en-us/library/y0dddwwd.aspx ------------------------- http://pushingcows.se Gula Nallen |
olle | 16:34 - 25:e Juli 2006 | Post #23 | |
Medlem Inlägg: 57 Skicka PM |
Men när dessa tre rader är samma sak,
varför kan jag då inte skriva
För att
Det är just detta som jag ej förstår. För man har ju tillgång till attributen i just den objet som anropar den funktionen. Hoppas du förstår hur jag menar och tänker. ------------------------- Ingen signatur! |
Nissebosselasse | 17:02 - 25:e Juli 2006 | Post #24 | |
Medlem Inlägg: 490 Skicka PM |
Vad får du för felmeddelande? ------------------------- http://pushingcows.se Gula Nallen |
olle | 17:31 - 25:e Juli 2006 | Post #25 | |
Medlem Inlägg: 57 Skicka PM |
Tror jag måste gå och vila mig lite grann. Verkar som jag suttit framför dator alldeles förlänge När jag hade använt utan (*this) i funktionen group::move() så hade jag i grouptest.cpp gjort lite annorlunda så att jag ej såg resultatet. Nu kommer jag ej ihåg exakt hur det var. Då kunde jag kompilerade utan att få fel. Men såg att den ej rörde sig. Men nu visar det sig att den fungerar hehe. Måste varit fel i grouptest.cpp som sagt. Så slutsatsen är att man använder (*this) när man verkligen behöver göra det som tex i clone() funktionen? Brukar man oxo alltid använda det i operator += eller = etc? eller är det fall till fall? ------------------------- Ingen signatur! |
Forum huvudsida -> Programmering -> C++: Hjälp med en övning, någon?
Du får inte posta i den här tråden | Till toppen
Datum
2024-05-03 15:52
Vecka: 18
Besökare
Inloggade: 0
Gäster: 605
Medlemmar
Medlemmar: 53576
Forum
Senaste inlägget: HAHA MÄNNISKAN LEVER ÄN (13:45 - 18:e Januari 2019, av Hetzz)
Wiki
Senaste ändringen:
3D (rev: 1, tid: 09:40 - 13:e November 2015)
Chatt
#blinkenlights @ Libera.Chat
Gratis shellkonton för IRC, webbsidor mm.