JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=388fa6391c763342f849a008396ff48aMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Enumeration - Namensstring zu Wert, geht das?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.09.2006, 18:31    Titel: Enumeration - Namensstring zu Wert, geht das? Antworten mit Zitat

Tach,
ich hab nur ne kurze Frage. Wenn's nicht geht hab ich schon ne aufwendigere Lösung parat.

Ich möchte ein Dateiformat zur Verwaltung von Effekten schreiben. Dieses soll auch beinhalten welche Shaderkonstante was für eine Information erhält (zum Beispiel Welttransformationsmatrix, Materialfarbe oder Lichtrichtung). In meinem Programm habe ich das über eine Enumeration gelöst. Aber wie soll ich das jetzt in dem Dateiformat machen? Wenn ich einfach die Werte der Enumeration in das Dateiformat schreibe wäre das sehr inflexibel und unpraktisch. Daher wäre es mir lieber wenn ich im Dateiformat zum Beispiel so etwas schreiben könnte:
Vertex_Shader_Constant 4 VS_CONST_WORLD_TRANS_1
Um der vierten Vertexshaderkonstante die erste Zeile der Welttransformationsmatrix zuzuweisen. Doch um das so machen zu können bräuchte ich eine Möglichkeit aus der String, die den Namen des gewünschten Werts enthält den entsprechenden Wert zu kriegen. Gibt es da irgendeine direkte Möglichkeit für?

Ansonsten werde ich einfach ein Stringarray mit den Namen anlegen und nach dem richtigen Suchen. Aber das wäre sicherlich nicht die schönste Lösung. Also, für jede hilfreiche Antwort bin ich dankbar Very Happy .
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 19.09.2006, 18:59    Titel: Antworten mit Zitat

Doch ich dneke schon, das eine Tabelle die schönste Lösung ist. Anders wirds wohl nicht gehen, da ja irgendwie kein logischer Zusammenhang zwischen Name und Wert besteht. Es mag auch DX Funktionen geben, die von Konstanten den String, bzw. den Wert zurückgeben, aber letzendlich wird das alles über Tabellen laufen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 19.09.2006, 19:16    Titel: Antworten mit Zitat

Mach es doch mit einer std::map. Das sollte am einfachsten sein.
CPP:
std::map<std::string, DWORD> CONSTMAP;
// und so fügst du dann alles ein
CONSTMAP["VS_CONST_WORLD_TRANS_1"] = VS_CONST_WORLD_TRANS_1;
// und über einen string bekommst du die Konstante
std::string blabla = "VS_CONST_WORLD_TRANS_1";
DWORD iConst = CONSTMAP[blabla];

Okey, das war jetzt aus dem Kopf. Mit einem Makro kannst du dass einfügen der Konstanten noch vereinfachen. Aber das bekomme ich nicht aus dem Kopf hin. Wink
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.09.2006, 19:38    Titel: Antworten mit Zitat

Na, wenn's nicht geht werd ich's wohl über ne Liste angehen. Allerdings ehr über klassische char-Arrays. Ich definiere einfach einmal als Membervariable einer Klasse zur Verwaltung von gemeinsamen Daten ein Array von 32*Anzahl der Enumerationselemente chars und schreibe dann eine Memberfunktion um in diesem Array per strcmp die richtige String zu finden. Dabei ist wenigstens die Erstellung des Arrays kein großer Aufwand und lässt sich recht einfach aktualisieren wenn sich etwas ändert:
CPP:
char VSConstantEnumName[9][32]={
   "PS_CONST_MANUAL_SETTABLE",
   "PS_CONST_LIGHT_AMBIENT_COLOR",
   "PS_CONST_LIGHT0_COLOR",
   "PS_CONST_LIGHT1_COLOR",
   "PS_CONST_LIGHT2_COLOR",
   "PS_CONST_MAT_AMBIENT",
   "PS_CONST_MAT_DIFFUSE",
   "PS_CONST_MAT_EMISSIVE"
};

Der Arrayindex is dann der Enumerationswert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 19.09.2006, 20:43    Titel: Antworten mit Zitat

Mit welcher Shadersprache arbeitest du? HLSl bietet zB wirklich ne gigantische Menge an Möglichkeiten die Daten gut zu nutzen.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.09.2006, 21:19    Titel: Antworten mit Zitat

Ich arbeite immernoch mit D3D 8 (hängt mit der Zielgruppe meiner Engine zusammen). Entsprechend schreibe ich meine Shader in Assemblercode ohne große Nutzung von D3DX, also auch ohne fx-dateien.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 20.09.2006, 14:43    Titel: Antworten mit Zitat

Ich würde dann doch eher std::string benutzen. Das Array kann antürlich coonstant und sttic sein.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 20.09.2006, 15:35    Titel: Antworten mit Zitat

funktioniert nicht auch ne std::map?

CPP:
struct r_ConstTable
{
  enum Enumeration
  {
    CONST1,
    CONST2,
    ...
  }
};

std::map<r_ConstTable::Enumeration, std::string> m_ConstTableMap;



Edit: Mist Dragon hats ja schon vorgeschlagen Wink
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 20.09.2006, 17:17    Titel: Antworten mit Zitat

Ich denke das Array ist für mich doch die einfachste Lösung. Ich verwende in meinem Code zur Zeit kaum die STL und müsste einiges abändern um sie sicher anwenden zu können.

Um es mal mit der Aufteilung von C++ in vier Teilsprachenauszudrücken, die in Tipp 1 von Effektiv C++ Programmieren beschrieben wird, könnte man sagen, dass ich ehr den C mit Klassen Teil verwende und die STL größtenteils außer Acht lasse. Ich weiß, dass das nicht unbedingt überall sinnvoll ist und ich werde es vielleicht auch irgendwann mal ändern.

Aber für dieses Problem werde ich jetzt erstmal bei dieser Lösung bleiben. Ein klarer Vorteil davon ist auch, dass ich um aus der Enumeration das Stringarray zu machen lediglich eine Kopie des Codes machen muss in der ich ein paar Sachen automatisch ersetzen lasse. Außerdem ist es ja wirklich keine besonders große Arbeit eine Schleife mit ein paar strcmp if-statements zu schreiben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 21.09.2006, 14:25    Titel: Antworten mit Zitat

Vorschlag:

CPP:
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>

template< typename Type >
struct funct_cmp : public std::binary_function< std::pair< std::string, Type >, const std::string, bool >
{
   bool operator()( const std::pair< std::string, Type > &p1, const std::string &name ) const
   {
      return p1.first == name;
   }
};

template< typename Type >
inline Type find_type( const std::string &name, const std::pair< std::string, Type > *Container, std::size_t size )
{
   const std::pair< std::string, Type > *result =
      std::find_if( Container, Container+size-1, std::bind2nd( funct_cmp< Type >(), name ) );

   if ( result == Container+size )
      throw std::logic_error( "No result found" );

   return result->second;
}

#define ENUM_START( Type, Name )   struct std::pair< std::string, Type > Name[] = {
#define ENUM( Ident, Value )         std::make_pair( #Ident, Value ),
#define ENUM_END()               };


ENUM_START( int, Constants )
   ENUM( FOO1, 1 )
   ENUM( FOO2, 2 )
   ENUM( FOO3, 3 )
ENUM_END()

int main()
{
   try
   {
      std::cout << find_type< int >( "FOO3", Constants, 3 );
   }
   catch ( std::logic_error &e )
   {
      std::cout << e.what();
   }
}


Ist zwar STL allerdings kannst du das auch recht schnell ohne STL konvertieren. Ich finde der Array-Vorschlag ist irgendwie unschön da die Werte in einer Enumeration auch nicht stetig ansteigend sind sondern frei wählbar sein dürfen.

grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 21.09.2006, 15:34    Titel: Antworten mit Zitat

Dann hätte ich ja garkeine Enumeration mehr und keinen eigenen Datentyp für diese Information Confused . Um meinen Code darauf anzupassen wären schon größere Änderungen nötig. Außerdem wäre es für andere Nutzer meiner Engine sehr unkomfortabel.

Da finde ich die Arraylösung sehr viel angenehmer. Da hat man dann nur ein zusätzliches Array und eine Memberfunktion, ändern muss man nix. Und wenn es mal dazu kommen sollte, dass ich den Enumerationselementen Manuell Werte zuweisen muss, was ehr unwahrscheinlich ist kann ich ja einfach eine Struktur die eine char[32] string und eine integer enthält erstellen und das Array dann mit fast der gleichen Schreibweise erstellen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 21.09.2006, 15:54    Titel: Antworten mit Zitat

Wenn du meinst... Rolling Eyes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum