Literarisch ich, nachdem ich nach viel zu viel Zeitinvestment endlich etwas automatisiert habe, was nicht unbedingt nötig gewesen wäre zu automatisieren (der lexikalische Analysator aus meinem letzten Pfosten funktioniert nun und ist mit ca 40 Zeilen auch relativ schlank. Er ist nicht perfekt, aber er funktioniert).

  • cows_are_underrated@feddit.orgOP
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    11 days ago

    Hier ist der Code dafuer: https://pastebin.com/EuE55X5t

    Ist bei weitem nicht perfekt, aber das reicht. Werde den auch noch etwas weiter ausbauen um ein Errorhandeling zu ermoeglichen.

    Habe dafür die Syntax der Init Datei etwas geändert und zwar dass aus Variable = Wert; jetzt simpel Variable Wert wird.

    • doeknius_gloek@discuss.tchncs.de
      link
      fedilink
      arrow-up
      2
      ·
      10 days ago

      Cool, danke für den Code! Hast du Interesse an Feedback von einem Webentwickler, der in seinem Leben noch nicht eine Zeile C geschrieben hat?

        • doeknius_gloek@discuss.tchncs.de
          link
          fedilink
          arrow-up
          1
          ·
          10 days ago

          Okay, also die folgenden Punkte sind mir aufgefallen:

          1. Du könntest deine Konfigurationsvariablen in einem Struct gruppieren, dann kannst du später sowas wie config.exposureTime machen.
          2. Eine while-Schleife bietet sich immer dann an, wenn du die Anzahl an Schleifendurchläufen nicht kennst - in deinem Code kennst du deine MAX_ROWS aber schon, daher würde ich eher eine for-Schleife nutzen (wobei ich gerade nicht weiß, wie sich das mit fscanf verträgt…)
          3. Die Reihenfolge deiner Variablen muss in der Konfigurationsdatei exakt so sein, wie dein Code es erwartet. Der Key deiner Key-Value Paare wird nicht abgeglichen.
          4. Wenn du den ersten Punkt umsetzt, würde ich empfehlen, dass initalizeVariables ein Config Struct returned, anstatt globale Variablen zu füllen. Macht’s wartbarer.
          5. Jemand anderes hat bereits den möglichen Buffer Overflow bei fscanf angesprochen.
          6. Generell müsste man noch einiges an Errorhandling hinzufügen, um das Programm robuster zu machen
          7. Vielleicht willst du irgendwann mal andere Konfigurationswerte eintragen, bisher gehen nur (Gleitkomma)zahlen

          Ich habe mich mal hingesetzt und das zum Anlass genommen, meinen ersten (und wahrscheinlich auch einzigen) C-Code zu schreiben. Disclaimer: Das Ergebnis macht mich nicht besonders glücklich, aber ich hasse mein Leben nicht genug, um weitere Verbesserungsideen auszuprobieren. C scheint mir doch recht alt/limitiert und was bei anderen Sprachen Standardfeatures sind, sucht man bei C vergebens. Eine Map wäre z.B. sehr praktisch gewesen, oder ein switch Statement, welches mit Strings umgehen kann oder überhaupt ein String Datentyp statt Char-Arrays mit festen Längen… Uff ey.

          Egal, hier mein (nicht besonders guter und brüchiger) Code: https://pastebin.com/hWCFSvQd

    • d_k_bo@feddit.org
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      10 days ago

      (IBKCP: Ich bin kein C-Programmierer)

      Versuchter Klugschiss
      typedef struct {
          char* name[VARIABLE_NAME_LENGTH];
          float value;
      } variable;
      
      fscanf(file, "%s %f", &data[i].name, &data[i].value)
      

      Das sieht mir gefährlich nach einem möglichen Pufferüberlauf aus. Wenn die Variable länger ist als VARIABLE_NAME_LENGTH - 1 (1 Zeichen wird für \0 benötigt), dann ist der Platz für die Zeichenkette zu klein.

      https://stackoverflow.com/questions/18845234/preventing-buffer-overflow-when-using-fscanf#18854941


      Edith: Was passiert eigentlich, wenn die Datei nicht dem von fscanf erwarteten Format entspricht? Ich glaube, da müssen noch irgendwo Fehler gehandhabt werden, sonst kommt es im späteren Verlauf wahrscheinlich zu Segmentierungsfehlern.