So-net無料ブログ作成
検索選択

NULL の delete [C++]

前回の修正でビルドが通ったので、ちょちょっと動かして閉じたところ、「Application Output」のウィンドウで「The program has unexpectedly finished.」と言うメッセージが出てました。Macで異常終了していましたが、NetWalkerでも異常終了しているようですね・・。先に進む前にこれの修正をしておきたいと思います。

10062900.png
こちらでも異常終了してますね・・


コードをなめてみたところ、ポインタを delete した後に NULL をセットするのを忘れていた箇所がありました。デストラクタでポインタの解放の要否の判定をしているのですが、判定はその変数が NULL かどうかで行っているため、delete したポインタを再度 delete することが発生していたんですね。修正したら、エラーは出なくなりました。

で、改めて、delete した際に自動で NULL に設定することはできないのか探してみたところ、「NULL を delete しても特に何も起こらない」という記述が・・。これは、deleteの仕様の様です・・。これに従うと、delete 時に自動で NULL を設定できるかどうかはともかく、delete 時にポインタ変数が NULL かどうかはチェックする必要はないということですね。


【参考】
第12章 new/delete - C++編(言語解説)
delete NULL; - オタクのブ。





   

QListの使用とテンプレート [Qt]

先日記載した通り、QtのSVG関連のライブラリはSVG形式での出力はできる様ですが、途中でそのデータをいじることはできないようです。なので、今後、画像を編集することが発生する可能性を考えると、編集用にデータを別途持っておく必要があります。現状、点のデータの集まりになると思われるので、それを保存するためにQListを利用することにします。

まずは、QListの説明に書かれている中で、意識しておいた方がよさそうな点を列挙しておきます。

  • 「QList<T>」は「T」型の配列になっている
  • その前後の領域に事前にメモリを確保するため、append()等が高速
  • 0から始まるインデックス(list[0]等)によるアクセスが可能
  • インデックスによるアクセスでは、アイテムへの参照を返す
  • インデックスによるアクセスを式の左辺で利用することが可能(代入等も可能)
  • 読み出しのみならインデックスによるアクセスよりも、at()の方が高速
  • 格納する型はassignable data type(デフォルトコンストラクタ、コピーコンストラクタ、「=」演算子を持つ)でなければならない
    →「==」演算子も必要そう
  • assignable data type以外の型を格納したい場合は、ポインタを利用する
  • 参照による、挿入、追加、置換はサポートしていない
  • isEmpty()以外のメンバ関数はリストが空で無いことを前提にしている
  • インデックス値を要求するメンバ関数はインデックス値が必ず有効な範囲内にあることを前提にしている
  • QT_NO_DEBUGを定義しておくとインデックス値が範囲外などの場合にそれを検知しない
    →定義しなければ検知してQ_ASSERT()もしくは、Q_ASSERT_X()を発行する


これらを念頭に、画像のデータを線の集まりとして記憶します。その線は点の集まりとして記憶することにします。なお、データはQtlDrawData内で持つことにします。

*

上記を実装するために、下記の通り、QList<QList *> と言う型のメンバを用意しました。

QList<QList *> *draw_data;


ですが、コンパイルすると「template argument 1 is invalid」と言うエラーが出てしまいました。C++の文法的におかしいのか・・?

んんんん~~、「QList<Qlist *>」で検索してみると、ばっちりな記事は出てきませんでしたが、何となくわかった気が・・。

先程のメンバの型を「QList<Qlist<QPoint *> *> *」に変えてみました。

QList<QList<QPoint *> *> *draw_data;


これで、コンパイルが通りました。なるほどですね。テンプレートクラスは内包する型も指定して初めてちゃんとした型になるんですねぇ・・。



【参考】
QList Detailed Description - Qt 4.5.3





   

筆跡の保存 [Qt]

なんとなく、SVGの利用ができそうなことが分かったので、描いたメモをSVG形式で保存する所まで実装してみたいと思います。今のところ、このようなクラス構成になっています。

10061401.png
今の段階のクラス図


一応、QtlDrawDataに描画データを保持しておくつもりにしていますが、今のところQPixmapしか持ってないので、最終結果の画像しか無く、筆跡を逐一保存しているわけではありません。ここに筆跡を保存し、ついでに外からの指示で、ファイルに保存できる様な関数を用意するようにしましょうか。

こういう、筆跡の保存って普通はどうするんでしょうかね・・? 単純に思いついているのは、ペンの位置を逐次リストにでも記憶してそれを線とし、線をさらにリストで保存していくという感じでしょうか・・。

10061402.png
QListを追加しようかと・・


Qtにリストってあるんかなと見ていたら、QListと言うクラスがありました。コンテナクラスの説明もありますね。

いわゆるテンプレートクラスという奴でしょうか。C++のテンプレートって、ちゃんと理解はしてないんですよね・・。


さて、さて。つづく。





FUJITSU ScanSnap S1500 FI-S1500



SVGの利用 [Qt]

さて、とりあえずMac&NetWalkerのマルチプラットフォームでの開発が出来そうだとわかったところで、NetWalkerでの開発の続きに取り組みたいと思います。これまでで、ペンの動作を補足する所まではできましたが、せっかくのベクトルデータなので、この内容をSVGで保存したいと思っています。と言うことで、QtのSVG関連のライブラリを確認してみました。

