Problem mit Arraybefüllung



  • Hallo zusammen,
    ich arbeite mit dynamischen Arrays und mir passiert es leider immer noch viel zu oft, dass ich entweder in ein nicht vorhandenes Element oder in zu wenige Elemente schreibe. Genau so geht es mir auch jetzt:

    double size = Graph1->xMax * 50;   //xMax == 15 --> size == 750
     double* x = new double[size],
           * y = new double[size];
     int i = 0;
     double rn = Graph1->xMin,          //xMin == -15
            end   =  Graph1->xMax,
            stp   = (ABS(rn) + end + 1) / size; //ABS --> Betrag
    
     end  -= stp;
     //Diese Berechnungen sind für die Schrittweite zuständig, damit jedes Elemet des Arrays korrekt beschrieben wird
    
     while(rn < end+1)
     {
      x[i] = rn;
      y[i] = sin(rn);
      i++;
      rn+=stp;
     //Das letzte Element (x[749], y[749]) ist stets mit 0 gefüllt. Ich finde den Fehler nicht
     }
     Graph1->DrawGraph(x,y,size);
     delete[] x, y;
    }
    

    Ich finde den Fehler in meinen Berechnungen nicht. Wenn xMax == 10 und xMin == -10 ist, dann funktioniert komischerweise alles.

    Könnt ihr mir da helfen?

    Vielen Dank
    lg, freakC++



  • ...gelöscht...



  • doubles sind keine genauen Datentypen, und 31/750 lässt sich binär halt nicht genau abspeichern.

    Wahrscheinlich ginge es mit etwas wie

    while(rn - end - 1 < epsilon)
    

    mit epsilon beispielsweise 1e-6, aber es erscheint mir sinnvoller, i von 0 bis 749 laufen zu lassen und rn im Schleifenkörper aus Graph1->xMin + stp * i zusammenzusetzen.



  • Ich will ja nicht penetrant wirken, aber irgendwie habe ich den Eindruck, dass kein C++ Lehrbuch die vernünftige Umgehensweise mit der STL anspricht. Mit der STL und TR1/boost kommt man fast immer ohne new/delete aus, wenn du deine beiden dynamischen Arrays durch eine Kombination aus Point Struktur und std::vector ersetzt kann man Folgendes machen:

    #include <cmath>
    #include <vector>
    #include <iostream>
    #include <iomanip>
    #include <iterator>
    #include <algorithm>
    
    struct Point
    {
    	double	x_;
    	double	y_;
    
    	Point() : x_( 0.0 ), y_( 0.0 )
    	{
    	}
    
    	Point( double x, double y ) : x_( x ), y_( y )
    	{
    	}
    };
    
    std::ostream& operator<<( std::ostream& os, const Point& point )
    {
    	os << "(" << std::fixed << std::setprecision( 3 ) << point.x_ << " , "
    				 << std::fixed << std::setprecision( 3 ) << point.y_ << ")";
    	return os;
    }
    
    struct SineGenerator
    {
    	double			Value_;     	// Aktueller Wert
    	double			Increment_;		// Inkrement nach jeder Iteration
    
    	SineGenerator( double Start, double Increment ) :
    		Value_( Start ),
    		Increment_( Increment )
    	{
    	}
    
    	Point operator()()
    	{
    		Point point( Value_, std::sin( Value_ ) );
    		Value_ += Increment_;
    		return point;
    	}
    };
    
    int main()
    {
    	std::vector<Point> v( 20 );
    	std::generate( v.begin(), v.end(), SineGenerator( 15.0, 0.02 ) );
    
    	std::copy( v.begin(), v.end(), std::ostream_iterator<Point>( std::cout, "\n" ) );
    }
    

    Ist doch wirklich schöner zu lesen und intuitiv zu begreifen, oder?



  • Hallo ihr beiden,
    vielen Dank für eure Hilfe. Mit dem folgenden Schleifenkopf funktioniert es:

    while (i < size) {...}
    

    Ich gebe DocShoe recht, doch da ich noch nicht mit der STL gearbeitet habe, möchte ich das jetzt nicht machen. Ich setze mich irgendwann dafür eigens hin und bringe mir das bei.

    Vielen Dank
    lg, freakC++

    edit: Außerdem müssste ich die Methode "DrawGraph" wieder komplett umschreiben, da diese nur Arrays nimmt


Anmelden zum Antworten