2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Чтение PNG файла. Отладочный тупик
Сообщение15.02.2023, 10:48 
Аватара пользователя


05/06/08
479
Из проекта в проект использую старые прграммы чтения и записи PNG файлов. Без особых проблем.
Сейчас столкнулся с непреодолимым тупиком.
В моде Release отладка (да и без) программа затыкается на
Код:
if (!png_check_sig(pbSig, 8)) {
        fclose(stream);
        throw CError("ReadFilePNG: invalid PNG signature");
   }


В моде Debug все проходит на ура.
Что делать ума не приложу.
Может есть какие соображения?
Заранее спасибо за помощь.

PS Может быть наводкой:
Ставлю метку остановки перед чтением
Код:
fread(pbSig, 1, 8, stream);

Но дебагер сразу выходит на исключение не останавливаясь. Что-то в коде не то...

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение15.02.2023, 13:01 
Аватара пользователя


05/06/08
479
Как я понял, проблема выходит за пределы означенной темы. Это проблема компилятора и линковщика билдера MS VS 2019.
Формально, на момент первого чтения программа ничем не отличается от множества моих, да и просто учебных программ написанных в этой среде.
То есть исполнительный бинарный код, следующий по порядку за открытием файла, каким-то образом портит именно этот код. Возможно, какие-то ощибки в коде (плохо отслеживаемые) и сущесвовали ранее, без последствий. Однако оптимизация кода сделала код не тестируемым. В моде Release затыкается там, где этого не может быть в принципе. Но в этой моде невозможно что-то отследить по существу, кроме условных мест сбоев (часто никак не связанных ни с чем реальным).

Возможно, пора менять стиль программирования новых проектов, но возраст не дает такого шанса.

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение15.02.2023, 15:17 
Заслуженный участник


02/08/11
7015
MGM в сообщении #1581690 писал(а):
Что делать ума не приложу.
Используйте метод половинного коммента: вырезайте примерно половину программы, проверяйте осталась ли проблема, если осталась — вырезайте дальше, если нет — проблема в вырезанном участке. Это трудоёмко, но ничего не поделаешь.

-- 15.02.2023, 16:20 --

Также надо подебажить дизассеммблером — возможно что-то станет понятно и поотлаживать вставками отладочной печати/логирования.

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение15.02.2023, 15:58 


14/01/11
3077
К сказанному warlock66613 и добавить особо нечего. Замечу только, что ошибки в компиляторе крайне маловероятны, вот это предположение
MGM в сообщении #1581701 писал(а):
Возможно, какие-то ощибки в коде (плохо отслеживаемые) и сущесвовали ранее, без последствий.
выглядит наиболее правдоподобным.

-- Ср фев 15, 2023 16:07:31 --

Также в Visual Studio можно в настройках проекта для любой конфигурации, в т.ч. "Release", отключить оптимизацию для упрощения отладки.

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение15.02.2023, 16:22 
Аватара пользователя


28/10/21
100
MGM в сообщении #1581701 писал(а):
Это проблема компилятора и линковщика билдера MS VS 2019.


У вас опять "компилятора виноват", как было в "true(204)"...

Нет, "проблемы компилятора и линковщика" тут исчезающе маловероятны. Вы что-то сами накосячили в коде.

MGM в сообщении #1581690 писал(а):
Ставлю метку остановки перед чтением ... Но дебагер сразу выходит на исключение не останавливаясь.


Так бывает в коде, скомпилированном в Release конфигурации. Это ничего не значит.

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 18:23 
Аватара пользователя


05/06/08
479
TheRuinedMap в сообщении #1581716 писал(а):
MGM в сообщении #1581701 писал(а):
Это проблема компилятора и линковщика билдера MS VS 2019.


У вас опять "компилятора виноват", как было в "true(204)"...

Нет, "проблемы компилятора и линковщика" тут исчезающе маловероятны. Вы что-то сами накосячили в коде.

