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

bsgv

Frischling

  • »bsgv« ist der Autor dieses Themas

Beiträge: 13

Wohnort: Würzburg

  • Private Nachricht senden

1

24.10.2008, 18:54

[Erledigt] Problem bei Funktionsaufruf mit einem Vektor

Hi,

ich habe folgendes Problem.

Ich habe an eine Funktion einen Zeiger auf einen Vektor (auf die Klasse CZahl) übergeben.

C-/C++-Quelltext

1
void Menue (std::vector <CZahl> *pZahl)


Mit

C-/C++-Quelltext

1
anzahl = pZahl->size ();

kann ich ja z.B. die Größe des Vektors ermitteln. Das funktioniert auch alles.

Wenn ich aber nun mit

C-/C++-Quelltext

1
pZahl->ZahlenSpeichern (pZahl)

versuche, eine Memberfunktion dieser Klasse aufzurufen, kommt folgende Fehlermeldung:

error C2039: 'ZahlenSpeichern': Ist kein Element von 'std::vector<_Ty>'

Wie kann ich also auf die Memberfunktion zugreifen?

Ich hoffe, ich habe das einigermassen verständlich erklärt :?

MfG
bsgv

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

2

24.10.2008, 19:00

vergiss was ich gesagt habe xD.. hab nicht gesehen von welchem typ der Vector ist xD

Also man könnte es über iteratoren lösn sowas wie:

C-/C++-Quelltext

1
2
3
4
5
6
vector<bla>::iterator cBla_Iter; 
cBla_Iter = cBla.begin();
    for (; cBla_Iter != cBla.end(); cBla_Iter++)
    {
        (*cBla_Iter).Speicherdingsdabums()
    } 

Hoffentlich hab ich nix falsches gesagt xD

3

24.10.2008, 19:11

Re: Problem bei Funktionsaufruf mit einem Vektor

Zitat von »"bsgv"«

Ich habe an eine Funktion einen Zeiger auf einen Vektor (auf die Klasse CZahl) übergeben.
[...]
Wie kann ich also auf die Memberfunktion zugreifen?
Indem du zuerst auf ein Element zugreifst. Z.B. über front(), back(), at(), operator[] oder Iteratoren.

C-/C++-Quelltext

1
2
3
4
5
6
7
void Function(std::vector<CZahl>* Vec)
{
    for (std::vector<CZahl>::iterator it = Vec->begin(); it != Vec->end(); ++it)
    {
        it->ZahlenSpeichern(pZahl)
    }
}


Wieso übergibst du überhaupt einen Zeiger auf den vector und keine Referenz?

bsgv

Frischling

  • »bsgv« ist der Autor dieses Themas

Beiträge: 13

Wohnort: Würzburg

  • Private Nachricht senden

4

25.10.2008, 09:22

Erstmal danke Leute.

Vektoren sind für mich noch ein ziemliches Neuland, deshalb bin ich erstmal am Austesten der Möglichkeiten.

Ich werde das Ganze auf jeden Fall auch mal mit Referenzen probieren.

MfG
bsgv

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

5

25.10.2008, 11:16

Es ist ganz einfach so, dass ein vector eine ganz normale C++ Klasse ist. Sie hat eigene Methoden und sie hat KEINE Methode die sich "ZahlenSpeichern" nennt. Deine Klasse CZahl hat eventuell eine.

Ein Vector hat intern ein Array, in dem er Elemente vom übergebenen Typ speichern kann. Wenn du nun die "ZahlenSpeichern" methode von einem dieser Elemente aufrufen willst, musst du doch zuerst mal ne Referenz oder einen Vector auf das entsprechende Element haben. Mit dem [] operator kannst du wie bei einem normalen Array auf die Elemente zugreiffen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::vector<int> intVec; // Ein vector(dynamisches array) mit ints


// zuerst mal einen int zum array hinzufügen

intVec.push_back(123);

// Wie man sieht, kann sich die größe des Arrays ändern. Den technischen hintergrund möchte ich nicht erläutern, das würde dich jetzt nur verwirren. Erstmal noch ein paar ints rein:

intVec.push_back(321);
intVec.push_back(4321);
intVec.push_back(0);

// So nun haben wir 4 ints hinzugefügt, also sollten auch 4 drinne sein.

// Das Prüfen wir mit der size methode vom vector:

std::cout << "Es sind " << intVec.size() << " Elemente in intVec.\n";

// Nun wollen wir auf das 2. Element zugreifen.

// Wie du weisst, hat das erste Element den Index 0. (Wie bei einem normalen Array auch).

//Das zweite Element hat den Index 1, das dritte 2 etc etc...

// Um nun via index auf ein Element zuzugreifen, haben wir den []-Operator der lässt sich wie bei jedem normalen Array auch benutzen.

std::cout << "Das 2. Element (Index = 1) ist: " << intVec[1] << std::endl;


Wenn du das einfach mal in ne main Funktion reinpackst und ausführst, sollte etwa folgendes rauskommen:

Quellcode

1
2
Es sind 4 Elemente in intVec.
Das 2. Element (Index = 1) ist: 123


Ich hoffe, ich konnte dir etwas helfen und verständnissprobleme beheben,

Socke

6

25.10.2008, 11:24

Ich hab noch nie etwas mit Vektoren gemacht, aber das scheint ja ganz einfach zu sein... (Danke @ FauleSocke)

Zitat

Wenn du das einfach mal in ne main Funktion reinpackst und ausführst, sollte etwa folgendes rauskommen:

Quellcode

1
2
Es sind 4 Elemente in intVec. 
Das 2. Element (Index = 1) ist: 123  

Meiner Meinung nach müsste aber
"Das 2. Element (Index = 1) ist: 321" rauskommen...hast dich wohl vertippt.
(Könnte ja sein dass er sich fragt warum du "123" geschrieben hast)

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

7

25.10.2008, 11:26

DefaultPlayer: Du hast natürlich recht, ich hatte beim nachschauen, welche Zahl rauskommt auf das erste push_back geguckt :oops:

Socke

8

25.10.2008, 11:48

Bleibt vielelicht noch zu sagen, dass man so denn möglich die Größe eines Vektors selten ändern sollte. Also lieber am Anfang ein resize() machen, da sonst bei jedem push_back die Größe verändert wird, was langsamer ist. Besonders wenn man jetzt z.b. tausend Große Elemente hat, und das in jedem Frame.
Lieber dumm fragen, als dumm bleiben!

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

9

25.10.2008, 13:03

Damit gibst du allerdings den großen Vorteil des komfortablen Hinzufügens von Elementen weg, in meinen Augen ein Hauptgrund, vector überhaupt zu benutzen. Der Einwand ist natürlich teilweise richtig, allerdings würde ich dann doch eher auf reserve zugreifen anstatt auf resize, damit lassen sich Elemente weiterhin mit push_back hinzufügen. Außerdem sollten die gängigen STL Implementierungen diesbezüglich soweit optimiert sein, dass nicht jedes push_back automatisch ein realloc verursacht - ich meine im STL Quelltext, der VS beiliegt, mal etwas von +50% reserve bei "Überlauf" gelesen zu haben.

Wird ein Vektor tatsächlich pro Frame erstellt, sollte dieser sowieso die Frames überdauern, Allokation kann dich sonst mit oder ohne resize einiges kosten.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

bsgv

Frischling

  • »bsgv« ist der Autor dieses Themas

Beiträge: 13

Wohnort: Würzburg

  • Private Nachricht senden

10

25.10.2008, 14:02

Erstmal danke an alle.

Zitat

Es ist ganz einfach so, dass ein vector eine ganz normale C++ Klasse ist. Sie hat eigene Methoden und sie hat KEINE Methode die sich "ZahlenSpeichern" nennt. Deine Klasse CZahl hat eventuell eine.


Dieser Satz hat mir schon sehr geholfen.
Dadurch wird das Ganze logisch und erklärt, warum das so nicht funktionieren konnte.

Ich werd mich nun mal ne Weile hinsetzen und versuchen, das Alles irgendwie umzusetzen.

Wenns nicht klappt, lest ihr wieder von mir :)

MfG
bsgv

Werbeanzeige