Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа со спроецированным файлом 
V
    Опции темы
feodorv
Дата 18.5.2012, 10:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(GremlinProg @  18.5.2012,  08:25 Найти цитируемый пост)
эта ошибка системная, очень распространенная

Сам её совершал неоднократно)))

Цитата(GremlinProg @  18.5.2012,  08:25 Найти цитируемый пост)
выход за пределы блока - точно есть

Я имел в виду, что в коде записи в память нет, всё рид-онли smile А так-то))))


Цитата(GremlinProg @  18.5.2012,  08:25 Найти цитируемый пост)
в WordCount передается указатель на 1 символ, а читается fSize,

Мда. Казалось бы, начало неплохое, если CreateFile, GetFileSize, CreateFileMapping и MapViewOfFile отрабатывают без ошибок (что не очевидно):
Цитата

    case WM_CREATE:
  hFile = CreateFile(_T("My.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if(hFile != INVALID_HANDLE_VALUE)
  {
    fSize = GetFileSize(hFile, NULL);
    hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, fSize, NULL);
    if(hFileMap)
    p = (TCHAR*)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
    break;
  }
  countW = WordCount(p, fSize);
  countT = fSize;

Остро нужен контроль ошибок. 
Кроме того, если ни hFile, ни hFileMap (кроме как в высвобождении ресурсов) более не используются, почему бы их здесь же не освободить (и забыть про них)?
Кроме того:
Цитата
    unsigned int countW, countT;
 как и p тоже не static.


Однако, в WM_PAINT... 
Цитата

  _stprintf(str, _T("Word count = %i\n Simbols count = %i\n"), WordCount(p, SimbolsCount(fSize)), SimbolsCount(fSize));

При этом: 
Цитата(wallstreet @  16.5.2012,  12:54 Найти цитируемый пост)
отрисовывает правильный результат
 smile 


Цитата(wallstreet @  14.5.2012,  19:01 Найти цитируемый пост)
в объявлении:

1: TCHAR *p = new TCHAR;

помогло.

Жуть... Ну и лекарство...


Такой код
Цитата

TCHAR *p = new TCHAR;
...
UnmapViewOfFile(p);

разрушить кучу вполне способен...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GremlinProg
Дата 18.5.2012, 10:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @ 18.5.2012,  12:02)
Такой код
Цитата

TCHAR *p = new TCHAR;
...
UnmapViewOfFile(p);

разрушить кучу вполне способен...

ну, в данном случае, куча портится раньше вызова UnmapViewOfFile,
так что все равно не понятно, где она успела это сделать


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 18.5.2012, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(GremlinProg @  18.5.2012,  11:18 Найти цитируемый пост)
так что все равно не понятно, где она успела это сделать

Тогда ждём от wallstreet исправлений и дальнейших приключений  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
wallstreet
Дата 21.5.2012, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



Пока пришел вот к этому результату и дальше сдвинуться не могу никак.
Код

int WordCount(TCHAR *pStr, unsigned int fSize)
{
    unsigned count = 0;
    int prev_alpha = 0;
    for(unsigned i=0; i<fSize; ++i)
    {
        int now_alpha = _istalnum(pStr[i]);
        count +=now_alpha && !prev_alpha;
        prev_alpha = now_alpha;
    }
    return count;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    static HANDLE hFile, hFileMap;
    static DWORD fSize;
    static RECT rt;
    static TCHAR *str = new TCHAR;
    static TCHAR *p = 0;


    switch (message)
    {
    case WM_CREATE:
        hFile = CreateFile(_T("My.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if(hFile != INVALID_HANDLE_VALUE)
        {
            fSize = GetFileSize(hFile, NULL);
            hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, fSize, NULL);
            if(hFileMap)
            {
                CloseHandle(hFile);
                p = (TCHAR*)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
                CloseHandle(hFileMap);
            }
            break;
        }
        break;
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        GetClientRect(hWnd, &rt);
        hdc = BeginPaint(hWnd, &ps);
        if(*str)
        {
            _stprintf(str, _T("Word count = %i\nSimbols count = %i\n"), WordCount(p, fSize), fSize);
            DrawText(hdc, str, _tcslen(str), &rt, DT_LEFT);
        }
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        if(p!=NULL)
            UnmapViewOfFile(p);
        if(str!=NULL)
            delete str;
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Прошу не судить строго и намекать потолще на суть ошибки.
Буду стараться все быстрее исправить.
Кстати сейчас уже ошибка выполнения выскакивает при попытке закрыть окно.
суть:
Цитата

First-chance exception at 0x77942a80 in HomeWork6.9.exe: 0xC0000005: Access violation reading location 0xdddddde1.
The program '[5648] HomeWork6.9.exe: Native' has exited with code 0 (0x0).

указывает на:
Код

return DefWindowProc(hWnd, message, wParam, lParam);

в разделе обработки сообщения WM_DESTROY

ссылка для скачивания проекта

PM MAIL   Вверх
feodorv
Дата 21.5.2012, 16:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(wallstreet @  21.5.2012,  16:22 Найти цитируемый пост)
Прошу не судить строго и намекать потолще на суть ошибки.

Да мы добрые)))
Потолще... Гм, ну, разве что, взять и код переписать))))


Цитата(wallstreet @  21.5.2012,  16:22 Найти цитируемый пост)
    static HANDLE hFile, hFileMap;
    static DWORD fSize;
    static RECT rt;
    static TCHAR *str = new TCHAR;
    static TCHAR *p = 0;

Статики радуют глаз))) Кстати, Вы интересовались, чем статик от нестатик отличается?)))

Не радует глаз 
Цитата(wallstreet @  21.5.2012,  16:22 Найти цитируемый пост)
    static TCHAR *str = new TCHAR;

Цитата(wallstreet @  21.5.2012,  16:22 Найти цитируемый пост)
        if(*str)
        {
            _stprintf(str, _T("Word count = %i\nSimbols count = %i\n"), WordCount(p, fSize), fSize);

Для str памяти выделено всего на 1 символ!!! Вот это
Цитата(wallstreet @  21.5.2012,  16:22 Найти цитируемый пост)
_T("Word count = %i\nSimbols count = %i\n")

туда уже не влезает никак! И зачем if(*str)? Просто if(str) ещё понятно smile 

Вообще, зачем под str выделять память через new? Достаточно написать 
Код

TCHAR str[256];
 
То есть даже не статик, и не нужно потом возиться с высвобождением. Само объявление str можно даже перенести в WM_PAINT...

Добавлено через 2 минуты и 40 секунд
Вообще, код стал выглядеть намного лучше smile 
Но с юникодом мы ещё поборемся smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
wallstreet
Дата 22.5.2012, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



Цитата(feodorv @  21.5.2012,  16:00 Найти цитируемый пост)
Но с юникодом мы ещё поборемся   


с удовольствием!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.