Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

31

11.03.2007, 15:12

...
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

32

11.03.2007, 15:16

Zitat von »"David_pb"«

Hi!

Was mir spontan einfällt:

:arrow: Initialisierungsliste nutzen
:arrow: Du könntest ein Sentinelitem verwenden, das verbrät zwar etwas mehr Speicher aber du sparst dir diverse Abfragen
:arrow: Eine Funktion braucht keinen Rückgabewert wenn er sowiso immer ADDING_SUCCEEDED ist (z.B. Add()).
:arrow: Ich weiß nicht was hinter PTR_DELETE steckt, aber ein einfaches delete tuts auch!
:arrow: Die Funktionen welche mit irgendwelches Element/PositionIDs arbeiten sind nicht gerade effizient. Man sollte eher Listeneinträge übergeben. Eine verlinkte Liste arbeitet nunmal nicht mit Indice.
:arrow: Destruktor wär sinnvoll



hi!

danke für die schnelle antwort!

zu 1. was genau meinst du mit initialisierungliste? ^^

zu 2. was ist Sentinelitem? :D

zu 3. die funktion Add() ist eine überladene funktion.. bei der 2ten gibt es mehrere error codes.. und naja.. wenn ich schon einen habe für 0, dann schreib ich einfach ADDING_SUCCEEDED .. ist ja hupe oder?

zu 4. PTR_DELETE überprüft ob der pointer NULL ist, wenn nicht, dann löscht er ihn und setzt ihn auf NULL (schreibarbeit sparen ^^)

zu 5. jap.. dasselbe habe ich mir nat. auch schon gedacht, denn ab einer gewissen anzahl von elementen kann so ein schleifendurchlauf unter umständen etwas länger dauern.. was ist Indice? wie genau würde das mit den Listeneinträgen funktionieren? mir fällt da leider keine schnellere möglichkeit ein zu einem bestimmten element zu kommen, als es eben in einer schleife rauszupflücken!

zu 6. was soll im destructor stehn? ^^
EDIT: OK habs gecheckt.. ^^ im destructor soll die anweisung stehn den speicher für die elemente freizugeben .. ^^ *aufdenkopfklatsch*

Zitat von »"big_muff"«

Ich habs jetzt nur kurz überflogen:
1. SortList() ist als Name ein bisschen verwirrend
2. Ich weiss nicht wie du darauf kommst aber hör mal damit auf jeder Funktion einen Rückgabewert zu geben. Die Add()- oder die SortList()-Funktion können nicht fehlschlagen also kannst du dort den Rückgebewert doch weglassen. Genau so wenig interessiert es jemanden ob die Liste leer wahr wenn er DeleteList() aufruft. Dort kannst du dir den Rückgabewert doch sparen.
3. Der Sinn der Remove()-Funktion ohne Parameter bleibt mir verborgen...



zu 1. hm.. hättest du nen vorschlag zum namen?

zu 2. das mit den rückgabewerten habe ich deswegen, weil ich mir als ich anfing nicht überlegt habe was genau alles schief laufen könnte.. also habe ich einfach jede funktion mal mit einem rückgabewert definiert. die funktionen wie SortList() werde ich dann noch auf void umdefinieren, das hatte ich so oder so vor.

3. naja die remove funktion ohne parameter entfernt einfach das letzte element in der liste.. bei der anderen kann man noch zusätzlich angeben welches element genau gelöscht werden soll...

thx für die antwort :)

EDIT2:

hat ein struct auch so etwas wie einen contructor? ich würde nämlich gerne eine statische membervariable dazu verwenden mir die anzahl der elemente anzugeben.. (aus übungszwecken)

ich hab jetz aber das problem dass mir der compiler meldet dass es sich um ein unaufgelöstes externes symbol handelt:

C-/C++-Quelltext

1
2
3
4
5
    // P U B L I C #########################################

public:

        // S t a t i c _ M e m b e r _ V a r i a b l e s ###

    static unsigned long    m_ElementCounter;


tja...

C-/C++-Quelltext

