Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
klynxe
11 / 11 / 4
Регистрация: 07.09.2012
Сообщений: 542
#1

Ошибки преобразования при передаче указателя на функцию - C++

06.07.2015, 12:24. Просмотров 359. Ответов 5
Метки нет (Все метки)

Есть функция
C++
1
2
3
4
5
6
7
SQLITE_API int SQLITE_STDCALL sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);
речь о 3-ем члене

когда пишу
C++
1
2
3
4
5
6
7
8
callback(void *zs, int argc, char **argv, char **azColName){
    int i;
    for (i = 0; i<argc; i++){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}
все нормально, но как только пытаюсь запихать эту функцию в класс SQLtest получаю ошибки

C++
1
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
1>SQLtest.cpp(47): error C3867: SQLtest::callback: в вызове функции отсутствует список аргументов; используйте SQLtest::callback" для создания указателя на член

или

C++
1
rc = sqlite3_exec(db, sql,  &SQLtest::callback, 0, &zErrMsg);
1>SQLtest.cpp(47): error C2664: "int sqlite3_exec(sqlite3 *,const char *,int (__cdecl *)(void *,int,char **,char **),void *,char **)": невозможно преобразовать аргумент 3 из "int (__cdecl SQLtest::* )(void *,int,char **,char **)" в "int (__cdecl *)(void *,int,char **,char **)"
1> Не существует контекста, в котором такое преобразование возможно
http://www.cyberforum.ru/cpp-beginners/thread1413835.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2015, 12:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибки преобразования при передаче указателя на функцию (C++):

Ошибка при передаче в функцию указателя на элемент массива
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt;...

Ошибки C2280, E1776 при передаче экземпляра ostream в функцию
Ошибки C2280, E1776. Учу С++ по книге Страуструпа и при работе с файлами...

Использование указателя при передаче параметра
Добрый вечер! Надо оформить функцию &quot;LoadTexture&quot;. Вот задачка:...

При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему?
Hi All! class SomeObj { public: int x; }

Функция требующая ссылку компилируется при передаче ей указателя
Такого я еще не видел.... проблемный участок кода находится на скрине... имеем...

5
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
06.07.2015, 12:33 #2
klynxe, функция, если хочешь запихнуть ее в класс, должна быть статической.
Функции класса нужен объект для вызов, чего, очевидно, sqlite3_exec обеспечить не может.
Как вариант можно передать this в качестве 4 параметра, затем сделать обратный каст в callback и осуществить вызов функции класса.
0
klynxe
11 / 11 / 4
Регистрация: 07.09.2012
Сообщений: 542
06.07.2015, 12:34  [ТС] #3
Цитата Сообщение от DrOffset Посмотреть сообщение
klynxe, функция, если хочешь запихнуть ее в класс, должна быть статической.
Функции класса нужен объект для вызов, чего, очевидно, sqlite3_exec обеспечить не может.
Как вариант можно передать this в качестве 4 параметра, затем сделать обратный каст в callback и осуществить вызов функции класса.
А можно пример? то есть написать в классе static int callback(void *zs, int argc, char **argv, char **azColName); достаточно?
0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
06.07.2015, 12:36 #4
Лучший ответ Сообщение было отмечено klynxe как решение

Решение

Цитата Сообщение от klynxe Посмотреть сообщение
А можно пример?
При условии, что callback статическая функция SQLtest, можно так (этот вызов в какой-то из функций класса SQLtest, например SQLtest::exec - это должно быть понятно):
C++
1
rc = sqlite3_exec(db, sql, &SQLtest::callback, this, &zErrMsg);
Внутри callback:
C++
1
2
3
int SQLtest::callback(void *zs, int argc, char **argv, char **azColName){
    return static_cast<SQLtest*>(zs)->sqlCallback(argc, argv, azColName);
}
В классе должна быть функция:
C++
1
2
3
4
5
6
7
8
9
int sqlCallback(int argc, char **argv, char **azColName)
{
    int i;
    for (i = 0; i<argc; i++){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}
1
klynxe
11 / 11 / 4
Регистрация: 07.09.2012
Сообщений: 542
06.07.2015, 13:32  [ТС] #5
Хотя я пока добавил только слово static и эта ошибка пропала
0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
06.07.2015, 13:40 #6
Цитата Сообщение от klynxe Посмотреть сообщение
Хотя я пока добавил только слово static и эта ошибка пропала
Да это понятно, что она пропадет. Но мы же ради чего-то это затеяли?
В смысле функция-член класса нужна для того, чтобы работать с полями этого класса (иначе зачем она вообще?). А если так, то статик функции мало. Т.к. к полям объекта она доступа иметь не будет. Поэтому я тебе привел полное решение, под поставленную задачу.
0
06.07.2015, 13:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2015, 13:40
Привет! Вот еще темы с решениями:

При передаче указателя в качестве аргумента функции теряется значение
Добрый день. Есть простенькая задачка сделать связанный список. При этом...

Ошибка Access violation при передаче указателя в функцию
выделяю память для нужд програмных и соханяю его. char *resadres =(char*)...

Remove_if - при передаче функции класса выдает ошибки
#include &lt;QCoreApplication&gt; #include &lt;vector&gt; using namespace std; template...

Ошибка при передаче в функцию
Хочу передать в функцию строку и там ее заполнить, подчеркивает void...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru