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

1

08.01.2008, 20:20

ptrDelte();

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// -------------------------------------------------------------------

// Name: ptrDelete()

// Desc: Deletes a pointer

// -------------------------------------------------------------------

template <typename T>
inline void ptrDelete( T*& ptr )
{
    delete ptr;
    ptr = NULL;
} // ptrDelete()



            // -------------------------------

            // Name:    ShutDown()

            // Desc:    Shut down the server and clean up.

            // -------------------------------

    private: System::Void ShutDown () {

                 ptrDelete(m_pServer);
                 ptrDelete(m_pServerThread);

             } // ShutDown()



Zitat von »"Compiler"«


error C2664: 'ptrDelete': Konvertierung des Parameters 1 von 'Thread *' in 'Thread *&' nicht möglich

error C2664: 'ptrDelete': Konvertierung des Parameters 1 von 'Server *' in 'Server *&' nicht möglich
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

2

08.01.2008, 20:30

Cat: er will den zeiger auf 0 setzen, deswegen die referenz ;)

$nooc: zeig mal den aufruf wo das passiert...

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

3

08.01.2008, 21:41

Seltsam, wo siehst du meinen Post? Ich habe meinen Post gelöscht, weil er Blödsinn enthielt und ich wenig Zeit hatte. ;-)

Prinzipiell sind Referenzen auf Pointer eine unschöne Sache - auch wenn sie vielleicht möglich sind. Pointer sind nunmal Pointer und Referenzen Referenzen - das eine ist die Adresse zum Speicher, das andere ist direkter Platzhalter des Objekts - beides zusammen kann abführend wirken. ;-)

Dein Problem wäre möglicherweise mit einem Doppelpointer besser gelöst, das führt auf jeden Fall zu weniger Verwirrung.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

4

08.01.2008, 22:00

ich höre immer was anderes bezüglich dieser hilfsfunktion..

postet mal alle eure lösung zu solch einer..

würd mich interessieren was dabei rauskommt..

@ dot:

der aufruf ist bereits gepostet-->

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
            // -------------------------------

            // Name:    ShutDown()

            // Desc:    Shut down the server and clean up.

            // -------------------------------

    private: System::Void ShutDown () {

                 ptrDelete(m_pServer);
                 ptrDelete(m_pServerThread);

             } // ShutDown()
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

5

08.01.2008, 22:58

Zitat von »"CodingCat"«

Seltsam, wo siehst du meinen Post? Ich habe meinen Post gelöscht, weil er Blödsinn enthielt und ich wenig Zeit hatte. ;-)

Prinzipiell sind Referenzen auf Pointer eine unschöne Sache - auch wenn sie vielleicht möglich sind. Pointer sind nunmal Pointer und Referenzen Referenzen - das eine ist die Adresse zum Speicher, das andere ist direkter Platzhalter des Objekts - beides zusammen kann abführend wirken. ;-)

Dein Problem wäre möglicherweise mit einem Doppelpointer besser gelöst, das führt auf jeden Fall zu weniger Verwirrung.


Inwiefern würde eine Referenz auf einen Zeiger, in diesem Fall, denn "abführend" wirken, deiner Meinung nach?
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

09.01.2008, 09:39

Zitat von »"$nooc"«

ich höre immer was anderes bezüglich dieser hilfsfunktion..

postet mal alle eure lösung zu solch einer..


ich verwend eigentlich keine derartige hilfsfunktion


Zitat von »"$nooc"«


@ dot:

der aufruf ist bereits gepostet-->


sry, hab ich übersehen^^

Zitat von »"CodingCat"«

Seltsam, wo siehst du meinen Post? Ich habe meinen Post gelöscht, weil er Blödsinn enthielt und ich wenig Zeit hatte. ;-)


sry, da war ich wohl zu schnell...

Zitat von »"CodingCat"«

Prinzipiell sind Referenzen auf Pointer eine unschöne Sache - auch wenn sie vielleicht möglich sind.


warum, das kann ich nicht ganz nachvollziehen?

Zitat von »"CodingCat"«

Dein Problem wäre möglicherweise mit einem Doppelpointer besser gelöst, das führt auf jeden Fall zu weniger Verwirrung.


imo nein, denn dann müsste man die funktion immer so aufrufen:

C-/C++-Quelltext

1
ptrDelete(&myPtr);

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

7

09.01.2008, 12:27

Mir ist schon klar, was $nooc erreichen will. Allerdings halte ich Referenzen auf Pointer dennoch für eine unschöne Sache.

Diese Hilfsfunktion ist im Grunde nichts anderes als ein Makro, nur in Form einer Inline-Funktion. Das Unschöne ist in diesem Fall wie bei Makros, dass der Zeiger zwar ganz normal auf den Speicher zeigt, der freigegeben wird - eine Funktion ptrDelete ist dazu da, diesen Speicher freizugeben - die Referenz als Platzhalter für diesen Zeiger allerdings nun dazu da ist, den Zeiger auf NULL zu setzen. Super, du sparst dir dabei dann eine Zeile Code pro Freigabe. Allerdings erwartet jemand anderes, der deinen Code liest, nicht, dass eine solche Funktion auch den Zeiger auf NULL setzt. Speicher freizugeben hat mit dem Zeiger an sich nämlich eigentlich nichts zu tun - insofern trägst du auf jeden Fall zur Verwirrung bei - bei einer Funktion rechnet man mit derartigem Verhalten nämlich noch weniger als bei einem Makro. :)

