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

19.06.2006, 08:44

pointer auf pointer richten und einer funktion übergeben?

Hallo,

also mich würde mal interessieren wie das funktioniert.

ich bräuchte es z.b. bei klassen, die man ja eigentlich so erstellen sollte

class CClass *pClass = NULL;
pClass = new CClassx();

und jetzt möchte ich pClass einer funktion übergeben.
da kommen mir 2 ideen in den sinn:
-entweder man übergibt den pointer einfach so als wert sozusagen
ODER
-man übergibt die adresse vom pointer und richtet einen neuen drauf

variante 2 wäre imo sicherer, aber irgendwie funktioniert das nicht. vl weil man auf pointer keine pointer richten kann?

naja hier mal meine ansätze :)

function(*pClass);

void function (CClass *pClass)
{
}

<---- funktioniert nicht^^

ansatz 2

function(&pClass)

void function (CClass *pClass)
{
}

<---- geht auch nicht ;)


also wie macht man denn sowas?

// ///////////////////////////////////////////////

und noch ne frage zu klassenarrays.

also im buch werden die so erstellt.

C-/C++-Quelltext

1
2
3
CClass *pXYZ = NULL;
pXYZ = new CClass[NumberOfPlayers] // ist jetzt nur ein Beispiel

delete []*pXYZ;


jedoch kommt es da bei mir zu merkwürdigen ergebnissen wenn ich ein klassenarray so kreiere, deswegen schaut das bei mir dezreit so aus.

*pXYZ[4]
delte *pXYZ[0];
delete *pXYZ[1];
etc....

hier noch der fehler der mit der oberen schreibweise auftritt.

C-/C++-Quelltext

1
2
3
4
5
// Auch nur ein Beispiel

for (unsigned short i = 0; i < i_NumberOfPlayers; i++)
{
pXYZ = new CClass[i];
}


wenn jetzt z.b. spieleranzahl 4 ist werden komischerweise 6 klassen erzeugt.
bei einem spieler 0, bei 3 spielern 3 und bei 2 spielern eine klasse.

ich versteh zwar nicht warum, aber es ist so :)

naja genug der viele worte, vl kann mir wer helfen.

mfg
Drac

ext

Treue Seele

  • Private Nachricht senden

2

19.06.2006, 10:29

Ein Zeiger zeigt immer auf einen bestimmten Typ:

Quellcode

1
2
3
int    * -> Zeiger auf int

int*   * -> Zeiger zeigt auf int*


Nun überleg dir was du in der Methode verändern möchtest:
a) einen int
oder
b) einen Zeiger auf int

bei a) schreibst int*
und bei b) schreibst int**


In C++ kannst das aber etwas eleganter machen indem du ne Referenz auf den Typ übergibst:

Quellcode

1
2
int    &  -> Referenz auf int  => Referenz manipuliert den zugehörigen int
int*   &  -> Referenz auf int* => Referenz manipuliert den zugehörigen int*

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

3

19.06.2006, 11:00

Also, die beiden Varianten, wie du deine Funktionen aufrufst sind das Problem.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo (CClass* arg) { }

void bar ()
{
  CClass c1;
  CClass* c2 = new CClass;

  foo (&c1); // funktioniert

  foo (c2);   // funktioniert


  foo (c1);  // Fehler, kein Zeiger auf CClass

  foo (*c2); // Fehler, c2 dereferenziert, kein Zeiger mehr

  foo (&c2); // Fehler, Zeiger auf c2 ist "Pointer to Pointer"

}


Vieleicht solltest du dir nochmal anschauen, wie das mit Zeigern in C/C++ funktioniert... dein Problem scheint mir eher darin zu liegen, dass du die Zeiger Erzeugung / Dereferenzierung durcheinander gebracht hast.

Dann klappt das nämlich auch mit den Arrays von Objekten oder Arrays von Zeigern auf Objekten.

MfG
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

4

19.06.2006, 11:40

k danke :)

werd im buch auch nochmal bischen nachlesen, vl stehen da auch noch infos drinnen :)

thx

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

19.06.2006, 14:31

Zitat

variante 2 wäre imo sicherer, aber irgendwie funktioniert das nicht. vl weil man auf pointer keine pointer richten kann?


Warum sollte das sicherer sein?

Zeiger auf Funktionen können z.B. so aussehen: unsigned int (WINAPI *Funktion)(void*);
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.

6

21.06.2006, 07:54

naja sicherer deswegen, weil man ja nicht wirklich die variable manipuliert, sondern nur den pointer, aber ich habe vergessen,dass ich ja sowieso schon nen pointer übergebe :)

hat sich btw eh schon erledigt, klappt jetzt alles

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

21.06.2006, 11:35

Das nenne ich Logik: ich mache den Zugriff sicherer indem ich anstatt dem Pointer einen Pointer auf den Pointer übergebe, damit ich den Wert des ersten Pointers nicht ändern kann...ich glaube du hast da was an Pointern nicht ganz verstanden ;)
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