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

Program działa a później CRASH

Ostatnio zmodyfikowano 2017-05-30 18:11
Autor Wiadomość
AJOT74
Temat założony przez niniejszego użytkownika
Program działa a później CRASH
» 2017-05-29 19:54:18
Napisałem sobie taki prosty program:

C/C++
#include <conio.h>
#include <dirent.h>
#include <windows.h>
#include <fstream>

using namespace std;

string pliczek, rozsz, loadplik, saveplik, rok, mies, dzien, folder, frok, fmies, fdzien;
int pozycja, i;

struct dirent * plik;
DIR * sciezka;

FILETIME dane;
SYSTEMTIME danex, daney;
HANDLE hPlik;

int main()
{
    if(( sciezka = opendir( "." ) ) )
    {
        while(( plik = readdir( sciezka ) ) )
        {
            pliczek = plik->d_name;
            if( pliczek != "." )
            {
                if( pliczek != ".." )
                {
                    pozycja = 0;
                    for( i = 0; i < pliczek.length(); i++ )
                         if( pliczek[ i ] == '.' ) pozycja = i;
                   
                    if( pozycja != 0 )
                    {
                        rozsz = pliczek;
                        rozsz.erase( 0, pozycja + 1 );
                        hPlik = CreateFile( pliczek.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL );
                        GetFileTime( hPlik, NULL, NULL, & dane );
                        CloseHandle( hPlik );
                        FileTimeToSystemTime( & dane, & daney );
                        SystemTimeToTzSpecificLocalTime( NULL, & daney, & danex );
                        sprintf(( char * ) rok.c_str(), "%d", danex.wYear );
                        sprintf(( char * ) mies.c_str(), "%d", danex.wMonth );
                        sprintf(( char * ) dzien.c_str(), "%d", danex.wDay );
                        frok = rok.c_str();
                        fmies = mies.c_str();
                        if( fmies.length() == 1 )
                             fmies = "0" + fmies;
                       
                        fdzien = dzien.c_str();
                        if( fdzien.length() == 1 )
                             fdzien = "0" + fdzien;
                       
                        printf( pliczek.c_str() );
                        printf( " -data modyfikacji: " );
                        folder = frok + "-" + fmies + "-" + fdzien;
                        printf( folder.c_str() );
                    }
                }
            }
        }
        closedir( sciezka );
        printf( "\n\nKoniec folderu!\n" );
    }
    else
    {
        printf( "\n\nZawartosc folderu jest pusta!!!\n" );
    }
    getch();
    return 0;
}

Program wykonuje się cały, ale na koniec po zamknięciu następuje CRASH i to nie ważne czy działa pod konsolą czy okienkami Windows? -co może być przyczyną?
P-161741
karambaHZP
» 2017-05-29 20:01:52
Użyj debuggera.
Błąd może być w
closedir( sciezka );
P-161742
AJOT74
Temat założony przez niniejszego użytkownika
» 2017-05-29 21:13:50
Nie, mam podobną procedurę która działa prawie w identyczny sposób i ona nie powoduje błędu.
Bardziej podejrzewam błąd w tym:
C/C++
sprintf(( char * ) rok.c_str(), "%d", danex.wYear );
sprintf(( char * ) mies.c_str(), "%d", danex.wMonth );
sprintf(( char * ) dzien.c_str(), "%d", danex.wDay );
-podejrzewam w tym gdyż w tej innej procedurze niema takiego konwertowania zmiennych i wszystko działa OK.
Nie wiem w czym problem, może przed wyjściem powinienem zwolnić jakieś zasoby pamięci, może powinienem w inny sposób konwertować zmienne. Nie mam pojęcia bo niby wszystko ok a po zakończeniu programu wyskakuje błąd APPCRASH.
P-161753
1aam2am1
» 2017-05-29 21:18:18
Tak się nie robi konwertowania zmiennych do string. Piszesz po nie swojej pamięci więc się niedziw że jest crash.
Zadeklaruj tablice charow i do niej konwertuj zmienne a następnie z tej tablicy do stringa.
P-161754
AJOT74
Temat założony przez niniejszego użytkownika
» 2017-05-29 21:25:56
Może jakaś podpowiedź w kodzie? -bo jestem początkujący i jeżeli chodzi o assembler to bym to zrobił a C++ na razie to jeszcze wszystkiego nie łapę.
P-161755
1aam2am1
» 2017-05-29 22:13:23
C/C++
char tab[ 10 ];
sprintf( tab, "%d", danex.wYear );
rok = tab;
P-161756
AJOT74
Temat założony przez niniejszego użytkownika
» 2017-05-30 18:11:18
O dzięki Ci dobry człowieku, przy okazji załapałem o co chodzi z tym CHAR bo do tej pory to cały czas miałem upór, że to wartość od -128 do 128 i nie wiedziałem, że funkcja może pracować na zasadzie tablicy którą potem można załadować do STRING.
P-161802
« 1 »
  Strona 1 z 1