Frage zu 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.