Im Allgemeinen halte ich das Mischen von Zeigern und Referenzen deshalb für gefährlich, weil beide so unterschiedliches Verhalten an den Tag legen. In diesem Fall ist die Funktionsweise relativ leicht ersichtlich, schaut man sich den Code der Hilfsfunktion an. Im Allgemeinen lassen sich Zeiger allerdings nunmal manipulieren und auch neu zuweisen, Referenzen dagegen nicht. In längerem Code verliert man sowas leicht aus den Augen. ;)

P.S. Trotzdem funktioniert dein Code übrigens bei mir in MSVC 2005 seltsamerweise für mehrere Testdatentypen problemlos, solltest du also trotzdem unbedingt diese Funktion in der Form implementieren wollen, wäre es hilfreich, zu wissen, welchen Compiler du verwendest.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

09.01.2008, 13:24

Hallo CodingCat!

Um ehrlich zu sein sehe ich in deiner kompletten Antwort kein Argument das deine vorherige Aussage unterstreichen würde. Zur Erinnerung:

Zitat von »"CodingCat"«


Prinzipiell sind Referenzen auf Pointer eine unschöne Sache - auch wenn sie vielleicht möglich sind. Pointer sind nunmal Pointer und Referenzen Referenzen - das eine ist die Adresse zum Speicher, das andere ist direkter Platzhalter des Objekts - beides zusammen kann abführend wirken. ;)


Nun hast du zwar einige Argumente gebracht, aber irgendwie überzeugt keines davon richtig.

Zitat von »"CodingCat"«


Diese Hilfsfunktion ist im Grunde nichts anderes als ein Makro, nur in Form einer Inline-Funktion. Das Unschöne ist in diesem Fall wie bei Makros, dass der Zeiger zwar ganz normal auf den Speicher zeigt, der freigegeben wird - eine Funktion ptrDelete ist dazu da, diesen Speicher freizugeben - die Referenz als Platzhalter für diesen Zeiger allerdings nun dazu da ist, den Zeiger auf NULL zu setzen.


Zum einen gibt es gute Gründe die für eine Bevorzugung von inline-Funktionen, gegenüber Makros, sprechen. Zum anderen ist durch die Referenz auf den Zeiger klar ersichtlich, das der Zeiger selbst in der Funktion geändert werden kann (und vermutlich auch wird). Genau das bringt uns zu:

Zitat von »"CodingCat"«


Allerdings erwartet jemand anderes, der deinen Code liest, nicht, dass eine solche Funktion auch den Zeiger auf NULL setzt.


Aufgrund der Referenz auf den Zeiger sollte es sehr wohl klar sein, das der Zeiger selbst geändert wird. Sollte dies nicht der Fall sein wäre wohl kaum eine Referenz angebracht.

Zitat von »"CodingCat"«


Speicher freizugeben hat mit dem Zeiger an sich nämlich eigentlich nichts zu tun - insofern trägst du auf jeden Fall zur Verwirrung bei - bei einer Funktion rechnet man mit derartigem Verhalten nämlich noch weniger als bei einem Makro.


Einerseits ist ein Zeiger unabdingbar um Speicher freizugeben andererseits trägt das in diesem Fall kaum zur Verwirrung bei, da die Funktionsbezeichnung ja recht genau beschreibt was die Funktion macht.

Zitat von »"CodingCat"«


Im Allgemeinen halte ich das Mischen von Zeigern und Referenzen deshalb für gefährlich, weil beide so unterschiedliches Verhalten an den Tag legen.


Der Unterschied von Referenz und Zeiger ist ja bekannt, aber inwiefern verhalten sich beide unterschiedlich? Und wieso ist ein Gemisch aus beidem deshalb, deiner Meinung nach, gefährlich?

Zitat von »"CodingCat"«


Im Allgemeinen lassen sich Zeiger allerdings nunmal manipulieren und auch neu zuweisen, Referenzen dagegen nicht. In längerem Code verliert man sowas leicht aus den Augen.


Genau, aber ob du jetzt einen Doppelzeiger oder eine Referenz verwendest ist doch vollkommen egal. Beides sagt aus: Der referenzierte Zeiger kann innerhalb der Funktion manipuliert werden.

Was mich jetzt interessieren würde ist, warum du einen Doppelzeiger einer Referenz auf einen Zeiger vorziehen würdest. Wo siehst du da die Vorteile und wo wirken sich Referenzen auf Zeiger "abführend" aus?

grüße
@D13_Dreinig

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

9

09.01.2008, 13:42

Bei deinem Doppelzeiger ist es auch im Code klar ersichtlich, dass der Zeiger selbst verändert wird, bei einer Referenz nur unter Betrachtung der Funktiondeklaration - da diese Art der Manipulation von Zeigern durch Referenzen wohl eher unüblich ist.

Dass ein Gemisch aus Zeigern und Referenzen in längerem Code leicht zu Fehlern führen kann, ist meine eigene Erfahrung. Insofern drückt der Post oben meine eigene Meinung aus - wenn du anderer Meinung bist, hast du vielleicht andere Erfahrunge gemacht. :)

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

10

09.01.2008, 13:59

David das argument liegt auf der hand was diskutierst du noch: Der Code von oben funktioniert nicht, reicht das nicht?

@topic: machs einfach so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename T>
inline void ptrDelete( T **ptr )
{
    delete *ptr;
    *ptr = NULL;
}

    private: System::Void ShutDown () {

                 ptrDelete(&m_pServer);
                 ptrDelete(&m_pServerThread);

             }


So sollte es gehen.

Socke

Werbeanzeige