VS2008 Compiler Optimation Option (Build hängt)



  • Hallo Leute,

    ich habe das Problem , dass sich beim builden meines Codes der Kompiler/Linker bei der Generierung "Generating Code..." aufhängt. (nur im release) Mfc Anwendung

    Dabei handelt es sich um eine Source (Cpp) files welche Langauge-Texte enthält. (ca. 6000 Zeilen und viele und lange lext literatle) und genau bei der Generierung des obj. gehts nicht weiter.

    Nach Recherche gibt es die möglichkeit "Properties -> c++ -> Optimization-> Disabled"
    Dann klappt es (auch wenn es auch etwas länger geht), aber die Binary (exe) ist dann groß und die App gefühlt etwas langsame.. was auch logisch is da zuvor "Properties -> c++ -> Optimization-> Maximize Speed" eingestellt war.

    Was kann ich tun um das Problem zu umgeben, was könnte ich mit der Language.cpp machen

    Kleiner Ausschnitt (damit man sich das vorstellen kann): und da eben 6000 Zeilen:

    entry.Languages[_T("DE")] = LangEntry(_T("Die Meldungshistorie wurde gelöscht."),_T("Meldungshistorie gelöscht"),_T("%Ignore%"));
          entry.Languages[_T("EN")] = LangEntry(_T("The message history has been cleared."),_T("Message history cleared"),_T("%Ignore%"));
          hash[1073741826] = entry;
          entry.Languages[_T("DE")] = LangEntry(_T("Ein Fehler wurde als gesehen quittiert."),_T("Fehler quittiert"),_T("%Ignore%"));
          entry.Languages[_T("EN")] = LangEntry(_T("A fault has been acknowledged as viewed."),_T("Fault acknowledged"),_T("%Ignore%"));
          hash[1073741827] = entry;
          entry.Languages[_T("DE")] = LangEntry(_T("Uhrzeit des Geräts wird mit Netzwerkzeit synchronisiert."),_T("Uhrzeit synchronisiert"),_T("%Ignore%"));
          entry.Languages[_T("EN")] = LangEntry(_T("Device time is being synchronized with the network time."),_T("Time synchronized"),_T("%Ignore%"));
          hash[1073741829] = entry;
          entry.Languages[_T("DE")] = LangEntry(_T("%Ignore%"),_T("%Ignore%"),_T("%Ignore%"));
          entry.Languages[_T("EN")] = LangEntry(_T("%Ignore%"),_T("%Ignore%"),_T("%Ignore%"));
          hash[1090584832] = entry;
          entry.Languages[_T("DE")] = LangEntry(_T("%Ignore%"),_T("%Ignore%"),_T("%Ignore%"));
          entry.Languages[_T("EN")] = LangEntry(_T("%Ignore%"),_T("%Ignore%"),_T("%Ignore%"));
          hash[1090584833] = entry;
    


  • Ist das eine generierte Source-Datei oder wurde diese von Hand erstellt (dann aber würde ich den Ersteller tadeln)?

    Kann der gesamte Code umgeschrieben werden, wie in Kompilierung langsam bei großen Arrays, Maps (also Trennung von Code und Daten)?



  • @Th69 sagte in VS2008 Compiler Optimation Option (Build hängt):

    Ist das eine generierte Source-Datei oder wurde diese von Hand erstellt (dann aber würde ich den Ersteller tadeln)?
    Kann der gesamte Code umgeschrieben werden, wie in Kompilierung langsam bei großen Arrays, Maps (also Trennung von Code und Daten)?

    Ja der code darf verändert werden. Habe mir schon überlegt DE und EN enträge zu splitten in 2 LanguageClasse o.ä.

    was würdest du vorschlagen? wie müsste der code aussehen, die Generierung (aus einer csv) kann geändert werden.

    EDIT: hier die header dazu:

    typedef struct LangEntry
    {
       LangEntry()
           :Cause(_T("")), Head(_T("")), Solution(_T(""))
       {}
       LangEntry(CString cause, CString head, CString solution)
           :Cause(cause), Head(head), Solution(solution)
       {}
    
    
       CString Cause;
       CString Head;
       CString Solution;
    
    
    } LangEntry;
    
    
    typedef struct AlarmEntry
    {
    	std::map<CString, LangEntry> Languages;
    
    } AlarmEntry;
    
    
    typedef std::map<int, AlarmEntry> AlarmEntries;
    
    class AlarmTextList
    {
    	AlarmEntries hash;
    public:
      AlarmTextList();
    //public:
    //const static AlarmEntries Alarms;
    };
    


  • Also erstmal finde ich solchen Code schon fragwürdig - wo kommen z.B. all die Zahlen für die hash-Keys her?

    Dann weiß ich natürlich nicht, was entry für ein Datentyp ist, aber möglicherweise wäre die allereinfachste Vereinfachung schon sowas wie

    auto &de = entry.Languages[_T("DE")];
    auto &en = entry.Languages[_T("EN")];
    
    de = LangEntry(...);
    en = LangEntry(...);
    hash[....] = entry;
    
    de = LangEntry(...);
    en = LangEntry(...);
    hash[....] = entry;
    
    ...
    

    Das erspart dir die tausenden von operator[]-Calls.

    Aber generell wäre das Trennen/Auslagern der Texte sicher eine gute Idee.

    PS: Ich wusste gar nicht, dass "Ignore" ein deutsches Wort ist 😉



  • @wob sagte in VS2008 Compiler Optimation Option (Build hängt):

    Dann weiß ich natürlich nicht, was entry für ein Datentyp ist, aber möglicherweise wäre die allereinfachste Vereinfachung schon sowas wie

    Die Typen siehe oben....

    ahhh.. ok clever.. ich vewende aber C++11 hoffe da geht dann trotzdem 1?

    AlarmEntry entry;
    
     LangEntry& de= entry.Languages[_T("DE")] 
     LangEntry& en = entry.Languages[_T("EN")] 
    
        de=  LangEntry(_T("Die Meldungshistorie wurde gelöscht."),_T("Meldungshistorie gelöscht"),_T("%Ignore%"));
        en=  LangEntry(_T("The message history has been cleared."),_T("Message history cleared"),_T("%Ignore%"));
    
           hash[1073741826] = entry;
    
    ..
    


  • @SoIntMan: Du hast also eine CSV-Datei mit den Daten und möchtest die in der Headerdatei definierten Datenstrukturen damit füllen.
    Wieso verwendest du dann nicht einfach die direkte Initialisierung, s. z.B. C++ : How to Initialize a map in one line using initialzer_list? (also du erzeugst Code, der direkt die Map füllt - anstatt tausender Einzelzuweisungen).

    Deine Hashwerte sehen aber eigenartig aus (hast du einfach einen Zähler dafür?).
    Wie greifst du denn dann vom Hauptprogramm aus auf die AlarmEntries zu?



  • @Th69 sagte in VS2008 Compiler Optimation Option (Build hängt):

    @SoIntMan: Du hast also eine CSV-Datei mit den Daten und möchtest die in der Headerdatei definierten Datenstrukturen damit füllen.
    Wieso verwendest du dann nicht einfach die direkte Initialisierung, s. z.B. C++ : How to Initialize a map in one line using initialzer_list? (also du erzeugst Code, der direkt die Map füllt - anstatt tausender Einzelzuweisungen).

    Hmm.. ja da hast du recht.. gibt die "initialzer_list" schon in c++?!

    die hashwerte sind fehler codes aus ner hardware, die habe ich so bekommen...

    der zugriff dann über eine Function

    GetErrorText(index,_T("DE"))
    

    ist hier im code noch nich implementiert..😇

    EDIT: Aber wird so denn überhaupt mein Problem Code genierung gelöst, oder reden wir hier von kosmetik?

    EDIT2: Ok, wird gelöst er hat 10min gebraucht, aber compiliert😎

    EDIT3: so sieht der code jetzt aus:

    AlarmEntry entry;
        
        LangEntry &de =  entry.Languages[_T("DE")];
        LangEntry &en = entry.Languages[_T("EN")];
    
        de.Set(_T("Die Meldungshistorie wurde gelöscht."),_T("Meldungshistorie gelöscht"),_T("%Ignore%"));
        en.Set(_T("The message history has been cleared."),_T("Message history cleared"),_T("%Ignore%"));
        hash[1073741826] = entry;
        de.Set(_T("Ein Fehler wurde als gesehen quittiert."),_T("Fehler quittiert"),_T("%Ignore%"));
        en.Set(_T("A fault has been acknowledged as viewed."),_T("Fault acknowledged"),_T("%Ignore%"));
        hash[1073741827] = entry;
        de.Set(_T("Uhrzeit des Geräts wird mit Netzwerkzeit synchronisiert."),_T("Uhrzeit synchronisiert"),_T("%Ignore%"));
        en.Set(_T("Device time is being synchronized with the network time."),_T("Time synchronized"),_T("%Ignore%"));
        hash[1073741829] = entry;
    

    und jetzt mal mit der init list!?;)



  • Ja, die std::initializer_list gibt es seit C++11.
    Du mußt dann halt verschachtelte Einträge (jeweils mittels { ... }) erzeugen.

    PS: Dein Code - basierend auf @wob's Code - ist logisch noch falsch (du verwendest jeweils den gleichen entry-Wert)...
    Aber lass das einfach und verwende die direkte Intialisierung.

    Das generelle Stichwort dafür lautet "Uniform Initialization", s. z.B. Modern C++ Features – Uniform Initialization and initializer_list.



  • @Th69 sagte in VS2008 Compiler Optimation Option (Build hängt):

    PS: Dein Code - basierend auf @wob's Code - ist logisch noch falsch (du verwendest jeweils den gleichen entry-Wert)...

    Das ist aber nicht logisch falsch, denn bei der Zuweisung an hash wird doch kopiert.

    Was man sich noch angucken könnte, ist der Constructor:

       LangEntry(CString cause, CString head, CString solution)
           :Cause(cause), Head(head), Solution(solution)
       {}
    

    @SoIntMan Du könntest dir hier die Kopien sparen.



  • Ich Honk .. ich verwende den C++03 Standart.. sorry hab ich verrafft.. kann das auch nich ändern.. MFC oldschol win ce entwicklung in VS2008:(

    EDIT: Ja muss dann den Wob weg gehen.. genau , der Entry werden immer kopiert nachdem ich den Inhalt geändert habe..



  • @SoIntMan sagte in VS2008 Compiler Optimation Option (Build hängt):

    Ich Honk .. ich verwende den C++03 Standart.. sorry hab ich verrafft.. kann das auch nich ändern.. MFC oldschol win ce entwicklung in VS2008:(

    EDIT: Ja muss dann den Wob weg gehen.. genau , der Entry werden immer kopiert nachdem ich den Inhalt geändert habe..

    Genau. Aber ich meinte, dass dein LangEntry-Constructor statt der CString-Parameter stattdessen LPCTSTR-Parameter nehmen sollte - aber vielleicht machst du das in "Set" auch?



  • @wob: Das ist logisch trotzdem falsch, denn falls mal ein Eintrag für eine Sprache ("DE", "EN", ...) nicht existiert, dann würde der vorherige LangEntry-Wert dafür verwendet werden (weil eben immer dieselbe entry-Variable verwendet wird und die Einträge nicht jeweils gelöscht werden).

    @SointMan: Trotzdem kannst du auch in C++98 (oder C++03) die direkte Initialisierung verwenden, du mußt nur explizit die Typnamen verwenden, s.a. Ideone-Code C++98:

    std::map<CString, LangEntry> entry1 =
     { { "DE", LangEntry("D1", "D2", "D3") }, { "EN", LangEntry("E1", "E2", "E3") } };
    
    AlarmEntries entries =
    {
      { 1, entry1 },
      { 2, { { "DE", LangEntry("D1", "D2", "D3") }, { "EN", LangEntry("E1", "E2", "E3") } } }
    };
    

    (Ich habe den Typ AlarmEnty entfernt und direkt die Languages-Map verwendet - ansonsten den von mir auskommentierten Konstruktor hinzufügen und verwenden.)

    Du kannst dich für eine der Initialisierungen entscheiden (entweder explizit vorher die Languages-Maps einzeln erzeugen oder aber - so würde ich es machen - direkt einsetzen, da es der "Uniform Initialization" am nächsten kommt).

    PS: Auf die (gleichnamigen) typedef für die struct-Datentypen kannst du in C++ verzichten!



  • @Th69 sagte in VS2008 Compiler Optimation Option (Build hängt):

    @SointMan: Trotzdem kannst du auch in C++98 (oder C++03) die direkte Initialisierung verwenden, du mußt nur explizit die Typnamen verwenden, s.a. Ideone-Code C++98:
    std::map<CString, LangEntry> entry1 =
    { { "DE", LangEntry("D1", "D2", "D3") }, { "EN", LangEntry("E1", "E2", "E3") } };

    AlarmEntries entries =
    {
    { 1, entry1 },
    { 2, { { "DE", LangEntry("D1", "D2", "D3") }, { "EN", LangEntry("E1", "E2", "E3") } } }
    };

    (Ich habe den Typ AlarmEnty entfernt und direkt die Languages-Map verwendet - ansonsten den von mir auskommentierten Konstruktor hinzufügen und verwenden.)
    Du kannst dich für eine der Initialisierungen entscheiden (entweder explizit vorher die Languages-Maps einzeln erzeugen oder aber - so würde ich es machen - direkt einsetzen, da es der "Uniform Initialization" am nächsten kommt).
    PS: Auf die (gleichnamigen) typedef für die struct-Datentypen kannst du in C++ verzichten!

    Super.. vielen dank für den Support.. ich setzt mich morgen früh an die Sache;)



  • @Th69 sagte in VS2008 Compiler Optimation Option (Build hängt):

    s.a. Ideone-Code C++98:

    Hi Th69, noch echt vielen Dank, guter Mann:) .. dass du dir sogar die Mühe gemacht hast ein Beispiel für mich zu machen. Hab es zwar noch nicht ausprobiert.. aber echt sehr nett für den Support..

    Generell Danke an euch alle.. für den Support in alles Threads.. super Forum:=)



  • @SoIntMan: Hat es funktioniert?



  • @Th69 sagte in VS2008 Compiler Optimation Option (Build hängt):

    @SoIntMan: Hat es funktioniert?

    Ja hat(te) hab dann das ganze in DE und EN gesplittet und jeweils ne Klasse dafür angelegt welche von ne LanguageBase
    Klasse ableiten. die hat ne Funktion

    Set(1234, "TextA","TextB",TextC");
    

    diese wurde dann in den concreten Language klassen verwenden um einen Sprachtech hinzuzufügen.

    Jetzt wird "compliliert" aber dauert trotzdem 10 min 🙂 Naja muss dazusagen , VS2008 läuft in ner VM. Und der Host Rechner is ein 4 Jahre altes i5 Business Notebook:)

    Aber was ich nicht korrekt validiert hatte, is deine Initialisierung-Listen, variante wirklich schneller im builden als meine Set-Methode .

    Ich weiß natürlich nichtwas der Compiler bei der code generierung macht bei deiner und bei meiner variante:)


Anmelden zum Antworten