Вопрос в том, где косяк? А главное, как этот косяк искать.
Попробую повторить вопрос.
Код до затыка:
Код:
int main(int argc, char **argv) {

   float lp = atof(argv[1]);
   float lm = atof(argv[2]);
        int X, Y, CH;
   char* im_name0 = concat(argv[3], "input_Cam040.png");
   BYTE * im0 = readImageBf(im_name0, &X, &Y, &CH); delete[] im_name0;


Функция чтения PNG файлов, взятая целиком с проверенного ресурса:
BYTE * im0 = readImageBf(im_name0, &X, &Y, &CH);
качует из одного проекта в другой лет 15ть. Никогда никаких сбоев.
Если вставить внутри функции cout << im_name0 печатает то, нужное имя.
По всем классическим канонам программирования ошибка кода должна быть до этой функции. А не после.
Вот в чем проблема.
Тем более, что в Дебаге все открывается. А значит не вероятность того, что проблема в самом PNG файле не очень правдоподобна.

Может быть что-то с командной строкой?
У меня при копировании LateX проектов в Overleaf - если проект на кириллице - возникают фонтомные символы, которые трудно отлавливаемые.
Даже не знаю, что и думать - карма какя-то с текстами. :)

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 19:12 


14/01/11
3077
Откуда вы берёте функцию concat? Вообще, при такой работе с сырыми указателями очень легко ненароком испортить память, что может привести к непредсказуемым последствиям при дальнейшем выполнении программы.

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 19:15 
Аватара пользователя


05/06/08
479
Вроде бы нащупал лик.
Вот этот модуль взял с непроверенного ресурса, до сих пор работал нормально.
Код:
char* concat(const char *s1, const char *s2)
{
   char *result = new char[(strlen(s1) + strlen(s2)+1)];//+1 for the null-terminator
                                        
   strcpy(result, s1);
   strcat(result, s2);
   return result;
}

А сейчас хоть и выдает правильную строку, но в режиме Release крутится по нескольку раз и портит код.
Что в этой функции не так?

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 20:50 
Заслуженный участник


18/09/21
1766
MGM в сообщении #1582222 писал(а):
крутится по нескольку раз и портит код.
Что значит?
"readImageBf" внутри не запоминает ссылку на строку?
"argv[3]" там точно есть третий аргумент? Можно для надёжности "argc" проверять.

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 21:39 
Аватара пользователя


28/10/21
100
MGM в сообщении #1582222 писал(а):
Что в этой функции не так?


Все в ней в порядке, кроме разве что побочных придирок к реализации. Но реальных проблем в ней нет.

MGM в сообщении #1582222 писал(а):
Вроде бы нащупал лик.


Какой "лик"? В том коде, который вы приводили ранее, выделенная этой функцией память честно освобождалась вызывающим кодом. Именно на такой способ использования эта функция и рассчитана.

MGM в сообщении #1582222 писал(а):
но в режиме Release крутится по нескольку раз и портит код.


О каком "портит код" вы ведете речь? Что это вообще значит - "портит код"?

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 22:06 
Аватара пользователя


05/06/08
479
TheRuinedMap в сообщении #1582252 писал(а):

MGM в сообщении #1582222 писал(а):
но в режиме Release крутится по нескольку раз и портит код.


О каком "портит код" вы ведете речь? Что это вообще значит - "портит код"?

Так как мода Release, то процесс дебага становится нелогичным.

Но не суть. После нескольких экспериментов по переделке кода и возврата к старой версии я вдруг обнаружил следующее:

Код:
int main(int argc, char **argv) {

   cout << argv[1] << endl;

Выдает цифру 140 при моде Release
и d:/IF/full_data/training/cotton/ при моде Debug

Последнее соответсвует первому аргументу командной строки.

То есть полный атас. Понять, почему строка аргумента неверна сразу же после входа для меня непосильная задача.

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 23:06 
Заслуженный участник


18/09/21
1766
Надо было "argc" проверять.
Перед "float lp" вставить
Используется синтаксис C++
if(argc < 4) {printf("error\n"); return -1;}


-- 18.02.2023, 23:10 --

MGM в сообщении #1582260 писал(а):
Выдает цифру 140 при моде Release
и d:/IF/full_data/training/cotton/ при моде Debug

Последнее соответсвует первому аргументу командной строки.
Кто знает, как вы их задаёте...
Может в IDE как-то, как параметр проекта. И задали по-разному.

Сделайте EXE файл и запустите его в консоли, задавая нужные аргументы.

 Профиль  
                  
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение19.02.2023, 02:27 
Аватара пользователя


28/10/21
100
MGM в сообщении #1582260 писал(а):
Выдает цифру 140 при моде Release
и d:/IF/full_data/training/cotton/ при моде Debug


Ну так небось вы из-под IDE запускаетесь, и в IDE именно такие параметры и прописаны: для Release "140", а для Debug "d:/IF/full_data/training/cotton/"

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group