Switch-/Case-Schleife

Gast #140414
Lesenswert?
• ▲
▼
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?
Gast #140417
Lesenswert?
• ▲
▼
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)
Gast #140418
Lesenswert?
• ▲
▼
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.
Gast #140419
Lesenswert?
• ▲
▼
@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.
Gast #140420
Lesenswert?
• ▲
▼
"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
Gast #140421
Lesenswert?
• ▲
▼
@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.
Gast #140422
Lesenswert?
• ▲
▼
"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
Gast #140423
Lesenswert?
• ▲
▼
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
Gast #140424
Lesenswert?
• ▲
▼
>"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?
Gast #140425
Lesenswert?
• ▲
▼
"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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren