Russian Qt Forum
Сентябрь 30, 2024, 16:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с QIODevice::open/close и Unix open/close  (Прочитано 8398 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Май 16, 2009, 22:07 »

Доброго времени суток!

Делаю класс наследник от QIODevice , который должен работать в Linux с файлами.
Проблема в том, что в Linux в хейдере "fcntl.h"  функции открытия и закрытия файлов называются: open и close, а также в QIODevice тоже есть ф-ции open и close, и поэтому возникает проблема при компиляции моего дочернего класса:
Цитировать
posixserialdevice.cpp: In member function ‘virtual bool TPosixSerialDevice::open(QFlags<QIODevice::OpenModeFlag>)’:
posixserialdevice.cpp:113: ошибка: нет подходящей функции для вызова ‘TPosixSerialDevice::open(QByteArray, int&)’
posixserialdevice.cpp:83: замечание: претенденты: virtual bool TPosixSerialDevice::open(QFlags<QIODevice::OpenModeFlag>)
posixserialdevice.cpp: In member function ‘virtual void TPosixSerialDevice::close()’:
posixserialdevice.cpp:182: ошибка: нет подходящей функции для вызова ‘TPosixSerialDevice::close(int&)’
posixserialdevice.cpp:175: замечание: претенденты: virtual void TPosixSerialDevice::close()
posixserialdevice.cpp: At global scope:
posixserialdevice.cpp:201: ошибка: expected unqualified-id before ‘/’ token
posixserialdevice.cpp:201: ошибка: expected constructor, destructor, or type conversion before ‘/’ token
make: *** [build/obj/posixserialdevice.o] Ошибка 1
[den@myhost src]$   

т.е. мне нужно чтобы работал примерно вот такой код:
Код:
/*!
\fn void TPosixSerialDevice::close()

\en Closes a serial port.  This function has no effect if the serial port associated with the class
    is not currently open.
\ru Закрывает последовательное устройство.
    Эта функция не будет работь если до этого порт не был корректно открыт.
*/
void TPosixSerialDevice::close()
{
....
....
        if (close(fd)==-1) { <<<<<< ВОТ ТУТ КОМПИЛЯТОР НЕ ЗНАЕТ КАКУЮ ФУНКЦИЮ ПОДСТАВИТЬ !!!
            TTY_PORTABILITY_DEBUG("TPosixSerialDevice::close->close! Error!");
        }
    }//if isOpen() &&&&&
    QIODevice::close();
}

где TPosixSerialDevice - класс наследник от QIODevice !!!
Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #1 : Май 16, 2009, 22:19 »

"::close"?
А чем QFile не понравился?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Май 16, 2009, 22:34 »

Цитировать
"::close"?
А чем QFile не понравился?
Не хочу лишнее

единственное что приходит в голову - это создать какой нибудь файл convert.h
c таким содержанием
Код:
#include <fcntl.h>		/* File control definitions */

// тут переназываю функции
int new_open(int fd, int flags)
{
return open(fd, flags);
}
// и аналогично с close

и потом уже подключать convert.h к хейдерам где есть класс QIODevice и вызывать ф-ии new_open и new_close
Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #3 : Май 16, 2009, 22:47 »

Не хочу лишнее
В таком случае могу посоветовать C90 Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Май 16, 2009, 22:49 »

обожаю людей, изобретающих велосипед...
попробуй namespace abc{ #include <fcntl>}. Если не поможет, то через доп файл
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Май 16, 2009, 23:24 »

а могу сделать так:
Код:
#define open new_open

Непонимающий

через  namespace abc{ #include <fcntl>} не получается
Записан

ArchLinux x86_64 / Win10 64 bit
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Май 16, 2009, 23:31 »

проверил:
Код:
class MainWindow : public QMainWindow
{
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void open(){}
};
Код:
#include "mainwindow.h"

namespace abc
{
    #include <fcntl.h>
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    open();
    abc::open("lol", 0);
}
работает
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Май 16, 2009, 23:53 »

хм, пока что я сделал так:
Код:
#include <fcntl.h>					//тут определены open и close
int opendevice(const char *pathname, int flags) { return open(pathname, flags); }
int closedevice(int fd) { return close(fd); }
#include <unistd.h> // тут определены read и write
ssize_t readdevice(int fd, void *buf, size_t count) { return read(fd, buf, count); }
ssize_t writedevice(int fd, const void *buf, size_t count) { return write(fd, buf, count); }

но с пространством имен еще раз сейчас проверю
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Май 17, 2009, 00:07 »

сделал так:
Код:
namespace abc //serial device i/o
{
#include <fcntl.h>
#include <unistd.h>
}

"прокатил" только вызов open. вызовы close, read, write выдали ошибки:
Цитировать
...
...
posixserialdevice.cpp:182: ошибка: ‘close’ не является элементом ‘abc’
...
...
Записан

ArchLinux x86_64 / Win10 64 bit
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Май 17, 2009, 00:16 »

дейстаительно... странно это, ну да ладно:) зато работает, как написано во 2м посте
Код:
    ::open("lol", 0);
    ::close(10);
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Май 17, 2009, 02:56 »

>>if (close(fd)==-1) { <<<<<< ВОТ ТУТ КОМПИЛЯТОР НЕ ЗНАЕТ КАКУЮ ФУНКЦИЮ ПОДСТАВИТЬ !!!
а тут чья функция? (я тоже не знаю)
Записан

Юра.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Май 17, 2009, 08:56 »

unistd.h -> int close(int d); d - дескриптор
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #12 : Май 17, 2009, 14:13 »

Улыбающийся

спасибо всем! сделал как сказано в посте №2 и вроде ругаться компилятор перестал!

можно ставить тег [РЕШЕНО] Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.146 секунд. Запросов: 22.