Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++][visual studio 2013] Przycinanie się programu w trybie release

Ostatnio zmodyfikowano 2018-12-25 19:58
Autor Wiadomość
pekfos
» 2018-12-24 23:44:56
To nie jest błąd kompilacji, tylko bug linkera. Użyj nowszej wersji.
P-173319
Wicon
Temat założony przez niniejszego użytkownika
» 2018-12-24 23:46:50
Używałem też visuala 2017 i jest identycznie.
P-173320
pekfos
» 2018-12-24 23:49:48
Jaki dokładnie numer wersji?
P-173321
Wicon
Temat założony przez niniejszego użytkownika
» 2018-12-24 23:55:18
Wersja 15.7.27703.2047
Data ostatniej aktualizacji 8 sierpnia 2018
P-173322
pekfos
» 2018-12-24 23:59:13
Zaktualizuj do najnowszej.
P-173323
Wicon
Temat założony przez niniejszego użytkownika
» 2018-12-25 14:47:37
Nadal to samo.

EDIT: Szukam miejsca w kodzie, które powoduje ten błąd za pomocą
#pragma optimize ("", off)
. Na początku dodałem taką linijkę na początku każdego pliku w projekcie, teraz pojedynczo usuwam. Jeden plik znalazłem, zaraz sprawdzę czy inne pliki też powodują taki błąd, potem postaram się znaleźć funkcję lub konkretne miejsce w kodzie, może to da jakąś odpowiedź.
P-173324
Wicon
Temat założony przez niniejszego użytkownika
» 2018-12-25 17:41:18
Ok, chyba znalazłem. Błąd wywalała jedna funkcja, a raczej pętla którą ta funkcja zawierała. Otóż pętla była bardzo długa, ok 7 tyś. linijek. Gdy większą część pętli oznaczyłem w komentarz kompilacja przebiegła pomyślnie. Im jednak mniejszą część pętli zostawiałem w komentarzu a większą odznaczałem do kompilacji tym generowanie kodu trwało coraz dłużej aż przy pewnej ilości zaczynało wyrzucać ten właśnie błąd (Błąd wyrzucało po ok. minucie generowania kodu). Podzieliłem więc tą pętle na 3 pętle i kompilacja się powiodła, chociaż trwała ok. 30 minut z włączoną optymalizacją dla tylko tego 1 pliku. Podzieliłem tą pętlę jeszcze bardziej, na tak krótkie pętle, aby po zaznaczeniu klamry otwierającej każdą z tych pętli podświetliła się ona oraz klamra zamykająca. Kompilacja nadal trwa jednak długo, już ok. 15 minut. (Nadal się kompiluje)

Zastanawiam się jednak, czy nie lepiej po prostu wyłączyć optymalizację dla tej jednej funkcji za pomocą właśnie
#pragma optimize ("", off)
 a za funkcją znów włączyć optymalizację. Funkcja ta aktualizuje to co ma być wyświetlane na ekranie gdy gracz otworzył okno nauki u jakiegoś nauczyciela. Funkcja wykonuje się raz w momencie otwierania okna nauki oraz za każdym razem gdy nauczy się którejś z umiejętności z listy.
C/C++
// tablica Lehre_AllSkill jest wypełniana w innej funkcji, która wybiera zestaw umiejętności dla konkretnego z nauczycieli po wybraniu odpowiedniej opcji dialogowej
while( f < Lehre_AllSkill.size() )
{
    sizeofteaching = Lehre_AllSkill.size(); // zmienna zapamiętuje rozmiar tablicy na początku przebiegu pętli
    if( Lehre_AllSkill[ f ].SkillNumber == 1 ) // sprawdza numer umiejętności
    {
        if( PlayerSkill_Str_1 == true ) // sprawdza czy gracz nauczył się już tej umiejętności
        {
            // jeśli gracz zna tą umiejętność, to zostaje ona osunięta z tablicy
            ccc = f;
            while( ccc < Lehre_AllSkill.size() - 1 )
            {
                Lehre_AllSkill[ ccc ] = Lehre_AllSkill[ ccc + 1 ];
                ccc++;
            };
            ccc = 0;
            Lehre_AllSkill.pop_back();
        }
        else // jeśli gracz nie zna jeszcze tej umiejętności, to aktualizuje tekst jaki będzie dla niej wyświetlony, na jakiej podstawie nie trudno domyślić się z kodu
        {
            Lehre_AllSkill[ f ].Visual.setString( L"" );
            if( PlayerSTR < 20 || PlayerSWORD < 20 ) { Lehre_AllSkill[ f ].Visual.setString( L"" + Lehre_AllSkill[ f ].Visual.getString() + ", WYMAGANIA: " ); }
            else { Lehre_AllSkill[ f ].Visual.setString( L"" + Lehre_AllSkill[ f ].Visual.getString() + ")" ); };
            if( PlayerSTR < 20 && PlayerSWORD < 20 ) { Lehre_AllSkill[ f ].Visual.setString( Lehre_AllSkill[ f ].Visual.getString() + L"Siła: 20, Miecze: 20)" ); };
            if( PlayerSTR < 20 && PlayerSWORD > 19 ) { Lehre_AllSkill[ f ].Visual.setString( Lehre_AllSkill[ f ].Visual.getString() + L"Siła: 20)" ); };
            if( PlayerSTR > 19 && PlayerSWORD < 20 ) { Lehre_AllSkill[ f ].Visual.setString( Lehre_AllSkill[ f ].Visual.getString() + L"Miecze: 20)" ); };
            Lehre_AllSkill[ f ].Visual.setString( L"Walka mieczem- podstawowy (Koszt PN: 5" + Lehre_AllSkill[ f ].Visual.getString() );
        };
    };
    // teraz to samo dla innych umiejętności, atrybutów lub zaklęć, w sumie jest ich prawie 300
    sizeofteaching_02 = Lehre_AllSkill.size(); // zmienna zapamiętuje rozmiar tablicy na końcu przebiegu pętli
    if( sizeofteaching_02 == sizeofteaching ) f++; // jeśli w tym przebiegu jakaś umiejętność została usunięta z tablicy, nie zwiększa zmiennej f, gdyż pod tym samym indeksem znajduje się już kolejna umiejętność
   
};
P-173325
pekfos
» 2018-12-25 17:50:33
Otóż pętla była bardzo długa, ok 7 tyś. linijek.
7 tysięcy linii w jednej pętli oznacza bardzo słabo napisany kod, co potwierdza załączona próbka kodu. Ale to nie tłumaczy, czemu kompilacja tyle trwa. Raczej do tych 32GB pamięci nie masz doczepionego procesora sprzed 20 lat. To nie brzmi jak poprawne zachowanie i raczej powinieneś zasięgnąć opinii supportu na developercommunity.visualstudi​o.co​m.

Kompilacja nadal trwa jednak długo
Kompilacja, czy linkowanie? Skoro sypie się link.exe to raczej to drugie. A jeśli dzieje się to z powodu optymalizacji, możesz spróbować wyłączyć Whole Program Optimization.
P-173326
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona