Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Florian Super JLI'ler

Alter: 37 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 10.04.2004, 16:20 Titel: vector Frage |
|
|
Hallo wie kann ich die Größe eines vectors festlegen.
Ich weiß nur noch beim Deklaieren kann man das so machen glaube ich.
vector<int> zahl(9);
in diesem beispiel ist es ein vector miit 9 zahlen;
wie kann ich aber das nach der Deklaration machen.
Geht es so zahl.size = 9 oder wie bitte kann mir jemand da helfen. |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
 |
Florian Super JLI'ler

Alter: 37 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 10.04.2004, 19:13 Titel: |
|
|
ok Danke werde ich gleich mal probieren.  |
|
Nach oben |
|
 |
HotAcid Super JLI'ler

Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 10.04.2004, 20:56 Titel: |
|
|
Es gibt auch
_________________ 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 |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 12.05.2005, 19:41 Titel: |
|
|
Ich hab ein kleines Problem beim Löschen von Elementen aus Vectoren:
Code: |
//Deklaration
vector<CBillboard*>::iterator itExplosion; //Grafikzeiger
vector<CBillboard*> listExplosion; //Grafikliste
//Löschen von Explosionsbillboards bei Animationsende
for(itExplosion=listExplosion.begin();itExplosion!=listExplosion.end();itExplosion++)
{
if((*itExplosion)->m_animationEnd){
delete (*itExplosion);
itExplosion = listExplosion.erase(itExplosion);
}
}
|
Wenn ich versuche, weiterhin zu rendern, kommt eine Fehlermeldung.
Code: |
//Billboards rendern
for(itExplosion=listExplosion.begin();itExplosion!=listExplosion.end();itExplosion++)
{
(*itExplosion)->Render(Environment.m_Position+Environment.m_Zoom,Environment.m_LookAt);
(*itExplosion)->GetDrawPosition();
}
|
Wenn ich die vorhandenen Objekte zählen lasse, wird dieselbe Anzahl ausgegeben wie vor dem Löschen eines Billboards. Andererseits wird beim Versuch, das vermeintlich gelöschte Objekte zu rendern, kommt eine Fehlermeldung.
Wo könnte hier der Fehler im Quellcode liegen?? _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 12.05.2005, 20:31 Titel: |
|
|
wenn der Fehler beim Rendern kommt, dann wohl sehr wahrscheinlich bei
CPP: | CBillboard->Render() |
wo zeigt denn der Compiler dir den Error an? Welche Zeile? Ach ja, und poste mal Render() und GetDrawPosition()
Nebenbei: LeeDiGer hat Folgendes geschrieben: | CPP: | //Deklaration
vector<CBillboard*>::iterator itExplosion; //Grafikzeiger
vector<CBillboard*> listExplosion; //Grafikliste
|
|
eigentlich ist zwischen vector und list in der STL ein Unterschiedt, aber is egal..
Gruß DirectXer |
|
Nach oben |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 12.05.2005, 21:58 Titel: |
|
|
Nee, an meine Funktionen "Render()" und "GetDrawPosition()" liegts nicht. die funktionieren, wenn ich Listen benutze. Es wird ein Nullzeigerfehler ausgegeben.
Ich wollte hier aber "Vector" verwenden, um einen Sortieralgorithmus anwenden zu können, um Billboards mit Alphablending in korrekter Reihenfolge zu rendern.
Was ist gegen diese Deklaration einzuwenden:
Code: |
//Deklaration
vector<CBillboard*>::iterator itExplosion; //Grafikzeiger
vector<CBillboard*> listExplosion; //Grafikliste
|
Gibt zumindest keine Kompilerfehler. Kann man immer noch einzelne Elemente an jeder Stelle löschen wenn man folgerndermaßen deklarieren würde:
Code: |
//Deklaration
vector<CBillboard> Listxplosion; //Grafikzeiger
|
_________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 12.05.2005, 22:06 Titel: |
|
|
Bist du dir sicher, dass an dem Speicherbereich auch noch gültiger Speicher ist?
Du übergibst deinem Vector ja nur Zeiger auf CBillboard-Objekte. Die Objekte selbst müssen allerdings auch so lange im Speicher existieren wie du sie durch den Vector verwenden willst. Eine Funktion wie diese bringt also wenig:
CPP: | void AddBillboard(void)
{
CBillboard my_new_billboard;
//Initialisierung
listExplosion.push_back(&my_new_billboard);
}
//Ab hier wird der Gültigkeitsbereich von my_new_billboard verlassen
vod SomewhereElse(void)
{
listExplosion[0]->DoSth(); //<- Zugriff auf ungültigen Speicher
} |
_________________ 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 |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 12.05.2005, 22:10 Titel: |
|
|
LeeDiGer hat Folgendes geschrieben: | Kann man immer noch einzelne Elemente an jeder Stelle löschen wenn man folgerndermaßen deklarieren würde:
|
Bei jeder Reallokierung verlieren alle Iteratoren ihre Gültigkeit.
Alle Algorithmen sollten auch mit list funktionieren. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 12.05.2005, 22:14 Titel: |
|
|
PeaceKiller hat Folgendes geschrieben: | Alle Algorithmen sollten auch mit list funktionieren. |
Leider der sort-Algo im VC 6.0 für Listen nicht (weiß gerade nicht mehr, obs der allgemeine Algo oder - falls es das bei list überhaupt gibt - die sort()-Methode war)
Da ist irgendein Bug im Compiler, der da einen Fehler verursacht. _________________ 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...
Zuletzt bearbeitet von The Lord of Programming am 12.05.2005, 22:32, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 12.05.2005, 22:27 Titel: |
|
|
Listen wollt ich natürlich auch sortieren, hab aber nix dazu gefunden. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 12.05.2005, 22:31 Titel: |
|
|
LeeDiGer
std::vector != std::list
Bei std::vector gehts so:
CPP: | #include <iostream>
#include <string>
#include <algorithm>
class item
{
public:
item (const std::string& name_) : name(name_) {};
~item (void) {}
std::string name;
unsigned int arguments;
};
bool const ssss (const item& left, const item& right)
{
if (left.name<right.name) return (true);
if (left.name>right.name) return (false);
return (false);
}
int main (void)
{
std::vector<item> items_vec;
items_vec.push_back(item("hallo2"));
items_vec.push_back(item("hallo"));
items_vec.push_back(item("mamaaaaa"));
items_vec.push_back(item("hallo63"));
items_vec.push_back(item("hallo44"));
items_vec.push_back(item("arschilochi"));
std::sort(items_vec.begin(),items_vec.end(), ssss);
for (int i=0; i<items_vec.size(); ++i)
{
std::cout<<items_vec[i].name.c_str() << std::endl;
}
std::cin.get();
return 0;
} |
Bei std::list gibt es die Memberfunktion std::list::sort, da std::list anders aufgebaut ist als std::vector. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 12.05.2005, 22:31 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: |
Bist du dir sicher, dass an dem Speicherbereich auch noch gültiger Speicher ist?
|
Nein, ich bin mir nicht sicher .
Es soll ja auch ein Objekt gelöscht werden. Aber es wurde irgendwie nur halb gelöscht. Einerseits hab ich das Gefühl, dass das Element weg ist. Andererseits ist der Speicherplatz aber immer noch belegt. Der vektor hat also immer noch die gleiche Anzahl an Elementen wie vor dem Löschvorgang (oder hab ich falsch gelöscht???). _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 12.05.2005, 22:41 Titel: |
|
|
Du könntest den Löschvorgang auf jeden Fall vereinfachen. Anstatt jedes Element einzeln zu erasen, kannst du nach dem Durchlaufen der Liste/des Vectors(bei dem du den Speicher freigibtst) auch billboardvector.clear() aufrufen
Ich bin mir gerade nicht sicher, aber kann auch sein, dass erase dir ein ungewünschtes Ergebnis zurückgibt. Entweder gibt es dir einen Iterator auf das Element vor dem gelöschten oder auf das Element nach dem gelöschten zurück. Wenn du übrigens den Iterator beim erasen mit einem dieser beiden Möglichkeiten initialisierst und durch die Schleife den Iterator nach hinten schiebst(itExplosion++), dann ist es auch naheliegend, dass Elemente übersprungen werden.
Bsp:
CPP: | itExplosion = listExplosion.erase(itExplosion);
//itExplosion zeigt auf Element nach dem gelöschten, weil dieses selbst nicht mehr existiert |
CPP: | for(itExplosion=listExplosion.begin();itExplosion!=listExplosion.end();itExplosion++)
//Dadurch wird bei dem nächsten Schleifendurchlauf der Iterator auf das zweitnächste Element gesetzt
//=> Element wird übersprungen
|
_________________ 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 |
|
 |
LeeDiGer Super JLI'ler

Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 12.05.2005, 22:49 Titel: |
|
|
Wie würdest dus denn am besten machen? Ich will ja im Grunde genommen nur irgendwelche Billboards zeichnen, sortieren und gegebenfalls löschen, wenn die Animation eines Billboards abgelaufen ist. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
 |
|