000
06.02.2006, 23:39 Uhr
~chuck
Gast
|
Folgender Quelltext liefert nur beim Datentyp float die richtige Ausgabe, d.h. der Betrag des jeweiligen Vektors (Vektor-Objekt) wird nur mit float anstelle von double bzw. long double korrekt ermittelt. (Hinweis: Der Quelltext ist auf das Wesentliche gekürzt wiedergegeben. X- und Y-Werte für p[i] werden aus einer Datei, die n Linien mit Anfangs- und Endpunkt enthält, in x[] und y[] eingelesen.)
C++: |
#include <iostream> #include <cmath> // für sqrtl und powl
using namespace std;
class point_2d // 2-D-Punkt { public: long double x, y; // x und y Koordinate für Punkt P point_2d() // Standardkonstruktor { x = 0; y = 0; } };
class vektor // Linie zwischen zwei Punkten als mathematischer Vektor { public: point_2d a, e; // Anfangs- (a) und Endpunkt (e) der Linie long double betrag; void set_betrag() { betrag = sqrtl(powl((a.x-e.x),2)*powl((a.y-e.y),2)); //betrag = sqrt((a.x-e.x)*(a.x-e.x) + (a.y-e.y)*(a.y-e.y)); } vektor() {betrag = 0;} // Standardkonstruktor };
int main () { int i, j, n, iret; n = anzahl_linie(); long double *x = new long double[2*n+1]; // Vektor für x- und y-Koordinaten der End- und Anfangspunkte dynamisch allokieren long double *y = new long double[2*n+1]; // n Linien => 2*n Koordinatenpaare (+1, da Zähler ab 1) point_2d *p = new point_2d[2*n+1]; // Objekt-Vektor aus 2*n Punkten dynamisch erzeugen zum Speichern der Anfangs- und Endpunkte vektor *v = new vektor[n+1]; // Objekt-Vektor aus n Linien dynamisch erzeugen (auf den Heap) iret = dxf_read(x, y, n); // Koordinaten in x[] und y[] einlesen if(iret!= 0) printf("Funktion dxf_read fehlgeschlagen!!!\n\n"); p[0].x = 0; //erstes Element 0, da Zähler ab 1 p[0].y = 0; for(i=1; i<=2*n; i++) { p[i].x = x[i]; // Umspeichern der eingelesenen Koordinaten in Punkt-Vektor p[i].y = y[i]; } for(i=1, j=1; i<=n; i++) // Punkte zu den Anfangs- und Endpunkten der Linien zuordnen { v[i].a = p[j]; v[i].e = p[j+1]; v[i].set_betrag(); j=j+2; } for(i=1; i<=n; i++) // Ausgabe {
printf("%Lg", v[i].a.x); printf("%\t%Lg\n",v[i].a.y); printf("%Lg", v[i].e.x); printf("%\t%Lg\n",v[i].e.y); printf("Betrag: %Lg\n\n", v[i].betrag); } cin.get(); delete[] x; delete[] y; delete[] p; delete[] v;
return 0; }
|
Standardausgabe: (falscher Betrag!)
Code: |
11.216 6.6617 16.216 6.6617 Betrag: 0
16.216 6.6617 16.216 16.6617 Betrag: 0
23.216 16.6617 16.216 16.6617 Betrag: 0
23.216 16.6617 23.216 21.6617 Betrag: 0
23.216 21.6617 11.216 21.6617 Betrag: 0
11.216 6.6617 11.216 16.6617 Betrag: 0
11.216 16.6617 11.216 21.6617 Betrag: 0
11.216 21.6617 16.216 16.6617 Betrag: 0
|
Bei Verwendung des Datentyps dagegen erhält man die richtige Ausgabe für "betrag". Wird anstelle von printf() cout verwendet, werden auch sämtliche Koordinaten mit "0" ausgegeben. Möglicherweise liegt das Problem in der Verwendung von printf() und cout.
IDE: Bloodshed Dev C++ V 4.9.9.2
Vielen Dank für alle Denkanstösse.
mod edit: benutze die Board Tags selber! Dieser Post wurde am 06.02.2006 um 23:40 Uhr von Pablo editiert. |