# Problem bei funktion "Bogen Maß in Grad"



## telly (2. Juli 2009)

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.


```
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


----------



## deepthroat (2. Juli 2009)

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?!


```
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ß


----------



## telly (2. Juli 2009)

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"

```
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.


----------



## deepthroat (2. Juli 2009)

telly hat gesagt.:


> 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"


Sorry, ich habe einen Parameter vergessen:

```
printf("%s in Grad: %f\n", eingabe, BogenToGrad(bogen));
```
Gruß


----------



## telly (2. Juli 2009)

Super, das läuft schonmal ,,, ich versuch dann meine Rechnung anzupassen, meld mich später. Thx


----------



## chmee (2. Juli 2009)

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


----------



## telly (2. Juli 2009)

Also ich hab mir hier die Formel raus gesucht, getestet und ich komme auf meine erwarteten Werte.

http://de.wikipedia.org/wiki/Bogenminute

Ich glaube aber es gibt mehrere Weg dies Umzurechnen.


----------



## chmee (2. Juli 2009)

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


----------



## telly (3. Juli 2009)

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. 


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

Vielen Dank nochmal.


----------



## devDevil (3. Juli 2009)

```
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


----------

