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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 542
#1

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

06.07.2015, 12:24. Просмотров 323. Ответов 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> Не существует контекста, в котором такое преобразование возможно
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2015, 12:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибки преобразования при передаче указателя на функцию (C++):

Порча указателя при передаче в функцию - C++
Добрый вечер. Проблема такая - при передаче в функцию структуры, полем которой является указатель на указатель, последний портится....

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

Ошибки C2280, E1776 при передаче экземпляра ostream в функцию - C++
Ошибки C2280, E1776. Учу С++ по книге Страуструпа и при работе с файлами появилась такая проблема. Как решить? //Source.cpp #include...

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

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

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

5
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,293
06.07.2015, 12:33 #2
klynxe, функция, если хочешь запихнуть ее в класс, должна быть статической.
Функции класса нужен объект для вызов, чего, очевидно, sqlite3_exec обеспечить не может.
Как вариант можно передать this в качестве 4 параметра, затем сделать обратный каст в callback и осуществить вызов функции класса.
0
klynxe
10 / 10 / 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
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,293
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;
}
1
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 542
06.07.2015, 13:32  [ТС] #5
Хотя я пока добавил только слово static и эта ошибка пропала
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,293
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 при передаче указателя в функцию - C++
выделяю память для нужд програмных и соханяю его. char *resadres =(char*) VirtualAlloc (0, 50000, MEM_COMMIT | MEM_RESERVE,...

Remove_if - при передаче функции класса выдает ошибки - C++
#include &lt;QCoreApplication&gt; #include &lt;vector&gt; using namespace std; template &lt;class T&gt; class c_equ { protected: T equ; ...

Ошибка при передаче в функцию - C++
Хочу передать в функцию строку и там ее заполнить, подчеркивает void karta(MyStruct s.karta,int size); И пишет: 1 IntelliSense:...

Теряется строка при передаче в функцию - C++
Привет Замучался копать уже. Теряется строка при передаче её в функцию. Код такой: char* Read() { char str = &quot;1 2 3 4&quot;; ...


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

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

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