Forum: PC-Programmierung char in double


von milan (Gast)


Lesenswert?

Hallo zusammen,
ich benutze volgende funktion:
double chartodouble(char *grad)
{
  double ergebnis = 999.999; // ungültiger Wert
  double d;
  double g;
  char *endp;

  g = strtod(grad, &endp);
  if (grad != endp && *endp == '\0')
  {

    d = trunc(g/100);
    ergebnis = d + (g - d*100)/60;

  }
  return ergebnis;
}

aufgerufen wird die so:
chartodouble("123.456");

im AVRStudio5 kann ich es nicht kompilieren.
sobald ich "g = strtod(grad, &endp);" rausnehme. Geht alles. Natürlich 
ohne berechnung.
included sind:
#include <math.h>
#include <stdint.h>
#include <stdlib.h>

Kann mir bitte jemand helfen. Ich weiss nicht weiter.

Danke
Gruss
Milan

von Peter II (Gast)


Lesenswert?

milan schrieb:
> Kann mir bitte jemand helfen. Ich weiss nicht weiter.

nur wenn du uns sagst was nicht geht?

> im AVRStudio5 kann ich es nicht kompilieren.
gibt es eine fehlermeldung?

von milan (Gast)


Lesenswert?

also ich kann es nur nicht kompilieren!
Feher:
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped 
==========

Das wars! Keine Fehler meldung. nix.

mit myAVR Workpad kann ich die ohne Probleme kompolieren.

sobald ich die zeile: g = strtod(grad, &endp); rausnehme.
kann ich es mit AVR Studio 5 kompilieren, mit geht nicht.

von milan (Gast)


Lesenswert?

im myAVR Workpad habe ich das noch
// LinkerOption:    -Wl,-u,vfprintf -lprintf_flt -lm

wenn ich das rausnehme kann ich es auch nicht kompilieren.
wie kann ich das im AVR Studio eingeben???
oder liegt es an dem??

Gruss
Milan

von milan (Gast)


Lesenswert?

Hallo zusammen,
ich habe es.

man muss libm.a unter libraries einfügen.

funktionier super.

Danke trotzdem.
Gruss
Milan

von Vlad T. (vlad_tepesch)


Lesenswert?

milan schrieb:
> double ergebnis = 999.999; // ungültiger Wert


für sowas definiert man normalerweise wenigstens ein define, damit beide 
Seiten (aufrufer und Berechner) das selbe testen
übrigends  haben IEEE-Floats für sowas gibts extra Werte NaN wäre das in 
deinem Fall
Leider scheint es Compilerabhängig zu sein, wie man einem Float/Double 
einen NaN Wert zuweist

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

In C99 gibt es die funktion nan() dafür.

Und in GCC zusätzlich __builtin_nan das aber zur Compilezeit optimieren 
kann weil das Argument bekannt ist:
1
float nan_0 ()
2
{
3
    return __builtin_nanf ("0");
4
}
5
6
double nan_23 ()
7
{
8
    return __builtin_nan ("23");
9
}

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Die Funktion weist noch einen ganz üblen Fehler auf, der sich aber 
vermutlich erst später als unerklärlicher Seiteneffekt zeigen wird...

Ein Tipp: Es wird fremder Speicher überschrieben.

von Karl H. (kbuchegg)


Lesenswert?

Andreas Schweigstill schrieb:

> Ein Tipp: Es wird fremder Speicher überschrieben.

?

von Vlad T. (vlad_tepesch)


Lesenswert?

bestimmt den falschen Thread erwischt.

von Peter II (Gast)


Lesenswert?

naja sauber sieht das nicht aus:
1
char *endp;
2
g = strtod(grad, &endp);

von Peter II (Gast)


Lesenswert?

mist jetzt habe ich mich auch verrirren lassen, ignoriert meinen Betrag. 
Code stimmt schon.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.