Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

C++ ruft nach Hilfe :D

<<< zurück   -1- -2- -3-  
Polaris
Experte (offline)

Dabei seit 07.2006
1766 Beiträge
Geschrieben am: 06.01.2008 um 13:38 Uhr

Zitat von uwebaier:

Jo, das is schon OK...
Aber das eigentliche Problem wurde halt immer noch nich so recht angesprochen...

na ja, so ganz habe ichs nicht verstanden ... wieso unbedingt ein Array aus Pointern?

du kannst doch eigentlich auch einfach dein Array so machen:

Objekt * Objekts = new Objekt[10];

// => "dynamisches" Array , jederzeit änderbar in der Größe
// man muss halt, bei Erweiterung oder Löschung von Elementen umkopieren, aber wenn du ein Array aus Pointern machst, musst du auch die Pointer kopieren

Und was ich noch nicht verstanden habe, ist weshalb du in welchem Zusammenhang keine Operatorladung willst -- für was braucht man da Operatorüberladung?

Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)

uwebaier - 36
Halbprofi (offline)

Dabei seit 06.2005
124 Beiträge

Geschrieben am: 06.01.2008 um 14:51 Uhr
Zuletzt editiert am: 06.01.2008 um 14:52 Uhr

Du hast schon recht, ich machs warscheinlich auch so wie du das gesagt hast, also ein Pointer auf ein Array der Objekte
(Objekt *Objekte=new Objekt[20];)

Mein Proble ist, dass der Algorithmus zum hinzufügen bzw. löschen eines Objektes aus der Liste nicht funktioniert...

Das ist das was ich euch die ganze Zeit gepostet hab... ^^

Und da hab ich euch gebeten den Fehler zu finden, der mir immer tolle Adressenverletzungen usw. verursacht, weil ich keinen finde...

UT3 Sucks ^^

bassmaster - 48
Profi (offline)

Dabei seit 10.2004
631 Beiträge

Geschrieben am: 06.01.2008 um 17:54 Uhr

Zitat von uwebaier:

Du hast schon recht, ich machs warscheinlich auch so wie du das gesagt hast, also ein Pointer auf ein Array der Objekte
(Objekt *Objekte=new Objekt[20];)

Mein Proble ist, dass der Algorithmus zum hinzufügen bzw. löschen eines Objektes aus der Liste nicht funktioniert...

Das ist das was ich euch die ganze Zeit gepostet hab... ^^

Und da hab ich euch gebeten den Fehler zu finden, der mir immer tolle Adressenverletzungen usw. verursacht, weil ich keinen finde...


vielleicht sind wir nicht auf deinen fehler eingegangen, weil das kein sinn macht. du versuchst eine verkettete liste zu programmieren, die es schon fertig gibt. zusätzlich ist dein ansatz schon falsch. du müsstest dir mal ein programmiergrundlagenbuch zu gemüte führen.

jetzt stell dir mal dein algorithmus vor. du hast 1 milion objekte (nichts ungewöhnliches) und du willst 10 objekte löschen ( auch nichts ungewöhliches) - jetzt musst du also ca 10 milionen mal ein delete[] und 10 milionen mal ein new machen, weil du mitten drin nichts löschen kannst und du immer eine temporäres array brauchst. darum programmiert man verkettete listen bischen anders. jedes objekt kennt das nächste objekt ( bei einer doppelt verketteten liste auch das vorgängerobjekt). löscht man ein objekt, dann musst man nur einen zeiger umbiegen und alles ist gut ( bei doppelt verkettete listen zwei zeiger).

jetzt ist die frage, was du überhaupt machen willst:
willst du einfach ein programm schreiben, dass eine verkettete liste verwendet, dann nimm lauffähige und fertig getestete liste. in der stl, atl, mfc oder welches framework du auch immer verwendest sind schon fertige listen drin.

willst du dagegen lernen mit zeiger umzugehen und die grundlagen von c++ anhand eines projekts näher kennenzulernen, dann kannst du gerne eine verkettete liste programmieren, solltest aber vom anfang anfangen. die liste sollte dann unabhängig von deinen programm funktionieren und wiederverwertbar sein.

http://www.impala64.de/blog - http://www.impala64.de/ - www.myspace.com/impala64lowrider

uwebaier - 36
Halbprofi (offline)

Dabei seit 06.2005
124 Beiträge

Geschrieben am: 06.01.2008 um 18:00 Uhr
Zuletzt editiert am: 06.01.2008 um 18:20 Uhr

Hast ja recht, ich schau mal was ich machen will...

Das mit der verketteten Liste:
Wenn ich ein neues Objekt hinzufügen will muss ich trotzdem die anderen kopieren oder nich?

Ich lass mir mal was einfallen :D

UT3 Sucks ^^

bassmaster - 48
Profi (offline)

Dabei seit 10.2004
631 Beiträge

Geschrieben am: 06.01.2008 um 19:35 Uhr

Zitat von uwebaier:

Hast ja recht, ich schau mal was ich machen will...

Das mit der verketteten Liste:
Wenn ich ein neues Objekt hinzufügen will muss ich trotzdem die anderen kopieren oder nich?

Ich lass mir mal was einfallen :D


nein, das letzte objekt in deiner liste hat als zeiger auf das nächste objekt einen nullpointer. somit weißt du, dass das dein letztes objekt ist.

wenn du jetzt ein neues objekt zur liste hinzufügen willst, dann machst du:

1. "new"
2. den nullpointer des letzten objektes mit der adresse des neuen objekt überschreiben
3. das neue objekt bekommt als zeiger für das nächste objekt logischerweise ein nullpointer