1
2
3
4
5
int main()
{
    ChainedList::m_ElementCounter = 0;
    ChainedList *pList;
    pList = new ChainedList;


es scheitert schon bei der initialisierung..

Zitat


error LNK2001: Nicht aufgelöstes externes Symbol ""public: static unsigned long ChainedList::m_ElementCounter" (?m_ElementCounter@ChainedList@@2KA)". Main.obj
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

33

11.03.2007, 16:30

1. Beim Konstruktor vor dem Funktionsrumpf per Doppelpunkt eingeleitet.
2. Ein "Dummy" Item das beim erstellen der Liste angelegt wird aber nicht zum usersichtbaren Teil gehört.
3. Es gibt Funktionen die unnötigerweise nur einen Wert zurückgeben.
4. Delete auf einen NULL-Pointer anzuwenden ist sicher. Daher musst du aucht nicht prüfen ob der Zeiger = 0 ist.
5. Indice ist die Mehrzahl von Index. Schneller wäre einfach Referenzen oder Zeiger auf Listenitems zu übergeben.
6. ok

Zu deiner Frage:
Statische Member müssen immer auch definiert werden. In deiner .cpp Datei muss also noch folgendes stehen:

C-/C++-Quelltext

1
unsigned long ChainedList::m_ElementCounter = 0;
@D13_Dreinig

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

34

11.03.2007, 17:00

Zitat von »"$nooc"«

hat ein struct auch so etwas wie einen contructor? ich würde nämlich gerne eine statische membervariable dazu verwenden mir die anzahl der elemente anzugeben.. (aus übungszwecken)

Ja ein struct hat in C++ auch einen Konstruktor.
Ich gehe mal davon aus du hast vor in der struct für deine Listenelemente eine statische Variable einzubauen die diese zählt. Das ist aber nicht die beste Lösung. Stell dir vor du hast 2 verschiedene Listen, dann werden in dieser statischen Variable die Anzahl Elemente beider Listen gespeichert und ich denke nicht dass dies das Verhalten ist das du haben willst. Wieso zählst du die Anzahl Elemente nicht einfach in der Listenklasse. Dann brauchst du auch keine statische Variable...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

35

11.03.2007, 19:17

@ big_muff:
jop du hast recht.. dieses verhalten will ich wirklich nicht bezwecken ^^
aber nur so aus neugier.. wie könnte ich evtl. den constructor eines structs selbst definieren? und .. will mir evtl. jemand zeigen wie ich den * operator so überladen kann, dass er mir pointer immer sofort auf NULL setzt? also wenn ich schreibe

int *Pointer;

dass er automatisch den Pointer auf NULL setzt eben ^^

@ David_pb:
zu 1. ich verstehe nicht ganz welche variablen ich initialisieren soll .. ^^

zu 2. sorry versteh ich noch immer nicht ^^ meinst du ich soll wenn die liste angelegt wird zb. im constructor ein dummy-element anlegen oder so? ich versteh nicht so ganz was du damit meinst.. ^^

zu 3. joa wie gesagt ich ändere diese funktionen noch sobald der code mal richtig funzt ^^ dann ändere ich gewisse funktionen zu funktionen ohne rückgabewert .. wenn ich mich nicht irre nennt man das dann eine methode richtig?

zu 4. hm... ich habe schon so einige makros gesehn die immer zuerst überprüfen ob der zeiger auf NULL ist.. O_o

zu 5. hm ja gut.. in diesem sinne sind indice bei verketteten listen unnütz.. aber wer weiß, vllt. braucht man sie ja doch.. aber mal abgesehn davon weiß ich nicht, wie ich zum beispiel bei 100 elementen einfach so auf das 50igste element kommen soll, ohne eine schleife durchlaufen zu lassen..

zu 6. wenigstens hab ich ->etwas<- richtig gemacht :D
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

36

11.03.2007, 19:31

1. Du setzt doch diverse Pointer auf den Wert NULL?!
2. Du hast zu Beginn ein Element das quasi als Wurzelelement fungiert. Dann kannst du dir die Abfragen (ist firstitem = NULL usw) sparen, weil du immer schon ein Item hast.
3. Du solltest deinen Code vllt erstmal planen bevor du anfängst ihn zu schreiben.
4. Das ist absoluter Schwachsinn. Ist ein Zeiger gleich NULL so kann ein delete auf selbigen angewendet werden ohne dass das geringste passiert. Der Standard schreibt vor das delete auf einen Nullzeiger sicher ist!
5. Wenn du per Index auf Items zugreifen willst nutzt du einen vector aber keine verlinkte Liste.

Zitat von »"$nooc"«


will mir evtl. jemand zeigen wie ich den * operator so überladen kann, dass er mir pointer immer sofort auf NULL setzt? also wenn ich schreibe


Das geht nicht.
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

37

11.03.2007, 19:50

Zitat von »"David_pb"«

1. Du setzt doch diverse Pointer auf den Wert NULL?!
2. Du hast zu Beginn ein Element das quasi als Wurzelelement fungiert. Dann kannst du dir die Abfragen (ist firstitem = NULL usw) sparen, weil du immer schon ein Item hast.
3. Du solltest deinen Code vllt erstmal planen bevor du anfängst ihn zu schreiben.
4. Das ist absoluter Schwachsinn. Ist ein Zeiger gleich NULL so kann ein delete auf selbigen angewendet werden ohne dass das geringste passiert. Der Standard schreibt vor das delete auf einen Nullzeiger sicher ist!
5. Wenn du per Index auf Items zugreifen willst nutzt du einen vector aber keine verlinkte Liste.

Zitat von »"$nooc"«


will mir evtl. jemand zeigen wie ich den * operator so überladen kann, dass er mir pointer immer sofort auf NULL setzt? also wenn ich schreibe


Das geht nicht.


zu 1. macht es einen unterschied ob ich die variablen im contructor auf NULL setze oder in der inti-liste?

zu 2. ja das leuchtet zwar ein, aber ist es schlimm wenn das erste item erst erstellt wird wenn ich es erst tatsächlich brauche?

zu 3. joa.. da gebe ich dir auf jeden fall recht, aber da es sich nicht um ein 10.000 seiten projekt handelt, hab ich einfach wild drauf losgeschrieben ^^

zu 4. wo steht das denn im standard geschrieben? unter welchem punkt? würd mich mal interessieren, ich finde ihn jedenfalls nicht im standard wo sowas steht

zu 5. ja wie soll ich dann zb von 100 elementen ohne umwege auf das 51igste element zugreifen können? ich weiß eben keine lösung :D mir fällt nur das mit der schleife ein und dann überprüfen welchen index das jew. element hat ..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

38

11.03.2007, 20:04

Zitat von »"$nooc"«

zu 1. macht es einen unterschied ob ich die variablen im contructor auf NULL setze oder in der inti-liste?


ja, in der ini liste wird der konstruktor der variablen aufgerufen, sonst wird eine zuweisung gemacht (vorausgesetzt der kompiler kapiert nicht was du willst und macht es automatisch richtig)...

Zitat von »"$nooc"«

u 4. wo steht das denn im standard geschrieben? unter welchem punkt? würd mich mal interessieren, ich finde ihn jedenfalls nicht im standard wo sowas steht



If the argument given to a deallocation function in the standard library is a pointer that is not the null pointer value (4.10), the deallocation function shall deallocate the storage referenced by the pointer

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

39

12.03.2007, 09:45

zu 1. achso ist das! das wusste ich gar nicht! habs geändert und die variablen im konstruktor in der ini-liste initialisiert! danke :)

zu 4. ich versteh den satz nicht, aber wenn da steht that is not the null pointer dann verstehe ich das so:
wenn das übergebene argument/der übergebene parameter kein null pointer ist, dann sollte ("shall") die funktion den speicher freigeben der vom pointer referenziert wird.

O_o sry ich blick da nicht durch ^^
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

40

12.03.2007, 10:03

Zitat von »"$nooc"«

wenn das übergebene argument/der übergebene parameter kein null pointer ist, dann sollte ("shall") die funktion den speicher freigeben der vom pointer referenziert wird.

Du hast es doch schon übersetzt. Was gibt es hier nicht zu verstehen?
Du kannst es ja mal umkehren:
wenn das übergebene argument/der übergebene parameter ein null pointer ist, dann sollte die funktion den speicher nicht freigeben der vom pointer referenziert wird.
Deswegen kann man auf einen Null-Pointer gefahrlos delete aufrufen, da die delete-Implementierung selbst schon prüft (bzw. prüfen muss), ob der Zeiger ein Nullzeiger ist bevor der Speicher freigegeben wird.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Werbeanzeige