FRAM(/dev/mtdblock4)のデバイスファイルをQFile
で開き
seek
で所定の位置まで移動して、wirte
でデータを書く
という流れの処理をしています。
コンパイルのQtバージョンは5.3.2で、実行環境もQt5.3.2
の状態でアプリを起動すると、seek
を呼んでいるところで
QIODevice::seek: Cannot call seek on a sequential device
というエラー?警告?文が表示されます。
言葉通りなら
シーケンシャルデバイスではシークできないよと言っているのだと思います。
確かにQtのドキュメントにも
For sequential devices, the default behavior is to do nothing and return false.
と書いているため、シーケンシャルデバイスの場合何もしないということになります。
seek
の戻り値がfalseになっていたことも確認済みです。
しかし、実際にFRAMの中身を見てみると
しっかりとシークをした位置にデータを書き込んでいることが確認できました。
というかそもそもFRAMはランダムアクセスだと思うので、前提の部分でおかしいです。
isSequential
を呼んでみるとfalseが返ってくるため、しっかりとランダムアクセスデバイスとして
認識は出来ているみたいです。
また、コンパイルしたものはそのままで実行環境をQt5.7.1で実行してみると
問題の警告文が表示されなくなります。
このことからQtのバグなのではと推測したのですが
これに関するバグレポートや修正に関する文書が見つけられず困っています。
これがただ単に間違って警告が出てしまうだけだというなら、
表示される警告を無視、出来れば表示しないようにしてそのままQFile
のseek
を使い続けようと思っているのですが
他に致命的なバグが存在するようなのであれば、C++の関数に処理を書き換えようと思っております。
何かコレに関する情報をご存知の方、ちょっとしたことでもいいので教えていただけませんでしょうか?
よろしくお願いします。
###追記
Qt5.3.2のソースを見ていたところ
C++
1bool QIODevice::isSequential() const 2{ 3 return false; 4}
というのを見つけました
つまりどんな状況でもfalseしか返さないので、実質シーケンシャルデバイスを認識するのは不可能?
そうなってくるとなぜ警告文が出てくるのか、なおさら分からなくなってしまいました...
###追記2
QFile::seek() on character devices not working
該当の問題だと思われるバグのページを見つけていました...
割と最初に見つけていたのに勝手に勘違いしてスルーしていました...
恐らくこれだと思われるので
今一度、検討をしてみたいと思います
回答2件
あなたの回答
tips
プレビュー