С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
1

Конвертирование типов или указатель на функцию

15.06.2013, 22:14. Показов 3119. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создаю класс mainwindow, в нём есть функции dispatcher_handler и interception. В interception есть библиотечная функция pcap_loop (Библиотека winpcap). Компилятор выдаёт ошибку:
G:\Qt\Qt5.0.2\Tools\QtCreator\bin\probMon\mainwindow.cpp:231: ошибка: cannot convert 'MainWindow::dispatcher_handler' from type 'void (MainWindow:(unsigned char*, const pcap_pkthdr*, const unsigned char*)' to type 'pcap_handler {aka void (*)(unsigned char*, const pcap_pkthdr*, const unsigned char*)}'


Код .h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include "pcap.h"
#include <remote-ext.h>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void dispatcher_handler(unsigned char *, const struct pcap_pkthdr *, const unsigned char *);
 ...
}
.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void MainWindow::dispatcher_handler(unsigned char *state, const struct pcap_pkthdr *header, const unsigned char *pkt_data){
    struct timeval *old_ts = (struct timeval *)state;
        u_int delay;
        LARGE_INTEGER Bps,Pps;
        ....
}
 
void MainWindow::interception(QString nameAdapter){
    pcap_t *fp;
    char errbuf[PCAP_ERRBUF_SIZE];
    struct timeval st_ts;
...
    pcap_loop(fp, 0, dispatcher_handler, (PUCHAR)&st_ts);
 
...
}
Если делать это не в классе, то всё работает
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.06.2013, 22:14
Ответы с готовыми решениями:

конвертирование или приведение типов
есть две переменные типа object, мне нужно: -одну преобразовать в тип OperationRequest, -другую...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая...

Конвертирование типов
Как сконвертировать тип OleVariant в String или какой-нибудь нормальный Delphi'йский???

Указатель на функцию или делегат
Как в java сделать указатель на функцию ? Суть такова что есть класс в котором один из методов...

13
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.06.2013, 03:01 2
StalkerSmerch, я совсем не знаю Qt.
Подозреваю, что хотя dispatcher_handler конечно видно в interception(QString nameAdapter) как методе класса (думаю нестатическом, - догадка)), для pcap_loop - библиотечной функции (тоже догадка) может быть не достаточно данных для получения адреса метода, для данного экземпляра MainWindow.
А что если попробовать создать поле - указатель:
C++
1
void (*ptr_dispatcher_handler) (unsigned char *, const struct pcap_pkthdr *, const unsigned char *);
и где-то (в коеструкторе напр):
C++
1
ptr_dispatcher_handler=&MainWindow:: ptr_dispatcher_handler;
ну и в вызове внутри метода:
C++
1
2
3
4
5
interception(QString nameAdapter){
//////////
pcap_loop(fp, 0, this->*ptr_dispatcher_handler, (PUCHAR)&st_ts);
/////////
}
2
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
16.06.2013, 11:24 3
По хорошему тема не относится к Qt, а все из-за незнания StalkerSmerch, IGPIGP С++.
В C++ для вызова метода через указатель, в Си++ требуется указатель на объект и указатель на метод.
Используй для каллбека статический метод, или функцию обертку.
2
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
16.06.2013, 12:31  [ТС] 4
Dmitriy_M,
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
В C++ для вызова метода через указатель, в Си++ требуется указатель на объект и указатель на метод.
Это ведь так?
C++
1
    pcap_loop(fp, 0, this->dispatcher_handler, (PUCHAR)&st_ts);
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Используй для каллбека статический метод
Можно по точнее? dispatcher_handler должен быть static или что?
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
16.06.2013, 18:24 5
Цитата Сообщение от StalkerSmerch Посмотреть сообщение
Это ведь так?
В стандартном С++ не так. Если не ошибаюсь в компиляторе от Borland был особый тип указателя на метод, который содержал информацию об объекте.
Цитата Сообщение от StalkerSmerch Посмотреть сообщение
dispatcher_handler должен быть static
Да. Статические методы класса существуют до создания любого экземпляра этого класса, и существуют когда нет ни одного экземпляра этого класса.

