Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

1

31.01.2014, 15:20

Wert unbekannten Typs parsen (C++)

Hey :)

Ich gehe im Moment den ersten Schritt in Richtung Skriptsprache und habe mal mit der Programmierung eines Konfigurationsdateiparsers begonnen. Die Dateien sind im Grunde aufgebaut wie INIs. Bis jetzt läuft alles super, ich muss jetzt allerdings Werte parsen, deren Typen mir unbekannt sind:

Quellcode

1
2
Energie = 100
Sichtbar = true


Mein Ansatz:

Quellcode

1
2
3
4
5
6
7
8
Wenn (WertAlsString "true" oder "false" ist) dann
#parsen als bool
Andernfalls wenn (WertAlsString nur Ziffern enthält) dann
# parsen als int
Andernfalls wenn (WertAlsString nur Ziffern und einen Punkt enthält) dann
# parsen als float
Andernfalls
# parsen als string


Das würde prinizipiell gehen, mich würde aber interessieren, ob man das mit der C++-Standardbibliothek eleganter lösen könnte.

Danke schonmal für eure Hilfe :D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

31.01.2014, 15:31

Warum weißt du denn vorher nicht, dass z.B. "Sichtbar" einen bool-Wert darstellt?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

31.01.2014, 15:32

Was würde das für einen Sinn machen?
Im C++-Code gibt es doch ein Gegenstück zu den Variablen im Script. Sie sollten unbedingt den selben Datentypen besitzen. Kann der Wert nicht als sein Datentyp geparst werden kann nur ein Fehler ausgegeben werden.
"Energie = true" würde ja keinen Sinn ergeben.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

4

31.01.2014, 15:43


Warum weißt du denn vorher nicht, dass z.B. "Sichtbar" einen bool-Wert darstellt?


Was würde das für einen Sinn machen?
Im C++-Code gibt es doch ein Gegenstück zu den Variablen im Script. Sie sollten unbedingt den selben Datentypen besitzen. Kann der Wert nicht als sein Datentyp geparst werden kann nur ein Fehler ausgegeben werden.
"Energie = true" würde ja keinen Sinn ergeben.

Bei .ini-Dateien muss man doch auch keinen Datentyp angeben.
Und mir geht es darum eine Klasse zu schreiben, die diese Dateien in Abschnitte und zugehörige Eigenschaften einteilt. Als Programmierer weiß ich doch nicht, welchen Datentyp "Sichtbar" hat und deshalb muss ich das herausfinden.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

31.01.2014, 15:46

Das weißt du sehr wohl. Immerhin musst du ja etwas mit diesem Wert anfangen. Etwas auslesen zu können ohne es zu verwenden ist doch Blödsinn.
Wenn du versuchst eine Scriptsprache zu entwickeln muss ich dich warnen, dass es wieder ein Thema für sich ist, mit dem man sich Jahrelang in großen Teams beschäftigen kann. Du weißt anscheinend nichtmal wo du anfangen sollst :/
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

6

31.01.2014, 16:03

Ich komme gerade nicht mehr mit :huh:

Gegeben sei z.B. folgende Datei:

Quellcode

1
2
3
4
5
6
7
8
# properties.txt
#

-Irgendwas
    Nr.1 = 5
    Nr.2 = Peace
    Nr.3 = true
    Nr.4 = 0.3003


Es gibt die Ganzzahlen (C++: int), Zeichenketten (C++: std::string), Booleans (C++: bool) und Fließkommazahlen (C++: float).
Ich lese die Namen der Werte als String und die eigentlichen Werte ebenfalls als String ein.
Aber um die Werte als Benutzer der Bibliothek später nutzen zu können, muss ich sie ja erstmal aus der Stringrepräsentation in den jeweiligen C++-Typ umwandeln.
Und da ich den Datentyp nicht weiß, weil ich, wie schon gesagt nur einen String habe, muss ich den Typ erstmal herausfinden :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

31.01.2014, 16:17

Nein, du hast da einen Denkfehler.
Irgendwo in deinem Programm benutzt du doch die Werte, die du aus der Konfiguration bekommst (wenn nicht, ist die Konfigurationsdatei völlig sinnlos).
Und in dem Moment, wo du den Wert benutzt, weißt du doch auch, von welchem Typ er sein muss!
Du machst dir das Leben unnötig kompliziert.
Es könnte ganz einfach so gehen:

C-/C++-Quelltext

1
2
// irgendwo in deiner Anwendung
bool visible = config.get<bool>("Visible");

oder auch

C-/C++-Quelltext

1
bool visible = config.getBool("Visible");

In dem Moment schaut das config-Objekt nach, was denn unter "Visible" abgelegt ist, und versucht es als bool zu parsen. Geht das nicht, wirfst du eine Exception.

Beim Lesen der Konfigurationsdatei würde es also reichen, einfach alles als String zu lesen. Der String wird dann erst in dem Moment versucht in den gewünschten Typ zu parsen, in dem er gebraucht wird.

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

8

31.01.2014, 16:47

Irgendwo in deinem Programm benutzt du doch die Werte, die du aus der Konfiguration bekommst (wenn nicht, ist die Konfigurationsdatei völlig sinnlos).

Ja, aber nur als String, weil ich es via std::getline aus einem std::ifstream auslese.


C-/C++-Quelltext

1
2
// irgendwo in deiner Anwendung
bool visible = config.get<bool>("Visible");


Diese Methode "get" muss ich doch erstmal programmieren. ?(

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

31.01.2014, 16:58

Klar, aber sie gibt den Datentyp vor, der in "Visible" zu stehen hat.
Schau mal bei Rickety Racquet im Code, da haben wir auch genau sowas.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

wluc-16

Treue Seele

  • »wluc-16« ist der Autor dieses Themas

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

10

31.01.2014, 17:09

Achso, jetzt verstehe ich das :dash:
Mein Plan war alle Werte in eine std::map aus dem Namen des Abschnitts und einer std::map aus dem Namen der Eigenschaft und ihrem Wert zu packen und das dann auslesen können.

Du machst dir das Leben unnötig kompliziert.

:thumbsup:

Ok, dann mache ich es so. Danke :D

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wluc-16« (31.01.2014, 17:17)


Werbeanzeige