![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Xuch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 23.12.2013 Репутация: нет Всего: нет |
Друзья, выручайте!
Что-то я в тупике очередном. Ситуация такая: есть функция статическая, которая вызывается по определенному событию. В функцию передается указатель gpointer на класс, содержащий переменную, и в этой функции переменная этого класса устанавливается в "1". Далее мне необходимо уже из не-статического метода этого класса узнать значение этой переменной. Я все время ее вижу как "0", хотя при следующем вызове статической функции она видит эту переменную правильно как "1". Подскажите как мне так сделать, чтобы можно было менять значение переменной класса как из статических методов так и из не-статических. Спасибо! |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
А у Вас и там и там одинаковые экземпляры класса? gpointer - это void *, да? В коде правильное приведение типов? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Xuch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 23.12.2013 Репутация: нет Всего: нет |
Экземпляры одни и те же.. приведение типа правильное.
Остальные члены (не-статические) прекрасно отображаются как в статической функции, так и в не-статической. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
||||
|
||||
Xuch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 23.12.2013 Репутация: нет Всего: нет |
baldina, огромное спасибо!
|
|||
|
||||
Xuch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 23.12.2013 Репутация: нет Всего: нет |
Все равно не работает...
Опишу подробнее. enum RState { NOTINITIALIZED = 0, INITIALIZED, STOPPED, WRITING }; class CType { public: RState State[2]; static void SetRState(gpointer, size_t, RState); static gboolean BusCall(GstBus *, GstMessage *, gpointer); } CType::CType { State[0] = NOTINITIALIZED; State[1] = NOTINITIALIZED; } void CType::SetState(gpointer ptr, size_t i, RState rstate) { CType *Cm = (CType *) ptr; if ((i <= 1) && (i >= 0)) { Cm->RState[0] = rstate; } } gboolean CType::BusCall(GstBus *bus, GstMessage *msg, gpointer data) { CType *Cm = (CType *) data; printf("DEBUG: State[0] = %d\n", State[0]); if (State[0] == NOTINITIALIZED) SetState(Cm, 0, WRITING); printf("DEBUG: State[0] = %d\n", State[0]); --> Здесь правильно выводит статус WRITING } void CType::PrintState(size_t i) { printf("DEBUG: State[%d] = %d\n", i, State[i]); } Если после вызова функции BusCall вызвать функцию PrintState(0), то она всегда будет выдавать значение "0", соответствующее NOTINITIALIZED. При следующем вызове BusCall правильно отобразит ранее измененный статус WRITING, однако какие бы изменения не вносились функцией BusCall, при вызове функции PrintState(0) все равно всегда 0. Честно говоря уже сломал всю голову... |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
это все страшно интересно, но хотелось бы увидеть как эти функции вызываются
|
|||
|
||||
Xuch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 23.12.2013 Репутация: нет Всего: нет |
void CType::Init()
{ gst_bus_add_watch(Bus2, BusCall, this); } Тут BusCall это статическая функция, описанная выше, а this указатель на класс CType |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Xuch, покуда вы будете приводить не ваш код, а только огрызки (к тому же с синтаксическими ошибками), помочь вам будет нельзя. Кстати, пользуйтесь кнопочкой "код".
Из того, что привели удалось слепить вот что http://ideone.com/yJ74C0 и оно работает как и ожидалось. Есть подозрение, что ошибка где-то в другом месте, но вы его скрываете от нас)) Добавлено через 2 минуты и 14 секунд кстати забавная у вас функция
она устанавливает State[0] независимо от параметра i |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
кстати, почему есть SetRState, но нет GetRState? Зачем SetRState статическая? зачем State public?
я бы переделал хотя бы так:
Это сообщение отредактировал(а) baldina - 23.12.2013, 22:43 |
|||
|
||||
Xuch |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 23.12.2013 Репутация: нет Всего: нет |
Я не могу привести весь код, там несколько тыс строк..
Точнее я конечно могу, но думаю будет трудно читабельно
тут ошибся когда набирал, конечно должно быть
Это сообщение отредактировал(а) Xuch - 24.12.2013, 06:23 |
||||
|
|||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Тут Вы тоже ошиблись, когда набирали? Добавлено через 5 минут и 19 секунд Вместе со значением State[0] выводите ещё значение data/this. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Xuch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 23.12.2013 Репутация: нет Всего: нет |
baldina, не работает этот вариант.. Все по-прежнему...
Такое ощущение, что эта переменная в функции BusCall имеет один адрес в памяти, а во всех остальных функциях - другой. Как бы значения этой переменной не менялись, видит их корректно только BusCall, все остальное читает всегда "0". Мыслей больше нет... |
|||
|
||||
Xuch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 23.12.2013 Репутация: нет Всего: нет |
Не дает исходники разместить... пишет макс длина 30000 символов
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
нам не нужны все исходники, только ключевые. например, вы так и не привели код, где вызывается Init() и PrintState(). Т.к. показанный вам код работает, понятно что ошибка у вас есть, и скорее всего где-то еще... Лучше уж весь код показывайте, т.к. предыдущие фрагменты были, мягко говоря, недостоверны. можете zip приаттачить Добавлено через 29 секунд
это легко выяснить отладочной печатью или в отладчике Добавлено через 2 минуты и 7 секунд кстати, раздельная компиляция иногда дает неожиданные ошибки. например, если есть копии заголовочного файла, и они отличаются, могут отличаться размеры структур и классов, это ведет к непредсказуемому поведению. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |