www.mikrocontroller.net

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


Autor: Ulli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rahul (Gast)
Datum:

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

Schleifen haben übrigens etwas wiederholendes...

Autor: Gerhard Gunzelmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (ein anderer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (ein anderer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (ein anderer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Norbert aus E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.