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).
Ich hatte das schon zu oft!
Ewig, stundenlang rumbauen, dass der ursprüngliche Kode nicht mehr ersichtlich ist, aber gefühlt so nahe an der Lösung des Problems. Und dann ENDLICH FUNKTIONIERT ES! UND DANN AM NÄCHSTEN TAG FUNKTIONIERT ES NICHT MEHR!!
Hatte ich jetzt auch. Habe das ganze am PC zum laufen bekommen und am Laptop hats am nächsten Tag nicht funktioniert.
Ich hätte mir eine Kugel Eis kaufen können, würde ich für jedes mal 1ct bekommen
Ruhe auf den Billigen Plätzen (Kode ist aber tatsächlich scheinbar ein deutsches Wort).
Anmerkung zur Anwendung: Die Schreibweise Kode ist seit 1. Juli 2024 nicht mehr im Wörterverzeichnis des Rates für deutsche Rechtschreibung aufgeführt, sondern einzig die Schreibweise Code.
Erster Hauptsatz der Informatik: Erledige niemals eine Arbeit in 5 Minuten manuell, wenn du auch zwei Stunden zum Entwickeln einer Automatisierung aufwenden kannst.
Was tut ein lexikalischer Analysator?
Er analysiert lexikalisch.
Achso!
Ich habe den Java Entwickler gefunden.
Deutsch für Parser.
Beispiel: ich habe im Code die Variable “Distanz” deren Wert in einer Datei steht (bspw. Distanz 50). Der Parser findet den entsprechenden Wert der Variable in der Datei und stellt ihn dir im code zur Verfügung.
Wie hast du’s letztendlich gemacht? Ich habe inzwischen deinen vorherigen Post gelesen und gesehen, dass deine Konfigurationsdatei im Grunde eine vereinfachte .ini ist - pro Zeile ein Key-Value Paar, getrennt durch ein "=”.
Mein naivster Ansatz wäre, die Datei einzulesen, an allen EOLs zu splitten, um alle Key-Value Paare zu bekommen und dann wiederrum am = zu splitten?
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.
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?
Feedback dürft ihr immer gerne geben.
Okay, also die folgenden Punkte sind mir aufgefallen:
- Du könntest deine Konfigurationsvariablen in einem Struct gruppieren, dann kannst du später sowas wie
config.exposureTime
machen. - Eine
while
-Schleife bietet sich immer dann an, wenn du die Anzahl an Schleifendurchläufen nicht kennst - in deinem Code kennst du deineMAX_ROWS
aber schon, daher würde ich eher einefor
-Schleife nutzen (wobei ich gerade nicht weiß, wie sich das mitfscanf
verträgt…) - 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.
- 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. - Jemand anderes hat bereits den möglichen Buffer Overflow bei
fscanf
angesprochen. - Generell müsste man noch einiges an Errorhandling hinzufügen, um das Programm robuster zu machen
- 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 einswitch
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
Vielen Dank für den Code. Der ist um einiges besser als das was ich hinbekommen habe. Ich habe auch einen ganzen haufen gelernt. Ich werde den evtl noch etwas für mich anpassen und dann so verwenden. :)
- Du könntest deine Konfigurationsvariablen in einem Struct gruppieren, dann kannst du später sowas wie
(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.
🦀
Herzlichen Glückwunsch!