Anderes Problem mit weiterer mathematischer Funktion!
-
Hachja... von dem anderen Thread (http://www.c-plusplus.net/forum/viewtopic-var-t-is-228604.html) mal abgesehen habe ich eine zweite Aufgabe zu machen. Da hänge ich nun aber auch.
Es soll eine Funktion geschrieben werden, die kartesische in polare Koordinaten umrechnet!Dabei sollen wir folgendes machen:
Einmal soll die Funktion die Ergebnisse über zeiger zurückgeben mit folgendem Funktionskopf:double* kartesisch_zu_polar(double u, double v)
Zum anderen soll die Funktion die Ergebnisse über Zeigereingabeparameter zurückgeben mit folgendem Funktionskopf:
void kartesisch_zu_polar2(double u, double v, double *r, double *phi)
der Quelltext:
#include <stdio.h> #include <math.h> void kartesisch_zu_polar2(double u, double v, double *r, double *phi) { double r2,phi2; r2 = sqrt(u * u * v * v); phi2 = atan2(v,u); } double* kartesisch_zu_polar(double u, double v) { double r1,phi1; r1 = sqrt(u * u * v * v); phi1 = atan2(v,u); } int main(double u, double v, double r2, double phi2, double *r, double *phi, double r1, double phi1, double *r3, double *phi3) { r=&r2; phi=&phi2; r3=&r1; phi3=&phi1; printf("Bitte u und v eingeben:"); scanf("%lf %lf", &u, &v); printf("Das Ergebnis bei Teil 1: r= %5.3lf und phi= %5.3lf \n",*r3,*phi3); printf("Das Ergebnis bei Teil 2: r= %5.3lf und phi= %5.3lf \n",*r,*phi); }
Die Rückgabe ist aber falsch. Irgendwie zeigen die Zeiger (^^) auch auf falsche Adressen/Werte, aber ich finde den richtigen Weg einfach nicht.
-
ich schlage vor, du guckst dir nochmal die ersten Vorlesungsstunden zu C, denn schneinbar hast du davon keine Ahnung (siehe deine main-Funktion).
-
Cicatrix schrieb:
Einmal soll die Funktion die Ergebnisse über zeiger zurückgeben mit folgendem Funktionskopf:
double* kartesisch_zu_polar(double u, double v)
das ist doof. du braucht immer 2 doubles, wenn du x/y in polarkoordinaten wandeln willst. mach besser was mit structs oder so.
-
~fricky das brauch man nicht unbedingt kannst auch ein array machen.
So hab es mal verbessert siehe comments im code
#include <math.h> #include <stdio.h> #include <stdlib.h> void kartesisch_zu_polar2(double u, double v, double *r, double *phi); double* kartesisch_zu_polar(double u, double v); int main(int argc, char **argv) { // Der Aufruf mit parameter geht so wie hier mit argc und **argv // in argc steht die anzahl der Parameter drin und in argv // die Argumente. // Bsp: Programm heist bla.exe // bla.exe 1 2 // dann steht in argc 3 und in argv stehen die parameter als strings // argv[0]=bla.exe der Programmname // argv[1]=1 // argv[2]=2 // Wenn du zb dein Programm so starten moechtest // bla.exe 3.1 4.5 // geht folgender code double u, v; double *erg1, erg_r, erg_phi; if(argc != 3) { printf("zu wenig parameter\n"); printf("aufruf: %s r phi\n",argv[0]); return 0; } // atof wandelt einen string in einen double ist in // stdlib.h drin u=atof(argv[1]); v=atof(argv[2]); erg1=kartesisch_zu_polar(u, v); kartesisch_zu_polar2(u, v, &erg_r, &erg_phi); printf("Ergebnisse der Berechnung:\n"); printf("--------------------------\n"); printf("kartesisch_zu_polar:\n"); printf("r: %f\tphi: %f\n",erg1[0],erg1[1]); printf("\nkartesisch_zu_polar2:\n"); printf("r: %f\tphi: %f\n",erg_r, erg_phi); return 0; } void kartesisch_zu_polar2(double u, double v, double *r, double *phi) { *r = sqrt(u * u * v * v); *phi = atan2(v,u); } double* kartesisch_zu_polar(double u, double v) { double *ret; // hier wird ein array erstellt in ret[0] wird r gespeichert // und in ret[1] phi ret=(double*)malloc(2*sizeof(double)); *ret = sqrt(u * u * v * v); *(ret+1) = atan2(v,u); return ret; }
-
Du machst einen Fehler beim Umrechnen von Kartesisch zu polar:
Richtig wäre:
void cart2polar(double re, double im, double *dist, double *phi) { *dist = sqrt((re * re) + (im * im)); // hier muss ein Plus und kein Mal stehen! if (*dist > 0.) { *phi = atan2(im, re); } else { *phi = 0.; } }
Ich stimme ~fricky zu, es ist schöner, wenn du structs verwendest!
Gruß mcr
EDIT: und du hast vergessen, den mit malloc allozierten Speicherbereich
wieder frei zu geben!
-
danke für die ratschläge aber nobody is perfect