Konstante Pi stimmt nicht...
-
Hi erstmal...
Ich kämpfe gerade mit einer Aufgabe rum, in der ich ein wenig rechnen soll. Nun bin ich noch absoluter Anfänger (wie so viele hier
) und scheiter an einer ganz simplen Sache:double const PI=3.14159265; printf("\n %f",PI);nun schmeisst mir mein Prog immer die Zahl 261.0155 als Pi raus, was nun ja nicht richtig ist.
Wo liegt da der Fehler? Ich habe heute schon nen ganzen Haufen Dokus gewälzt, aber keine passende Antwort gefunden. Auch schon vieles ausprobiert, aber nie hab ich die Zahl Pi angezeigt bekommen.Die Deklaration befindet sich, wie auch "printf", im "Mainblock"
Danke schonmal für die Hilfestellung.
mfg
Head
-
Poste mal bitte ein vollständiges Programm, und sage welchen Compiler und welche Plattform du benutzt. Das Programm ist eigentlich richtig.
-
Ich nutze Dev-C++ (4.9.9.2) mit dem beiliegenden Compiler. Wenn ich das richtige sehe, ist es der gcc.
Hmm...das komplette Programm, das wird vermutlich unangenhem für mich...ist überwiegend noch Kraut und Rüben...aber nun gut:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main( int argc, char *argv[] ) { int aufgabe,i; char temp[10]; char *datei[10]; double const PI=3.14159265; system("cls"); printf("**********************************************\n"); printf("* Rueckwaertschnitt von XXXX *\n"); printf("* -Lösung nach Collin- *\n"); printf("**********************************************\n\n\n"); if (argc == 1) { printf("1 - Datei einlesen\n"); printf("2 - Bildschirmausgabe\n"); printf("3 - Speichern\n"); scanf("%d",&aufgabe); printf("Eingabe war: %d",aufgabe); } else if (argc == 2) { printf("Verwendete Datei: %s\n\n",argv[1]); printf("2 - Bildschirmausgabe\n"); printf("3 - Speichern\n"); scanf("%d",&aufgabe); printf("Eingabe war: %d",aufgabe); } else { printf("Fehlerhafte Syntax!\nBitte ueberpruefen oder ohne Dateiangabe starten... \n\nBeispiel: \"rschnitt datei.txt\"\n"); } /* Abfrage, ob Datei per Syntax angegeben oder nicht*/ if ((aufgabe == 1) && (argc !=2)) { printf("\nDateiname: "); scanf("%s",temp); *datei = temp; } else if ((aufgabe != 1) && (argc == 2)) { *datei = argv[1]; } else { printf("Fehlerhafte Eingabe! Bitte wiederholen"); } /*Einlesen*/ struct messen { /* char ziel[10]; */ double richtung; }; struct bekannt { /* char pkt[10]; */ double wert_r; double wert_h; }; struct messen werte[3]; struct bekannt punkt[3]; /* void einlesen ( char* datei, struct messen *werte, struct bekannt *punkt) { */ FILE *datei_ptr; datei_ptr = fopen(*datei,"r"); if ( datei_ptr == NULL ) { printf("Datei nicht vorhanden!"); } else { for(i=0;i<=5;i++){ if ((i <= 2)) { fscanf(datei_ptr,"%lf,%lf",&punkt[i].wert_r,&punkt[i].wert_h); } else if (i >= 3) { fscanf(datei_ptr,"%lf",&werte[i].richtung); } } printf("\nEinlesen war erfolgreich\n\n"); printf("Eingelesene Festpunktwerte:\n"); printf("%.4f, %.4f\n",punkt[0].wert_r,punkt[0].wert_h); printf("%.4f, %.4f\n",punkt[1].wert_r,punkt[1].wert_h); printf("%.4f, %.4f\n",punkt[2].wert_r,punkt[2].wert_h); printf("Eingelesene Messwerte:\n"); printf("%.4f\n",werte[3].richtung); printf("%.4f\n",werte[4].richtung); printf("%.4f\n",werte[5].richtung); fclose(datei_ptr); } /* Eigentliche Berechnung*/ double tma, taq, tba; double sam, sab, sgh, sag; double deltay, deltax; double alpha, beta, gamma; printf("\n\n%.4f\n",punkt[1].wert_r); printf("%.4f\n",punkt[0].wert_r); deltay = punkt[1].wert_r - punkt[0].wert_r; deltax = punkt[1].wert_h - punkt[0].wert_h; sam = sqrt(deltay * deltay + deltax * deltax); tma = atan(deltay / deltax)* (200/3.141592); deltay = punkt[2].wert_r - punkt[0].wert_r; deltax = punkt[2].wert_h - punkt[0].wert_h; sab = sqrt(deltay * deltay + deltax * deltax); /* Quadrantenabfrage */ if (deltax < 0) { tma = tma + 200; }; if ( (deltay < 0) && (deltax > 0) ) { tma = tma + 400; }; deltay = punkt[2].wert_r - punkt[0].wert_r; deltax = punkt[2].wert_h - punkt[0].wert_h; tba = atan(deltay / deltax)* (200/3.141592); /* Quadrantenabfrage */ if (deltax < 0) { tba = tba + 200; }; if ( (deltay < 0) && (deltax > 0) ) { tba = tma + 400; }; alpha = werte[4].richtung; beta = werte[5].richtung - werte[4].richtung; gamma = tma - tba; sgh = (-1) * sab * ( ( sin(alpha*(3.141592/200)) * sin(beta*(3.141592/200))) / sin(alpha*(3.141592/200)+beta*(3.141592/200)) ); sag = sab * ( ( sin(alpha*(3.141592/200)) * cos(beta*(3.141592/200))) / sin(alpha*(3.141592/200)+beta*(3.141592/200)) ); printf("\n\n Sab: %.4f m",sab); printf("\n Sam: %.4f m",sam); printf("\n Sgh: %.4f m",sgh); printf("\n Sag: %.4f m",sag); printf("\n Tma: %.4f gon",tma); printf("\n Tba: %.4f gon",tba); printf("\n Alpha: %.4f gon",alpha); printf("\n Beta: %.4f gon",beta); printf("\n Gamma: %.4f gon",gamma); return 0; }Die Pi-Ausgabe hab ich rausgenommen, da sie ja erstmal ohne wert war. Aufgefallen war es mir, da die Ergebnisse nicht stimmten.
Die Ausgabe stand ziemlich am Ende..Das Programm ist noch nicht fertig, also nicht gleich anprangern.

