Code Verständnisproblem



  • Hallo liebe Community,

    wäre sehr dankbar wenn mir jemand diesen Codeabschnitt erklären könnte und was ganz genau da passiert.

    NameAusgabedatei[12] = (char) ((int) '0' + MesswertID);
    	NameAusgabedatei[14] = (char) ((int) '0' + MittelwertFenster / 10);
    	NameAusgabedatei[15] = (char) ((int) '0' + MittelwertFenster % 10);
    


  • Es werden drei zu einem char gecastete integer-Werte in einem char-Array gespeichert.
    Ich vermute mal für eine Pfadangabe.


  • Mod

    ⚠ Umständlicher und fehleranfälliger Code, unnötige Casts -> Nicht als Vorbild nehmen! ⚠

    Erklärung des Codes:
    MesswertID soll wohl eine Zahl zwischen 0 und 9 sein. Es ist in C garantiert, dass die Zeichen '0' bis '9' nacheinander im Zeichensatz stehen (Beachte den Unterschied: Die Zahl 0 ist nicht gleich dem Zeichen '0'!). Somit ist garantiert, dass beispielsweise '0' + 5 gleich dem Zeichen '5' ist. Also wird hier aus einer Zahl zwischen 0 und 9 das entsprechende Ziffernzeichen berechnet. Dieses wird dann einer gewissen Position in einer Zeichenkette zugewiesen (ich nehme mal an, dass NameAusgabedatei eine Zeichenkette ist).

    Dito für die anderen beiden Zeilen, wobei MittelwertFenster wohl ein Wert zwischen 0 und 99 sein soll. Dementsprechend wäre MittelwertFenster / 10 die erste Ziffer in der Dezimaldarstellung und MittelwertFenster % 10 die letzte.

    Im Endeffekt soll wohl aus den zwei Werten ein Dateiname zusammengesetzt werden. Angenommen MesswertID wäre 3 und MittelwertFenster wäre 78, soll vermutlich etwas in der Art von "Messwertreihe_3.78" herauskommen. Wenn die Annahmen über die Wertebereiche (0-9 bzw 0-99) nicht stimmen, geht das natürlich komplett schief.

    Die Casts sind sämtlich vollkommen überflüssig und können komplett weggelassen werden:

    NameAusgabedatei[12] = '0' + MesswertID;
    NameAusgabedatei[14] = '0' + MittelwertFenster / 10;
    NameAusgabedatei[15] = '0' + MittelwertFenster % 10;
    

    Ein deutlich besserer Ersatz wäre aber höchstwahrscheinlich ein einfaches sprintf, welches dann für den kompletten Dateinamen anzuwenden wäre. Kann man ohne genauen Kontext aber nicht sagen. Die Codequalität lässt jedenfalls vermuten, dass der Autor nicht sonderlich gut C konnte, daher liegt der Verdacht nahe, dass die hier gezeigte Lösung wohl aus Unkenntnis besserer Methoden entstand.



  • wie würde es denn aussehen wenn man diese drei Zeilen umschreiben würde ?



  • wieso wurden für den selben char array unterschiedliche wertgrößen reingeschrieben ?


  • Mod

    Cobain schrieb:

    wieso wurden für den selben char array unterschiedliche wertgrößen reingeschrieben ?

    😕
    Ich glaube, du hast nicht verstanden, was hier passiert oder wie Arrays funktionieren. Das können wir nicht auch noch erklären.

    Cobain schrieb:

    wie würde es denn aussehen wenn man diese drei Zeilen umschreiben würde ?

    Umschreiben wohin? sprintf? Das kommt drauf an, wie der Dateiname am Ende aussehen soll. Der Code ist offensichtlich ein Teilstück eines größeren Codes, der wahrscheinlich ähnlich umständlich ist und insgesamt durch ein einziges sprintf ersetzt werden könnte.



  • okay habe es nun verstanden und hier ist ein weitere zeile

    char NameAusgabedatei[] = "mittelwerte_0_00.txt";
    
        //die drei zu einem char gecastete int-Werte werden in NameAusgabedatei abgespeichert
    
        NameAusgabedatei[12] = '0' + MesswertID;
        NameAusgabedatei[14] = '0' + MittelwertFenster / 10;
        NameAusgabedatei[15] = '0' + MittelwertFenster % 10;
    


  • Ist das ein Ratespiel? Wieso postest du nicht einfach den kompletten Code und sagst worauf du hinaus willst?
    Diese Zeile bestätigt nur unsere Vermutung.


  • Mod

    Die exakte Umschreibung mittels sprintf hängt davon ab, was die genaue Spezifikation ist. Derzeit versagt der Code einfach nur kläglich, falls die Wertebereiche nicht eingehalten werden. Vermutlich hat sich der Programmierer überhaupt keine Gedanken darüber gemacht, daher können wir nur raten, was wohl die Spezifikation sein könnte. Ein paar Möglichkeiten:

    char out_file_name[40];
    
      snprintf(out_file_name, sizeof(out_file_name), "mittelwerte_%d_%d.txt", MesswertID, MittelwertFenster);
      // oder
      snprintf(out_file_name, sizeof(out_file_name), "mittelwerte_%d_%02d.txt", MesswertID, MittelwertFenster);
      // oder
      snprintf(out_file_name, sizeof(out_file_name), "mittelwerte_%d_%02d.txt", MesswertID % 10, MittelwertFenster);
      // oder
      snprintf(out_file_name, sizeof(out_file_name), "mittelwerte_%d_%02d.txt", MesswertID, MittelwertFenster % 100);
      // oder
      snprintf(out_file_name, sizeof(out_file_name), "mittelwerte_%d_%02d.txt", MesswertID % 10, MittelwertFenster % 100);
      // oder am wahrscheinlichsten:
      noch irgendetwas ganz anderes;
    

    Das ist kein Ratespiel hier, weder für uns noch für den Computer. Du musst in irgendeiner Sprache (C oder Deutsch) ausdrücken können, was du eigentlich möchtest. Entweder indem du dem Computer genau sagst, was du willst oder indem du es uns genau erklärst. Wir können ein bisschen besser den Kontext ergänzen als der Computer das kann, aber wenn deine Beschreibungen weiterhin so mager bleiben, dann wird vielen Helfern ganz schnell die Geduld ausgehen. Beispielsweise hätte ich mit einer genauen Beschreibung direkt das korrekte Format angeben können, anstatt 5 verschiedene Varianten aufzuschreiben, von denen am Ende wahrscheinlich sowieso keine genau passt.



  • so ich habs hinbekommen, danke nochmal du hast mir echt weiter geholfen


Log in to reply