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

31.12.2011, 13:08

C++ Zeiger, Arrays und Funktionen

Hey Leser/innen!
Ich bin gerade dabei mir ein Programm zu schreiben und schon hab ich eine Frage.
Also, wie kann ich einer Funktion, die Adresse eines Arrays übergeben?
Ich habe es so versucht:

struct SPlayer
{
........................
};
-------------------------------------
void getProperties(SPlayer *pPlayer[4])
{
........................
}
-------------------------------------
getProperties(&Player[4]);

Da spuckt jedoch der Compiler einen Fehler aus, woran liegt es :S ?
Only God can judge me.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

31.12.2011, 13:15

Wenn du void getProperties(SPlayer pPlayer[4]) schreibst wird nur der Zeiger aufs erste Element übergeben. Und den Bezeichner des Arrays kannst du oft wie einen Zeiger behandeln. Der Aufruf würde also so aussehen
getProperties(Player);
Es ist also schon call by reference.
Schonmal an std::vector gedacht?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

31.12.2011, 13:23

Mit Vektoren noch nie gearbeitet ;)
Only God can judge me.

4

31.12.2011, 13:28

Ah okey, habs verstanden danke.
Only God can judge me.

5

03.01.2012, 21:08

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
31
32
33
34
35
#include <iostream>
#include <vector>

using namespace std;

struct SPlayer
{
    int ID;
    char Name[30];
};

int main()
{
    SPlayer *pPlayer = NULL;
    vector<SPlayer*> vecPlayer;
    vector<SPlayer*>::iterator i;

    for(int j=0;j<2;j++)
    {
    pPlayer = new SPlayer;
    vecPlayer.push_back(pPlayer);
    pPlayer = NULL;
    }

    cout << "Kapazitaet: " << static_cast<int>(vecPlayer.size()) << endl;

    for(i=vecPlayer.begin();i!=vecPlayer.end();i++)
    {
        delete (*i);
        (*i) = NULL;
        cout << "Zerstoert.\n";
    }
    system("pause");
    return 0;
}


Ist das so richtig? :D
Only God can judge me.

6

03.01.2012, 21:31

Mal abgesehen davon, dass ich hier unique_ptrs verwenden würde, solltest du dir mal das Algorithm-Modul anschauen! Dein Code scheint mir etwas konfus zu sein.. Warum nich so:

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
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct SPlayer {
    int ID;
    char Name[30];
};

int main(int argc, char **argv) {
    vector<SPlayer*> playerCollection;

    for (int j = 0; j < 2; j++)
        playerCollection.push_back(new SPlayer);

    cout << "Kapazitaet: " << playerCollection.size() << endl;

    for_each(playerCollection.begin(), playerCollection.end(), [] (SPlayer* p) { delete p; });

    return 0;
}

Das hier jedenfalls ist ja völlig unnötig:

C-/C++-Quelltext

1
2
3
4
5
for(int j=0;j<2;j++)     {     
   pPlayer = new SPlayer;     
   vecPlayer.push_back(pPlayer); 
  pPlayer = NULL; 
    }

7

03.01.2012, 21:35

Überanstrenge mich nicht! xDD
Mit algorithm kam ich noch nicht in Begegnung, daher fällt es mir schwer deinen Code zu verstehen xDD
Trotzdem danke für die Verbesserung, die ich aber noch nicht benutzen werde :)
Only God can judge me.

8

03.01.2012, 23:35

std::for_each ist jetzt keine Raketenphysik und erst recht keine Magie. Es kann einem das Leben schon stark erleichtern. Dafür gibt es Referenzen.

Was den Aufruf etwas "gewöhnungsbedürftig" macht, ist, dass hier eine anonyme Funktion (lambda) verwendet wird, welche (erst) im neuen C++11-Standard eingeführt wurde.

Ohne lambda könnte der for_each-Aufruf folgendermaßen aussehen.

C-/C++-Quelltext

1
2
3
4
5
6
void deletePlayer(SPlayer* player)
    { delete player; }

// ...

    for_each(playerCollection.begin(), playerCollection.end(), deletePlayer);


Und verwende endlich std::string für Zeichenketten. ;)

EDIT:
C++11 ermöglicht eine range-for Syntax. Allerdings scheint mein Compiler (MinGw, GCC 4.5.2) diese noch nicht zu unterstützen:

C-/C++-Quelltext

1
    for(auto player : playerCollection) delete player;


Grüße ... bwbg

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »bwbg« (04.01.2012, 00:14)


spark

Frischling

Beiträge: 10

Wohnort: Ulm

Beruf: Code Monkey.

  • Private Nachricht senden

9

04.01.2012, 07:42

Du könntest vielleicht versuchen ohne Pointer auszukommen. Das ist weniger fehleranfällig, auch wenn der Code soweit ok ausschaut. Das macht einem später das Leben leichter.
Struct SPlayer ist klein genug, dass du es ohne schlechtes Gewissen direkt in den Vektor packen kannst.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

04.01.2012, 08:47

Also immer 34 Bytes hin und her zu kopieren finde ich persönlich ja nicht so hübsch. Klar, geht. Aber wozu? Wenn man Pointer verstanden hat, dann ist das allemal besser als auf Krampf etwas anderes schlecht zu verwenden, nur weil man grundlegende Konzepte nicht verstanden hat.
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