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

Problem z funkcją GetOpenFileName (Tryb Release błąd , tryb Debug bez problemów)

Ostatnio zmodyfikowano 2014-01-05 12:48
Autor Wiadomość
domin568
Temat założony przez niniejszego użytkownika
Problem z funkcją GetOpenFileName (Tryb Release błąd , tryb Debug bez problemów)
» 2014-01-04 11:27:29
Witam, skończyłem pisać moją mp3, chce ją teraz udostępnić, podpiąłem wszystkie liby dla wersji Release, wszystko się ładnie kompiluje, jednak kiedy klikam przycisk odpowiedzialny za wybranie piosenki, otwiera się okno Eksploratora Windows aby wybrać plik, po wybraniu pliku okno ponownie się ukazuje aby wybrać piosenkę, jednak nie mam żadnej złej pętli. W trybie debug nie ma najmniejszych problemów. Kod
:
C/C++
bool otworzPlik()
{
   
    OPENFILENAME ofn; // common dialog box structure
    char szFile[ 1024 ]; // buffer for file name
    // owner window
    HANDLE hf; // file handle
   
    // Initialize OPENFILENAME
    ZeroMemory( & ofn, sizeof( ofn ) );
    ofn.lStructSize = sizeof( ofn );
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
    // use the contents of szFile to initialize itself.
    ofn.lpstrFile[ 0 ] = '\0';
    ofn.nMaxFile = sizeof( szFile );
    ofn.lpstrFilter = "Pliki Mp3\0*.MP3\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
   
    // Display the Open dialog box.
   
    GetOpenFileName( & ofn );
   
    string sciezka = szFile;
   
    if( sciezka.length() > 2 )
    {
       
        if( !music.OpenFromFile( sciezka ) )
        {
            MessageBoxA( NULL, "Nie udało się odtworzyć pliku", "Błąd", MB_ICONEXCLAMATION | MB_OK );
            return false;
        }
        else
        {
           
            return true;
        }
    }
    return false;
}

Wywołanie tej funkcji :
C/C++
while( okno.isOpen() )
{
    while( okno.pollEvent( zdarzenie ) )
    {
        if( browse.inRectangle( posMouse ) == true && browse.isMouseKeyDown( zdarzenie ) == true )
        {
            if( otworzPlik() == true )
            {
                dlugoscPiosenki = music.getLength(); // akcje zwiazane z suwakiem do przesuwania
                wspolczynnikSuwak = suwakPiosenki.obliczWspolczynnik( dlugoscPiosenki );
                music.play();
            }
        }
    }
   
   
}
Tutaj funkcje odpowiadające za działanie przycisku
C/C++
bool Przycisk::inRectangle( sf::Vector2f pozycja_myszki )
{
    if( sprite.getGlobalBounds().contains( pozycja_myszki ) == true )
    {
        return true;
    }
}
bool Przycisk::isMouseKeyDown( sf::Event & zdarzenie )
{
    if( zdarzenie.type == sf::Event::MouseButtonPressed )
    {
        return true;
    }
}
Czytałem pewien artykuł że w trybie Release kod jest kompilowany odrobinkę inaczej, niezainicjalizowanie zmiennej może zrobić duże kłopoty, ale w moim przypadku każdą zmienną inicjalizuje. Proszę o pomoc :)
P-101089
pekfos
» 2014-01-04 12:03:42
Metoda Przycisk::isMouseKeyDown() ma niezdefiniowane zachowanie, jeśli warunek się nie spełni. To samo w Przycisk::inRectangle().
P-101092
domin568
Temat założony przez niniejszego użytkownika
» 2014-01-05 10:42:01
Dzięki działa, dosyć głupi błąd ;/ czyli jak się zachowuje funkcja która nie ma zdefiniowanego return ? no bo moim zdaniem to taka funkcja powinna sprawdzić czy warunek jest prawdziwy, a jeżeli nie to nic nie robić. Jak można to zdefiniować ?
P-101201
pekfos
» 2014-01-05 12:48:35
a jeżeli nie to nic nie robić.
Nie może nic nie robić. Funkcja w każdym przypadku musi zwracać wartość. Poprawny kod wygląda tak:
C/C++
bool Przycisk::inRectangle( sf::Vector2f pozycja_myszki )
{
    return sprite.getGlobalBounds().contains( pozycja_myszki );
}
P-101212
« 1 »
  Strona 1 z 1