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

04.10.2014, 15:02

Verkettete Liste

Im Bereich Tutorials gibt es das Beispiel zur verketteten Liste.
Verkettete Liste

Ich möchte über "get" nicht den Inhalt vom Element index erhalten, sondern einen Zeiger auf das Element. Das Ziel ist es, die Elemente in der Liste nachträglich zu verändern.
Ich habe Probleme die Adresse von m_data in der Struktur Item an der Position index zu ermitteln. Kennt jemand eine Lösung?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

04.10.2014, 15:21

Damit ich hier nicht einfach nur vorsage:
Angenommen du hast einen int i, wie kommst Du dann an die Adresse von i?

Und... wieso benutzt Du eine verkettete Liste? Bist Du sicher, dass ein std::vector nicht Deine Zwecke erfüllt?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

04.10.2014, 17:04

Die Ermittlung der Adresse von int i ist trivial und bekannt.

int i;
int *pi;
pi = &i;

Der Hinweis auf das Tutorial dient lediglich der Veranschaulichung der Problemstellung und nicht mehr.
Meine Motivation für die Verwendung einer Liste steht hier nicht zu Diskussion.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

04.10.2014, 17:08

Nun, da Du das kennst, wo ist das Problem dann die Adresse von temp.m_data zurückzugeben?

Dass Du so bockig bezüglich std::vector bist, finde ich übrigens sehr traurig.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

04.10.2014, 17:29

Mein Problem:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
bool GetElement(unsigned int index, Type *data)
{
   Type *temp;

   ...

   temp = &(current->m_data)     // Adresse ermitteln
   data = temp;   // Adresse übergeben 

}


data hat immer den Wert NULL, obwohl temp != NULL.

6

04.10.2014, 17:39

Der Inhalt von 'data' wird nach dem Aufruf der Funktion verworfen, da Parameter auch nur wie lokale Variablen sind. Du kannst aber z.B. 'data' als Referenz deklarieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
bool GetElement(unsigned int index, Type *&data)
{
    //...
    data = 42;
}

//...

Type d;
GetElement(..., d)

//d == 42

7

04.10.2014, 22:12

Grundlagen:
Zuweisung eines Pointers:

C-/C++-Quelltext

1
2
3
4
int value = 10, otherValue = 20;
int* pValue = &value;
int* pArgument = pValue;
pArgument = &otherValue;

Es wird der Wert der Addresse kopiert. Daraus resultiert im Beispiel, dass pValue NICHT auf otherValue zeigt. Selbiges passiert bei der Funktion. Um den Zeigerwert von pValue ebenalls zu aendern muss pArgument auf diesen pointer zeigen, ob als Referenz oder pointer: int **ppArgument = &pValue; *ppValue = &otherValue;
Das kannst du jetzt einfach auf eine Funktion anwenden.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

8

04.10.2014, 22:12

Der Hinweis auf das Tutorial dient lediglich der Veranschaulichung der Problemstellung und nicht mehr.
Meine Motivation für die Verwendung einer Liste steht hier nicht zu Diskussion.

Sollte es aber, weil es sinnvoll ist. Denn in den allermeisten Fällen, will der Fragesteller nicht das tun was er fragt, sondern er hat ein Problem, hat eine Idee für eine Lösung, kann diese aber nicht vollständig umsetzen. Man kann ihn bei seiner Lösung helfen, aber manchmal gibt es einen anderen Lösungsansatz, der viel besser ist. Erklärt man den, hat der Fragesteller mehr gelernt und kann vermutlich zukünftige Probleme besser alleine lösen.
Es ist ja nicht gesagt, dass listen nicht die richtige Lösung sind, aber darüber gar nicht erst diskutieren zu wollen zeugt von Unwillen zu lernen. Und dann frage ich mich, wieso man überhaupt erst eine Frage stellt, wenn man doch nicht lernen will.

Denn es zeigt sich, dass verkettete Listen viel seltener als man spontan denken würde die beste Lösung sind.
Lieber dumm fragen, als dumm bleiben!

9

05.10.2014, 11:26

Zeiger als Funktionsparameter

Die Problematik lässt sich auf folgende Ausgangssituation zurückführen

C-/C++-Quelltext

1
2
3
4
5
6
7
int a=5;
int *pa = &a;
int *pb=NULL;
    
pb = pa;

std::cout << a<<" / "<<*pa<<" / "<<*pb<<std::endl;

Die Frage ist, wie setzte ich pb = pa; in einer Funktion um.
Die Lösung ist:

C-/C++-Quelltext

1
2
3
4
5
6
Testfunktion2(&pa,&pb);

void Testfunktion2(int **pa, int **pb)
{
    *pb=*pa;
}

Es müssen die Adressen der Zeiger übergeben werden. Andernfalls erfolgt die Zuweisung lediglich lokal.

Falls jemand auf ein ähnliches Problem stößt:

C-/C++-Quelltext

1
2
3
4
5
6
7
bool GetElement(unsigned int index, Type **data)
{
   ...

   *data= &current->m_data;

}


Beim nächsten mal würde ich mir mehr inhaltliche Diskussion wünschen...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

05.10.2014, 12:28

Roflo hatte Dir schon die richtige Lösung genannt, die sogar deutlich besser ist Deine.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige