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

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

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

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

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

Порча указателя при передаче в функцию - 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...

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

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

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++
В ДЗ есть пример кода, помогите пожалуйста исправить, до работающего варианта (VS2015). Ошибки: (32) error C2660: strcpy_s: функция не...

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

Ошибка при передаче двумерного массива в функцию - C++
Помогите пожалуйста, никак не могу разобраться. Я хочу чтобы функция createBlankGameField() ввела данные в массив gameField созданный в...

Мусор в элементах массива при передаче в функцию - C++
Доброго времени суток, столкнулся с данной проблемой в CLI, попробовал реализовать аналог для консольного приложения всё работает, почему...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6929 / 4122 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
06.07.2015, 12:33     Ошибки преобразования при передаче указателя на функцию #2
klynxe, функция, если хочешь запихнуть ее в класс, должна быть статической.
Функции класса нужен объект для вызов, чего, очевидно, sqlite3_exec обеспечить не может.
Как вариант можно передать this в качестве 4 параметра, затем сделать обратный каст в callback и осуществить вызов функции класса.
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 538
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
6929 / 4122 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
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
Сообщений: 538
06.07.2015, 13:32  [ТС]     Ошибки преобразования при передаче указателя на функцию #5
Хотя я пока добавил только слово static и эта ошибка пропала
DrOffset
6929 / 4122 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
06.07.2015, 13:40     Ошибки преобразования при передаче указателя на функцию #6
Цитата Сообщение от klynxe Посмотреть сообщение
Хотя я пока добавил только слово static и эта ошибка пропала
Да это понятно, что она пропадет. Но мы же ради чего-то это затеяли?
В смысле функция-член класса нужна для того, чтобы работать с полями этого класса (иначе зачем она вообще?). А если так, то статик функции мало. Т.к. к полям объекта она доступа иметь не будет. Поэтому я тебе привел полное решение, под поставленную задачу.
Yandex
Объявления
06.07.2015, 13:40     Ошибки преобразования при передаче указателя на функцию
Ответ Создать тему
Опции темы

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