Problem bei funktion "Bogen Maß in Grad"

telly

Grünschnabel
Hallo zusammen.

Ich bräuchte mal ein bisschen Hilfe bei meiner Funktion. Da ich bissher nur php programmiert hab fehlt mir glaube ich das Grundwissen um mit den Variablen richtig um zu gehen.

Also ich benötige eine Function die mir Bogen Maß in Grad umrechnet.
Als Beispiel habe ich den String "5114.0700" und benötige als Antwort "51.12345"
Meine Function rechnet so weit richtig. Das Problem liegt meiner nach nur am falschen return format.

So ich hoffe mal das sowas für einen erfahrenen C Programmierer nur eine 2 min Sache ist.

Danke schomal im Vorraus.

Code:
char* BogenToGrad(char* bogen){
  char *bogenwerte;
  bogenwerte = strtok (bogen,".");
  char bogenwerte_array[3][20] = {0};
  int x=0;
  while (bogenwerte != NULL)
  {
    x+=1;
    strcpy(bogenwerte_array[x], bogenwerte);
    bogenwerte = strtok (NULL, ".");
  }
  double grad = floor(atof(bogen)/100);
  double min = fmod(atof(bogen),100)/60;
  double sek = atof(bogenwerte_array[2])/100/100*60/3600;
  bogen=grad+min+sek;
  return bogen;
}



int main(void) {
  char variable = BogenToGrad("5114.0700");
  printf("5114.0700 Umgerechnet in Grad: %s",variable);
  return EXIT_SUCCESS;
}

Bye
Telly
 
Zuletzt bearbeitet:
Hi.

Dein Code ist so ziemlich ungünstig organisiert. Außerdem kannst du nicht einfach so einen String zurückgeben, du müßtest erstmal Speicher dafür reservieren.

Zuallererst ist es ungünstig überhaupt mit Strings in der Funktion zu arbeiten. Mit Strings hat eine Umwandlung von Bogenmaß in Grad nunmal absolut nichts zu tun.

Wieso verwendest du denn strtok? Du kannst doch einfach sscanf nehmen?!

C:
double BogenToGrad(double bogenmass) {
   /* Berechung */

  double result = ...;

  return result;
}

int main() {
  const char* eingabe = "5114.0700";
  double bogen;
  if (sscanf(eingabe, "%lf", &bogen) == 1) {
    printf("%s in Grad: %f\n", BogenToGrad(bogen));
  }
  return 0;
}

Gruß
 
Zuletzt bearbeitet:
Hi danke für deine Antwort.

Ich hab das jetzt mal ganz simpel eingefügt, aber ich bekomme beim auführen immer die Meldung "Segmentation fault"
Code:
double BogenToGrad(double bogenmass) {
  double result = bogenmass;
  return bogenmass;
}

int main(void) {
  const char* eingabe = "5114.0700";
  double bogen;
  if (sscanf(eingabe, "%lf", &bogen) == 1) {
    printf("%s in Grad: %f\n", BogenToGrad(bogen));
  }
  return 0;
}

Du hattest geschrieben, ich muss erst Speicher reservieren .
Fehlt das noch, oder ist das schon drin ?
Ist Speicher reservieren nicht einfach eine Variable deklarieren ?

Danke nochmal für deine Mühe.
 
Super, das läuft schonmal ,,, ich versuch dann meine Rechnung anzupassen, meld mich später. Thx
 
Nur mal nebenbei, ich verstehe Deine Umrechnung Bogenmaß->Winkel/Min/sek nicht..

Wenn ich das richtig in Erinnerung habe, ist das Bogenmaß für eine volle Umdrehung erstmal 2pi (360°). Ergo sehe ich da irgendwie keine Umrechnung von Rad nach Grad.

Bei Werten über 2pi sind es erstmal volle Umdrehungen.

Grad = abs( Rad x 180 / pi)
Vollumdrehungen = abs( Grad / 360 )
Min = 60 x Nachkommastelle(Grad)
Sek = 60 x Nachkommastelle(Min)

Das wäre auf die Schnelle mein Gedankengang.

mfg chmee
 
Verbessere mich, wenn ich etwas falsch verstehe : Das Bogenmaß (Rad) hat erstmal nichts mit der Bogenminute zu tun. Beim Bogenmaß wird erstmal definiert, dass eine Vollumdrehung (360°) den Wert 2*pi hat (dies entspricht dem Umfang bei radius=1). Die Bogenminute dagegen ist eine weitere Unterteilung eines Grades (1°), die B.-Sekunde wiederum eine U. der B.-Minute.

Die Formel im Wiki ist die Umrechnung der Nachkomma-Dezimalstellen eines Gradwertes in Bogenminute und Sekunde..

mfg chmee
 
Ja da muss ich dir recht geben, ich glaub ich hab dann den Titel nicht richtig gewählt. Ich dachte immer das ist Bogen Maß, aber so wie ich das jetzt gelesen hab ich es trotzdem eine Grad Zahl, + BogenMinute + Bogensekunde.

Also mir geht es so gesehen nicht um Bogen Maß sondern um die Anzeige bei Google Earth... z.B. 51° 30' 50.12'' ...
jedoch bekomme ich als input nur Grad + BogenMin mit Nachkommastellen.

Meine Umrechnung konnte ich jetzt auf einen Dreizeiler reduzieren.

Code:
double BogenToGrad(double bogenmass) {
  double grad = floor(bogenmass/100);
  double min = (bogenmass-(grad*100))/60;
  return grad+min;
}

Vielen Dank nochmal.
 
C++:
const double RadToDeg(const double rad) 
{
    const double degree(std::floor(rad * 0.01));
    const double minute((rad - degree * 100.0) / 60.0);
    return (degree + minute);
}
So wäre deine Funktion noch etwas "korrekter" ... ;) also direkt alle konst. in double angeben, da sonst implizit nach double gecastet werden muss. Multiplikation is schneller als division. floor liegt in <cmath> und damit im Namensraum std. Nja und const überall weil du die werte nicht noch veränderst ;)
 
Zurück