C Mehrere switch case Funktionen ineinander.

  • Ersteller Ersteller Adam Gontier
  • Erstellt am Erstellt am
A

Adam Gontier

Gast
Hi,

ich schreibe gerade ein kleines Programm, es soll so ziemlich alles, was ich im letzen halben Jahr über C in der Schule gelernt habe zusammenfassen.

Es besteht anfangs aus eine Switch Case Funktionen, bei der man entscheiden soll was man machen will.

Erst einmal gabs ein Problem, das hier funktionierte nicht:

Code:
[B]int [/B]x;

printf:(\nAuswahl: ");
x=getch();
[B]switch[/B](x){....

Ich habe versucht es so zu lösen:

Code:
[B]int [/B]a,x:
printf("\nAuswahl: ");
x=getch();
[B]if[/B](x=getch()){a=x;}
[B]switch[/B](a){....

Das wäre nur eine kleine Feinheit, obwohl ich nicht deshalb diesen Thread eröffnet habe.

Mein eigentliches Problem ist, dass nach der Auswahl in der switch case Funktion noch mehrere andere switch case funktionen eingebaut worden sind, da ich nicht alles mit if(... machen wollte.

Wenn ich jetzt in der ersten Funktion die Fälle 1 bis 5 habe und 1 eingebe, kommt darauf noch eine switch case Funktion, die wieder die Fälle 1 bis 5 beinhaltet.
Wenn ich jetzt (nach der Eingabe von 1) noch mal 1 eingebe für die zweite Funktion, dann werden die 5 Fälle übersprungen und default tritt in Kraft.

Das sieht ungefähr so aus:

Code:
[B]int [/B]a,x;
printf
scanf
[B]switch[/B](a){
[B]case [/B]1 : printf
scanf
[B]switch[/B](x){ case 1 : 
[B]break[/B];
[B]case [/B]2 :
[B]break[/B];
[B]default [/B]: }
[B]break[/B];
[B]case [/B]2: 
[B]break[/B];
[B]default [/B]: }

Ich hoffe, dass ihr verstanden habt was ich meine.

Gruß
 
ich würde halt die einzelnen case-Teile in eigene Funktionen auslagern...
 
Wenn ich wüsste was das bedeutet, wäre ich dir sehr dankbar. :lol:

Ich beschäftige mich erst seit einem halben Jahr mit C und kann nicht gerade sehr viel.

Hier ist alles was wir gelernt haben:

Anhang anzeigen 182354

Fehlt noch die Modulo Fkt, nur versteh ich die noch nicht. :P

Der Anhang ist allerdings noch ohne die switch case fkt, die kommt ja grad. ;)

Und alles selber getippt. :P
 
Zuletzt bearbeitet:
Jetzt grob aus dem kopf, meint er wohl sowas:

Code:
void auswahl(int x) {
    switch(x) {
        case 1: whatever(); break;
        ....
    }
}

int main(void) {
    int x, y;
    ....
    switch(x) {
        case 1: auswahl(y); break;
        ....
    }
    return EXIT_SUCCESS;
}
 
man kann auch hintereinander die switch case machen oder geht das bei C nicht?

hmm wegen übersicht ist es aber nicht so wunschenswert wenn du mal irgendwann wieder dein code anschaust wirst du es nicht sofort verstehen können
 
Wenn du mit "hintereinander" verschachtelte switch statements meinst: Sicher, warum sollte das nicht gehen?
Allerdings säh dass relativ schnell wirklich übel aus. Also würde ich sowas nicht empfehlen.
 
Also übersichtlich bleibt es:


Es ist soziemlich alles, was wir in der Schule gemacht haben zusammen gefasst, außer wie o.g. die Modulo Fkt.

Nur so richtig funktionieren will es nicht.

@asdfman:

Ich werds mal ausprobieren, wird wahrscheinlich wieder viel Arbeit.
 
Würde für die Eingabe kein scanf() benutzen. Da passieren schnell merkwürdige Dinge, wenn der Benutzer
nicht genau das macht, was man erwartet. Lieber getchar() und dann damit weiter machen.
 
Lerne immer wieder gerne dazu. ;)

Nur Post #4 versteh ich nich, wenn vor der main Fkt eine andere kommt ("void auswahl(int x) {") wobei 'auswahl' vorher hätte deklariert werden müssen, wann kommt dann die main fkt?

Ich weiß, Frage hoert sich verwirrend an.

Und inzwischen funktionieren mehrere switch ineinander, siehe Anhang, nur warum das im von Post #7 nicht funktioniert verwirrt mich.

Noch was, falls ich im char einer Variable einen Buchstaben zuweisen, kann man dann nie ueber scanf() oder meinetwegen getchar() ein Wort eingeben?

Anhang anzeigen 182386
 
Zuletzt bearbeitet:
Deine Frage verstehe ich überhaupt nicht. auswahl() wird doch da mit der Definition gleichzeitig deklariert.
Und main() kommt hinter auswahl(). Wie man in meinem Beispiel sieht. Kannst main() auch vorher definieren,
aber DANN müsstest du auswahl() auf jeden Fall vorher deklarieren, weil es sonst, wenn main() abgearbeitet
wird, noch nicht bekannt ist.

getchar() nimmt nur ein Zeichen entgegen. Wenn du mehrere Zeichen haben willst, nimm gets(). scanf() geht
auch, aber wie gesagt, die Funktion ist nicht so toll :(
 
uswahl() wird doch da mit der Definition gleichzeitig deklariert.
Und main() kommt hinter auswahl(). Wie man in meinem Beispiel sieht. Kannst main() auch vorher definieren,
aber DANN müsstest du auswahl() auf jeden Fall vorher deklarieren, weil es sonst, wenn main() abgearbeitet
wird, noch nicht bekannt ist.

Gut, das habe ich jetzt schonmal verstanden, doch wie wechselt man von auswahl() zu main()?
In der Schule hatten wir das noch nicht, trotzdem will ich es wissen. ;) :lol:
 
du gehst ja sequentiel durch die Methode. Fängt eine funktion an, wird der zeiger auf diese Methode gestellt und diese Methode durchgearbeitet bis diese endet...

z.B.:
Code:
void auswahl(int x) {
    switch(x) {
        case 1: whatever(); break;
        ....
    }
}

int main(void) {
    int x, y;
    ....
    switch(x) {
        case 1: auswahl(y); break;
        ....
    }
    return EXIT_SUCCESS;
}

das ist der code von oben...
geht man in den case 1 rein...

Code:
-->       case 1: 
                        auswahl(y); 
                        break;
Zeigt der Zeiger erst auf 1, dann geht es weiter...


Code:
          case 1: 
-->                   auswahl(y); 
                        break;
im assembler spingst du auf entsprechenden code in abteilung auswahl... dies kann man aber mit C code nicht vergleichen, da assembler anders arbeitet als die C ansicht zeigt. Der nächster schritt währe dann...

Code:
-->void auswahl(int x) {
       switch(x) {
           case 1: whatever(); break;
           ....
       }
   }
dann geht der weiter bis zu der letzte geschweifte klammer "}" und springt wieder in den case 1 aber auf den "break;"


Code:
          case 1: 
                       auswahl(y); 
-->                  break;
Der compiler geht nicht nach Zeilen sondern nach Codeunterbrechungen die sowas ähnliches wie Zeilenumbrüche sind. Naja keine ahnung wie das ding genau heißt, die vorlesung ist schon lange her. auf jeden fall ist dieser Zeichen bei C das ";". Deswegen sollten man nach jeden ";" auch am besten Zeilenumbruch machen um dann beim debuggen nicht in den falschen Codeabschnitt zu gelangen (da man nicht weisst wohin genau der zeiger beim debuggen zeigt, welcher "object" wird jetzt angesprochen. Bei C gibt es keine objecte naja aber man kann trotzdem so vorsichtig ausdrücken.
 
Zuletzt bearbeitet:
höhöhö ich kapier nix :)

Was ich verstanden habe ist wohl falsch:


höhöhö², ich weiß nun, wie es ein bisschen funktionieren sollte.

learning by doing. ;)

edit3:
Ich denke ich weiß nun genau, wie es funktioniert. ;)

Dient ja nur zur Übersicht.
 
Zuletzt bearbeitet:
das wichtigste ist... das programm läuft "Zeilenweise" ab (am einfachsten ausgedrückt). Wenn du in eine Methode reingehst springt dein zeiger auf diese methode. nachdem alles abgelaufen ist, springt dein zeiger wieder zurück wo es vorher war!
 
Zuletzt bearbeitet:
Zurück
Oben