www.mikrocontroller.net

Forum: PC-Programmierung Double wert in c/c++ erkennen


Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich hätte eine Frage, ich muss zu einer Funktion daten übergeben, die 
guten sind double werte, aber dazwischen sind error werte die so 
bezeichnet sind zb: #E, sie sind allgemein keine double Werte.
Ich suche irgendeine Function in c/c++ die mir unterscheidet zwischen 
double und Errorwerte.
Vielen Dank.

Autor: The other side of Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IsNaN

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
The other side of Horst wrote:
> IsNaN

ich habe ausprobiert, aber der Compiler (visual studio 2005) erkennt die 
funktion nicht obwohl ich "cmath.h" eingefügt habe.
weisst warum.
Danke.

Autor: tata (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tata wrote:
> _isnan, siehe:
> http://msdn.microsoft.com/en-us/library/aa298428(VS.60).aspx
> http://bytes.com/forum/thread217918.html

danke ich habe es ausprobiert, für die Funktion _isnan ist alles was 
übergebe ist double,auch wenn ich (+#.-.)eingebe, mein problem ist, ich 
muss unterscheiden zwischen normale double werte und solche parameter 
#E00 zb die keine werte sind.
Hat jemand eine Idee.

Danke.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest vielleicht etwas klarer spezifizieren, was Du vorhast und 
wie Du das umsetzt.

Wie "übergibst" Du etwas, was Du eingibst, als double?

Liest Du Strings ein und konvertierst die mit atof oder sscanf oder was 
machst Du?

Autor: tata (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wendest du ihn richtig an?
Könntest ja auch mit
if (fscanf(foo,"#%2f",&bar)) {
    //cooler Code
}
else if (fscanf(foo,"%2f",&bar)) {
    //anderer cooler Code
}
oder so arbeiten.

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Die Werte bekomme ich von einem Abstandssensor und sind double werte, 
wenn der Sensor nicht auf den Gegenstand schiesst dann bekommt man 
solche werte die keine double sind (zb #E),  die ich ignorieren muss.
meine Funktion schaut so aus:

bool Vergleich (double wert)
{
if (wert)// hier möchte ich abfragen ob der wert double oder nicht

return 1;

else

return 0;

}

ich hoffe dass ich euch meine Frage gut erklärt habe.
kennt ihr irgend eine idee.

Danke.

Autor: tata (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das funktioniert so wirklich nicht, denn das '#E00' wird dann vermutlich 
als Zahl interpretiert. Kannst ja '0' in ein int/float hämmern, da kommt 
immer 48 (dec) raus, denn 48 ist die Verschiebung der Zahlen im 
ASCII-Zeichensatz.
Zu deinem Problem: Welchen Wertebereich deckts ab? 'E00' wird als 
1160785929 (dec) ausgewertet, wenn du Lust hast kannst du das gerne 
nachrechnen. ;-)
Wenn die Fehlerausgaben von '#E00' bis '#E99' gehen und dein 
Wertebereich unter 1160785929 ist, müsste folgendes funktionieren.
if (wert < '#E00')

cu

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich suche irgendeine Function in c/c++ die mir unterscheidet zwischen
> double und Errorwerte.

Was denn nun, C oder C++?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Werte bekomme ich von einem Abstandssensor und sind
> double werte, wenn der Sensor nicht auf den Gegenstand
> schiesst dann bekommt man solche werte die keine double
> sind (zb #E),

Wie sieht das in der Realität aus? Ist das eine Klartextdarstellung 
oder was?

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ali Mensch überleg doch mal was du schreibst!
Ob das für andere nachvollziehbar ist.

> wenn der Sensor nicht auf den Gegenstand
> schiesst dann bekommt man solche werte die keine double
> sind

void f(double wert) {
   // alles was im wert drin steht ist ein double
   // entweder als zahl oder als kennung (nan)
}

geh mal zum Typen der den Sensor programmiert hat
und frag ihn ..
1) welchen zahlenbereich soll 'wert' abdecken
2) wie signalisiert man sonderzustände!

so ein sonderzustand ist zb "nix erkannt"
dafür existieren nämlich mehrere lösungen wie man
es signalisieren kann. entweder man nimmt einen
unbenutzen wert ausserhalb des zahlenbereichs,
oder man führt andere variable ein, die den zustand kodiert.
üblicherweise kodiert man das in bool oder enum.

grüsse, daniel

Autor: Ali K. (lernen)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
anbei findet ihr ein excel file,wo ein Beispiel von den echten messungen 
sind.
wie ihr merkt ich messe den Abstand von einem rotorblatt und wenn ich 
zwischen 2 Blätter dann kommen solche werte mit E2. deswegen muss 
unterscheiden zwischen normale werte und diese Zahlen E2 weil ich nur 
die guten brauche und die schlechten ignoriere ich sie.

An Chris: es wird eigentlich in C++ aber es macht keinen großen 
Unterschied ob es in C oder C++.

sorry dass ich  meine Frage nicht gut beschrieben habe.

Danke für eure Hilfe.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wo ist jetzt das Problem? Die Nicht-Zahl-Werte sind doch leicht 
rauszufiltern?

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Stegemann wrote:
> Und wo ist jetzt das Problem? Die Nicht-Zahl-Werte sind doch leicht
> rauszufiltern?

wie meinst du denn?kannst du mir bitte genauer erklären.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig doch mal den Code her, den du bisher hast.

Aber vieleicht waere es besser, du kaufst dir ein C-Buch und faengst von 
der ersten Seite an...

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das problem ist dass diese E2 wird vom compiler als double wert 
konvertiert 17714,
für E2 habe ich schon:

#define  Error_wert  'E2'

bool ErrorVergleich( double wert )
{
if ( ( wert >= Error_wert ) || ( wert <= 0.0 ) )

return true;

else

return false;
}

so geht auch, aber ich wollte fragen ob es noch eine elegante Lösung 
gibt, die nicht E2 rausfiltert,sondern alle Werte in dieser Art.

und mit solche Kommentare helfen die Leute nicht!!!

"Aber vieleicht waere es besser, du kaufst dir ein C-Buch und faengst 
von
der ersten Seite an..."



Danke.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anscheinend bekommst Du Deine Werte nicht als double, sondern als 
String. Dann ist es absolut pupseinfach, herauszufinden, ob die Werte 
gültig sind.

Zunächst entfernst Du whitespace (also Leerzeichen, Tabulatoren etc.), 
dann untersuchst Du das erste darauffolgende Zeichen. Gültig ist der 
Wert, wenn das Zeichen eine Ziffer oder ein Minuszeichen ist, in allen 
anderen Fällen ist der Wert ungültig.

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schon merkwürdig wie wir alle rumrätseln

Ali ist dir der Unterschied zwischen 1e1 und "1e1" klar?

Mach dir klar warum
1 nicht dasselbe ist wie "1" und wiederrum nichtdasselbe ist wie '1'

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.