Just nu i M3-nätverket
Jump to content

Rotate funktion!


Arne

Recommended Posts

Hej!

 

Jag har problem med en rotate funktion som inte riktigt funkar, om man ger värdet 6 så funkar funktionen, men alla andra värden får programmet att göra en förbjuden åtgärd.

 

Hoppas att nån kan hjälpa mig med detta.

 

Så här ser ring.cpp-filen ut:

 

#include <iostream.h>

#include "textklass.h"

#include "ring.h"

 

Ring::Ring() : m_last(NULL), m_items(0){}

 

Ring::Ring(const Ring &rhs) : m_last(NULL), m_items(0){

copy(rhs);

}

 

Ring::~Ring(){

clear();

}

 

Ring &Ring::operator=(const Ring &rhs){

copy(rhs);

return *this;

}

 

void Ring::add(const Text &item){

if(m_items == 0){

m_last = new RingItem(m_last, item);

m_last->m_next = m_last;

m_items++;

}

else{

RingItem *nyitem;

nyitem = new RingItem(nyitem, item);

nyitem->m_next = m_last->m_next;

m_last->m_next = nyitem;

m_last = nyitem;

 

m_items++;

}

}

 

 

Text Ring::removeFirst(){

Text retur(m_last->m_next->m_data);

RingItem *tmp = m_last->m_next;

m_last->m_next = tmp->m_next;

 

delete tmp;

 

--m_items;

return retur;

 

}

 

void Ring::clear(){ // Tömmer en ring genom att använda removeFirst

while(m_items > 0){ // så många gånger som det finns list element

removeFirst();

}

}

 

void Ring::copy(const Ring &rhs){ // Kopierar en ring till en annan genom att

clear(); // först rensa den aktuella ringen

RingItem *tmp = rhs.m_last->m_next; // och sedan i en loop anropa add funktionen

for(int i = rhs.m_items; i > 0; --i) // med argument från respektive m_data i listobjektet

{

add(tmp->m_data);

tmp = tmp->m_next;

}

}

 

void Ring::rotate(int steps){ // Funktion som flyttar m_head steps antal gånger

if(steps > m_items){ // framåt i ringen

steps = steps % m_items;

}

RingItem *tmp = m_head;

RingItem *tmplast = m_last;

while(steps > 0){

tmp = tmp->m_next;

tmplast = tmplast->m_next;

--steps;

}

m_head = tmp;

m_last = tmplast;

}

 

Text Ring::first()const{ // Funktion som returnerar texten i m_data för

return m_last->m_next->m_data; // det första list elementet

 

}

 

int Ring::size()const{ // Funktion som returnerar antal listelement

return m_items; // i ring objektet

}

 

Och så här ser ring.h-filen ut:

 

#ifndef RING_H

#define RING_H

#include <iostream.h>

#include "textklass.h"

 

class Ring{

public:

struct RingItem{

RingItem(RingItem *ri, const Text &t) :m_data(t), m_next(ri) {}

Text m_data;

RingItem *m_next;

};

 

Ring();

Ring(const Ring &rhs);

~Ring();

 

Ring &operator=(const Ring&rhs);

void copy(const Ring &rhs);

void add(const Text &item);

void clear();

Text first()const;

Text removeFirst();

void rotate(int steps);

int size()const;

RingItem *m_head;

int m_items;

RingItem *m_last;

friend ostream &operator<<(ostream &os, const Ring &rhs);

};

 

inline ostream &operator<<(ostream &os, const Ring &rhs){

int i = 0;

for(Ring::RingItem *p = rhs.m_last->m_next; i < rhs.m_items; i++, p = p->m_next){

os << p->m_data << ' ';

 

}

return os;

}

 

inline istream &operator>>(istream &is, Ring &rhs){

Text tmp;

is >> tmp;

rhs.add(tmp);

return is;

}

 

 

 

#endif

 

Programmet består även av andra .cpp och .h filer men dessa funkar korrekt.

 

Tacksam för hjälp.

 

/Arne

Link to comment
Share on other sites

Så här ser testprogrammet ut:

 

#include <iostream.h>

#include "ring.h"

#include "textklass.h"

#include "queue.h"

 

 

void main(){

 

Ring r;

 

r.add("item1");

r.add("item2");

r.add("item3");

 

cout << endl << r << endl;

r.rotate(2);

cout << endl << r << endl;

 

}

 

 

Link to comment
Share on other sites

Dina inlägg blir ganska svårlästa när du inte använder kod-taggen för att formattera koden, läs //eforum.idg.se/Eforumintro.asp#Del3 och redigera ditt inlägg så du får med kod-taggar.

 

Lär dig att använda en debugger och stega igenom koden för att se vad som går fel, det kommer underlätta din felsökning enormt.

 

Jag skummade genom din kod och såg några felaktigheter, har inte satt mig in i vad som orsakar problemet du beskriver.

 

- Din assignment operator hanterar inte self assignment. (Om du inte vet vad det innebär, sök på google)

- Din add-metod ser farlig ut.

	RingItem *nyitem;
nyitem = new RingItem(nyitem, item);

nyItem, som är oinitierad, skickars med som argument till constructorn för RingItem. Det kan bara bli dåligt. Ett tips för att undvika sånt här är att ställa warninglevel på din kompilator till högsta möjliga och "braek on warnings", så du inte kommer vidare förrän du kompilerar helt utan varningar. Det finns en anledning till att kompilatorn genererar varningar, utnyttja det som ett hjälpmedel!

- Jag ser inget ställe där du använder m_head på ett vettigt sett, tror du glömt något där.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...