2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: ошибка в оконной программе на С++
Сообщение28.08.2019, 04:13 


07/10/15

2400
Вот такое сообщение даёт сам 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 


07/10/15

2400
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 


07/10/15

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

 Профиль  
                  
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 06:41 


07/10/15

2400
worm2 в сообщении #1412057 писал(а):
Так что есть смысл покрыть printf'ами и внутренности ChildProc

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

 Профиль  
                  
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 11:07 


14/01/11
3036
Кстати, никакие предшествующие вызовы winapi в таких случаях не возвращают ошибок?

 Профиль  
                  
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 11:37 
Аватара пользователя


27/07/16
557
Попробуйте избавиться от memset , явно инициируйте оставшиеся поля ( там их немного ).
«Сотона» любит прятаться в memset)))
И, по любому, чему равна
первая глобальная переменная ni?
Какие «силы небесные» её изменяют?

 Профиль  
                  
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 12:24 
Заслуженный участник
Аватара пользователя


01/09/13
4656
Andrey_Kireew в сообщении #1412416 писал(а):
Есть подозрение, что при выходе их mex функции исчезают некоторые переменные, к которым продолжает обращаться окно в процессе своего создания.

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

 Профиль  
                  
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 13:55 
Аватара пользователя


27/07/16
557
Кстати, не пользуйтесь printf при отладке.
Она пишет в stdout, буферизованный. Можно не увидеть
последний вывод.Лучше писать в stderr (или сеrr,
coответственно, для с++).

 Профиль  
                  
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 15:24 


07/10/15

2400
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 
Аватара пользователя


27/07/16
557
Дабы расшифровать код, попробуйте вот это:
https://docs.microsoft.com/ru-ru/window ... error-code

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

 Профиль  
                  
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 17:08 


07/10/15

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

 Профиль  
                  
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 18:30 


09/05/16
138
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 


07/10/15

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

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

 Профиль  
                  
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 20:16 
Аватара пользователя


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

 Профиль  
                  
 
 Re: ошибка в оконной программе на С++
Сообщение29.08.2019, 21:57 


07/10/15

2400
Genaa в сообщении #1412775 писал(а):
Вы не пробовали эту функцию вне MATLAB

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

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

-- 29.08.2019, 23:31 --

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2

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



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

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


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

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