Datentypabfrage und Fehlermeldung

bau_house

Grünschnabel
Hallo zusammen!

Ich arbeite mit dem c++builder und möchte eine Abfrage machen, ob eine Eingabe vom Wert double ist. Falls ja, soll der Wert per seriell port raus geschickt werden und falls nicht, soll eine Art "falsche Eingabe..." - Fenster aufgehen, mit eigenem Text.
Allerdings kommt mir dieses automatische Fehlerfenster ("soundso ist nicht float...") vom c++builder immer zuvor. Was kann ich da machen?

Mein Ansatz:

double wert;
if (wert = eingabe->Text.ToDouble()){
ApdComPort1->Output = wert;
}
else{....
}

Vielen Dank im Voraus!
Besten Gruß!
 
HI,

fang doch die Fehlermeldung mit Try und Catch ab:

Code:
  try{
    double wert;
    if(wert = eingabe->Text.ToDouble()){
        ApdComPort1->Output = wert;
      }
    else{
        ...
      }
  }catch(...){
    ShowMessage("Falsche Eingabe");
  }

Im Builder wird die Fehlermeldung dann noch so angezeigt wie vorher, wenn du aber das Programm ohne den Builder startest wird Falsche eigabe ausgegeben.

MFG ASD20054
 
Zuletzt bearbeitet:
Danke erst mal für Deinen Tipp!

Ich werde das probieren!
Mir ist allerdings noch nicht klar, welche Bedingung dieses "catch" bekommen muss. Du hattest ja mit (...) angedeutet, dass da noch ein Wert gegeben werden muss.
Und die else Bedingung ist bei dieser Variante überflüssig, sehe ich das richtig!?

Ich kenne dieses try/catch bis jetzt noch gar nicht.

mfg!
 
HI,

also catch(...) kann so bleiben, da erhaltest du keine Fehlermeldung und musst auch keine Bedingung eintragen.

MFG ASD20054
 
Das was du in deiner Abfrage machst, ist keine Anweisung sondern Zuweisung. Desweiteren kannst du es mit den typecast Funktor herausfinden.

Kleines Beispiel:
Code:
#include <typeinfo>
#include <iostream>
#include <conio>

using namespace std;

main(){
  int wert1;
  double wert2;

  if(typeinfo(wert1) == typeinfo(double))
     cout << "wert 1 ist Fliesskomma";
  else if(typeinfo(wert2) == typeinfo(double))
    cout << "wert 2 ist Fliesskomma";

  getch();
}

Sicherlich kannst du unter Umständen die größe durch den Sizeof-Funktor herausfinden nur wird es spätestens bei Zeigern oder 64bit Systemen zu Schwierigkeiten führen.

Desweiteren kannst du damit auch natürlich fragen ob ein Zeiger auf eine Datenstruktur/Datentyp die selbige ist, wie mit der zu vergleichenden.

Code:
#include <typeinfo>
#include <iostream>
#include <conio>

using namespace std;

struct cat {
  int wert1;
}*t1;


main(){
  if(typeinfo(*t1) == typeinfo(double))
     cout << "Datentyp \"cat\" ist Fliesskomma";

  getch();
}

Typeid schaut quasi zur Laufzeit im Speicher nach, welche Klasse, bzw. welcher Datentyp hinter dem Argument sich befindet. Stimmen die einzelnen Datengrößen sowie Typen überein, kann von einem äquivalenten Datentyp-/Struktur gesprochen werden.
 
Vielen Dank auch Dir Krypthonas!
Sorry, dass ich so spät reagiere, war jetzt länger nicht an dem Projekt beschäftigt.

Ich weiss, dass ich innerhalb der if-Abfrage if(wert = eingabe->Text.ToDouble()){ eine Zuweisung mache. Aber ich dachte, das wäre ok. So kenne ich das jedenfalls von C! Wenn die Zuweisung funktioniert, liefert sie eine 1 zurück, was wiederum die if-Abfrage positiv bestätigt. Wenn die Zuweisung nicht funktioniert, gibt es eine 0 und die if-Anweisung würde nix tun, oder eben einen else-Zweig ausführen.
Geht das in C++ nicht?

Für mein Problem ist das nicht wichtig, aber ich will ja was lernen! ;-)
Ansonsten funktioniert diese try/catch - Sache wie gewünscht.

Viele Grüße!
 

Neue Beiträge

Zurück