SVG関連のクラスは「QGraphicsSvgItem」「QSvgGenerator」「QSvgRenderer」「QSvgWidget」があるようです。・・・が、「ECMA scripts and DOM manipulation are currently not supported.」の記載が・・・。また、QtでサポートしているのはSVG 1.2 Tiny の「static features」のみとのことで、よくわからないんですが限られた範囲のもののみの様です。ま、さしあたり線が引ければいいので、たぶんそれは問題ないと思うんですが、「DOM manipulation」がサポートされてないって、SVGデータの読み込みはできても、作成ができないんじゃないじゃないでしょうか…??

ん~~、まずは、「QSvgGenerator」がなんとなくSVGを作成してくれそうな名前なので、見てみました。

*

このクラス、「QPaintDevice」を継承しています。と言うことは、直接書き込みができますね。書き込んだ内容をそのままSVGのデータとして記憶してくれるのでしょうか?? 説明を読んだところ、まさにその通りの様です。ちなみに、ファイル名をセットする関数はあるけど、セーブする関数が見当たりません。・・・と思っていたら、QPainter::end()のタイミングで自動的に保存される様です。ん~、それはちょっとどうなんでしょうね。

上記の通り、このクラスでSVGの作成はできる様ですね。でも、画面への描画はどうなんでしょうか? QPixmapみたいに、描きこんだものをそのままQWidgetなどに貼り込みできるのかとサンプルを見てみましたが、どうもこのクラスはSVGのファイルを生成することだけが目的の様ですね。データを保存するタイミングで、このクラスに対する書き込みを再度行う必要がありそうです。と言うことは、描画のデータとしては、別に保持しておく必要がありますねぇ・・。ま、生成できることがわかったので、それはそれでいいか。


つづく。


【参考】
QtSvg Module - Qt 4.5.3
Scalable Vector Graphics (SVG) Tiny 1.2 Specification - W3C
Feature strings for SVG 1.2 - W3C




<
300円ギフト券↓
[10affivc06030630]
税抜3000円以上で利用可


.pro.userについて [Qt]

前回、「.pro.user」ファイルを削除したらうまくいくとのことだったので、単純に削除(ほんとはリネーム)したんですが、このファイルは何なんでしょうか?「環境毎に作成されるものなので、全ての環境には不要」との意見も見られます。そもそも、どういう過程で作成されたファイルなのかがよくわかりませんね・・。

中身を見てみたら、どうも、QtCreatorの設定ファイルの様な感じです。NetWalkerでのディレクトリ構成などがばっちりファイル内に記述されていました。

まあ、今のところ、大した設定を行ってないので削除しても問題はなさそうですが、ビルド設定などを色々加えだすとほんとにそれでいいのか不安・・。ビルドに必要な設定などはここには含まれないんですかね・・?


【参考】
[Qt-creator] pro.user files?








とりあえず動作・・・でも、他のエラー・・ [Qt]

さて、改めて立ち上げたところ、NetWalker版と違って、前回使ってたプロジェクトがトップに表示されませんね・・。

10052500.png
不便


と思って、画面をよく見てみたら真ん中に「開発」と言う領域が・・。クリックしたところ「最近使ったプロジェクト」と言うのが出てきました。

10052501.png
ありました


NetWalkerの画面と比べてみたら、右端の「コミュニティ」が追加されたため、一画面で表示するのが難しくなったんですかね・・。その分、「Qt Creatorを始めよう」の画面が充実していますが・・。

*

ま、それはさておき、不具合の解消です。面倒ですね・・。検索してみたら、2chで同じ症状の方がいるようです。が、私の場合、Finderで直接出来上がっているアプリを実行した場合、ちゃんと立ち上がったりします・・。

10052502.png
一応、立ち上がっている


でも、終了させるとこんなエラーが出たりします。書き込みしたりせずに立ち上げて終了させるだけなら出ないんですけどね・・。

10052503.png
これを送られてもアップルも困るでしょう


前回出た現象に対する取っ掛かりが無いですね・・。いろいろ、見ていて気になっているところは「プロジェクト」のウィンドウ内の「ビルド時の環境変数」と「実行時の環境変数」「依存関係」。いずれも設定されていません。ビルドは完了しているので、「実行時の環境変数」が怪しいですかね・・。

取っ掛かりが無いので、英語のメッセージを見たいんですが、Qt Creatorには言語設定がなさそうです。仕方が無いので、Macの言語設定を「English」にして、英語でどんなメッセージが出てるのか調べてみました。すると、こんな感じ「Starting...」「Failed to start program. Path or permission wrong?」だとのこと。

10052504.png
これで検索


これで、英語の情報でも引っかかりますかねぇ・・。と、たくさん引っかかりました! と言うことは、みんな悩んでるんですね・・。さて、解決策が見つかるか・・。

いろいろ見ていると、質問は出てるが、回答がついてないという状況・・。そんな中、ひとつだけ、解決策が示されているブログがありました! Qt Creator 1.3 Betaのリリースを連絡するエントリのコメントにつけられていたんですが、同じような状況の質問に対し、「プロジェクトをクローズして、.pro.user ファイルを削除して、再度プロジェクトを開いて、リビルドせよ」とのこと。

試してみたところ、動きました!

10052505.png
.pro.userファイルって何??


そして、ウィンドウを閉じたところ、「プログラムが突然終了した」とのエラーメッセージです。先程出た、アップルへの通知のダイアログも出ましたね。

10052506.png

これも、そっけないメッセージ・・


さ、これはなんなんでしょうか・・? つづく。


【参考】
[Qt-creator] "Failed to startprogram. Path or permissions wrong?" bug?
Qt Creator 1.3 Beta - Qt Creator Blog
qmakeと*.proと*.pro.userの関係について - Qt Users Forum Japan









ブログを作る(無料) powered by So-netブログ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。