カレンダー
| 12 | 2026/01 | 02 |
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
最新記事
(01/30)
(01/18)
(12/16)
(12/12)
(11/25)
(11/25)
(11/24)
(11/24)
(11/22)
(11/17)
最新コメント
[12/25 日没]
[11/15 無色大師]
[11/12 無色大師]
[11/11 無色大師]
[11/08 無色大師]
リンク
新刊カレンダー
ブログ内検索
プロフィール
HN:
Nina.A
性別:
男性
趣味:
麻雀、ラノベ、漫画
自己紹介:
MJ4や天鳳等でよく麻雀やってます。もし会ったらよろしくです。
ブログは単なるメモ帳となる予定。
ブログは単なるメモ帳となる予定。
カウンタ
C/C++勉強中の大学生雑記
2026/01/13
14:57:43
2008/11/10
22:12:57
買ったのはBUFFALOのBWC130H01。
ソフマップで4280円だったんだけど、ソフマップカード新規入会でその場で1000円引き出来るというので、もちろん入会しました。まあ、VISAカード持ってなかったのでいいかな、と。おかけで予想以上に手こずって講義に遅れかけましたが。
製品の方はドライバ周りで少し手こずったけど無事完了。OpenCVでの動作も確認。ということで、1つプログラムを書いてみようかな。
PR
2008/11/10
00:43:29
前のエントリで関数ポインタを少し理解したので、続いてメンバ関数ポインタについて少し学ぶ。
今回もとりあえず例を挙げておく。
class vec{
public:
void resize(int);
};
int main(void){
vec v;
vec *w = new vec();
void (vec::*func)() = &vec::resize;
(v.*func)(5);
(w->*func)(5);
return 0;
}
メンバ関数ポインタの宣言は、
void ( vec ::* func )( ); 【返却値】(【クラス名】::*【変数名】)(【引数】);
メンバ関数のアドレス取得は、
& vec :: resize &【クラス名】::【関数名】で可能。メンバ関数のアドレス取得は&が必須なので、関数アドレス取得時には常につける癖をつけた方がよさそう。各変数固有のアドレス(上の例ではvec::vのresize関数)を取得するわけではないみたい。
ポインタを介した関数の実行は、
vec v; (v.*func)(5); vec* w = new vec; (w->*func)(5);の様に、.*演算子か->演算子を用いる。
ちなみに、メンバ関数が静的(static)である場合には、呼び出しは普通の関数の様に呼び出せる。
2008/11/09
15:32:31
関数ポインタを使う必要が出てきた。OpenCVのcvSetMouseCallback関数とかで存在自体は知ってたけど、使うのは初めてなのでメモっておく。
参考:C++言語解説
以下に簡単な関数ポインタのプログラム例を挙げておく。
#include <iostream>
void func1(void){
std::cout << "func1\n";
}
void func2(void){
std::cout << "func2\n";
}
int main(void){
int i;
void (*func)(void);
while(1){
std::cout << "1:func1 2:func2 0:quit\n";
std::cin >> i;
switch(i){
case 1:
func = &func1;
break;
case 2:
func = func2;
break;
default:
goto LOOP_EXIT;
}
func();
}
LOOP_EXIT:
return 0;
}
これを見ると分かるように関数ポインタの宣言は、
void (* func )( void );
【関数の戻り値】 (*【変数名】)(【関数の引数】);
という形になる。
関数アドレスの取得は、
&func1 &【関数名】または単に、
func2 【関数名】で取得可能。
関数ポインタを介した関数の実行は、
(* func )( ); (*【関数ポインタ】)(【引数】);で実行可能。また、普通の関数のように、
func ( );
【関数ポインタ】(【引数】);
としても実行できる。
2008/11/08
00:05:32
いつものパソコン以外のvimだと設定がされてなかったりするのでここに置いておく。
" vi非互換モード
set nocompatible
" 構文ハイライトをon
syntax on
" 行数表示
set number
" コマンド部の高さ指定
set cmdheight=1
" タブを4字に
" タブ8字の場合ts=8 sw=4 sts=4
set ts=4 sw=4 sts=0
" Tabを表示
set listchars=tab:>\
" 行数表示の色指定
set highlight=n:NONE
set list
" 全角スペースの可視化
if has("syntax")
syntax on
function! ActivateInvisibleIndicator()
syntax match InvisibleJISX0208Space " " display containedin=ALL
highlight InvisibleJISX0208Space term=underline ctermbg=Gray guibg=Gray
endf
augroup invisible
autocmd! invisible
autocmd BufNew,BufRead * call ActivateInvisibleIndicator()
augroup END
endif
"
" 補完機能制御
set wildmode=list:full
set wildmenu
" バッファ切り替え後もundo保持
set hidden
" AutoIndent
set autoindent
" ソフトタブ無効(タブ有効)
set noexpandtab
" 改行コードの自動認識
set fileformats=unix,dos,mac
" ステータスラインを常に表示
set laststatus=2
" ステータスラインに文字コードと改行文字を表示する
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P"
" BSの対応
set backspace=2
"
"
" 文字コードの自動認識
if &encoding !=# 'utf-8'
set encoding=japan
set fileencoding=japan
endif
if has('iconv')
let s:enc_euc = 'euc-jp'
let s:enc_jis = 'iso-2022-jp'
" iconvがeucJP-msに対応しているかをチェック
if iconv("\x87\x64\x87\x6a", 'cp932', 'eucjp-ms') ==# "\xad\xc5\xad\xcb"
let s:enc_euc = 'eucjp-ms'
let s:enc_jis = 'iso-2022-jp-3'
" iconvがJISX0213に対応しているかをチェック
elseif iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==# "\xad\xc5\xad\xcb"
let s:enc_euc = 'euc-jisx0213'
let s:enc_jis = 'iso-2022-jp-3'
endif
" fileencodingsを構築
if &encoding ==# 'utf-8'
let s:fileencodings_default = &fileencodings
let &fileencodings = s:enc_jis .','. s:enc_euc .',cp932'
let &fileencodings = &fileencodings .','. s:fileencodings_default
unlet s:fileencodings_default
else
let &fileencodings = &fileencodings .','. s:enc_jis
set fileencodings+=utf-8,ucs-2le,ucs-2
if &encoding =~# '^\(euc-jp\|euc-jisx0213\|eucjp-ms\)$'
set fileencodings+=cp932
set fileencodings-=euc-jp
set fileencodings-=euc-jisx0213
set fileencodings-=eucjp-ms
let &encoding = s:enc_euc
let &fileencoding = s:enc_euc
else
let &fileencodings = &fileencodings .','. s:enc_euc
endif
endif
" 定数を処分
unlet s:enc_euc
unlet s:enc_jis
endif
" 日本語を含まない場合は fileencoding に encoding を使うようにする
if has('autocmd')
function! AU_ReCheck_FENC()
if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
let &fileencoding=&encoding
endif
endfunction
autocmd BufReadPost * call AU_ReCheck_FENC()
endif
" □とか○の文字があってもカーソル位置がずれないようにする
set ambiwidth=double
" if exists('&ambiwidth')
" set ambiwidth=double
" endif
参考:ずんWiki - vim
2008/11/06
16:55:01
複数の画像(0.png、1.png、…)を読み込み、そのうちの一枚と他の画像の形状を比較するプログラムを練習用に作ってみた。練習用なのでエラーチェックが適当かもです。
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <vector>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int main(int argc, char* argv[])
{
int i;
// 画像の読み込み枚数を指定
std::cout << "Enter the number of image.\n";
std::cin >> i;
const int num(i);
std::vector<IplImage*> img(num);
{
// 画像読み込み
std::stringstream ssm;
std::string fname;
for(i = 0; i < num; ++i){
ssm << "C:\\Users\\UserName\\Desktop\\IMG\\" << i << ".png";
fname = ssm.str();
img[i] = cvLoadImage(fname.c_str(), CV_LOAD_IMAGE_GRAYSCALE);
if( !img[i] ){
std::cerr << "Failed : " << fname << std::endl;
exit(EXIT_FAILURE);
}
std::cout << "Loaded : " << fname << std::endl;
ssm.str("");
}
}
// 比較元とする画像を指定
do{
std::cout << "Enter the image number of origin.\n";
std::cin >> i;
}while( ( i < 0 || num <= i ) && ( puts("The number exceeds the range.") || true ) );
const int origin(i);
// cvMatchShapes関数を利用して形状を比較する
double* result = new double[num];
for(i = 0; i < num; ++i){
result[i] = cvMatchShapes( img[origin], img[i], CV_CONTOURS_MATCH_I1);
}
// 結果を表示
for(i = 0; i < num; ++i){
std::cout << "I(" << i << "," << origin << ") = " << result[i] << std::endl;
}
// ベストマッチを探す
int minIdx = static_cast<int>(0 == origin);
double minResult = result[minIdx];
for( i = 0; i < num; ++i){
if( i == origin ) continue;
if( result[i] < minResult ){
minResult = result[i];
minIdx = i;
}
}
std::cout << "Min : Image No." << minIdx << std::endl;
// ウィンドウを開く
cvNamedWindow("Original", CV_WINDOW_AUTOSIZE);
cvNamedWindow("Best", CV_WINDOW_AUTOSIZE);
// 画像表示
cvShowImage("Original", img[origin]);
cvShowImage("Best", img[minIdx]);
cvWaitKey();
// 破棄
cvDestroyAllWindows();
delete [] result;
for(i = 0; i < num; ++i){
cvReleaseImage( &img[i] );
}
return 0;
}
