![]() |
|
|
![]()
|
|
| bilbobagginz |
|
||||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
привет, странное со мной опять произошло.
Наверное напорол, но никак заметить не могу. О проблеме: есть программа, которая до некоторого времени бежала под вин,лин, и мак. потом решили дяди подточить ее на PDA, масштабировали весь интерфейс на PDA 320х240. делалось всё это на винде. методом:
но получилось так, что часть переменных иногда были не нужны для одной из конфигураций, а другая часть была релевантной только для второй. Короче под винду, программа собралась, запустилась, отладилась, и всё работает. Теперь проверяем ан линукс, и программа скомпилилась, но не запускается. Точнее при запуске выходит несколько похожих ошибок, которые представлены тут: http://rafb.net/p/XU9uMe73.html пробовал дебажить, но программа вылетает до моих классов. Я не знаю даже в чем может быть проблема... может один из моих define-ов как-то перехлестнуслся с wxWidgets:
помогите врубиться в чем дело! -------------------- Я ещё не демон. Я только учусь. |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
А случаем нет статических объектов? Я бы посмотрел бэктрейс и копал уже оттуда.
|
|||
|
||||
| bilbobagginz |
|
||||||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
возможно... я линкую Си-шную библиотеку, и оборачиваю ее Си++снутым классом-wrapper-ом. есть несколько функций, которые я определяю в C++ файле, и объявляю их как статическими. но внутри класса никакой статики вроде бы нет. И еще момент - структура программы не изменилась относительно той версии, в которой проблем нет. Добавлено @ 16:08 бэктрейс чего ? я даже не дохожу до своего кода. Запускаю gdb, "выбираю" брейкпойнт:
запускаю:
получаю зависание. жму Ctl+C, имею:
-------------------- Я ещё не демон. Я только учусь. |
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
вот к чему приводит использование статических переменных.
bilbobagginz, запускай gdb и сразу иди шагами. Скорее всего, проблема в статических объектах. |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
я пробовал! не дошел до main()-а -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| t_rex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 11.10.2006 Где: Украина, г. Запор ожье Репутация: 2 Всего: 7 |
В общем, возможно что у тебя где-то есть статические битмапы (или любое другое чудо, у которого у wxWidgets предусмотрены хэндлеры, например объект файловой системы) и у тебя они пытаются проинициализироваться ДО вызова OnInit. Поэтому лучше всего глобальные переменные статические перекинуть в класс приложения и сделать так чтобы они там не вызывали конструкторов с параметрами при инициализации, а всю инициализацию этих объектов делать в OnInit вручную, а потом уже их юзать.
--------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
хороший hint! но:
только я вроде бы их инциализирую в InitXmlResource(); лучше делать это в каком-то другом порядке ? Кстати. Проблемы начались параллельно с увеличением бит-мапов. Возможно что происходит какое-то переполнение чего-то, и поэтому просто во время инитиализации данные переписывают программу, и просиходит такой глюк ? (ну, и да, у меня таки да эти переменные - static-и., я об их существовании забыл, они как бы инклюдятся себе и вот только сейчас видимо созрела проблема) -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| t_rex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 11.10.2006 Где: Украина, г. Запор ожье Репутация: 2 Всего: 7 |
Вобще все хэндлеры надо в wxApp::OnInit инициализировать т.к. например главное окно ты можешь пересоздать и они проинициализируются заново, поэтому лучше там в OnInit, там же файловые системы, InitXmlResources вроде тоже в OnInit надо, хотя надо глянуть, это ж вроде глобальная функция, так? или ты там сам ее написал?
--------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
Советую сменить схему именования. Переменные и дефайны, первый символ символ которых - подчёркивание, а второй - большая латинская буква, зарезервированы стандартом С++. Не факт, что проблема в этом, но тем не менее. |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
это самописная функция, написал одной левой:
Далее, значиццо так: программу (без изменений) собирал на маке, всё запустилось. собирал на винде - всё запустилось. думаем вместе : в чём могет быть трабла ?!?!?!?! СЦОБАКА... -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| t_rex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 11.10.2006 Где: Украина, г. Запор ожье Репутация: 2 Всего: 7 |
icon_png и остальные если у тебя статические, то они инициализируются до вызова конструктора формы и вызывают коллапс сознания ошибки в работе приложения. Говорю ж, все статические битмапы должны загружаться из файлов ПОСЛЕ добавления хэндлеров.
--------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей |
|||
|
||||
| bilbobagginz |
|
||||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
Для легкости переноса и установки моё приложение должно быть 1-м экзешником, статически слинкованном, ни от чего нестандартного не зависящим, который просто - скопировал, и запустил. всё. (т.е. с моей т.з. wxWidgets - не предустановлен на стандартныe linux версии для PDA, ерго надо к wx-ам линковать статически) Поэтому используется такой метод - чтобы не было какого-то каталога, в котором есть настройки программы, иконки, и т.д. Насколько я понимаю ситуацию - до того, как я начинаю пользоваться данными, они не изображения, а просто набор беспорядочных данных, массивы байтов, не обрабатываемых никакими хэндлерами. изображениями они становятся после инициализации, т.е. после загрузки InitXmlResource(), внутри Init() вызывается CreateControls(), внутри которого есть примерно такой код:
И уже после этого загружается битмап в какую-то wxStaticBitmap, и прорисовывается. т.е. я не вижу противоречия между твоими словами, и моим кодом. Где-то я ошибаюсь ? Если я ошибаюсь, как можно моим подходом отложить загрузку данных, т.е. до "после" ? Огромное Спасибо за помощь, кстати! -------------------- Я ещё не демон. Я только учусь. |
||||
|
|||||
| t_rex |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 11.10.2006 Где: Украина, г. Запор ожье Репутация: 2 Всего: 7 |
Ладно, показываю как правильно
App.h
App.cpp
Frame.h
Frame.cpp
Т.е. Делаем список битмапов члоеном клааса приложения. Потом в OnInit() добавляем все нужныэ хэндлеры После этого загружаем все битмапы И уже затем создаем форму, в коротой эти битмапы можно юзать как хочется. Но основная идея в том чтобы не было такого
потому что если битмапа mySuperGlobalImage статическая то она будет пытаться подгрузиться до вызова OnInit после чего в линухе все покрэшится. Добавлено через 13 минут и 49 секунд ЗЫ: по поводу единого экзешника.. если ты хочешь грузить все картинки из памяти, то надо сначала: Подобавлять в wxImage все хэндлеры Дрбавить к FileSystem ZIP-хэндлер (я чото не очень уверен что wxrc там в InitXmlResources его добавляет, хотя надо смотреть). В общем хэндлер для XRC добавлять после хэндлеров битмапов А уже потом грузить все что надо из XRC или из памяти как там тебе удобней --------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей |
||||||||||
|
|||||||||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
ты сказал, что нужно, чтобы до использования битмапов хэндлеры были загружены. у меня подгрузка хэндлеров происходит в конструкторе класса (наследника от wxDialog). но она происходит тоже ДО создания битмапов. Ведь изначально эти переменные не битмапы, а static unsigned char массивы. Я привел код, показывающий, что именно так и происходит в моей программе. Мои битмапы я переводил из png в
т.е. механизм wxWidget-овской VFS тут не работает до использования wxMemoryStream. Нaсколько я понял главное - это чтобы хэндлер был инициализован ДО использования его функционала. на 1 строчку раньше или на 100 - не важно. т.е. Какая на фиг разница где будет инициализирован хэндлер на PNG до создания объектов из классов wxImage, wxBitmap внутри wxApp или как я сделал: в самом пользовательском классе MyDlg, вызываемом из wxApp? либо ответь на мой вопрос, либо переспроси... ну я имею ввиду, что закидывать меня неактуальным кодом не получится ;-] и еще один момент, повторяюсь. если дано:
то я сомневаюсь, что проблема в программе. Возможно я проапгрейдил какую-то системную библиотеку, на которую полагалась моя родная wxWidgets, и теперь ее нет, и программы накрываются медными тазиками. Сейчас устанавливаю систему OpenSUSE для тестировки. Соберу с ее штатной wxWidgets. Если запустится - ясный пень какие-то системные изменения/проблемы. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| t_rex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 11.10.2006 Где: Украина, г. Запор ожье Репутация: 2 Всего: 7 |
Ээ.. тогда ок, раз не используется VFS тогда да, можно и в конструкторе диалога все сделать.
А по поводу того что в винде все воркает, а в Линухе нет, ну.. так бывает %) сам помню подобные танцы с бубном. Так.. ладно.. ты отлаживать в линухе пробовал? Минимально, если влом ковыряться с GDB, то с помощью wxLogTrace надо бы локализовать строку, на которой падает.. ну а потом все равно лезть внутрь wx'ов и там смотреть пошагово где валится. Если там у тебя только заглушка и не жалко в публичный доступ отдавать, дай мне сорцы, я под Убунтой пересоберу, посмотрим что там и как. --------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |