2014 dxdy logo

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

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




На страницу Пред.  1, 2
 
 Re: ошибка в оконной программе на С++
Сообщение28.08.2019, 04:13 
Вот такое сообщение даёт сам Matlab:
Цитата:
This error was detected while a MEX-file was running. If the MEX-file
is not an official MathWorks function, please examine its source code
for errors. Please consult the External Interfaces Guide for information
on debugging MEX-files.

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение28.08.2019, 05:19 
arseniiv в сообщении #1412207 писал(а):
И может быть ошибка останется и сможет быть выловлена более просто

По поводу этого я уже писал - так сделать нельзя, вернее, это будет уже совсем не то. Смысл всей этой программы в том, что функция после вычислений завершает работу. В ней нет бесконечного цикла, нет и отдельного потока. После завершения работы функции окно уже существует само по себе, для перерисовки используется только CALBACK fcn().

-- 28.08.2019, 06:31 --

Уважаемый aitap, как Вы думаете, может ли повлиять на работу программы расположение идентификаторов
Код:
HINSTANCE hinst;                  // Дескриптор экземпляра приложения
char ClassName[]="Window";            // Название класса окна
char AppTitle[]="Application Win32";  // Заголовок главного окна


раньше у меня они объявлялись локально, и я вдруг подумал, что может они используются при вызовах CALBACK fcn(). По крайней мере, в примерах Windows приложений они почему то объявлены глобально. Решил попробовать и я. Пока не одной ошибки не выскочило, но кто его знает ...

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение28.08.2019, 07:01 
Выяснилось, что mex функция может завершить работу ещё до того, как будет создано окно. При этом возникает та же самая ошибка. Есть подозрение, что при выходе их mex функции исчезают некоторые переменные, к которым продолжает обращаться окно в процессе своего создания.

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 06:41 
worm2 в сообщении #1412057 писал(а):
Так что есть смысл покрыть printf'ами и внутренности ChildProc

Попробовал и такой способ. Сразу выяснилось, что при возникновении описанной ошибки ChildProc не вызывается не разу. Получается, нарушение прав доступа возникает при попытке вызова самой ChildProc. Самое странное, что в большинстве случаев всё работает нормально.
С чем это может быть связано, и как можно исправить?

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 11:07 
Кстати, никакие предшествующие вызовы winapi в таких случаях не возвращают ошибок?

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 11:37 
Аватара пользователя
Попробуйте избавиться от memset , явно инициируйте оставшиеся поля ( там их немного ).
«Сотона» любит прятаться в memset)))
И, по любому, чему равна
первая глобальная переменная ni?
Какие «силы небесные» её изменяют?

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 12:24 
Аватара пользователя
Andrey_Kireew в сообщении #1412416 писал(а):
Есть подозрение, что при выходе их mex функции исчезают некоторые переменные, к которым продолжает обращаться окно в процессе своего создания.

После завершения mex функции Matlab вправе в любой удобный ему момент времени очистить всю память, занимаемую кодом или данными этой функции. Очевидно, не правда ли?

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 13:55 
Аватара пользователя
Кстати, не пользуйтесь printf при отладке.
Она пишет в stdout, буферизованный. Можно не увидеть
последний вывод.Лучше писать в stderr (или сеrr,
coответственно, для с++).

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 15:24 
Genaa в сообщении #1412664 писал(а):
Попробуйте избавиться от memset


попробовал, и заодно проверил возвращаемый значения Win API функций
действительно, RegisterClass() возвращала ноль.

-- 29.08.2019, 16:40 --

Причём, даже в этом случае окно может создаваться без видимых проблем. Наверное UpdateWindow() не работала именно по этой причине.
Вместо w.style =0, который задавался memset, поставил w.style = CS_HREDRAW; Первый раз помогло, но потом опять RegisterClass() возвратила 0 и выскочила та же самая ошибка

-- 29.08.2019, 16:49 --

Если класс не зарегистрировался, GetLastError() выдаёт код 1151407328

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 16:53 
Аватара пользователя
Дабы расшифровать код, попробуйте вот это:
https://docs.microsoft.com/ru-ru/window ... error-code

Там dw вставьте в параметр. В общем ясно…

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 17:08 
По ошибке не там написал GetLastError(), надо было - сразу после RegisterClass(), а этот код скорее всего неверный. После исправления, код ошибки 1410 "класс уже существует". Но это при нормальной работе. Какой код будет при падении matlab пока не ясно, пытаюсь "отловить". Сейчас, как на зло, всё работает без ошибок. Вернул w.style =0, но никаких изменений не произошло. Видимо, дело совсем не в этом.

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 18:30 
Andrey_Kireew в сообщении #1412412 писал(а):
может ли повлиять на работу программы расположение идентификаторов

Мне не удалось найти информацию о требованиях к lifetime указанных переменных в документации на WinAPI. Хорошей идеей может оказаться изменение
Используется синтаксис C
char ClassName[]="Window";
char AppTitle[]="Application Win32";

на
Используется синтаксис C
const char* ClassName="Window";
const char* AppTitle="Application Win32";
- тогда содержимое строк попадает в статическую область памяти, а не в область переменных с automatic storage duration (обычно стек), но это, скорее всего, окажется малозаметной оптимизацией, а не исправит баг.

Andrey_Kireew в сообщении #1412154 писал(а):
Оказалось, что все видимые функции MEX-файла размещаются по адресам 0x000007fdb


А это похоже на то, что MATLAB решил выгрузить DLL с кодом, который необходим для отрисовки окна. Если жизненно необходимо держать код именно в таком виде, а не рисовать интерфейс средствами Matlab, можно попробовать вынести требуемый для GUI код в отдельную библиотеку и подгружать её при помощи LoadLibrary(). Простого способа потом её выгрузить я сейчас предложить не могу, так что это может значить утечку одной HMODULE. Но здесь я могу ошибаться с большой вероятностью.

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 19:01 
aitap в сообщении #1412746 писал(а):
А это похоже на то, что MATLAB решил выгрузить DLL с кодом, который необходим для отрисовки окна

учитывая, что ошибка возникает при первом вызове callback fcn, возникают сомнения в том, что она вообще загружается, либо - просто не успевает вовремя загрузиться (хотя такого быть не должно)

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 20:16 
Аватара пользователя
Вообще-то вы не первый, кто решил осчастливить
MATLAB подобным образом. Тут некто спрашивал
творцов про возможность такого деяния ( из мех файла ):
https://www.mathworks.com/matlabcentral ... a-mex-file
Вы не пробовали эту функцию вне MATLAB, как простую
программу рисования? Если она грохнется, то вы легко
найдете в чем там дело, а если нет, то потребуются танцы
с бубном или использование средств рисования от творцов.

 
 
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 21:57 
Genaa в сообщении #1412775 писал(а):
Вы не пробовали эту функцию вне MATLAB

Это совет мне давали уже многие, повторюсь, в это нет особого смысла, т.е. работать то оно конечно будет, но это будет уже совсем не то.
Genaa в сообщении #1412775 писал(а):
Тут некто спрашивал
творцов про возможность такого деяния

Почитал - написано, что это никем не тестировалось. А вообще - не советуют, ссылаясь на возможную нестабильность работы Matlab. Понятно, что такие действия прямо противоречат интересам MathWorks. Какого либо другого ответа ожидать и не стоило.

-- 29.08.2019, 23:31 --

Странно, но после того как поставил после RegisterClass() GetLastError() ни одной ошибки больше не появилось ни разу. Всё работает как часы

 
 
 [ Сообщений: 30 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group