Russian Qt Forum

Qt => Общие вопросы => Тема начата: kuzulis от Май 16, 2009, 22:07



Название: Проблема с QIODevice::open/close и Unix open/close
Отправлено: kuzulis от Май 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 !!!


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: Rcus от Май 16, 2009, 22:19
"::close"?
А чем QFile не понравился?


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: kuzulis от Май 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


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: Rcus от Май 16, 2009, 22:47
Не хочу лишнее
В таком случае могу посоветовать C90 :)


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: Авварон от Май 16, 2009, 22:49
обожаю людей, изобретающих велосипед...
попробуй namespace abc{ #include <fcntl>}. Если не поможет, то через доп файл


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: kuzulis от Май 16, 2009, 23:24
а могу сделать так:
Код:
#define open new_open

???

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


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: Авварон от Май 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);
}
работает


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: kuzulis от Май 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); }

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


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: kuzulis от Май 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’
...
...


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: Авварон от Май 17, 2009, 00:16
дейстаительно... странно это, ну да ладно:) зато работает, как написано во 2м посте
Код:
    ::open("lol", 0);
    ::close(10);


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: lit-uriy от Май 17, 2009, 02:56
>>if (close(fd)==-1) { <<<<<< ВОТ ТУТ КОМПИЛЯТОР НЕ ЗНАЕТ КАКУЮ ФУНКЦИЮ ПОДСТАВИТЬ !!!
а тут чья функция? (я тоже не знаю)


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: Авварон от Май 17, 2009, 08:56
unistd.h -> int close(int d); d - дескриптор


Название: Re: Проблема с QIODevice::open/close и Unix open/close
Отправлено: kuzulis от Май 17, 2009, 14:13
:)

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

можно ставить тег [РЕШЕНО] :)