Russian Qt Forum
Ноябрь 23, 2024, 08:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: грубое изменение типа в проекте с qmake  (Прочитано 6785 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Март 27, 2009, 15:39 »

для работы с библиотекой, написанной на С, надо заносить по указателю void* указатели на функции-колбэки (они написаны на С)

вот такое вот

    extern "C" void* add_ptr( void* );
    extern "C" void mvardel( int,int );
....
    retval = add_ptr( reinterpret_cast<void*>(mvardel) );


MinGW, как баран, уперся и ругается, что ISO C++ запрещает преобразовывать указатель на функцию в указатель на объект

при чем тут Qt? при том, что проект переносится на Qt и отлаживается в QtCreator, соответственно используется qmake

бубны и чтение мануалов не помогает - возможности отключить контроль этого преобразования у компилятора в файле проекта qmake найти не удалось, искать такой ключ у GCC даже не стал, потому как не вижу как передать влоб ключи компилятору из проекта

есть тут прямой путь?

или только в обход идти, создавая функции-переходники на С, и втыкая их между колбэками и кодом на С++, и add_ptr вызывать в переходниках
это придется на каждый колбэк переходник делать, их несколько десятков, и вызываются они из разных мест, все перепахивать надо...

/*причем Visual Studio это все пропускает даже без замечаний и все прекрасно работает*/
Записан

2^7-1 == 127, задумайтесь...
Rcus
Гость
« Ответ #1 : Март 27, 2009, 16:03 »

/*shrugs*/ бить C по C Улыбающийся C-style cast еще не отменили Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Март 27, 2009, 16:21 »

в смысле?

retval = add_ptr( (void*) mvardel); // ??

такое он тоже не пропускает, ругань про недопустимое преобразование типа (*)(int,int) в void*

Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #3 : Март 27, 2009, 17:47 »

retval = add_ptr( (void*) mvardel); // ??

такое он тоже не пропускает, ругань про недопустимое преобразование типа (*)(int,int) в void*
А если написать так:
Код
C++ (Qt)
retval = add_ptr( (void*)&mvardel );
 
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Март 29, 2009, 04:26 »

искать такой ключ у GCC даже не стал, потому как не вижу как передать влоб ключи компилятору из проекта

http://doc.trolltech.com/4.4/qmake-manual.html (QMAKE_CXXFLAGS, ...)

P.S. Согласно стандарту всё правильно ругается, т.к. указатель на функцию нельзя гарантированно привести к указателю на объект (т.е. к простому void*).
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Март 30, 2009, 08:09 »

retval = add_ptr( (void*) mvardel); // ??

такое он тоже не пропускает, ругань про недопустимое преобразование типа (*)(int,int) в void*
А если написать так:
Код
C++ (Qt)
retval = add_ptr( (void*)&mvardel );
 

так тоже нельзя

я то понимаю, что он правильно ругается, но обычно ругань можно отключить если действительно надо

в описание qmake я смотрел, способа это сделать не нашел, если есть, ткните меня носом

пришлось функции в переходнике на С передавать, причем достаточно одного переходника, у него параметр "указатель на функцию", ее тип уже нормально приводится

Записан

2^7-1 == 127, задумайтесь...
Tonal
Гость
« Ответ #6 : Март 30, 2009, 08:45 »

Код
C++ (Qt)
#include <iostream>
 
using std::cout;
using std::endl;
 
void f(int, int) {}
 
int add_ptr(void* f) {
 return reinterpret_cast<int>(f);
}
 
int main() {
 cout<<add_ptr((void*)&f)<<endl;
}
 
Таки код нормально компилится и выполняется мингвой.
Плюсовые касты всяко не канают.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Март 30, 2009, 09:04 »

хм... вроде я так тоже пробовал...

хотя мог пропустить этот вариант от усталости в пятницу
Записан

2^7-1 == 127, задумайтесь...
Eugene Efremov
Гость
« Ответ #8 : Апрель 25, 2009, 20:18 »

Ну... Если требуется грубая сила, значит надо использовать грубую силу:

Код
C++ (Qt)
template<class to_t, class from_t> to_t force_cast(from_t t)
{
union
{
to_t to;
from_t from;
} cvt;
cvt.from = t;
return cvt.to;
}
 
void f() {}
 
int main()
{
void (*pf)() = &f;
void *p = force_cast<void* >(pf);
......
 

Да, разумеется, никаких гарантий и все такое. Строго говоря, результат применения такого кода непредсказуем. Но оно сконвертирует что угодно куда угодно, и компилятор это съест. Другой разговор — что будет, когда ты попробуешь этот указатель использовать...

Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #9 : Апрель 27, 2009, 11:21 »

все уже давно работает вот в таком варианте

Код:
    retval = add_ptr( (void*) &mvardel );

Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.363 секунд. Запросов: 22.