Problem mit if-Abfragen



  • Hallo zusammen.
    Ich habe nun erneut ein Problem.
    Ich hoffe es wie eben selber lösen zu können, allerdings bin ich mal wieder verzweifelt;)

    Erstmal mein code.

    while (kkk<=10)
    	{
    		kk++;
    		printf("Durchlauf Nr.:%i\n\n",kkk);
    		wert=strtok(NULL,trenner);
    
    		if (kk=1)
    		{
    			strcpy(lapNr,wert);
    			printf("Wert für kk:%i\n",kk);
    			printf("Wert=%s\n\n",wert);
    		}
    
    		if (kk=2)
    		{
    			strcpy(lapLen,wert);
    			printf("Wert für kk:%i\n",kk);
    			printf("Wert=%s\n\n",wert);
    		}
    
    		if (kk=3)
    		{
    			strcpy(lapTimeMS,wert);
    			printf("Wert für kk:%i\n",kk);
    			printf("Wert=%s\n\n",wert);
    		}
    
    		if (kk=4)
    		{
    			strcpy(lapTime,wert);
    			printf("Wert für kk:%i\n",kk);
    			printf("Wert=%s\n\n",wert);
    		}
    
    		if (kk=5)
    		{
    			strcpy(speed,wert);
    			printf("Wert für kk:%i\n",kk);
    			printf("Wert=%s\n\n",wert);
    		}
    
    		if (kk=6)
    		{
    			strcpy(lateralAcc,wert);
    			printf("Wert für kk:%i\n",kk);
    			printf("Wert=%s\n\n",wert);
    
    		}
    

    Das geht noch bis 16 weiter. Bei 16 werden die diversen Werte in eine Datei geschreiben und "kk"wieder auf 0 gesetzt. Zudem wird "kkk" um eins erhöht.

    Ich habe nun folgendes Problem... Wenn ich das ganze laufen lasse, ergibt sich diese Ausgabe:

    Durchlauf Nr.:1

    Wert für kk:1
    Wert=xx

    Wert für kk:2
    wert=xx

    Wert für kk:3
    wert=xx
    .
    .
    .

    Durchlauf Nr.:2

    😕 😮
    Wieso hüptf das Programm hier in jede "if"-Abfrage rein, obwohl sich "kk" eigendlich nicht erhöhen dürfte? Zudem zeigt die Ausgabe, das sich kk jedes mal erhöht, Wieso? Wo hab ich da den fehler drin? Ich versteh das nicht so richtig 😡

    Danke schonmal für die Hilfe



  • Du hast einen typischen Anfängerfehler drinne:
    kk = 1 ist eine Zuweisung und weist der Variable kk den Wert 1 zu.
    Um einen Vergleich durchzuführen musst du == nutzen.

    Richtig wäre also:

    if (kk == 1) // Vergleich mit ==
    {
     // ...
    }
    

    Außerdem solltest du dir mal switch ansehen:

    switch (kk)
    {
     case 1:
      strcpy(lapNr,wert);
      printf("Wert für kk:%i\n",kk);
      printf("Wert=%s\n\n",wert);
     break;
    
     case 2:
      strcpy(lapLen,wert);
      printf("Wert für kk:%i\n",kk);
      printf("Wert=%s\n\n",wert);
     break;
     //...
    }
    


  • Weil = eine Zuweisung ist.
    Der Vergleich ist in C ==

    if (kk==1)
    


  • khjkjhk schrieb:

    Außerdem solltest du dir mal switch ansehen:

    switch (kk)
    {
     case 1:
      strcpy(lapNr,wert);
      printf("Wert für kk:%i\n",kk);
      printf("Wert=%s\n\n",wert);
     break;
    
     case 2:
      strcpy(lapLen,wert);
      printf("Wert für kk:%i\n",kk);
      printf("Wert=%s\n\n",wert);
     break;
     //...
    }
    

    Und nicht alles 16 mal schreiben:

    char *p;
    switch (kk)
    {
     case 1: p = lapNr; break;
     case 2: p = lapLen; break;
     //...
    }
    strcpy(p,wert);
    printf("Wert für kk:%i\n",kk);
    printf("Wert=%s\n\n",wert);
    

    Oder so ähnlich.



  • Argh... was für ein dummer Fehler 😉
    Jetzt wo du es sagst springt es mir auch direkt ins Auge.
    Nagut dann danke erstmal.

    Und nun zu dem Case.
    Wie genau funktioniert das denn? Sagt mir nämlich gar nichts 😉

    Würde er sich in dem von dir gezigten Beispiel die Zahl hinter dem Case als Bedingung für das kk nehmen und dann den jeweiligen fall bearbeiten oder wie?

    Und wenn er das tut, wo ist dann der Unterschied zu if ?

    Auch hier schonmal danke für die hilfe



  • Anstatt

    if (k == 1)
    {
    }
    else if (k == 2)
    {
    }

    kann man schreiben:

    switch (k)
    {
    case 1: // Code
    break;

    case 2: // Code
    break;

    // ...
    }

    Ist einfach bequemer und lesbarer.



  • fghfgh schrieb:

    Ist einfach bequemer und lesbarer.

    Vielleicht gibt's den switch aber auch, weil es leichter ist, daraus schnellen Code zu erzeugen.



  • bei if sind sowohl ungleichheit, größer, kleiner etc. überprüfbar, bei
    switch wird lediglich auf gleichheit geprüft.

    dadurch dass du bei jeder überprüfung das gleiche machst (oder hab ich mich
    verlesen?) so reicht doch ein einziges if...

    sprich:

    if (kk >= MIN_VALUE && kk <= MAX_VALUE)
            {
                strcpy(lapNr,wert);
                printf("Wert für kk:%i\n",kk);
                printf("Wert=%s\n\n",wert);
            }
    

    da ist sogar ein switch unnötig... 😋



  • itedvo schrieb:

    bei if sind sowohl ungleichheit, größer, kleiner etc. überprüfbar, bei
    switch wird lediglich auf gleichheit geprüft.

    Und zwar auf Gleichheit mit einem zur Compilezeit bekannten Wert.

    itedvo schrieb:

    dadurch dass du bei jeder überprüfung das gleiche machst (oder hab ich mich
    verlesen?)

    Ja, leider. Das Ziel von strcpy() ändert sich mit den Werten.



  • mngbd schrieb:

    itedvo schrieb:

    bei if sind sowohl ungleichheit, größer, kleiner etc. überprüfbar, bei
    switch wird lediglich auf gleichheit geprüft.

    Und zwar auf Gleichheit mit einem zur Compilezeit bekannten Wert.

    itedvo schrieb:

    dadurch dass du bei jeder überprüfung das gleiche machst (oder hab ich mich
    verlesen?)

    Ja, leider. Das Ziel von strcpy() ändert sich mit den Werten.

    mit strtok() hab ich jetzt noch nicht gearbeitet, da ich mir nämlich vorgenommen
    habe die standard-funktionen, bevor ich sie verwende, versuche nach zu progra-
    mmieren. weil was ich nicht verstehe wie es ungefär funktioniert, ist für mich
    nur mit mulmigem gefühl zu verwenden. weiß nich wieso, is aber so. vieleicht
    weil ich mir dann so unwissend vorkomme wenn ich was verwende von dessen
    aufbau ich keine ahnung habe. weiteres ist es hilfreich wenn man sich eigene
    algorithmen für sowas ausarbeitet, da man aus solchen algorithmen vieleicht
    schnittpunkte für andere probleme findet und sich leichter tut andere probleme
    einfacher anzugehen.

    aber bin jetzt vom thema abgekommen, was für eine aufgabe erledigt strtok()?

    gruß
    ITEDVO



  • itedvo schrieb:

    weil was ich nicht verstehe wie es ungefär funktioniert, ist für mich
    nur mit mulmigem gefühl zu verwenden. weiß nich wieso, is aber so.

    Das ist gesunde Skepsis. Die Standardbib. ist aber sinnvoll und nützlich, mit Ausnahme von Altlasten wie gets().

    itedvo schrieb:

    aber bin jetzt vom thema abgekommen, was für eine aufgabe erledigt strtok()?

    man: strtok liefert nacheinander die Tokens in einem String (oder so ähnlich). Aber strtok() kam hier bis jetzt gar nicht vor, meintest du strcpy()?



  • ach wieder verlesen, ich sollte echt nicht wärend der ausbildung im forum
    rumgammeln =b vorallem nicht wärend dem wir Wirtschaft und Recht haben, mein
    fehler... hab erst jetzt gesehen das ja bei strcpy() verschiedene werte
    übergeben werden. ich dachte vorher das liegt am strtok()... aber jetzt weiß
    ichs besser...

    ach so, das hab ich eh mal selber ausprogrammiert, nur wusste ich damals nicht,
    dass es so eine standard funktion gibt.
    ich verwende schon standard funktionen, da sie praktischer sind und vorallem
    sicherlich keine fehler beinhalten und falls schon sich sicher wer dran macht
    und diese ausbessert. doch bevor ich eben solche funktionen verwende gehts bei
    mir so gut wie immer ans selber ausprogrammieren, hilft fürs verständniss =b

    so muss jetzt, der Professor guckt wieder so böse, der hat sicherlich nen Test
    vorbereitet.



  • if-Abfragen sind immer sinnvoll für reine true/false Situationen. Für das beschriebene Beispiel sind switch-case-Konstrukte geeigneter.


Log in to reply