Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 15.12.2004, 22:20 Titel: Probleme mit Rückgabe eines 2D-Vektors |
|
|
Abend zusammen,
hab mich heut ma wieder an mein Projekt gesetzt und ich weiss an einer Stelle net weiter.
Und zwar soll eine Funktion einen Zeiger auf einen 2D-Vektor zurückgeben, was aba net wirklich funktioniert.
Ich hab das ganze jetzt mal auf int-Vektoren in einem Übungsprogramm reduziert:
Code: |
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int> > *bla();
int main()
{
vector<vector<int> > *moep = bla();
cout << moep[0][0] << endl;
cout << moep[0][1] << endl;
return 0;
}
vector<vector<int> > *bla()
{
vector<vector<int> > vecInt;
vector<int> temp;
temp.push_back(6);
temp.push_back(7);
vecInt.push_back(temp);
return &vecInt;
}
|
Bin aba zu doof
kriegs net auf die Reihe ^^
kann mir jemand bei diesem Problemchen helfen?
Thx (:
MFG
Chris _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 15.12.2004, 22:49 Titel: |
|
|
sollte helfen.
Du erstellt eine lokale Variable in der Funktion. Diese wird nach Beendigung gelöscht. Als Rückgabewert benutzt du einen Zeiger auf diese lokale Variable --> Nach der Mehtode zeigt der Zeiger ins Nirvana.
Lösung:
du kannst entweder den Vektor als Rückgabetyp definieren (nicht nur Zeiger), oder den Vektor als Parameter übergeben (Referenz oder Zeiger)
cu Felix
[/code] _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 15.12.2004, 22:57 Titel: |
|
|
das mit
geht nüsch, hab ich scho probiert =/
hab das jetz wie du gesagt hast einfach mit zeigerübergabe gemacht
Code: |
void bla(vector<vector<int> >* vecInt)
{
vector<int> temp;
temp.push_back(6);
temp.push_back(7);
vecInt->push_back(temp);
} |
wie kann ich den inhalt des vektors denn testweise mal ausgeben lassen?
so gehts jedenfalls net, dann sagt er mir, dass << net dafür definiert wär.
Code: |
int main()
{
vector<vector<int> > *moep;
bla(moep);
cout << moep[0][0] << endl;
return 0;
}
|
_________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 16.12.2004, 13:19 Titel: |
|
|
Code: | vector<vector<int> > *bla()
{
vector<vector<int> >* vecInt = new vector<vector<int> >();
vector<int> temp;
temp.push_back(6);
temp.push_back(7);
vecInt.push_back(temp);
return vecInt;
} |
ist nicht ganz so guter stil, da man normalerweise davon ausgeht, dass die funktionen, die objekte erzeugen diese auch wieder freigeben, aber es funktioniert. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 16.12.2004, 14:47 Titel: |
|
|
Wenns immer noch net funzt:
Was willst du denn mit dem Code erreichen? Vllt. gibts ja eine bessere Lösung(z.B. Referenzen, die sind einfacher zu handhaben). _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 16.12.2004, 15:07 Titel: |
|
|
und Referenzen sind besonders bei großen Objekten sinnvoll, weil die dann nicht kopiet werden müssen! _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 27.12.2004, 16:21 Titel: |
|
|
soo, hab mich heut ma widda drangesetzt und es hingekriegt.
es lag daran, dass ich den rückgabetyp falsch angegeben habe, hab nämlich nur ein 1D-Vektor als rückgabetyp festgesetzt, obwohl es ja ein 2D-Vektor ist
Thx für die Unterstützung
Es hat sich aba n neues Problemchen ergeben. Und zwar möchte ich diesen 2D-Vektor komplett durchlaufen, um jedes Element prüfen (und ggf. zeichnen) zu können.
Wie stell ich das an? Hab von Iteratoren-Arithmetik net so viel ahnung...
MFG
#C _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 27.12.2004, 17:04 Titel: |
|
|
Habs eilig, drum keine Garantie das das stimmt...
Ich glaube, die Vectorklasse hat eine Methode "size", die dir die Zahl der Elemente zurückliefert, die der Vector enthält...
Mit Hilfe dieses Wertes müsstest du den Vector eigentlich schnell und einfach in einer Schleife durchlaufen können...
Code: |
for(int y=0; y<vector.size(); y++){
for(int x=0; x<vector[y].size(); x++){
vector[x][y].bla;
}
}
|
Alternativ gehts glaub ich auch genauso wie bei Listen:
Code: |
std::vector<bla>::iterator it;
for(it=vec.begin(); it!=vec.end(); it++){...}
|
usw... dürfte klar sein was ich meine... |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 27.12.2004, 18:36 Titel: |
|
|
ok thx, so weit, so gut...
das schaut bei mir jetz so aus:
Code: |
void Spielfeld::Draw()
{
for(int y=0; y<vecTiles->size(); y++)
{
for(int x=0; x<vecTiles[y].size(); x++)
{
if(vecTiles[x][y].GetA() < re->right ||
vecTiles[x][y].GetX()+vecTiles[x][y].GetSprite()->GetWidth() < re->right &&
vecTiles[x][y].GetX() > re->left ||
vecTiles[x][y].GetX()+vecTiles[x][y].GetSprite()->GetWidth() > re->left &&
vecTiles[x][y].GetY() < re->bottom ||
vecTiles[x][y].GetY()+vecTiles[x][y].GetSprite()->GetHeight() < re->bottom &&
vecTiles[x][y].GetY() > re->top ||
vecTiles[x][y].GetY()+vecTiles[x][y].GetSprite()->GetHeight() > re->top)
vecTiles[x][y].Draw();
}
}
|
allerdings geht das net, und zwar wenn ich den Punkt hinter vecTiles[x][y] setze, dann geht eine liste mit den methoden des vectors auf. ich will aba auf die methoden des Tile-Objektes zugreifen...
wie kriegt man das hin?
die deklaration ist
Code: | vector<vector<Tile*> > *vecTiles; |
danke (:
MFG
#C _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 27.12.2004, 21:19 Titel: |
|
|
Zyrian hat Folgendes geschrieben: | allerdings geht das net, und zwar wenn ich den Punkt hinter vecTiles[x][y] setze, dann geht eine liste mit den methoden des vectors auf. ich will aba auf die methoden des Tile-Objektes zugreifen...
wie kriegt man das hin? |
Da gibts zwei Möglichkeiten:
Entweder du dereferenzierst den 2D-Vector, bevor du mit dem []-Operator auf die Elemente zugreifst:
Code: | (*vecTiles)[x][y]->CMethode(); |
Oder du benutzt die alternative Memberfunktion des Vectors at():
Code: | vecTiles->at(x).at(y)->CMethode(); |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
|
Nach oben |
|
|
|