.
|
|
| Autor | Beitrag |
|---|---|
|
000 21.01.2008, 01:55 Pyro Phoenix |
Nachdem ich einigermaßen davon überzeugt bin, die Grundlagen von C/C++ zu kennen, Ich möchte mir einen *.ini Parser schreiben. Das heißt: ich möchte Werte in eine Mein Problem ist Folgendes: |
|
Profil || Suche |
|
001 21.01.2008, 03:17 Master Pegasus |
Mach dir erstmal nen Plan was dein Programm genau können soll und braucht, hier ist z.B. wichtig ob die Reihenfolge der Parameter in der ini wichtig sind (simpler Parser, geht dann z.B. über Zeilennummer), oder ob das alles kreuz und quer ist und der das trotzdem können soll. Dann überlegst du dir was du für Funktionen brauchst, vielleicht eine die die ini zeilenweise in eine einfach verkettete Liste einliest, eine die die einzelnen Zeilen in "Parameter" und "Wert" aufspaltet, ... Und wenn du dir das so einigermaßen überlegt hast, ist dann mal der Zeitpunkt gekommen zu Editor und Compiler zu greifen und Stück für Stück deine Funktionen zu realisieren. --Was immer auch geschieht: Nie sollt Ihr so tief sinken, von dem Kakao, durch den man Euch zieht, auch noch zu trinken! -- Erich Kästner |
|
Profil || Suche |
|
002 21.01.2008, 07:49 chriss |
UML dürfte dir da auch helfen deine Gedanken geordnet zu „Papier“ zu bringen. http://de.wikipedia.org/wiki/UML -- |
|
Profil || Suche |
|
003 21.01.2008, 13:01 Pyro Phoenix |
Für UML müsste man aber einen groben Plan von dem haben, was man machen Aber Master Pegasus hat mir da schon einen guten Ansatz geliefert. Der Parser soll: * Reihenfolgen unabhängig sein. bisher is mir aber nix weiter eingefallen. -- |
|
Profil || Suche |
|
004 21.01.2008, 18:17 Kriz |
1. Watt is'n .INI Datei? Zu 2.: Die Struktur dürfte ja mittlerweile bekannt sein: Kommentare, Gruppenblöcke, Key-Value Paare (die MSDN ist das sehr redselig). Also hast du es nur mit 3 Gebilden zu tun, die du erfassen und verarbeiten musst. Zu 3.: Bei Key-Value Paaren empfehlen sich assoziative Container (die du dir in C sowieso selber zusammencoden mußt, außer du hast gerade eine Lib parat), speziell Sets (Mengen). Vorteil: Jeder Key ist einzigartig, was multiple Vorkommen verhindert (Ausnahme Multisets, was aber hier schwachsinnig wäre, da die meisten INIs einzigartige Keys verwenden). Zu 4.: Hier reicht wohl eher ein "Abtasten", ein vollständiger Parser wäre wie mit Kanonen auf Spatzen geschossen. Ansonsten ist Lex/Yacc dein Freund (auch als Win-Edition erhältlich), wobei das schon etwas Knowhow erfordert. Zu 5.: Beim Datei-IO würde ich bei INI-Dateien erstmal den gesamten Inhalt in einem Rutsch einlesen und sequenziell in einem char*-Array puffern. Hier wild in der Datei rumseeken ist imho nicht nötig, im Array dann bequem hin- und herspringen ist dann bequemer. Vorab mußt du natürlich den Puffer auch genügen groß anlegen, d.h. du mußt die Dateigröße in Bytes rausfinden. An dieser Stelle ist das Seeken natürlich sinnvoll, wenn man den entsprechenden Algorithmus in C kennt. Zu 6.: Für Lernzwecke ok, ansonsten vergeudete Zeit :-) PS: Viele Wege führen nach Rom! --K:R-I)Z++ |
|
Profil || Suche |
|
005 21.01.2008, 21:09 Pyro Phoenix |
Zu 1.: Datt is'n .INI Datei ;P Zu 2.: Zu 4.: "Abtasten"? Ich dache mir eher, das der Parser den gewünschten Wert auf Anfrage liefert. Zu 5.: strtok () (in Verbindung mit einer mir Momentan nicht einfallenden Routine) sollte ein guter Verbündeter sein. :P Zu 6.: Selbermachen rockt am meißten ... :P --Dieser Beitrag wurde am 21.01.2008 um 21:15 von Pyro Phoenix bearbeitet. |
|
Profil || Suche |
|
006 21.01.2008, 22:28 Bluthund |
3. Stichwort STL... Und das Wort assoziativ solltest du schon auflösen können wenn du sowas schreiben willst ;) 4. Ich nehme an mit "Abtasten" meinte Kriz, dass du den ganzen fiesen Kram wie Grammatiken und reguläre Sprachen etc außen vor lässt und deshalb um so lustige Sachen wie nen Kellerautomaten schreiben um die Semantik zu prüfen drumherum kommst. Also dass du einfach sukzessive durch deine Datei wanderst und fröhlich nach chars kuckst die eine besondere Bedeutung haben (Kommentarzeichen, Wertzuweisungszeichen) und entsprechende Aktionen daraus resultieren lässt. 5. Das war wohl eher in die Richtung seek & tell gedacht. 6. Eigentlich rockt wiederverwenden am meisten. The C language combines all the power of assembly language with all the ease-of-use of assembly language. |
|
Profil || Suche |
|
007 21.01.2008, 23:29 Pyro Phoenix |
Hmm jetzt stellt sich mir die Frage: Wie realisiere ich am besten einen assoziativen Container (ala Map) in C? Zu 4.:
€dit: Ausgebessert. €2: Zu 5.: Dieser Beitrag wurde am 21.01.2008 um 23:57 von Pyro Phoenix bearbeitet. |
|
Profil || Suche |
|
008 22.01.2008, 00:27 Bluthund |
4. mach da mal nen Struktogramm bzw wenigstens nen anständigen PAP draus. Das sieht ja unsagbar sch**ße aus ;) Vorallem deshalb weil es keinen klar definierbaren Einstiegspunkt in den Graph gibt. 5. Absolut unnötig. Wie Kriz schon sagte: "An dieser Stelle ist das Seeken natürlich sinnvoll, wenn man den entsprechenden Algorithmus in C kennt." -> http://www.cplusplus.com/reference/clibrary/cstdio/ftell.html edit: zu deinem assoziativen Container: The C language combines all the power of assembly language with all the ease-of-use of assembly language. Dieser Beitrag wurde am 22.01.2008 um 00:45 von Bluthund bearbeitet. |
|
Profil || Suche |
|
009 22.01.2008, 01:46 Pyro Phoenix |
Zu 5.:
Wirst jetz sicher sagen: "rewind (); hätte auch gereicht." €dit: Warum spackt der Linker rum, wenn ich die Funktionsdefinition aus einer *.h in -- Dieser Beitrag wurde am 22.01.2008 um 01:54 von Pyro Phoenix bearbeitet. |
|
Profil || Suche |
|
010 22.01.2008, 01:53 theDon |
Linking conventions: C++ hat name mangling, C nicht. --\o tanz den naziprau! o/ And more than ever, I hope to never fall, |
|
Profil || Suche |
|
011 22.01.2008, 08:36 Bluthund |
Ieeeeeh getpos und setpos... seek&tell in umgekehrter Reihenfolge hätten das auch getan ;) The C language combines all the power of assembly language with all the ease-of-use of assembly language. |
|
Profil || Suche |
|
012 22.01.2008, 14:23 Pyro Phoenix |
Was is mit 'getpos' und 'setpos' nich in Ordnung?
Dieser Beitrag wurde am 22.01.2008 um 14:35 von Pyro Phoenix bearbeitet. |
|
Profil || Suche |
|
013 22.01.2008, 15:57 Bluthund |
An getpos und setpos ist nix verkehrt. War nur meine persönliche Meinung... Denn im Prinzip sind diese Funktionen völlig überflüssig, weil man mit seek und tell genau diese Funktionalität und noch andere hat (wie zB das direkte Anspringen des Endes). Das was du da gemacht (struct kev_value) hast entspricht in etwa den Nodes in einer doppelt verketteten Liste (Doubly-Linked List). Nur das du deinen Datentyp schon direkt in die Node hardcodet hast und ne LL in C für gewöhnlich nen void* auf das eigentliche Datum enthält. Ganz dringend würde ich dir empfehlen mal ein bisschen zum Thema Datenstrukturen rum zuforschen. Denn wenigstens den Begriff verkettete Liste sollte man drauf haben. Auf Basis derer lassen sich nämlich auch wunderbar andere Sachen wie binäre Bäume und Stacks implementieren indem man einfach oben aufsetzt. --The C language combines all the power of assembly language with all the ease-of-use of assembly language. |
|
Profil || Suche |
|
014 22.01.2008, 16:45 Kriz |
Lektüre: Sedgewick - Algorithmen in C - Addison Wesley Imho würde ich sowas auch gleich in C++ erledigen, da spart man sich viel Arbeit. --K:R-I)Z++ |
|
Profil || Suche |
|
015 22.01.2008, 17:06 Pyro Phoenix |
Grml ... hab mir mal den Wiki eintrag angeschaut. Ich blick da ned durch. http://de.wikipedia.org/wiki/Datenstruktur €dit: Grml² ... Dieser Beitrag wurde am 22.01.2008 um 17:13 von Pyro Phoenix bearbeitet. |
|
Profil || Suche |
|
016 22.01.2008, 17:59 Bluthund |
eBay rettet: Zwar nur noch ein Exemplar gefunden aber besser als garkeins (280192870619) :) Außerdem wie Kriz schon gesagt hat: Ganz klar C++ oder ne andere objektorientierte Sprache. Die Wartbarkeit und Lesbarkeit des Codes ist einfach um vieles besser. Allein schon deshalb weil die Datenstrukturen fest mit den darauf anwendbaren Methoden verknüpft sind und nicht nur irgendwie lose in einem Modul herumdümpeln. Da bist du aber jetzt ordentlich von deinem ursprünglichen Problem weg ;) --The C language combines all the power of assembly language with all the ease-of-use of assembly language. Dieser Beitrag wurde am 22.01.2008 um 18:02 von Bluthund bearbeitet. |
|
Profil || Suche |
|
017 22.01.2008, 18:38 Pyro Phoenix |
http://www-dbs.informatik.uni-heidelberg.de/teaching/ws2004/info1/InfoIDataStructures.pdf Seite 9 -> Letztes Kästchen. Jetz hab ich die Sache mit der LinkedList kapiert :P Ah stimmt. Ebay rockt. Gleich mal drauf geboten. €dit: ANSI C aus dem Grund, da man mit den Grundlagen beginnen soll ... ^^ Dieser Beitrag wurde am 22.01.2008 um 18:48 von Pyro Phoenix bearbeitet. |
|
Profil || Suche |
|
018 22.01.2008, 19:40 Bluthund |
Wage ich zu bezweifeln. Jemand, der keine Kenntnis von C hat, wird auch mit C++ nichts vernünftiges auf die Beine stellen können. C ist ja doch mehr oder weniger eine Untermenge von C++. Nicht umsonst hat der erste Compiler als vorläufige Ausgabe C-Code erzeugt. C++ ist wesentlich komplexer als C und kann schon aus diesem Grund nicht einfacher beherrschbar sein. Schon alleine die Ein/Ausgabe über Streams und vor allem das Denken das Streams Objekte sind ist für einen Anfänger imo total unverständlich. printf() ist da imho schon wesentlich besser für den Einstieg geeignet. Außer man fängt vielleicht sofort mit OOP an. Aber ich denke mal ein Großteil wenn nicht sogar alle fangen mit imperativer Programmierung an (BASIC, Pascal, C). Desweiteren gibt es einen Unterschied zwischen können und können. Klar kann jeder "Hello World!" auf die Konsole ausgeben oder vielleicht sogar über ne GUI-Bibliothek. Auch kriegt derjenige vielleicht noch nen Taschenrechner hin oder er wurstelt irgendwas am HL/HL2SDK rum. Wenn dann aber grundlegende Kenntnisse über Kapselung, Vererbung, Polymorphismus, usw fehlen schreibt er stinknormalen C-Code, denn dann sind Klassen nur schönere structs. Nichtsdestotrotz solltest du dein Vorhaben wie schon geplant in C umsetzen wenn du das möchtest. The C language combines all the power of assembly language with all the ease-of-use of assembly language. |
|
Profil || Suche |
|
019 22.01.2008, 22:05 Pyro Phoenix |
Hmm. Gut ich hab nix gesagt ;) Zu 5(#004).: Wieso eigentlich Puffern? Is denk ich mal nicht nötig da die €dit: Faxen is. Muss ich ja so oder so Puffern. *narf* Ist es angebracht die Funktion zum hinzufügen von "key value" Dieser Beitrag wurde am 22.01.2008 um 22:11 von Pyro Phoenix bearbeitet. |
|
Profil || Suche |
|
020 23.01.2008, 00:20 hausi |
Wieso nicht einfach das normale set-Interface dafür nehmen und die Methode put(key, value) nennen? Wenn in einer ini zwei mal dem selben Key etwas zugewiesen wird, wird ja das zweite genommen und nicht ein zweiter Eintrag gemacht -> add ist eigentlich nicht korrekt. Dieser Beitrag wurde am 23.01.2008 um 00:22 von hausi bearbeitet. |
|
Profil || Suche |
|
021 23.01.2008, 02:21 theDon |
Funktional > *. --\o tanz den naziprau! o/ And more than ever, I hope to never fall, |
|
Profil || Suche |
|
022 23.01.2008, 13:59 caedes |
jo, mach das in haskell - das ist die zukunft! -- caedes Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen. |
|
Profil || Suche |
|
023 23.01.2008, 18:28 Pyro Phoenix |
Ich Arbeite ja schon die ganze Zeit daran. ;) Nah ! Jetz hab ich mit C angefangen. Und irgendwann hör ich mit C++ auf. Reicht fürs erste. €dit: Naja vielleicht wärs noch ganz ratsam sich durch ASM zu quälen.
€dit2: 3, 2, 1 ... meins --Dieser Beitrag wurde am 23.01.2008 um 23:17 von Pyro Phoenix bearbeitet. |
|
Profil || Suche |
|
024 25.01.2008, 13:04 Pyro Phoenix |
Update:
|
|
Profil || Suche |
|