ganz einfach und ganz schnell. ohne hin und herkopieren und vor allem ohne temporär speicheranforderungen machen zu müssen, was bei einem system, dass schon im virtuellen speicher rumrutscht extrem langsam sein würde...

http://www.impala64.de/blog - http://www.impala64.de/ - www.myspace.com/impala64lowrider

uwebaier - 36
Halbprofi (offline)

Dabei seit 06.2005
124 Beiträge

Geschrieben am: 06.01.2008 um 21:15 Uhr
Zuletzt editiert am: 06.01.2008 um 21:18 Uhr

Habs schon xD

Funktioniert einwandfrei mit löschen und allem, ich denk den Rest kireg ich selber hin

Danke an alle die mir geholfen haben, und auch danke an Bassmaster mit dem schönen Ansatz...

Sollte es noch jemand interressieren werde ich den Qode noch eben posten, aber das ganze funktioniert schon und wird dann noch von mir "Perfektioniert", dass es alle möglichen Objekte besitzen kann...

Zitat:


class Objekt
{
private:
int zahl;
public:
Objekt(int pZahl) {zahl=pZahl;};
~Objekt() {};
void getZahl() {cout << zahl << "\n";};
};

struct array
{
array *Nextarray;
Objekt *pObjekt;
};

class Array
{
private:
array *Firstobjekt;
int arraysize;
public:
Array(Objekt *pFirstobjekt);
~Array();
void newElement(Objekt *pObjekt);
void killElement(int index);
Objekt *getElement(int index);
};

Array::Array(Objekt *pFirstobjekt)
{
arraysize=1;
Firstobjekt=new array;
Firstobjekt->pObjekt=pFirstobjekt;
}

Array::~Array()
{
array *kill=Firstobjekt;
for (int i=0; i<arraysize; i++)
{
delete kill->pObjekt;
array *temp=kill->Nextarray;
delete kill;
kill=temp;
}
}

void Array::newElement(Objekt *pObjekt)
{
array *lastelement=Firstobjekt;
for (int i=0; i<(arraysize-1); i++)
{
lastelement=lastelement->Nextarray;
}
lastelement->Nextarray=new array;
lastelement->Nextarray->pObjekt=pObjekt;
lastelement->Nextarray->Nextarray=NULL;
arraysize++;
}

void Array::killElement(int index)
{
if ((index+1)>arraysize || index<0)
{
cout << "Arrayobjekt nicht vorhanden!\n";
}
else
{
array *kill=Firstobjekt;
array *prekill;
for (int i=0; i<index; i++)
{
prekill=kill;
kill=kill->Nextarray;
}
if (index==0)
{
Firstobjekt=kill->Nextarray;
delete kill->pObjekt;
delete kill;
}
else
{
prekill->Nextarray=kill->Nextarray;
delete kill->pObjekt;
delete kill;
}
arraysize--;
}
}

Objekt * Array::getElement(int index)
{
array *element=Firstobjekt;
for (int i=0; i<index; i++)
{
element=element->Nextarray;
}
return element->pObjekt;
}


Man man man, das war ne schwere Geburt xD ^^

UT3 Sucks ^^

bassmaster - 48
Profi (offline)

Dabei seit 10.2004
631 Beiträge

Geschrieben am: 06.01.2008 um 21:44 Uhr

ich habs kurz überflogen. sieht soweit gut aus.

bei getElement würde ich ein nullpointer oder eine exception zurückgeben, wenn das index größer ist als elemente vorhanden sind.

die array klasse würde ich nicht von der klasse objekt abhängig machen. ich würde eher einen void * nehmen oder noch viel besser templates, dann ist das perfekt.

bei newElement würde ich nicht durch die ganze liste durchgehen, sondern ich würde mir lastelement als membervariable merken, das kostet dich zwar 4 byte, aber wird erheblich schneller, wenn du in eine sehr großen liste werte hinzufügen musst....

ich würde jetzt noch den bouce checker drüber laufen lassen um gewissheit zu haben, dass du alles schön aufgeräumt hast.

ach ja, gut gemacht! du hast zwar das rad neu erfunden, aber manchmal muss man das rad neu erfinden um zu wissen wie ein rad funktioniert... vermutlich weiß dein lehrer das gar nicht, wie eine verkettete liste funktioniert....

http://www.impala64.de/blog - http://www.impala64.de/ - www.myspace.com/impala64lowrider

uwebaier - 36
Halbprofi (offline)

Dabei seit 06.2005
124 Beiträge

Geschrieben am: 07.01.2008 um 16:39 Uhr
Zuletzt editiert am: 07.01.2008 um 16:40 Uhr

^^
Danke für das lob,
Ich überleg mir noch ob ichs mit Templates mach (habs mir gestern angelesen)

Mein Lehrer hat das schon mal angesprochen, aber gemacht hammers bisher noch nich

Und danke nochmal für die Hilfe

UT3 Sucks ^^

xDator
Profi (offline)

Dabei seit 01.2008
735 Beiträge
Geschrieben am: 07.01.2008 um 21:59 Uhr

Genau so seh ich des auch :-D

Sorry für den unsinnigen Beitrag :-D xDD

SuFu ftw.

KiLLa-T - 33
Champion (offline)

Dabei seit 06.2007
4586 Beiträge

Geschrieben am: 09.01.2008 um 17:07 Uhr

Zitat von xDator:

Genau so seh ich des auch :-D

Sorry für den unsinnigen Beitrag :-D xDD


Look @ picture .. :kopfschuettel:
<<< zurück
 
-1- -2- -3- [Antwort schreiben]

Forum / Bits und Bytes

(c) 1999 - 2026 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -