Denkanstoß benötigt



  • Hallo zusammen!

    Mir ist leider kein passenderer Name zu diesem Topic eingefallen.

    Ich möchte in meinem Programm etwas realisieren, wozu mir leider der nötige Ansatz für eine Herangehensweise fehlt.

    Es geht darum, dass ich mit meinem Programm Replay-Dateien von Starcraft 2 auslese. Unter anderem wird auch der Zeitpunkt des Speicherns eines Replays ausgelesen. Und um dieses Datum dreht sich mein Problem.

    Es gibt in Starcraft 2 sog. "Seasons". Jede Season hat ein Anfangs- und ein Enddatum. Diese Zeitspannen sind mir bekannt und ich möchte sie irgendwie in meinem Programm hinterlegen und später dann ermitteln, in welche der Seasons ein gewisses Replay fällt.

    Da es aber immer wieder neue Seasons geben wird und ich deren Start- und Enddaten in meinem Programm immer wieder nach pflegen muss, sollte das ganze möglichst dynamisch laufen.

    Die Frage ist nun:
    Wie kann ich diese Daten möglichst effizient und dynamisch erweiterbar in mein Programm einpflegen und zur Weiterverarbeitung nutzbar machen. Ich hatte mir da etwas vorgestellt, dass ich einfach nur zwei neue Variablen für das neue Anfangs- und das Enddatum hinzufügen brauche und dann durch bin mit der Sache.

    Ich habe schon an Structs in Kombination mit Listen gedacht, aber irgendwie bekomme ich das nicht komplett durchdacht.

    Ich hoffe mal, dass ich die Problematik einigermaßen habe rüber bringen können und dass mir jemand von euch weiter helfen kann. Mir raucht nämlich schon die Birne vom Grübeln 😉

    Vielen Dank im Voraus!

    Gruß
    Skubi



  • Wie wärs mit sowas: http://en.wikipedia.org/wiki/Interval_tree 😉

    Vermutlich aber kompletter Overkill weils wohl sowieso kaum jemals mehr als 100 Seasons geben wird. Ich würd also wohl einfach eine Liste machen und alle durchchecken.

    Die beste Lösung was das "dynamische einpflegen" angeht wär wohl, die Seasons von einem Webservice zu holen...



  • @Skubidus
    Wo genau drückt denn der Schuh?
    Ich frage, weil ich mir einfach nix vorstellen kann, was hier Probleme machen könnte.
    Einfachsterweise könntest du sowas machen:

    struct SeasonInfo
    {
        char const* name;
        char const* beginDate;
        char const* endDate;
    };
    
    SeasonInfo const g_seasons[] = {
        { "blah", "2012-01-01", "2012-02-01" },
        { "blubb", "2012-02-01", "2012-03-01" },
        // ...
        };
    
    size_t const g_seasonCount = sizeof(g_seasons) / sizeof(g_seasons[0]);
    

    Die Datums-Strings musst du dann natürlich im Programm noch irgendwie parsen, aber naja, das sollte nicht so schwer sein.

    Oder du schreibst dein Programm gleich so, dass es die Season-Infos aus einer externen Datei liest. Ein ganz einfaches Textfile sollte da ja reichen. z.B. jede Zeile die nicht leer ist und nicht mit nem ";" anfängt ist ne "Datenzeile", und ein Eintrag ist immer drei "Datenzeilen" lang, wobei die erste den Namen angibt, die zweite das Start-Datum und die dritte das End-Datum.
    Das ist ausreichend einfach zu parsen, und man kann damit ausreichend schön formatierte Files machen.

    EDIT: Err, sorry, hier ist ja C#. Naja, den Vorschlag oben auf C# abzubilden sollte trivial sein 🙂



  • Hiho!

    Danke erstmal für eure Antworten. Es muss gestern Abend schon ein bissl zu spät gewesen sein, dass ich auf das mit dem Array und dem Struct nicht gekommen bin 😉

    Für die, die es evtl. vom Ansatz her interessiert, ich hab's nun folgendermaßen gelöst:

    public struct Season
            {
                public int iSeason;                         // Season number
                public System.DateTime SeasonBegin;         // Timestamp of season beginning
                public System.DateTime SeasonEnd;           // Timestamp of season end
    
                // Constructor
                public Season(int i_Season, System.DateTime Season_Begin, System.DateTime Season_End)
                {
                    iSeason = i_Season;
                    SeasonBegin = Season_Begin;
                    SeasonEnd = Season_End;
                }
            }
    

    Und an anderer Stelle dann einfach:

    Season[] m_SeasonList = new Season[6];
    
                System.DateTime dtToday = new System.DateTime();
                dtToday = System.DateTime.Today;
    
                m_SeasonList[0] = new Season(1, new System.DateTime(2010, 7, 27, 0, 0, 0, 0), new System.DateTime(2011, 3, 28, 0, 0, 0, 0));
                m_SeasonList[1] = new Season(2, new System.DateTime(2011, 3, 29, 0, 0, 0, 0), new System.DateTime(2011, 7, 25, 0, 0, 0, 0));
                m_SeasonList[2] = new Season(3, new System.DateTime(2011, 7, 26, 0, 0, 0, 0), new System.DateTime(2011, 8, 24, 0, 0, 0, 0));
                m_SeasonList[3] = new Season(4, new System.DateTime(2011, 8, 25, 0, 0, 0, 0), new System.DateTime(2011, 12, 19, 0, 0, 0, 0));
                m_SeasonList[4] = new Season(5, new System.DateTime(2011, 12, 20, 0, 0, 0, 0), new System.DateTime(2012, 02, 14, 0, 0, 0, 0));
                m_SeasonList[5] = new Season(6, new System.DateTime(2012, 2, 15, 0, 0, 0, 0), dtToday);
    

    Und für jede neue Season brauche ich jetzt nur noch hin gehen und die größe des Arrays um 1 erhöhen und unten die neue Zeile dran hängen.

    Hätte man auch früher drauf kommen können 😉

    Gruß
    Skubi


Anmelden zum Antworten