Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

"Debug" работает а "Release" нет

1.9K
17 октября 2007 года
0xf001
96 / / 24.05.2005
Юзаю VC8 и вот засада - когда я компилирую c++ прогу в режиме Release то она работает тольно из-под оболочки ВС ( нажать зелёненький треугольничегг)! А если скомпиленый екзешник просто запустить как нормальную прогу, то он вышибает не успев как следует запустиццо. При попытки отладить имеем кучу дизассемблера и надпись что мол "access-violation по адресу 0x00000000"

Причем если запускать Debug-экзешник то с ним все норм. Я так понимаю от самой программы это не зависит - так у меня со всеми другими прогами... Даже если не лезть в настройки и юзать автоматически генерированый "блабла.vcproj"...

Скажите пожалуйста, кто то встречался с такой глюконафтией?
31K
18 октября 2007 года
Timberwolve
7 / / 12.09.2007
Баг у вас гдет-то. Чтение по кривому указателю. Если работает в дебаге и не работает в релизе - 100% баг в проге.
255
18 октября 2007 года
Dart Bobr
1.4K / / 09.04.2004
Попробуй создать лог.. По нему выяснишь где косяк.. 100% ты что намутил с указателями..
1.9K
18 октября 2007 года
0xf001
96 / / 24.05.2005
Вобщем я придумал извращенский но быстрый способ найти проглюченое место в проге - вставлять вызов месаржбоксов и смотреть между какими двумя происходит глюк. вот функция. первый аз вызывается - все нормально а во второй раз вышибает на строке src=new char[filelen+1];
По виду вполне работоспособный код - загрузка всего текста из текстового файла и юзание его в проге. Может на более опытный взгляд ошибка будет виднее? Глянте, если не трудно плз...

Код:
char *LoadTextFromFile(const char *filename) //тут глюк!!!!
{
    char *src=0, tmp;
    unsigned long int filelen=0;

    FILE *file = fopen(filename, "rt");
    if(file==0)
        return 0;
    while( fscanf(file, "%c", &tmp)!=EOF ) filelen++; // щитаем длинну файла
    fseek(file, SEEK_SET, 0);
        //MessageBox(0,"char", "char", 16);
    src=new char[filelen+1]; // создаем строку по длинне файла
        //MessageBox(0,"2222", "2222", 16);
    for(unsigned i=0; i<filelen; i++) fscanf(file, "%c", &src); // читаем файл
    src[filelen]=0;
    fclose(file);

    return src;
}
240
18 октября 2007 года
aks
2.5K / / 14.07.2006
Цитата: 0xf001

while( fscanf(file, "%c", &tmp)!=EOF ) filelen++; // щитаем длинну



Цитата: 0xf001

fscanf(file, "%c", &src); // читаем файл


>:E Зачем такой изврат? Исли просто символы читаешь - так и читай обычно босимвольно, хоть fgetc если именно на С пишешь. Это в первом случае, хотя ведь размер можно и так узнать.

Ну а во втором случае, раз уж известен размер файла, тут уж само напрашивается считать сразу все в строку за один раз через fread например. )

1.9K
18 октября 2007 года
0xf001
96 / / 24.05.2005
Да не в изврате дело, а в том что ошибка происходит при выделении памяти оператором new
534
19 октября 2007 года
HarryAxe
448 / / 19.01.2006
Гы!!! Стопудняк filelen <= 0. Если под дебагом проходит, а при двойном клике на файле - нет, проверь путь к файлу. Рабочая папка-то меняется, следовательно, относительные пути могут стать невалидными.
309
19 октября 2007 года
el scorpio
1.1K / / 19.09.2006
Ещё можно добавлять отладочные команды. Например есть функия OutputDebugStringA (const char*), которая выводит полученную строку в "консоль" среды разработки даже в "релизном" режиме.
(не знаю как в MSVC, а для BCB этот способ значительно упрощает ловлю блох)

Ещё можно включить "релиз", а потом вручную активировать одну-две отладочные опции (контрольные точки) - вполне возможно, проблема возникает после оптимизации кода
2.9K
19 октября 2007 года
Ation
96 / / 27.07.2004
А проверяется ли значение возвращенное из LoadFrom... на NULL?
1.9K
20 октября 2007 года
0xf001
96 / / 24.05.2005
Ф-я LoadTextFromFile возвращает 0 только если файл не найден..
В общем ставлю "Run-time library" на "Multi treated Debug" вместо просто "Multi treated" и вроде работает..
2.9K
20 октября 2007 года
Ation
96 / / 27.07.2004
Ну сосбна считай что ты debug и компилишь. А значит ошибка осталась.
Что и когда возвращает функция я понял :/ Вопрос в другом, проверяешь ли ты, что она возвращает, или есть место где используется NULL?
В качестве имени файла попробуй передавать полный путь (вида С:\\папка\\...)
смущает вызов fseek(file, SEEK_SET, 0); По-моему ты перепутал аргументы. (SEEK_SET должен идти последним)
да и вообще, в этом случае, проще использовать GetFileSize/ReadFile.
И проще и быстрее.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог