Frage zu Vector
-
GT schrieb:
...
Point zeichen; std::vector< Point > zeichen;...
Also DAS dürfte schonmal zu einem Compilefehler führen.

(Die erste Deklaration kann einfach weg)Ansonsten:
- ein "Vektor" ist in diesen Zusammenhang einfach "eine Menge von" (hier: Point) Objekten.
- "push_back()" fügt dieser Menge ein weiteres Objekt hinzu.
- size() gibt an, wie viele schon drin sind.Edit: Ich "dampfe" Deinen Code mal auf das Wesentliche ein:
#include <iostream> #include<vector> using namespace std; struct Point { double x; double y; double z; }; int main() { std::vector< Point > zeichen; zeichen.push_back(Point(0, 1, 0)); zeichen.push_back(Point(10,0,0)); zeichen.push_back(Point(10,10,0)); zeichen.push_back(Point(0,10,0)); zeichen.push_back(Point(10,0,0)); zeichen.push_back(Point(20,0,0)); cout << zeichen.size(); }Gruß,
Simon2.
-
Ok dann direkt.
Ich möchte Vectoren benutzen um die Anzahl der Werte einer schleife festzustellen. Und jetzt im Moment möchte ich einen Vector benutzen um Werte aufzulisten. Und jeder Wert soll 3 Zahlen haben. Die will ich dann in mehreren Schleifen zählen. Aber ich krieg das mit den ein Vector mit Wert und mehreren Zahlen noch nicht mal hin. Auf einen Wert mit einer Zahl ists einfach gewessen aber ich möchte ja einen Wert mit 3 zahlen Das ist im Moment das Problem.
@ pumuckl ich hab was gelesen und es versucht umzusetzen. Aber man sieht ja was dabei rausgekommen ist.
Aber du weist ja schon was ich möchte von vorherigen Problemen kannst du mir dann nicht auf irgendein schlichtes Beispiel zeigen wie ich einen Vector mache mit den drei werten so wie ichs wollt? also x y z?
Oder um direkt drauf zukommen wie ich es nutzen will.
myFile << "POLYGONS 612 2448\n"; for(x=1; x<= (nloop_phi - 1) ; x++) { myFile << 3 << " " << 0 << " " << x << " " << x + 1 << "\n"; } myFile << 3 << " " << 0 << " " << nloop_phi << " " << 1 << "\n"; for(x=1, y=(nloop_phi +1); x<=(nloop_phi - 1)&&y<=(nloop_phi * 2); x++, y++) { myFile << 3 << " " << x << " " << y << " " << y + 1 << std::endl << 3 << " " << x << " " << x + 1 << " " << y + 1 << std::endl; } myFile << 3 << " " << nloop_phi << " " << 1 << " " << (nloop_phi + 1) << "\n"; myFile << 3 << " " << nloop_phi << " " << (nloop_phi * 2) << " " << (nloop_phi + 1) << "\n"; for(x=(nloop_phi +1), y=(nloop_phi * 2); x<=(nloop - (nloop_phi + 2))&&y<=(nloop -4); x++, y++) { myFile << 3 << " " << x << " " << y << " " << y + 1 << std::endl << 3 << " " << x << " " << x + 1 << " " << y + 1 << std::endl; } myFile << 3 << " " << (nloop - (nloop_phi + 2)) << " " << (nloop -3) << " " << (nloop - 2) << "\n"; myFile << 3 << " " << (nloop - (nloop_phi + 2)) << " " << (nloop - nloop_phi + 1) << " " << (nloop - 2) << "\n"; for(x=(nloop - nloop_phi), y=(nloop - nloop_phi + 1); x<=(nloop -3)&&y<=(nloop - 2); x++, y++) { myFile << 3 << " " << 307 << " " << x << " " << y << "\n"; } myFile << 3 << " " << (nloop - 1) << " " << (nloop - nloop_phi - 1) << " " << (nloop - nloop_phi) << "\n"; myFile << 3 << " " << (nloop - 1) << " " << (nloop - 2) << " " << (nloop - nloop_phi - 1);Ich möchte diese Schleifen in Vectoren haben und die POLYGONS 612 ist dann die anzahl der Werte in den Vectoren zusammen gezählt (oder halt ein Vector).
-
GT schrieb:
...
Ich möchte Vectoren benutzen um die Anzahl der Werte einer schleife festzustellen...Eine "Schleife hat Werte" ? und die willst Du "feststellen" ? ...
Sorry, das verwirrt mich noch mehr als das Vorherige.Dein obiges Beispiel war doch schon nicht schlecht, wo "hakt's" denn ?
Zeig dochmal (wie immer: Übersichtliches Minimalbeispiel, das den Fehler isoliert zeigt), was Du da mit "der Schleife" und "den Werte" machen möchtest unst was schiefläuft.Gruß,
Simon2.
-
Also
#include <iostream> #include<vector> using namespace std; struct Point { double x; double y; double z; }; int main() { std::vector< Point > zeichen; zeichen.push_back(Point(0, 1, 0)); <--- hier geb ich doch Werte an zeichen.push_back(Point(10,0,0)); zeichen.push_back(Point(10,10,0)); zeichen.push_back(Point(0,10,0)); zeichen.push_back(Point(10,0,0)); zeichen.push_back(Point(20,0,0)); cout << zeichen.size(); <----- und hier frag ich wieviele es insgesamt sind }Das Problem ist das ich zeichen.push_back(Point(0, 1, 0)); <--- die 3 punkte
nicht hinbekommen. Ich weis nicht wie ich es Anstelle das Der eine Wert dann die 3 Punkte hat.
-
stimmt, denn du benutzt einen Konstruktor fuer Point, was auch sehr loeblich ist. Allerdings hast du so eien Konstruktor fuer Point hier nicht definiert. Und in deinem ersten Beispiel war sowas in der Richtugn zwar schon da, aber voellig verunglueckt. Der "Methodenname" muss gleich dem Klassennamen sein und die Wertzuweisung ging in die falsche Richtung. asc hat oben zwei Beispiele fuer einen Konstruktor geliefert, die in diesem Fall genau dasselbe machen. Wenn du einen von ihnen nutzt, wird dein Codeschnipsel vermutlich funktionieren.
Mir ergibt sich allerdings allmaehlich der Eindruck, dass du dir vielleicht noch einmal ein Buch ueber die Grundlagen der Programmierung in C++ und allgemeine Grundkonzepte der Programmierung durcharbeiten solltest (und wirklich durcharbeiten, nicht nur ueberfliegen), bevor du dich an sowas abgehobenes wie 3D-Grafiken heranmachst. Das wird dir in vieler Hinsicht ungemein weiterhelfen und dir auch den Wortschatz naeherbringen, der allgemein benutzt wird. Dadurch vermeidest du Missverstaendnisse, wie sie hier in letzter Zeit aufgetreten sind, weil du dich teils ungewohnt oder ungenau ausgedrueckt hast

-
Hopps, da hatt ich noch einen Fehler drin:
// ... struct Point { Point(double ix, double iy, double iz) : x(ix), y(iy), z(iz) {} double x; double y; double z; }; // ...Übrigens: "bekomm' ich nicht hin" ist definitiv weniger als Du weißt und uns sagen solltest.
Wenn Dein Compiler einen Fehler meldet, solltest Du ihn
a) lesen,
b) versuchen, zu verstehen und
c) hier mit angeben.Gruß,
Simon2.
-
GT schrieb:
...
Das Problem ist das ich zeichen.push_back(Point(0, 1, 0)); <--- die 3 punkte
nicht hinbekommen.Warum nicht? Hast du dazu mal bitte etwas wie eine aussagekräftige Fehlermeldung? (z.B. das was der Compiler dazu sagt)
(Ganz davon abgesehen sind es nicht 3 Punkte sondern ein Punkt der sich aus drei Werten zusammensetzt; Nur damit man mal von der Beschreibung auf einen "Punkt" kommt ;P ).GT schrieb:
Ich weis nicht wie ich es Anstelle das Der eine Wert dann die 3 Punkte hat.
Hat er das etwa nicht? Bzw. was hat der den dann bitte schön für Werte?
pumuckl schrieb:
...vielleicht noch einmal ein Buch ueber die Grundlagen der Programmierung in C++ und allgemeine Grundkonzepte der Programmierung durcharbeiten...
Damit kann ich mich nur anschließen.
cu André
-
@ Simon2
Danke jetzt funktionierts wenigstens. Und Ich tue mir mit beschreiben ziehmlich schwer. Ich werde wohl absofort die Kompiler fehler schreiben. Und ich kriegs nicht hin ist wirklich eine schlechte beschreibung
@ pumuckl
Ja ich werde wohl das Übungsbuch nochmal sehr gut durchgehne. Aber trotzdem danke.
-

Viel Vergnügen noch !Gruß,
Simon2.
-
Das funktioniert jetzt so wies soll!
#include <iostream> #include<vector> using namespace std; struct Point { Point(double ix, double iy, double iz) : x(ix), y(iy), z(iz) {} double x; double y; double z; }; int main() { std::vector< Point > zeichen; zeichen.push_back(Point(10,0,0)); zeichen.push_back(Point(10,10,0)); zeichen.push_back(Point(0,10,0)); zeichen.push_back(Point(10,0,0)); zeichen.push_back(Point(20,0,0)); zeichen.push_back(Point(30,0,0)); for(int i=0; i<= (zeichen.size()- 1); i++) { cout <<3 <<" " <<zeichen[i].x<< " "<<zeichen[i].y<< " "<<zeichen[i].z<< "\n"; } system("pause"); }Ich habs jetzt nur noch mal geschrieben, weil ich für verbesserungen und Vorschläge sehr offen bin.
Also Danke nochmal!
-
GT schrieb:
Ich habs jetzt nur noch mal geschrieben, weil ich für verbesserungen und Vorschläge sehr offen bin.
Vier kleine Anmerkung habe ich
for(int i=0; i<= (zeichen.size()- 1); i++) ...1. Statt i<=(zeichen.size()- 1) würde ich i<zeichen.size() schreiben.
2. Ich würde hier den Funktionsaufruf in der Prüfung herausziehen. Da dieser bei jedem Durchgang aufgerufen wird.
3. Ich würde, wenn es keine Verständnisprobleme mit sich bringt, statt i++ immer ++i vorziehen (Mag bei int relativ unbedeutend sein, bei großen Objekten kann es aber merkbare unterschiede geben, da hier ein temporäres Objekt gespart werden kann). Da es hier aber einzeln für sich steht sehe ich hier kein Problem.int count = zeichen.size(); for(int i=0; i<=count; ++i) ...4. Für "system("pause");" gibt es besserer Alternativen (die zudem portabel wären). Schau mal in den FAQ-Bereich (irgendwas mit mein Programm beendet sich sofort).
cu André
-
GT schrieb:
...ich für verbesserungen und Vorschläge sehr offen bin....
Das ist eine gute Voraussetzung !!
Deswegen nochmal eine Kleinigkeit:for(size_t i=0; i< zeichen.size(); ++i)Das ist eine Art "feststehendes Idiom", von dem ich nicht abrücken würde. Außerdem schützt size_t von "underflow"- und "overflow"-Problemen.
Falls Du sowieso "alle Elemente" meinst, kannst Du auch:
for(vector<Point>::const_iterator i=zeichen.begin(); i != zeichen.end(); ++i) { cout <<" " <<i->x<< " "<<i->y<< " "<<i->z<< "\n"; }oder konkret für die Ausgabe:
// oben rein (operator<<() - damit kann man alle Ausgaben so machen wie mit "eingebauten Typen"): ostream& operator<<(Point const& p, ostream& out) { return out <<" " << p.x << " " << p.y << " "<< p.z; } // unten dann for(vector<Point>::const_iterator i=zeichen.begin(); i != zeichen.end(); ++i) { cout << *i << "\n"; }... oder gar (setzt operator<<() von oben voraus) ..
// oben rein: #include <algorithm> // unten dann copy(zeichen.begin(), zeichen.end(), ostream_iterator<Point>(cout, "\n"));Ach ja: Wenn Du einmal "using namespace std;" geschrieben hast, brauchst Du unten nie wieder "std::" zu schreiben - ist bisweilen praktisch, kann Dir aber später mal ins Gesäß beißen (z.B: wenn man's in einen Header schreibt).
Gruß,
Simon2.