ROOTStudy

木曜日, 3月 29, 2007

トラブル VC++:間違えて作ったイベントハンドラを削除する方法

Class Wizardなどでイベントハンドラ処理関数を生成すると、
複数のファイルに記述されてしまうため
間違えたときに(インプリメントを手動で削除せよと言われて)混乱する。

1:MainFrm.h

// 生成されたメッセージ マップ関数
//{{AFX_MSG(CMainFrame)
protected:
afx_msg int On...()

2:MainFrm.cpp

int CMainFrame::On...(){}//関数の実体(インプリメントとはこのこと)

3:MainFrm.cpp

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
// この位置に生成されるコードを編集しないでください。
ON_...

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

水曜日, 3月 28, 2007

VC++:ViewクラスのOnDraw関数以外からpDCを取得する

GetDC()コマンドで呼べる。

Viewクラス内関数で
CDC *pDC = GetDC();

pDCで描画ができる。

C++でクラスを宣言しCのように関数を使いたい場合

クラスヘッダをインクルードして、
::で直接呼び出す方法が便利。
ただし staticで宣言すること。

(a.hファイル内)
class a{
public:
static char write();
a();//コンストラクタ
~a();//デストラクタ
};

(a.cpp ファイル内)
#include"a.h"

char write(){
return 'a';
}

(main.cppファイル内)
#include "a.h"
main(){
char c;
c = a::write();
}

もしオブジェクトを作る場合は
#include "a.h"
main(){
char c;
a aobj;//変数型
c = aobj.write();

}

オブジェクトを動的に生成する場合は
"include "a.h"
main(){
char c;
a *aobj = new a();
c = aobj->write();
delete aonj;
}//new とdeleteが入るので面倒

VC++:ViewクラスからDocクラスのポインタを取得

ヒント:View::OnDraw関数の頭に同じ記述がある。

CWindowtest2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

pDocがドキュメントのポインタを取得した状態になる。

VC++:DocクラスからViewクラスのポインタを取得

プロジェクトが Windowtest2である場合

CWindowtest2View* pView = ((CWindowtest2View*)(((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView()));

でpViewはViewポインタを取得できる。

トラブル:自作クラスがVC++6.0に組み込まれない

現象:
プリコンパイル済みヘッダー・・・予期しないEOFを検出しました、などと出る

原因:
1:"stdafx.h"がクラスヘッダの最上部にない、という切り口から
stdafx.hはMSDEVと連携して、
登録されたファイルを"cl.exe"に送るため。

2:プロジェクト-設定-C/C++のカテゴリ:プリコンパイル済みヘッダーが
"自動的に使用"になっている場合。

対策:
stdafx.hを書き加えてよい場合は
ヘッダの最上部に
#include "stdafx.h"
を追加
だめな場合は
プロジェクト-設定-C/C++のカテゴリ:プリコンパイル済みヘッダーで
”プリコンパイル済みヘッダーを使用しない”にラジオボタンをセット。

土曜日, 3月 17, 2007

トラブル:vixy.netからダウンロードした動画の音が出ない

問題:
youtube→vixy.net経由で高画質のflvファイルをダウンロードすると、
音声が再生しない場合がある。

原因:
vixy.netのエンコードが対応し切れていない?

対策:
youtubeで動画を選択し、ダウンロードが終わると、
viewerのゲージが赤になる。
その後
c:\documents and settings\user\local settings\temporary internet files\に
youtubeで表示したファイルがyoutubeのアドレスと同じ名前で保存されている。
http://www.youtube.com/watch?v=xxxxxxxxx)xxxxxxxxxがファイル名になっている
このファイルを違うフォルダに保存し、拡張子を*.flvとつける。
あとは携帯動画変換君で
http://www.forest.impress.co.jp/lib/home/ktai/ktaipic/keitaidouga.html
変換すればOK。

補足:
903SHで高画質動画が見たいときは
http://www.kaisentonya.or.tv/v903sh/index.html
からスマートなTranscoding_3GPP_AAC_XviD_903SH.iniを取得。
(解説あり)

携帯動画変換君とcygwinのトラブル

携帯動画変換君はcygwinのdllを読んでいるため、
cygwin起動中は変換作業ができない。

金曜日, 3月 16, 2007

データフォーマット(MSB, LSB)

unix系なのでデフォルトが"MSB"になっているが、
Intel80X86系は"LSB"である。
バイナリ読み込みを試みる際に注意。

トラブル:cygwinでwindowsディレクトリ名がわからない

cygwin上ではUnixライクなのでファイル名が"c:\"のようには書けず、
/cygdrive/c/...
のように指定する。

トラブル:OpenDXのメモリ確保

cygwin & OpenDXで512x512x96サイズのデータを扱おうとしたところエラーが出た。
Error Import: ---- too large for large arena
対策:
x windowでdxを立ち上げる前に
"DXMEMORY=512; export DXMEMORY" (リターン)
と入力すると、
環境変数envに512MB予約の試みが登録される。

または、

マイコンピュータ→プロパティ→詳細設定タブ→環境変数のユーザー環境変数に
変数      値
DXMEMORY 512
と入力してcygwinを起動する。

Visual C++ (VC6.0)トラブル

「ClassView情報を取得できません」と出たとき

タスクマネージャを起動して、
MSDEV.EXEを終了させる。

木曜日, 3月 15, 2007

cygwin とOpexDXのインストール・トラブル

発端:
OpenDXはWindows Applicationだと思っていた。
知ったこと:
OpenDXはUnix系のX Serverが必要である。
対応:
cygwinを導入する。
トラブル:
・cygwinの"setup.exe"はデフォルトでX11をインストールしない(!)
・cygwinの「環境設定」を設定すること。
・OpenDXの展開ディレクトリが分からない
・OpenDXの「環境設定」が分からない

調べたこと:

・cygwinの"setup.exe"[Select Packages]では「Devel,Graphics,Math,X11」を
"Default"をクリックして"Install"に変えておく
http://www.ysc-aqua.co.jp/oboegaki/dx/dx1.htm

・cygwinの環境設定

マイコンピュータ→プロパティ→詳細設定タブ→環境変数で
ユーザ環境変数で
変数       値
CYGWIN    ntsec
HOME      /home/xxx (xxxは任意の名前)
path       D:\cygwin\bin;D:\cygwin\usr\X11R6\bin   (追加)
(この場合cygwinインストールディレクトリはD:\cygwin)

・開いたついでにOpexDX用環境設定も先に済ませる
変数       値
path       D:\cygwin\usr\local\dx\bin;
DXROOT    D:\cygwin\usr\local\dx
(この場合OpenDX展開位置は\(後述))

・OpexDXダウンロード
http://www.ysc-aqua.co.jp/oboegaki/dx/dx1.htm
最新版(ver 4.4.1)で試してもよいが
opendx-4.3.0-rtc-cygwin.tar.gz
が安定版
登録すると送られるメールの中にダウンロードアドレスが書かれている
If your platform is not listed here or you need to
download an older version of the binaries. Please visit "......"
(メールアドレスを登録すると出るアドレスへ飛ぶ)

・opendx-4.3.0-rtc-cygwin.tar.gzを
D:\cygwin  に置く(ルートディレクトリ)
・cygwin起動(デスクトップのアイコンから)
まずcygwinコンソールで
"cd /"(リターン)
と入力するとルートディレクトリに移動する
"ls"(リターン)
でopendx-4.3.0-rtc-cygwin.tar.gzが見えることを確認
http://www.ysc-aqua.co.jp/oboegaki/dx/dx1.htm

・OpenDX展開
cygwinコンソールで
"tar zxvf opendx"(リターン)
で展開される

これで前述した環境変数と同じ場所にdx.exeができる
・x開始
cygwinコンソールで
"startx"(リターン)
または
"startxwin.sh""(リターン)
でx-windowが立ち上がる
この時"clipboard"エラーが出るが、しばらく待つと起動はしてくれる

気になる場合は
D:\cygwin\usr\X11R6\bin\startxwin.sh
をテキストファイル(Terapadなど)で開き
XWin -multiwindow -clipboard -silent-dup-error &
の行を探し(下のほう)コメントアウトする(#を先頭につける)

#XWin -multiwindow -clipboard -silent-dup-error &

・dx開始
立ち上がったxterm・コンソールで
"dx &"(リターン)
でdx開始
チュートリアルもあるけれど、楽な説明
http://www-lsp.ujf-grenoble.fr/recherche/a3t2/a3t2a2/bahram/OpenDX/index.html

木曜日, 3月 01, 2007

publicとprivateの使い分け

他から参照したい定数(光速とか)の場合public、
他から変更されたくない定数
(mallocで得た、後で開放しなければならないメモリの配列数)の場合
privateで保護する。