Wo steckt da bitte der Fehler???
-
Hallo,
Also ich hab ne Funktion geschrieben die die Eingabe von Großbuchstaben verhindern soll.
Wenn ich das vom Buchstabe A bis z.B. Buchstabe E mache funktioniert die Funktion. Wenn ichs aber von A - Z (also komplett) mache gehts nicht, bzw. wird mir eine Messagebox angezeigt die gar nicht kommen sollte. Hab alles ausprobiert und ich finde den Fehler nicht....
Was ist da los?????? Schaut euch das mal an:
[cpp]double Edit2Double(TEdit* E) { char S[50]; int Flag = 0; // Flag springt um falls illegale Taste int Flag_K = 0; // Flag springt um je getipptes Komma if(E->Text.IsEmpty()) { Application->MessageBox("Eingabe wiederholen","Info",MB_OK); // Falls keine Eingabe gemacht wurde return(0); } // erscheint Messagebox else { sprintf(S,"%s (dies ist der String)",E->Text.c_str()); for(int i=0;i<strlen(S);++i) // illegale Tasten { if((S[i] == 'A') || (S[i] == 'B') || (S[i] == 'C') || (S[i] == 'D') || (S[i] == 'E') || (S[i] == 'F') || (S[i] == 'G') || (S[i] == 'H') || (S[i] == 'I') || (S[i] == 'J') || (S[i] == 'K') || (S[i] == 'L') || (S[i] == 'M') || (S[i] == 'N') || (S[i] == 'O') || (S[i] == 'P') || (S[i] == 'Q') || (S[i] == 'R') || (S[i] == 'S') || (S[i] == 'T') || (S[i] == 'U') || (S[i] == 'V') || (S[i] == 'Q') || (S[i] == 'X') || (S[i] == 'Y') || (S[i] == 'Z')) Flag = 1; // illegale Grossbuchstaben if( Flag == 1 ) // Falls illegale Taste oder { Application->MessageBox("Fehler in Editfeld","Info",MB_OK); // mehrere Kommas return(0); } else */ { sprintf(S,E->Text.c_str()); // Wandelt Ansystring in char* um for(int i=0;i<strlen(S);++i) { double z = atof(S); // Umwandlung in double return(z); } } } return(0);Das bringt einen zum Wahnsinn....... Danke für eventuelle Hilfen
-
1. Deine Formatierung ist hässlich und nutze für C und C++ bitte die cpp Tags.
2. Wieso bitte den sprintf Aufruf?sprintf(S,"%s (dies ist der String)",E->Text.c_str());Von deinem Puffer S brauchst du dadurch schon nur 22 Zeichen für
" (dies ist der String)". Allerdings sowieso, wieso hier in einen Puffer rüberkopieren?
3. Der Aufruf vonstrlenin der for-Schleife ist extrem ineffizient. Du berechnest jedesmal die Länge neu, also jedes Mal wird erneut das'\0'gesucht. Eine Laufzeit von O(n).
4. Wieso setzt du ein Flag und fragst es gleich wieder ab? Du brauchst doch das Flag gar nicht.
5. Unten hast du schon wieder ein unsinniger Aufruf vonsprintf.
6. Wiederstrlenin der for-Schleife.
7. An diesem Punkt ist doch gar noch nicht garantiert, dass sich ein double im Textfeld befindet.Ich weiss jetzt zwar nicht genau wo der Fehler ist, aber ich bin mir sicher, dass deine Vorgehensweise viel zu kompliziert ist! Frag mal im Forum passend zu deinem Framework nach, wie man sowas erreichen kann, was du möchtest. Ich weiss leider nicht so recht, was du genau möchtest. Im Code wandelst du plötzlich die Eingabe in einen double um, oben beschreibst du aber, dass du nur die Eingabe von Grossbuchstaben verhindern möchtest. Beides kann sicher deutlich einfacher erreicht werden.
Grüssli
-
Servus,
also ich danke dir Dravere....
sprintf(S,"%s (dies ist der String)",E->Text.c_str());Da war der Fehler.....Dann stand ja "(dies ist der String)" in dem String S.....
Wodurch natürlich eine Fehlermeldung kommt weil ja dann ein groses S enthalten ist. Super...... HAHAHAHHA,......Deine anderen Punkte muss ich erst noch überprüfen und gucken ob ich das hinkriege.
Zum Thema effizienz muss ich sagen das es mir hier egal ist, weil es ja dort um die Eingabe vom Benutzer über Edit Felder geht und ich da nicht wahnsinnig schnell sein muss.
Wobei es effizient natürlich schöner wäre.....Bevor ich die Funktion geschrieben habe hab ich schon nach was ähnlichem gesucht aber nichts gefunden. Falls jemand da nen Einfall hat wonach man bei sowas in der Art suchen muss wärs cool wenn er es reinschreibt.
Das wichtigste ist das der Fehler gefunden ist. Danke nochmals
Mfg Cascoin
-
Hu Hu
if((S[i] == 'A') || (S[i] == 'B') || (S[i] == 'C') || (S[i] == 'D') || (S[i] == 'E') || (S[i] == 'F') || (S[i] == 'G') || (S[i] == 'H') || (S[i] == 'I') || (S[i] == 'J') || (S[i] == 'K') || (S[i] == 'L') || (S[i] == 'M') || (S[i] == 'N') || (S[i] == 'O') || (S[i] == 'P') || (S[i] == 'Q') || (S[i] == 'R') || (S[i] == 'S') || (S[i] == 'T') || (S[i] == 'U') || (S[i] == 'V') || (S[i] == 'Q') || (S[i] == 'X') || (S[i] == 'Y') || (S[i] == 'Z'))wie wärs denn statt dem Monster da oben einfaches
if ( S[i]>='A' && S[i]<='Z' )zu schreiben?
Grüße,
-
@Cascoin,
Eingabeüberprüfung ist das A und O bei GUIs. Dazu wirst du viele Themen finden, wenn du richtig suchst. Zuerst müsste man bei dir aber mal wissen:
1. Was willst du wirklich? Soll es nun ein Double sein oder nur keine Grossbuchstaben?
2. Mit welchem Framework arbeitest du? Sieht mir ein wenig nach VCL aus, bin mir aber nicht sicher. Falls es VCL ist, dann kannst du direkt hier im entsprechenden Unterforum mal nachfragen gehen:
http://www.c-plusplus.net/forum/viewforum-var-f-is-2.htmlCon@n schrieb:
wie wärs denn statt dem Monster da oben einfaches
if ( S[i]>='A' && S[i]<='Z' )zu schreiben?
Der C++ Standard gibt keine Garantie darüber, dass sich die Buchstaben A bis Z vom Wert her hintereinander befinden. Daher rate ich davon dringend ab.
Grüssli
-
Hallo,
@ Dravere = Sehr gut erkannt!
nochmals danke für eure Mühen. Also ich will einfach eine Eingabeüberprüfung machen das man bei der Eingabe (Editfeld) nur Zahlen und Kommas eingeben darf. Alles andere soll abgeblockt werden. Dazu arbeite ich mit dem Borland c++ Builder 4. Ich hab schon oft geschaut wie man das hinbekommt aber ich hab nie was wirklich passendes gefunden. Könnte höchstens sein das ich nach dem falschen gesucht habe. Aber ich find die Lösung hier gar nicht so schlecht eigenltich. Vlt ist mein Anspruch zu klein.......
Aber wenn wir schonmal dabei sind, sagt mir mal einen Suchbegriff bitte? Merci schonmalsMfg Cascoin
-
Dravere schrieb:
Con@n schrieb:
wie wärs denn statt dem Monster da oben einfaches
if ( S[i]>='A' && S[i]<='Z' )zu schreiben?
Der C++ Standard gibt keine Garantie darüber, dass sich die Buchstaben A bis Z vom Wert her hintereinander befinden. Daher rate ich davon dringend ab.
Grüssli
Waaaaah?!?!?!?
Wenn man sich darauf schon nicht mehr verlassen kann?
@Dravere: Wie würdest du das denn machen?
-
daersc schrieb:
Waaaaah?!?!?!?
Wenn man sich darauf schon nicht mehr verlassen kann?
@Dravere: Wie würdest du das denn machen?Mit reinem Standard C++, so:
http://www.cplusplus.com/reference/std/locale/isupper/@Cascoin,
Uff, gibt viele Begriffe, welche man da verwenden könnte. Und die kann man dann noch kombinieren. Notfalls kannst du, wie gesagt, einfach mal im VCL Forum fragen gehen.
Ich könnte mir zum Beispiel vorstellen, dass man Texteingabe Nachrichten oder sowas abfangen könnte und dort die Fehlerprüfung machen könnte. Falls man ein ungültiges Zeichen eingibt, mach der Computer halt "Beep". So mach ich das meistens mit C# und .Net.Grüssli
-
Sorry für den Doppelpost ...
@Cascoin,
Ich habe mal eine kurze Suche selber gemacht. Ich kenne mich in VCL nicht aus, wie ich bereits sagte, aber es könnte sein, dass duTMaskEditsuchst. Soll für die Formatierung und korrekte Eingabe von TEdit Felder verantwortlich sein.Grüssli
-
Dank dir