Если правильно понял документацию, то четвертый параметр pcap_loop указатель на пользовательские данные, а это значит, что можно создать структуру содержащая указатель на объект, которому нужно передавать данные при вызове обработчика.
1
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
16.06.2013, 23:42  [ТС] 6
Dmitriy_M,
Ошибка:
G:\Qt\Qt5.0.2\Tools\QtCreator\bin\probMon\mainwindow.cpp:144: ошибка: cannot declare member function 'static void MainWindow::dispatcher_handler(unsigned char*, const pcap_pkthdr*, const unsigned char*)' to have static linkage [-fpermissive]

Объявляю в .h:
C++
1
    void static dispatcher_handler(unsigned char *, const struct pcap_pkthdr *, const unsigned char *);
Объявляю в .cpp:
C++
1
void  static MainWindow::dispatcher_handler(unsigned char *state, const struct pcap_pkthdr *header, const unsigned char *pkt_data){
Не хочет работать

Добавлено через 1 час 44 минуты
Всё, разобрался.
Но появился новый вопрос.
А как указывать на создаваемый объект класс(this не работает) в dispatcher_handler? Можно создавать только новый объект.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
17.06.2013, 00:51 7
Цитата Сообщение от StalkerSmerch Посмотреть сообщение
А как указывать на создаваемый объект класс(this не работает) в dispatcher_handler? Можно создавать только новый объект.
читай предыдущее сообщение, четвертый параметр pcap_loop на что?
1
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
17.06.2013, 01:06  [ТС] 8
Dmitriy_M,
Так? Или надо обязательно структуру создавать?
C++
1
pcap_dispatch(fp, 1, MainWindow::dispatcher_handler,  (MainWindow*)this);
Но в любом случае выдаёт ошибку:
G:\Qt\Qt5.0.2\Tools\QtCreator\bin\probMon\mainwindow.cpp:251: ошибка: cannot convert 'MainWindow*' to 'u_char* {aka unsigned char*}' for argument '4' to 'int pcap_dispatch(pcap_t*, int, pcap_handler, u_char*)'
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
17.06.2013, 14:00 9
Цитата Сообщение от StalkerSmerch Посмотреть сообщение
Или надо обязательно структуру создавать?
От тебя зависит, т.к. вот это твой код
C++ (Qt)
1
2
3
   struct timeval st_ts;
...
    pcap_loop(fp, 0, dispatcher_handler, (PUCHAR)&st_ts);
Цитата Сообщение от StalkerSmerch Посмотреть сообщение
Но в любом случае выдаёт ошибку:
Приведение типов в C++
1
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
23.06.2013, 01:53  [ТС] 10
@Dmitriy_M,
Не получается так.
Видимо я что-то не понимаю
C++
1
2
3
void monitoring::dispatcher_handler(monitoring *lol, const struct pcap_pkthdr *header, const unsigned char *pkt_data)
...
pcap_dispatch(adapter, 0, dispatcher_handler, (unsigned char)this);
Ошибки:

G:\Qt\Qt5.0.2\Tools\QtCreator\bin\probMon\monitoring.cpp:110: ошибка: cast from 'monitoring*' to 'unsigned char' loses precision [-fpermissive]

G:\Qt\Qt5.0.2\Tools\QtCreator\bin\probMon\monitoring.cpp:110: ошибка: invalid conversion from 'void (*)(monitoring*, const pcap_pkthdr*, const unsigned char*)' to 'pcap_handler {aka void (*)(unsigned char*, const pcap_pkthdr*, const unsigned char*)}' [-fpermissive]

G:\Qt\Qt5.0.2\Tools\QtCreator\bin\probMon\monitoring.cpp:110: ошибка: invalid conversion from 'unsigned char' to 'u_char* {aka unsigned char*}' [-fpermissive]


Добавлено через 27 минут
Или можно ли как нибудь по другому вызвать метода этого класса?
Т.е. сделать вот так:
emit outputStatBPS(buf);
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
23.06.2013, 19:32 11
Цитата Сообщение от StalkerSmerch Посмотреть сообщение
Видимо я что-то не понимаю
Цитата Сообщение от StalkerSmerch Посмотреть сообщение
(unsigned char)this
Пойдите и поучитесь языку программирования Си и Cи++.
0
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
25.06.2013, 21:19  [ТС] 12
@Dmitriy_M, попробовал.
Пишет:

G:\Qt\Qt5.0.2\Tools\QtCreator\bin\probMon\monitoring.cpp:13: ошибка: invalid cast from type 'unsigned char*' to type 'monitoring::bufInf'
G:\Qt\Qt5.0.2\Tools\QtCreator\bin\probMon\monitoring.cpp:14: ошибка: invalid cast from type 'timeval' to type 'timeval*'
G:\Qt\Qt5.0.2\Tools\QtCreator\bin\probMon\monitoring.cpp:114: ошибка: invalid cast from type 'monitoring::bufInf' to type 'timeval'

Хотя, написано что reinterpret_cast вообще пофиг на принимаемый тип данных. Что делать? Может где указатель нужен или ещё что-то?

Код в monitoring.h:
C++
1
2
3
4
5
6
7
public:
    monitoring();
    static void dispatcher_handler(unsigned char *, const struct pcap_pkthdr *, const unsigned char *);
    struct bufInf{
        struct timeval st_ts;
        monitoring *rand;
    };
Код в .cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct timeval st_ts;
    bufInf pro;
    pro.st_ts=st_ts;
    pro.rand=this;
    struct timeval st_tss = reinterpret_cast<struct timeval>(pro);
    pcap_dispatch(adapter, 0, dispatcher_handler, (PUCHAR)&st_tss);
 
...
 
 
    void monitoring::dispatcher_handler(unsigned char *state, const struct pcap_pkthdr *header, const unsigned char *pkt_data){
    bufInf pro = reinterpret_cast<bufInf>(state);
    struct timeval *old_ts = (struct timeval *)pro.st_ts;
...
0
Заблокирован
25.06.2013, 22:27 13
C
1
2
3
void dispatcher_handler(unsigned char *, const struct pcap_pkthdr *, const unsigned char *); // <- указатель на этот метод?
 
pcap_loop(fp, 0, dispatcher_handler, (PUCHAR)&st_ts); // <- надо передать сюда?
Я как бэ не уверен (понятия не имею что там ждет pcap_loop), но попробовал бы так:

C
1
pcap_loop(fp, 0, [this](unsigned char *a, const struct pcap_pkthdr *b, const unsigned char *c) { dispatcher_handler(a, b, c); }, (PUCHAR)&st_ts)
И еще тут опечатки могут быть, но я не вижу сходу.
0
1 / 1 / 2
Регистрация: 04.03.2012
Сообщений: 159
26.06.2013, 14:41  [ТС] 14
@rrrFer, вы правильно поняли. Но выдаёт это:
G:\Qt\Qt5.0.2\Tools\QtCreator\bin\probMon\monitoring.cpp:117: ошибка: cannot convert 'monitoring::interception(pcap_t*)::<lambda(unsigned char*, const pcap_pkthdr*, const unsigned char*)>' to 'pcap_handler {aka void (*)(unsigned char*, const pcap_pkthdr*, const unsigned char*)}' for argument '3' to 'int pcap_dispatch(pcap_t*, int, pcap_handler, u_char*)'
0
26.06.2013, 14:41
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.06.2013, 14:41
Помогаю со студенческими работами здесь

Конвертирование типов данных
Как конвертировать тип String в тип PAnsiChar?И обратно?:eek:

Конвертирование типов данных
Нужно обработать данные. Пропустить их через кучу функций, каждая из них требует свой тип данных....

Конвертирование в bool собственных типов
Здравствуйте! Класс rnode оболочка над указателем для подсчета ссылок. Вот код: class rnode...

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru