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

1

07.02.2008, 23:24

Problem mit Zeigerübergabe

Hi

Ich habe mal wieder angefangen meine Kapselung der Win32 Oberfläche zu erweitern.
Jetzt bin ich auf ein Problem bei der Zeigerübergabe gestoßen und zwar warum Funktioniert das nicht:

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
23
24
25
#include <iostream>

void GetInt (unsigned int *pI)
{
    unsigned int *P = NULL;
    P = new unsigned int;
    *P = 1;

    (pI) = (P);
}

int main ()
{
    unsigned int *i = NULL;

    GetInt (i);

    std::cout << *i << std::endl; // <-- crash


    std::cin.get ();

    delete i;

    return 0;
}


Aber das hier:

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
23
24
25
26
#include <iostream>

void GetInt (unsigned int **pI)
{
    unsigned int *P = NULL;
    P = new unsigned int;
    *P = 1;

    (*pI) = (P);
}

int main ()
{
    unsigned int *i = NULL;

    GetInt (&i);

    std::cout << *i << std::endl;

    std::cin.get ();

                delete i;


    return 0;
}


Weil irgendwie ist doch

C-/C++-Quelltext

1
2
3
int **pI;

*pI; //<--

das gleiche wie

C-/C++-Quelltext

1
2
3
int *pI;

pI; //<--
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

07.02.2008, 23:41

Auch Zeiger werden generell beim übergeben nur kopiert(copy by value genannt). Sprich du übergibts einen Zeiger, davon wird eine Kopie erstellt, diese Kopie mit dem new Operator mit Leben befüllt und dann wird die Kopie zerstört. Danach greifst du beim cout auf das Orginal zurück und dieses hat sich natürlich nie geändert.
Ist das einigermaßen verständlich?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

07.02.2008, 23:43

Nur wofür brauchst du das da?! Was willst du mit der Funktion?!

C-/C++-Quelltext

1
std::auto_ptr<int> ptr_int(new int(0));
wenn du unbedingt mit Zeigern rumfummeln willst ;)

Und wenn ohne std::auto_ptr:

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
23
24
25
26
27
28
29
30
template<typename _Type>
void get_pointer(_Type*& ptr)
{
    ptr = new _Type(); // init pointer with default-value

}

template<typename _Type>
void reset_pointer(_Type*& ptr)
{
    delete ptr; // delete pointer

    ptr = NULL; // if developer use pointer again there will be an error (like null-pointer exception)

}

// example 001

#include <iostream> // std::cout, std::cin


int main ()
{
    // get memory

    unsigned int* ptr_i(NULL);
    get_pointer(ptr_i);

    // show value of pointer

    std::cout << (*ptr_i) << std::endl;

    // free memory

    reset_pointer(ptr_i);
   
    std::cin.get ();
}
...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

4

07.02.2008, 23:56

@ Nox
Vielen Dank für die schnelle Antwort^^ habs verstanden.

@ Deviloper

das ist nur eine vereinfachte Form meines Problems.
In meiner Kapselung hab ich eine Klasse die eine Liste als Member hat die Zeiger von anderen Klassen enthält.
Das Problem ist dann in der Get(-ter?) Funktion dieser Klasse aufgetreten in der ich ein Element dieser Liste abfrage und dann per Pointer zurückgebe.
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

5

07.02.2008, 23:57

Naja nimm statt doppel-zeiger lieber referenzen ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

08.02.2008, 16:48

Zum Thema ob Zeiger oder Referenz haben wir uns glaube ich schon oft genug unterhalten. Wenn es also dazu Fragen gibt Forensuche nutzen und nicht eine erneute Diskussion vom Zaun brechen. Danke :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige