Форум программистов, компьютерный форум, киберфорум
Кроссплатфор­менная разработка
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12

Преобразование типа для указателя на функцию

18.01.2014, 16:08. Показов 1584. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть враппер SQLite, которым успешно пользуюсь в CBuilder и MVC. Возникла необходимость портирования в GCC - и случилась неудачка.

C++
1
2
3
4
static void func_handler( sqlite3_context *ctx, int args, sqlite3_value **vals )
{
    ( *reinterpret_cast<SQLite::Function*>( sqlite3_user_data( ctx ) ) )( SQLite::Context( ctx, args, vals ) );
}
На эту конструкцию выпала ошибка: error: no match for call to ‘(SQLite::Function) (SQLite::Context)’

Здесь SQLite - это пространство имен, Function и Context - классы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Context
{
public:
 
    Context( sqlite3_context *aCtx, int aArgs, sqlite3_value **aVals )
           : ctx( aCtx ), args( aArgs ), vals( aVals )
    {}
 
};
 
class Function
{
public:
 
    Function( const std::string& aName, int aArgs );
 
};
Сам вызов в sqlite выглядит так:

C
1
2
3
4
5
6
// Extract the user data from a sqlite3_context structure and return a pointer to it.
 
SQLITE_API void *sqlite3_user_data(sqlite3_context *p){
  assert( p && p->pFunc );
  return p->pFunc->pUserData;
}

Я очень смутно представляю, что именно автор враппера делает в этой конструкции, возможно кто-то из знающих сумеет привести ее к виду, понятному GCC.

Идеальным было бы, если б кто-то еще и объяснил, что именно не понравилось GCC и почему в CBuilder и MVC проблема не возникает.

...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.01.2014, 16:08
Ответы с готовыми решениями:

Преобразование типа или преобразование типа указателя ?
Добрый день. Помогите пожалуйста понять что делает вот эта команда: out.write ((char *) &amp;n, sizeof n); Она что, перед записью в...

Как правильно пользоваться typedef для декларации типа указателя на функцию?
Мне нужны будут функции, принимающие параметр-указатель на функции с одним и тем же списком параметров и возвращаемым типом. Как правильно...

Преобразование типа указателя на С++ Builder XE
Всем здравствуйте, помогите пожалуйста со следующей проблемой! Установил С++Builder XE и загрузил в него полностью рабочий проект со...

7
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
19.01.2014, 23:01
Цитата Сообщение от vantfiles Посмотреть сообщение
На эту конструкцию выпала ошибка: error: no match for call to ‘(SQLite::Function) (SQLite::Context)
Логичная ошибка - SQLite::Function, которую пытается вызвать программа, не является указателем на функцию с параметром SQLite::Context.
Почему билдер и мвс пропускали, у меня нет объяснения. Может, в настройках компилятора стоит опция вовсе не проверять типы для указателей на функции.
Исправить можно, например, через явное приведение типа.
C++
1
2
3
4
static void func_handler( sqlite3_context *ctx, int args, sqlite3_value **vals )
{
    ( (void (*)(SQLite::Context))*reinterpret_cast<SQLite::Function*>( sqlite3_user_data( ctx ) ) )( SQLite::Context( ctx, args, vals ) );
}
Если судить по приведенным фрагментам, код избыточный. Вместо Function* проще было бы использовать void*. reinterpret_cast тоже, желательно, избегать.

Цитата Сообщение от vantfiles Посмотреть сообщение
Я очень смутно представляю, что именно автор враппера делает в этой конструкции
Удваивает количество кода.
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
22.01.2014, 15:02  [ТС]
error: invalid cast from type ‘SQLite::Function’ to type ‘void (*)(SQLite::Context)’
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
22.01.2014, 20:10
Цитата Сообщение от vantfiles Посмотреть сообщение
error: invalid cast from type ‘SQLite::Function’ to type ‘void (*)(SQLite::Context)’
C++
1
( (void (*)(SQLite::Context))reinterpret_cast<SQLite::Function*>( sqlite3_user_data( ctx ) ) )( SQLite::Context( ctx, args, vals ) );
или напрямую, поскольку из приведенного кода смысл промежуточного перевода в Function* не ясен.
C++
1
 ((void (*)(SQLite::Context))( sqlite3_user_data( ctx ) ) )( SQLite::Context( ctx, args, vals ) );
0
9 / 10 / 2
Регистрация: 18.06.2013
Сообщений: 119
25.03.2014, 22:48
пропиши стандарт, в котором программируешь!!!
GCC - набор компиляторов, а нужно в "g++".
Как нужно сделать?
Вот так:
C++
1
g++ -o output_file_name -std=c++11 file_name
Помогло???
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
27.03.2014, 21:23  [ТС]
Здравствуйте, Cryptoff.

Borland C++Builder 6 (год выпуска 2002)
Visual Studio 2010 (год выпуска 2010)
GCC version 4.7.2 (год выпуска 2012)

Исходник компилялся указанными версиями. В первых двух случаях компиляция идет гладко, в последнем - возникает ошибка. Вопрос все-таки больше не в том, как исправить, в данном случае в ветке уже было указано вполне работоспособное решение. Вопрос - в чем конкретно причина такого дифференцирования. Я подозреваю, что причина заключена в разных размерах указателей на функцию и функцию-член. Но четкого объяснения пока что нигде не нашел.

PS: нет, не помогло, да и удивительно было бы, если бы помогло. При чем тут последний стандарт?
0
9 / 10 / 2
Регистрация: 18.06.2013
Сообщений: 119
31.03.2014, 21:39
что пишет компилятор GCC?
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
05.04.2014, 18:48  [ТС]
Я же написал в самом начале:

На эту конструкцию выпала ошибка: error: no match for call to ‘(SQLite::Function) (SQLite::Context)’

Сообщение об ошибке одинаковое - что с ключом, что без ключа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2014, 18:48
Помогаю со студенческими работами здесь

Преобразование указателя одного типа в указатель другого
Помоги пожалуйста составить программу: Преобразовать указатель одного типа в указатель другого.

Передача типа указателя на функцию
Всем привет. Недавно в теме начинающих возник вопрос, а можно ли передать тип (указатель на функцию) без использования typedef: ...

Преобразование кода без указателя в код с использованием указателя
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using...

Forbids casting в dlsym - ISO C++ не поддерживает приведение типа указателя на функцию к указателю на объект
Есть вот такой пример загрузки .so #include &lt;iostream&gt; #include &lt;dlfcn.h&gt; int main() { using std::cout; using...

Как сделать функцию от указателя на класс и указателя на метод?
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru