Problem mit ausgabe bei einer for schleife + vector inhalte



  • Morgen,

    ich mal wieder

    also ich hab jetzt ein neues probelm aber und zwar folgendes ich hab einen vector erzeugt mit inhalten gefühlt und will die einzelnen inhalte dann in eine datei schreiben das will ich machen indem ich ne if schleife mache die size des vector hochzählt da ich aber ein problem habe mit dem schreiben in die datei wollt ichs mir erstmal ausgeben lassen aber da kommt dann 500000 raus 5 ist size also ich bräuchte dann antwort auf die frage wie ich die werte des vectors erstmal ausgeben lassen kann und dann noch wie ich sie dann reinschreiben kann. in des file schreib ich mit (*m_pStream) << // funkt aber nicht in der scheife und cout funktioniert auch ned mehr seit ich auf des visual studio umgestiegen bin des mach ich jetzt mit printf naja

    also wie immer sagen worte nicht sehr viel also hier der code

    // Das in der main datei
    std::vector<Point> points;
    
    	points.push_back(Point(10,0,0));
    	points.push_back(Point(30,0,0));
    	points.push_back(Point(30,20,0));
    	points.push_back(Point(0,20,0));
    	points.push_back(Point(10,0,0));
    
    	wr.writePoints(points); //ist erst später wichtig
    
    //Das ist in meiner VTKWriter.cpp datei
    
    void 
    VTKWriter::writePoints(std::vector<Point> vecPoints)
    {
    
    	int nPoints = vecPoints.size();
    		printf("%i", nPoints );         
    	for(int i=0; i< nPoints;i++)
    	{
    		Point p =  vecPoints[i];       //gibt 5 aus	
    
    	for (int l=0; l< nPoints; l++)
     {
          printf("%i", p );                        //gibt aus 00000
    
              }
    

    ja also hoffe das ist so gut erklärt und mir kann da jemand weiterhelfen

    Danke schonmal



  • Erstens: Es gibt keine "if-Schleife" 😉

    Zweitens: Du hast zwei Schleifen. Die erste überschreibt in jeder Runde den Inhalt der Variablen 'p', die zweite gibt nPoints mal den letzten Wert aus, den du in p eingetragen hast.

    PS: Was versteckt sich eigentlich hinter einem 'Point'? Und hältst du es wirklich für eine gute Idee, das als int-Wert ausgeben zu können?



  • versuchs mal mit iteratoren!!

    for(std::vector<Point>::iterator it= points.begin(); it < points.end(); it++){
    
     it->... //inhalt von Point
    }
    


  • OMG bin ich doof

    hab mich verschrieben natürlich hab ich keine if schleife das mir jetzt peinlich naja

    hmmm also die überschreiben sich also ok dann werd ich das mal ändern

    und zu deiner frage wegen point

    des ist jetzt so das ich OOP arbeiten soll aber immernoch das selbe wie dieletzt und wenn du dich erinnerst schreibt des ja kordinaten (ok hab ich nie erwähnt aber könnte ersichtlich gewessen sein) die soll ich jetzt als point zu einer klasse machen damit man einfach nur noch point nimmt und nicht mehr alles eingeben muss

    hmmm das mit dem überschreiben ist mir immer noch nicht ganz klar

    nur zur absicherung

    for(int i=0; i< nPoints;i++)  //zählt von 0 bis nPoints hoch
    	{
    		Point p =  vecPoints[i];  // weist vecPoints[i] p zu		
    		 printf("%i", p );        // gibt p aus  
               }
    

    aber tut sich dann i nicht dauernt verändern bis nPoints erreicht ist also in meinen fall da size ja 5 ist wärs doch dann
    vecPoints[0]
    vecPoints[1]
    vecPoints[2]
    vecPoints[3]
    vecPoints[4]

    und da müssten doch dann andere werte drin stehn?

    des weitern wäre sicher string sinnvoller oder? als int?

    PS:
    Wie geb ich den mit printf strings aus?



  • Ja, i verändert sich dauernd, aber während eines Durchlaufs durch den Schleifenrumpf bleibt es konstant (außer du hast es im Rumpf selber verändert). Das bedeutet, in jedem Schleifendurchlauf greifst du auf ein anderes vector-Element zu und gibst dieses dann aus.

    (übrigens kannst du das Kopieren weglassen und 'vecPoints[i]' direkt ausgeben)

    PS: Für String-Ausgaben (char*) gibt es die Formatkennung %s - aber ist dein Point ein String? (ich würde für die Klasse den operator<< überladen und dann die Punkte mit 'cout<<vecPoints[i];' ausgeben)



  • also Point ist kein string nein war eigentlich nur einfach so gefragt

    also ich soll des einladen und dann ausgeben lassen?

    und des weitern Point ist mit 3 punkten definiert mit x y z die standartmäßig auf null gesetzt sind

    points.push_back(Point(10,0,0)); <------ die 3 punkte
    points.push_back(Point(30,0,0));
    points.push_back(Point(30,20,0));
    points.push_back(Point(0,20,0));
    points.push_back(Point(10,0,0));

    ähm und es sind double werte

    (übrigens kannst du das Kopieren weglassen und 'vecPoints[i]' direkt ausgeben) des verteh ich jetzt nicht

    'cout<<vecPoints[i];' <--- mag er ned mehr deswegen ja das printf ka warum sagt dann das

    // error C2065: 'cout' : undeclared identifier

    versteh ich nicht warum

    ähm und wie soll ich des dann machen? des mit dem überladen (Beispiel wär nett)



  • GT schrieb:

    (übrigens kannst du das Kopieren weglassen und 'vecPoints[i]' direkt ausgeben) des verteh ich jetzt nicht

    Anstatt den Inhalt von vecPoint[i] erst in eine neue Variable zu kopieren und dann auszugeben, kannst du vecPoint[i] auch direkt ausgeben:

    //umständlich:
    Point p = vecPoints[i];
    print_point(p);
    
    //besser:
    print_point(vecPoints[i]);
    

    'cout<<vecPoints[i];' <--- mag er ned mehr deswegen ja das printf ka warum sagt dann das

    // error C2065: 'cout' : undeclared identifier

    Dafür fehlt vermutlich ein '#include <iostream>'.

    ähm und wie soll ich des dann machen? des mit dem überladen (Beispiel wär nett)

    Wenn du es nicht zu kompliziert haben willst, kannst du dir erstmal eine eigene Ausgabefunktion schreiben:

    void print_point(const Point& p)
    {
      printf("%f/%f/%f ",p.x,p.y,p.z);
    }
    

    Besser (weil flexibler) sieht es aus mit einem Ausgabe-Operator:

    std::ostream& operator<<(std::ostream& sout,const Point& p)
    {
      sout<<p.x<<"/"<<p.y<<"/"<<p.z<<" ";
      return sout;
    }
    

    Mit diesem Operator kannst du deine Punkte dann über 'cout<<vecPoints[i];' auf den Monitor schreiben.

    PS: Und das Zitieren üben wir auch nochmal 😃



  • ahja Zitieren sorry

    aber das was du jetzt geschrieben hast das kling für mich schlüssig und nachvollziehbar das werde ich jetzt ausprobiern

    Danke

    und ich werde mich bessern


Anmelden zum Antworten