Forum: Mikrocontroller und Digitale Elektronik Switch-/Case-Schleife


von Ulli (Gast)


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?

von Rahul (Gast)


Lesenswert?

liegt vielleicht daran, dass du das "&" (Adressoperator) bei scanf
vergessen hast...

Schleifen haben übrigens etwas wiederholendes...

von Gerhard Gunzelmann (Gast)


Lesenswert?

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

von Michael (ein anderer) (Gast)


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)

von Rufus T. Firefly (Gast)


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.

von Michael (ein anderer) (Gast)


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.

von peter dannegger (Gast)


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

von Michael (ein anderer) (Gast)


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.

von Tobi (Gast)


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

von Rufus T. Firefly (Gast)


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

von Norbert aus E. (Gast)


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?

von peter dannegger (Gast)


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

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
Noch kein Account? Hier anmelden.