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?
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