Menü ist noch nicht komplett usw. Mein Hauptaugenmerk liegt noch auf die Berechnung und danach kommt der Feinschliff.
Aber Verbesserungsvorschläge sind auch willkommen, so ist das nicht.mfg und danke schonmal
-
Headbreaker schrieb:
Die Pi-Ausgabe hab ich rausgenommen, da sie ja erstmal ohne wert war. Aufgefallen war es mir, da die Ergebnisse nicht stimmten.
Nur damit ich das recht verstehe: Du hast ein Problem mit der Ausgabe von PI, gibst uns auf Nachfrage aber einen Code der Wunder was macht, aber nicht PI ausgibt?
-
Mein Tipp ist, dass dein Puffer (temp) für den Dateinamen überläuft, oder gibst du wirklich nur 9 Zeichen ein? Dadurch wird die Konstante überschrieben ... Die professionelle, saubere Lösung ist kompliziert, für den Moment würde ich dazu raten, den Puffer einfach ausreichend groß zu machen.
Davon abgesehen glaube ich, dass deine Variable datei als Zeiger auf ein 10er-Array gedacht war. So ist es ein Array von 10 char-Zeigern, wobei du immer nur das erste Element benutzt. Ändere das mal in char* datei; und ändere alle Stellen, an denen *datei steht in datei (ohne Dereferenzierungsoperator.)
-
ein double const PI=3.14159265; sollte wegen des 'const' eigentlich in einem read-only bereich landen und von buffer-overflows verschont bleiben (d.h. programm stürzt ab beim schreibversuch). mal abgesehen davon, dass die zu kleinen arrays sowieso ein problem sind, mach's doch so:
#define PI 3.14159265
-
Undertaker schrieb:
ein double const PI=3.14159265; sollte wegen des 'const' eigentlich in einem read-only bereich landen
Hier offensichtlich nicht

-
Tim schrieb:
Nur damit ich das recht verstehe: Du hast ein Problem mit der Ausgabe von PI, gibst uns auf Nachfrage aber einen Code der Wunder was macht, aber nicht PI ausgibt?
Ja, ich habe den aktuellen Code hier einfach reinkopiert, weil es gefordert wurde. Dieser enthält aber nicht mehr die zweite Zeile des Codes vom Anfangspost,
sprich "printf("\n %f",PI);", weil dieser ja einen Fehler ausgab und ich das Pi-Problem erstmal beiseite geschoben habe...Undertaker schrieb:
ein double const PI=3.14159265; sollte wegen des 'const' eigentlich in einem read-only bereich landen ...

Hmm..ja, ne
keine Ahnung...Arrays passen bisher, weil es eine Berechnung ist, welche feste Werte hat!
Damit meine ich, das die Länge durch ein bestimmtest max. gegeben ist, die Anzahl der Werte feststeht und auch der Dateiname ist gegeben.
Von daher gibt es da noch was zu tun, was Fehleingaben und dergleichen anbetrifft, aber die eigentlich Rechnung funktioniert soweit. Problem ist halt nur, das ich nicht mit der Konstanten Pi arbeiten kann.
Kein wirkliches Problem, aber auch nicht befriedigend
danke schonmal
-
#include <stdio.h> int main() { double const PI=3.14159265; printf("%f\n",PI); return 0; }was kommt denn raus, wenn du das kompilierst und ausführst?
-
das klappt
-
Hör auf den Tipp von Bashar!!
Dann dein nächster Fehler:char *datei[10];Was soll das sein? Wie verwendest du es dann unten? Zehn Pointer auf char? Die zudem nicht mal belegt wurden.
Wie lang ist dein Dateiname übrigens?
-
werde ich gleich mal antesten @tip...
die datei soll eigentlich 8.3 sein...
und die Pointer Geschichte habe ich mir ohne weitere Logik durch Probieren zurechgefriemelt, wenn ich ehrlich bin...daher die [10] dahinter, weil es vorher ne normale Var sein sollte mit der max länge von 10 (zumindest dachte ich es so)
-
Headbreaker schrieb:
werde ich gleich mal antesten @tip...
die datei soll eigentlich 8.3 sein...
und die Pointer Geschichte habe ich mir ohne weitere Logik durch Probieren zurechgefriemelt, wenn ich ehrlich bin...daher die [10] dahinter, weil es vorher ne normale Var sein sollte mit der max länge von 10 (zumindest dachte ich es so)
Wenn dann:
char datei[10];oder
char *datei=malloc(10);Ist dein Dateiname länger, werden dahinterliegende Daten überschrieben, das ist das Problem. Mache alle Puffer wie Bashar sagte ausreichend groß. Entweder per Array oder malloc. Stichwort: BufferOverflow.
-
Danke, werde ich berücksichten...
-
hmm 8+3=11
-
In dem Fall sogar 8+3 = 12. Der Punkt ist ja auch noch ein Zeichen, nicht wahr?
EDIT: eventuell sogar 13, wenn´s nullterminiert ist.