Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
06.07.2015, 12:24     Ошибки преобразования при передаче указателя на функцию #1
Есть функция
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> Не существует контекста, в котором такое преобразование возможно
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2015, 12:24     Ошибки преобразования при передаче указателя на функцию
Посмотрите здесь:

При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему? C++
C++ Мусор в элементах массива при передаче в функцию
Remove_if - при передаче функции класса выдает ошибки C++
C++ Ошибка при передаче в функцию
Неправильная длина строки при передаче в функцию C++
Не работает класс при передаче в функцию объекта C++
Теряется строка при передаче в функцию C++
Порча указателя при передаче в функцию C++
При передаче указателя в качестве аргумента функции теряется значение C++
C++ Ошибка при передаче двумерного массива в функцию
C++ Ошибка при передаче параметра в функцию
Выдает ошибку при передаче массива в функцию C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6795 / 4006 / 920
Регистрация: 30.01.2014
Сообщений: 6,830
06.07.2015, 12:33     Ошибки преобразования при передаче указателя на функцию #2
klynxe, функция, если хочешь запихнуть ее в класс, должна быть статической.
Функции класса нужен объект для вызов, чего, очевидно, sqlite3_exec обеспечить не может.
Как вариант можно передать this в качестве 4 параметра, затем сделать обратный каст в callback и осуществить вызов функции класса.
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
06.07.2015, 12:34  [ТС]     Ошибки преобразования при передаче указателя на функцию #3
Цитата Сообщение от DrOffset Посмотреть сообщение
klynxe, функция, если хочешь запихнуть ее в класс, должна быть статической.
Функции класса нужен объект для вызов, чего, очевидно, sqlite3_exec обеспечить не может.
Как вариант можно передать this в качестве 4 параметра, затем сделать обратный каст в callback и осуществить вызов функции класса.
А можно пример? то есть написать в классе static int callback(void *zs, int argc, char **argv, char **azColName); достаточно?
DrOffset
6795 / 4006 / 920
Регистрация: 30.01.2014
Сообщений: 6,830
06.07.2015, 12:36     Ошибки преобразования при передаче указателя на функцию #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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;
}
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
06.07.2015, 13:32  [ТС]     Ошибки преобразования при передаче указателя на функцию #5
Хотя я пока добавил только слово static и эта ошибка пропала
DrOffset
6795 / 4006 / 920
Регистрация: 30.01.2014
Сообщений: 6,830
06.07.2015, 13:40     Ошибки преобразования при передаче указателя на функцию #6
Цитата Сообщение от klynxe Посмотреть сообщение
Хотя я пока добавил только слово static и эта ошибка пропала
Да это понятно, что она пропадет. Но мы же ради чего-то это затеяли?
В смысле функция-член класса нужна для того, чтобы работать с полями этого класса (иначе зачем она вообще?). А если так, то статик функции мало. Т.к. к полям объекта она доступа иметь не будет. Поэтому я тебе привел полное решение, под поставленную задачу.
Yandex
Объявления
06.07.2015, 13:40     Ошибки преобразования при передаче указателя на функцию
Ответ Создать тему
Опции темы

Текущее время: 09:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru