Hallo, ich möchte ne Switch-Schleife unter dem C-Compiler von Keil programmieren, doch leider funktioniert es nicht. Liegt es vielleicht daran, dass der Compiler die Switch-Schleife nicht kennt? printf("\n Geben Sie eine Zahl von 1 bis 3 ein:"); scanf("%d", a); switch(a) { case 1: printf("hallo 1"); break; case 2: printf("hallo 2"); break; case 3: printf("hallo 3"); break; } Das ist mal ein einfaches Beispiel zum Test. Funktioniert aber nicht. Was mache ich falsch?
liegt vielleicht daran, dass du das "&" (Adressoperator) bei scanf vergessen hast... Schleifen haben übrigens etwas wiederholendes...
Hallo was sind denn Deine daten für Datentypen ? Du liest ASCII ein und fragst Hex ab ?! Taste 1 = 31hex also vielleicht: case 31h: ??? Gerhard
Rahul hat recht. Dein scanf ist falsch. Jeder ordentliche Compiler warnt übrigens vor solchen Fehler. Was ist den Keil für ein Schrott? Der gcc bringt ordentliche Fehlermeldungen: #include <stdio.h> void test() { int a; scanf("%d", a); scanf("%f", &a); } # gcc -Wall -c test.c test.c: In function `test': test.c:6: warning: format argument is not a pointer (arg 2) test.c:7: warning: float format, different type arg (arg 2)
Eine Überprüfung der Parameter von printf/scanf macht durchaus nicht jeder Compiler; dazu gehören auch "große" 32-Bit-Compiler für verbreitete Betriebssysteme ... Hier ist die Verwendung eines anspruchsvolleren Syntaxcheckers à la Lint anzuraten. Übrigens verwendet Keil auch gcc - jedenfalls für den ARM. Auch wenn Rahul es bereits angedeutet hat: switch/case hat nichts mit Schleifen zu tun.
@Rufus: Der Umweg über lint ist schrott. Der Compiler hat so oder so den kompletten Parse-Tree vorliegen, mit allen Defines etc., der kann sämtliche Checks auf diesen Parse-Tree ausführen. Lint kommt da schon lange nicht mehr mit. Was soll ein "großer" Compiler denn sein? Einer der viel Geld kostet und dann immer noch zweimal die Hälfte der Fehler dem Anwender nicht meldet? Ein Compiler der solche banal zu entdeckende Fehler nicht meldet, hat in meinen Augen nur schrottwert! Und nur weil große Firmen ihre Compiler nicht ordentlich hinbekommen, heisst das noch lange nicht dass schlechte Compilter standart sind.
"Jeder ordentliche Compiler warnt übrigens vor solchen Fehler. Was ist den Keil für ein Schrott?" Immer langsam mit de jungen Pferde. Borland C++ meckert auch nicht. Es kann auch garnicht meckern, da scanf(), printf() eine variable Argumentenliste haben und die läßt sich nunmal nicht überprüfen, da sie alles mögliche sein kann, sie ist eben "variabel". D.h. der GCC hat wohl einen Patch drin, der beim Text "scanf" hellhörig wird und zusätzliche Prüfungen macht. Wenn man es z.B. in "scunf" umbenennen würde, vermute ich mal, wird er nicht mehr meckern. Man merkt eben, der GCC ist von Individualisten geschrieben. Z.B. habe ich jahrenlang PALs programmiert und weiß, daß & vor | geht, aber regelmäßig werden mir die fehlenden Klammern um die Ohren gehauen. Peter
@peter dannegger: Natürlich kann ein Compiler die Argumente einer vararg-Funktion überprüfen. Dazu muss die Funktion nur entsprechend getagt werden, der Name ist schnurze. Und der Compiler hat in 99% der Fälle beim Parsen alle Information zur Verfügung, um solche Fehler zu entdecken. Und da scanf, printf etc. ISO-C99 sind, ist das auch kein abenteuerlicher Patch oder Hack, sondern einfach nur sinnvoll! Aber ja, dass Borland den Fehler auch nicht entdeckt, ist kein Bug, sondern ein Feature! Alles klar.
"Natürlich kann ein Compiler die Argumente einer vararg-Funktion überprüfen. Dazu muss die Funktion nur entsprechend getagt werden, der Name ist schnurze." wie? borland c++ ist imo sowieso schrott
Michael, bitte erkläre mir mal, wie Du Dir die Überprüfung von Argumenten einer (selbstgeschriebenen) vararg-Funktion im einzelnen vorstellst. Erkläre doch auch, was Du mit "Dazu muss die Funktion nur entsprechend getagt werden, der Name ist schnurze." meinen magst. Überhaupt - von gcc abgesehen, kenne ich keinen C-Compiler, der printf-Formatstrings auswertet. Zu den von mir erwähnten "großen" Compilern gehört beispielsweise der Microsoft C++-Compiler, der in der aktuellen Version 7.1 (Visual Studio 2003) sowohl was die Standardkonformität als auch die Qualität des produzierten Codes betreffend einer der besten* verfügbaren Compiler für 32-Bit-Intel-Maschinen ist. *) das geht jedenfalls aus einem der letzten Compiler-Vergleichstest des DDJ hervor, kann nur "offhand" keinen genaueren Quellenverweis geben
>"Jeder ordentliche Compiler warnt übrigens vor solchen Fehler. Was
ist den Keil für ein Schrott?"
Vielleicht sollte jemand Ulli fragen, welcher Warninglevel(0,1,2 oder
3) bei seinem Keil-Compiler eingestellt ist?
"Michael, bitte erkläre mir mal, wie Du Dir die Überprüfung von Argumenten einer (selbstgeschriebenen) vararg-Funktion im einzelnen vorstellst." Das würde mich auch mal brennend interessieren. Im stdio.h finde ich jedenfalls nichts dazu, die Prototypen von printf und scanf sind exakt gleich. Und eine genau gleich definierte Funktion "scunf" liefert wie erwartet auch keine Warnung. Wenn es also eine Warnung gibt, dann ist diese nicht durch ein Syntaxelement des C-Standards abgedeckt. Deshalb würde ich mich nie dazu erdreisten, alle standardkonformen Compiler als Schrott zu bezeichnen, nur weil sie ein bestimmtes Gimmick nicht haben. Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.