[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 16:03 / Filesize : 231 KB / Number-of Response : 985
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

スレを勃てるまでもないC/C++の質問はここで 12



1 名前:デフォルトの名無しさん [2009/07/19(日) 22:32:32 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
pc11.2ch.net/test/read.cgi/tech/1221633708/
スレを勃てるまでもないC/C++の質問はここで 5
pc11.2ch.net/test/read.cgi/tech/1230516307/
スレを勃てるまでもないC/C++の質問はここで 6
pc11.2ch.net/test/read.cgi/tech/1231564903/
スレを勃てるまでもないC/C++の質問はここで 7
pc11.2ch.net/test/read.cgi/tech/1232983248/
スレを勃てるまでもないC/C++の質問はここで 8
pc12.2ch.net/test/read.cgi/tech/1235921779/
スレを勃てるまでもないC/C++の質問はここで 9
pc12.2ch.net/test/read.cgi/tech/1240022781/
スレを勃てるまでもないC/C++の質問はここで 10
pc12.2ch.net/test/read.cgi/tech/1242300936/
スレを勃てるまでもないC/C++の質問はここで 11
pc12.2ch.net/test/read.cgi/tech/1245059383/

236 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 23:00:53 ]
>>235
ありがとうございます。
ぶじかいけつできました。!!

237 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 01:24:15 ]
20個ものclassのインスタンスがあるのですが、
rand()%20 +1でせいせいした1~20までの数に合わせて
それぞれのインスタンスにメソッドを適用したいです。
classのインスタンスを引数にわたしてメソッドを実行する関数を書いたので
classの配列をつかってその関数にclassを渡したいです。Web検索で
vectorを使うとかの説明は1つだけ出てきたのですが詳しくわからないのでよろしくおねがいします。

具体的にいうと
class Hoge
{
public:
Hoge() {}
void fuga() {}
};

void foo(Hoge h)
{
h.fuga();
}
int main(void)
{
Hoge a;
Hoge b;
Hoge c;
hit = rand()%3 + 1;
class_array = なんらかのほうほうでa,b,cの配列
foo(class_array[hit]);
return 0;
}
と言う風にかけないかと思っています。
よろしくおねがいします。

238 名前:デフォルトの名無しさん [2009/08/06(木) 01:29:08 ]
Hoge a;
Hoge b;
Hoge c;
hit = rand()%3 + 1;

じゃなくて

Hoge class_array[3];
hit = rand()%3;

じゃだめ?

まあfooは参照かアドレスで渡すべきというのは置いておいて。


239 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 01:31:37 ]
>>238
すみません、大事な部分を忘れていました。
a,b,cのコンストラクタにはいくつかそれぞれ別の引数を渡したいのですが、
それもふまえた上でよろしくおねがいします。(上のコードのclass Hogeのコンストラクタは引数をとる物に変更してください)

240 名前:デフォルトの名無しさん [2009/08/06(木) 01:36:19 ]
こら。

Hoge *class_array[3];
にして、それぞれ new すれば良いでしょ。

>それもふまえた上でよろしくおねがいします。
>(上のコードのclass Hogeのコンストラクタは引数をとる物に変更してください)

どんだけ上目線なの。



241 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 01:38:35 ]
>>240
なるほど、なんとなくわかってきました。
ありがとう御座います。
>どんだけ上目線なの。
すいませんでした、いま自分の望んでいる動作を日本語にするのが難しくて
変な日本語になっていました。すいません。

242 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 01:40:17 ]
実際はインスタンスが100個以上あるので、できればもう書いて生成してしまったインスタンスを
けしてそれぞれnewし直す事なく修正したかったのですが、無理なようですね。
とりあえずがんばろうと思います。

243 名前:デフォルトの名無しさん [2009/08/06(木) 01:43:27 ]
ポインタ知ってる?

244 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 01:49:11 ]
どうやったらコンテナじゃないインスタンス100個とか糞みたいなコード書けるんだ



245 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 01:57:56 ]
>>244
すいません、まだC++についてよくわかっていないのです..
おなじ種族に属する物で名前やジャンルが違うものを
100個の内50個はデフォルトでひつようで残りの50個は条件の違いによって
生成時に与えられるパラメータが違うという妙な仕様になっていて
しかも100個どれが使用されるかはわからないという変なプログラムなんですよ。
まあ簡単にいうと動物園みたいなものです。

246 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 02:03:37 ]
配列にするのが嫌ならswitchでも使えばいいでしょ。
Hoge& selectHitTarget(Hoge& a, Hoge& b, Hoge& c)
{
switch(rand() % 3)
{
case 0: return a;
case 1: return b;
case 2: return c;
}
}
int main(void)
{
Hoge a;
Hoge b;
Hoge c;
Hoge& hit = selectHitTarget(a, b, c);
foo(hit);
return 0;
}

247 名前:デフォルトの名無しさん [2009/08/06(木) 02:08:50 ]
246は何の解決にもなってないので却下として、

生成時に与えられるパラメータでインスタンスの生成方法が変わるものを
100個分書いた時点でなんかもう…。ま、書き直しを勧めます。
普通はパラメータは外部配列にしておくか、アルゴリズムで与えて、
オブジェクトが100個だろうが100000個だろうがループで回して配列に
入れながら new するでしょうね。
#スケーラビリティと言います。

この後はアドレス渡しではまって、継承ではまって仮想関数ではまって…
となるのね。出題者は「わん」とか「にゃー」とか呼び分けたいだけなのに、
その手前で悩んでるパターンですかね。。。



248 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 02:25:46 ]
static変数にパラメーターリストを入れて
デフォルトコンストラクタでそれを参照しながら初期化するとか
でもなんか気持ち悪いな・・・

249 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 02:30:53 ]
オレだったらコンストラクタをテンプレート関数にして個々のメソッドの中にconstメンバを基にSTATIC_ASSERT吐く様にする

250 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 02:32:32 ]
モンスターのパラメータ
ランダムエンカウント時のモンスター決定
かと思った

251 名前:デフォルトの名無しさん [2009/08/06(木) 11:49:18 ]
ttp://racanhack.sourceforge.jp/rhdoc/codepre.html

このページのコードを実行したいのですがGlibはどうやって導入すればいいんでしょうか
WindowsXPでVisual Studio 2008 Expressを使ってます

252 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 13:37:37 ]
>>251
GTK+の本家サイトでWin32版がダウンロードできるみたいだよ
www.gtk.org/download.html

253 名前:253 mailto:sage [2009/08/06(木) 21:02:01 ]
CもしくはC++でウェブ上の画像をURLを指定してhttpでダウンロードしたいのですが
できなくて困っています。

環境は下の通りです。
OS:windows XP
開発環境:Visual C++ 2008 ExpressEdition(win32プロジェクト)

htmlファイルならwininetを使ってダウンロードできたのですが、
画像だとできません。htmlファイルと同様に画像もできないのでしょうか?
また、wininet以外でいい方法があるなら教えてください。

サンプルプログラムは次に書きます。


254 名前:253 mailto:sage [2009/08/06(木) 21:06:00 ]
HINTERNET hInet, hUrl;
char szBuf[128], *lpszSrc;
DWORD dwRead;
int nTotal = 0;
HGLOBAL hMem;
//目的のURLの入力
char szUrl[] = "hogehogehgoe.co.jp/hoge.jpg";
hInet = InternetOpen("hoge",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);
if (hInet == NULL) return -1;
hUrl = InternetOpenUrl(hInet, szUrl, NULL, 0, 0, 0);
if (hUrl == NULL) return -1;
//lpszSrcに1バイトのみ確保
hMem = GlobalAlloc(GHND, 1);
lpszSrc = (char *)GlobalLock(hMem);
while (1) {
InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead);
szBuf[dwRead] = '\0';
//読み出す物がなくなったのでループ脱出
if (dwRead == 0)break;
//必要バイト数の計算
nTotal += dwRead;
//確保領域の大きさ変更
hMem = GlobalReAlloc(hMem, nTotal, GMEM_MOVEABLE);
if (hMem == NULL) break;
lpszSrc = (char *)GlobalLock(hMem);
if (lpszSrc == NULL) break;
strcat_s(lpszSrc, nTotal+1, szBuf);
}

続く



255 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 21:07:14 ]
strcat?
画像の途中に 0x00 があったら、そこで切れない?

256 名前:253 mailto:sage [2009/08/06(木) 21:07:18 ]
//ファイル出力処理
std::ofstream fileout;
fileout.open("D:/hoge.jpg"); // 出力ファイルをオープン
if (!fileout){
MessageBox(NULL , TEXT("エラー!出力ファイルをオープンできません") ,TEXT("") , MB_OK);
return -1;
}
fileout << lpszSrc <<'\n';
fileout.close();

//メモリの解放
GlobalUnlock(hMem);
GlobalFree(hMem);
//インターネットハンドルの解放
InternetCloseHandle(hUrl);
InternetCloseHandle(hInet);

以上です。
すいませんがアドバイスください、お願いします


257 名前:253 mailto:sage [2009/08/06(木) 21:21:11 ]
>>255
そうなんですか?
じゃあ画像ファイルの場合どうしたらいいのでしょうか?

258 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 21:30:44 ]
どこまで格納したか覚えておいて、memcpyで

memcpy(&lpszSrc[現在の位置], szBuf, dwRead);
現在の位置 += dwRead;

みたいな感じで

259 名前:253 mailto:sage [2009/08/06(木) 21:51:36 ]
>.258さん、ありがとうございます。

>>254のサンプルプログラムのwhileループの前で
int nowI = 0;
と宣言して
whileループの最後のstrcat_sをコメントアウトして下の二行を追加しました。
memcpy(&lpszSrc[nowI], szBuf, dwRead);
nowI += dwRead;

でもできませんでした。なにか間違ってますでしょうか?
ファイルは作成されてるんですけどデータがほとんど入っていないようで
画像ファイルとして開けません。


うう・・・
別にwininetにこだっているわけではありません。
C/C++(VC+ EE)でweb上の画像をダウンロードする方法が他にあるのなら
wininetじゃなくてもいいです。

260 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 22:20:19 ]
おまえは、まず、バイナリデータをファイルに書き込んで、それを読み込むことが出来るのか?
話はそれからだ。

261 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 22:37:57 ]
fprintfで書いてるんじゃなかろうな

262 名前:253 mailto:sage [2009/08/06(木) 22:51:10 ]
>>おまえは、まず、バイナリデータをファイルに書き込んで、それを読み込むことが出来るのか?
うぅ、できません・・・
どうやら全然基礎が足りないみたいです。
もう一度勉強しなおします。
スレ汚してすいませんでした。

263 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 00:21:20 ]
今時ポインタがあるプログラミング言語なんてゴミ
らしいのですが
いまどき一番需要のあるプログラミング言語は何でしょうか?

264 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 00:30:01 ]
>>263
スレタイ読め

・・・っとただの釣りだったか。



265 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 02:05:25 ]
char (*a)[10];
a = malloc(10 * n * sizeof(char*));

とすれば、n行10列のメモリ領域を確保できると思います。
しかし、実際にこの領域に格納したいデータは、
hoge0、hoge1、…、hoge100、… のように、添え字がついており、長さがどんどん長くなります。
極端な話、char (*a)[100]; のように、十分に大きい値に設定しておけば問題ないのですが、
何かメモリ領域をうまくとる方法はありませんか。

266 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 03:06:38 ]
char (*a)[10];
a = malloc(n*sizeof(char [10]));

sizeof(char *)で何をしようと思ったのか理解できないのだが
もう少し詳しく書いてくれると良い情報が聞き出せるかもね

267 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 04:37:52 ]
reallocしたいとか
vector使えとか
そういう話じゃないかね

268 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 05:15:11 ]
ジャグ配列が欲しいって話だろ

269 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 12:06:41 ]
explicitをコピコンに使うと値渡し・返しができなくなるんだけどそういうもんなの?

270 名前:phenix mailto:sage [2009/08/07(金) 16:16:32 ]
>>269
hoge a=b;で渡せないって意味ならそう。
hoge a(b);で渡せる。



271 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 18:47:28 ]
フェニックスさんキタ!!

272 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 12:24:01 ]
関数の仮引数名に悩む場合
(どうすれば分かりやすくなるかな?とか)
どう考えて付ける?

273 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 12:32:22 ]
変数名と同じ扱いでいいんじゃない?

274 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 12:36:32 ]
>>273
俺は
同じ型の引数を持つ場合、
void foo(hoge_1, hoge_2)
の様にしているんだが、
果たしてこれで分かりやすいと言えるのだろうか。
void foo(hoge_lhs, hoge_rhs)
とどっちが分かりやすいだろう?

と言うか分かりやすい引数って何だろう?




275 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 12:56:01 ]
ユニークな名前付ける方がいいよ
file_copy(file1, file2) より file_copy( src, dst ) みたいに

276 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 13:01:10 ]
判り易くしようとすると変数名が長くなりがちだから、
そこらへんのバランスをどうするかが難しいな。

277 名前:272 mailto:sage [2009/08/08(土) 13:06:24 ]
みんなありがとう。
指針とさせてください。


278 名前:デフォルトの名無しさん [2009/08/08(土) 16:23:05 ]
windows xp でファイルの存在を確認したい
プログラムを書きたいのですができなくて困っています。
開発環境はVC++ 2008 Express Edition(win32 プロジェクト)でやっています。

下のプログラムのように、LPCWSTR型にファイルパスを直接代入すれば
できるのですが、ファイルパスはstd::string型の変数で扱いたいです。
LPCWSTR lpszFilePath = TEXT("test.jpg");
if( PathFileExists( lpszFilePath ) ) {
 cout << "指定されたパスにファイルが存在" << endl;
} else {
 cout << "ファイルはありません" << endl;
}

std::stringからLPCWSTRへの型変換の問題になると思うのですが
これがわかりません。




279 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 16:34:08 ]
LPCWSTR は Long Pointer to Const Wide String なので
C++標準に置き換えると const wchar_t *になるよね?
なので、std::stringでは扱えません。

std::string を使う場合は LPCSTR を使いましょう。

280 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 16:50:05 ]
>>278
AとWを相互に変換するライブラリがあるらしいよ。使ったことないけど…
msdn.microsoft.com/ja-jp/library/87zae4a3(VS.80).aspx

#include <atlstr.h>
std::string s = "test.jpg";
LPCWSTR lpszFilePath = CA2W(s.c_str());

281 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 16:55:57 ]
俺も>>279だな
LPCWSTR → LPCSTR
PathFileExists → PathFileExistsA

282 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 17:03:47 ]
Standard Edition 以上なら CString ですんじゃうんだけどねぇ。
MFCは嫌い? あ、そう。

283 名前:278 mailto:sage [2009/08/08(土) 17:06:36 ]
>>279-281
ありがとうございます、できました。

string hogeStr = "test.jpg";
LPCSTR lpszFilePath2 = hogeStr.c_str();
if( PathFileExistsA( lpszFilePath2 ) ) {
cout << "指定されたパスにファイルが存在" << endl;
} else {
cout << "no file!!!!!!!!!!!!!!!!!" << endl;
}

ちなみに>>280さんのATL(#include <atlstr.h>)は
Express editionでは使えないみたいです。
ttp://www.microsoft.com/japan/msdn/vstudio/2008/product/express/aboutexpress.aspx

もう、やりたいことができたのでいいんですけど・・・
ともかく皆さんありがとうございました。

284 名前:278 mailto:sage [2009/08/08(土) 17:09:20 ]
更新しわすれた・・・
>>282
そうですね、Cstringも同じですね。
嫌いというか今はただお金をかけたくないんだけなんですけどね・・・





285 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 17:18:30 ]
ナロー文字とワイド文字の混在は厄介だね。

char、wchar_t のかわりに TCHAR マクロを
"文字列", L"文字列"のかわりに _T("文字列") マクロを使い、
さらに
プロジェクト→プロパティ→構成プロパティ→全般→文字セットで
「設定なし」を選んでプロジェクト全体をshift-JIS標準に。
そうすればlocaleとかwstringとかwcoutとかostream_iterator< wchar_t >とか
いちいち考えなくてすむ。

286 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 19:16:17 ]
いやいや、stringのほうを両対応に変えようよ。
typedef std::basic_string<TCHAR> tstring;

tstring filePath = TEXT("test.jpg");
if ( PathFileExists( filePath.c_str() ) ) {
 cout << "指定されたパスにファイルが存在" << endl;
} else {
 cout << "ファイルはありません" << endl;
}

287 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 20:20:47 ]
でもその tstring は cout に渡せるときには wcout には渡せず、
wcout に渡せるときは cout に渡せないというような厄介なことになるよ。
Win APIやMFC、ATL側はひとつの名前で char と wchar_t に破綻なく処理を分岐してくれるけど
C++ 標準で同じことやろうとすると膨大なマクロなりtypedefなりを組むことになる。
その上、結局プログラマに「それはcharなのかwchar_tなのか」ということを意識させることに。

…と、思う。素直にMicrosoftの標準に従っといたほういい。
Windowsの開発環境は特殊だから。

288 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 20:44:49 ]
toutを作ればいいじゃない

289 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 20:56:39 ]
Microsoft標準に従うというのはプロジェクト全体をshift-JIS標準にすること?

290 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 21:07:05 ]
汎用テキストマッピング(_T()とかTCHARとか使うやつ)なんて破綻してるから使わないほうがいいよ。
実際の現場で、文字列の編集のある処理で、ワイド文字とマルチバイト文字の両方で
動くように書いてるやつなんて、すごい少数だろ。
さらに、両方でテストしてるところなんて皆無だろうし。
(テスト以前に両方でコンパイルを通してるところもなさそう)

汎用テキストマッピングを使っても、実際には片方でしか動かないコードしかできないし、
いまさらwin9x系に対応する意味とかないし、最初からワイド文字きめうち問題ないよ。
問題ないっていうか、変にワイド、マルチ文字両たいおうしたつもりのコードのほうが
問題おこしそう。

291 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 21:16:41 ]
つーか、相当処理がカツカツじゃなければ、一旦なんらかの内部コードに変換して統一した方がいいと思う。
まぁ、扱う入力データの種類にもよるが。

292 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 22:49:27 ]
>変にワイド、マルチ文字両たいおうしたつもりのコードのほうが問題おこしそう。

まったくそのとおりだと個人的にも思うが
tstring のようにC++標準を両対応にするくらいなら
まだTCHARとか使っておいたほうが安全だと思う。

293 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 00:45:30 ]
C言語で動画処理をしようと思っています

aviファイル読み込み→キャプチャ→RGBに対してフィルタ処理→表示
というようにしたいのですが、キャプチャしたときにRGBをしまう配列を指定できないでしょうか?
具体的には unsigned char を四つ持つ構造体に対して、ひとつメンバを余らせて一画素ずつ入れたいです
現在OpenCVで試しているのですが、RGBはunsigned char型の配列に自動的にしまわれてしまい、
キャプチャの値を構造体に入れなおすと時間がかかってしまいます

これができればOpenCVでなくてもかまわないので、誰かお知恵をお貸しください

294 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 01:17:04 ]
なぜ「ひとつメンバを余らせ」たいのか、OpenCVがキャプチャしてくれた
配列じゃなぜダメなのか?C言語が良いのか?

その辺をもう少し詳しく。
でないとDirectShowって言っちゃう。




295 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 02:58:51 ]
293です、詳しく説明します
実はCUDAというものでGPUを使った画像処理を行っているのですが、それを動画に応用したいのです
簡単にいえばCUDAでは4バイトずつデータにアクセスすると高速化する特性があります
そこでひとつ空きを作って無理やり4バイトにし、構造体単位でアクセスを行っています
これを空きなしの3バイトにしたところ10倍近く遅くなったので、1バイトのchar型だとさらに遅くなる可能性があります
C言語がいいのはCUDAがC言語を拡張したものだからです

296 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 03:28:51 ]
>>295
OpenCVを使うのであれば
IplImageを作るときにIPL_DEPTH_8Uにするのではなく
IPL_DEPTH_32S又はIPL_DEPTH_32Fにして宣言すれば4Bになるんじゃないでしょうか?

imageDataのR,G,Bは8bit*4なのに注意してください。
参考にどうぞ
rest-term.com/contents/other/technote/index.php/OpenCV#content_1_6

297 名前:293 mailto:sage [2009/08/09(日) 12:55:44 ]
ありがとうございます!
ためしてみます

298 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:08:07 ]
引き数にだけ文字列を使いたい時でもconst string&使ったほうがいいの?


299 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:12:42 ]
>>298
何を言っているのかわからん。

300 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:21:28 ]
>>298 もしかしてこういうことか?

void foo(const string& s) { cout << s << endl; }

void bar(const char* s) { cout << s << end; }

int main() {
foo("footest"); // リテラル文字列をstring&に渡す
bar("bartest"); // char*に渡す
}

こういう話だったら、const char* でもいいだろうけど
char*とstringが混在すると面倒だから俺は全部stringに統一

301 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:55:20 ]
そんなかんじですね
ヘッダ解析のコストもあるしchar*でわたして必要ならソースでstringにかえればいいかなと・・・

302 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:01:04 ]
C++ code - 21 lines - codepad
ttp://codepad.org/ADzqt4PN

struct Animalのstatic constなメンバであるweight = 10;
を、Animalを継承したHumanで別の数字に変更したい場合、
このような方法でよろしいでしょうか?



303 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:25:57 ]
>>302
それでおk。

あと
struct Animal
{
static const int weight = 10;
};
が他人が作った物である場合、
struct Human : Animal
{
enum{ weight = 50 };
};
こうやって書き換えた方が良い。
互換性が高い。

304 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:06:43 ]
>>303
互換性ってなんの?



305 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:14:18 ]
>>303
enum って何の略か分かってる?

306 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:18:36 ]
>>305
enumハックしらないの?

307 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:20:52 ]
互換性って古めのコンパイラだと前者を配列の宣言に使用できないとかそういうこと?

308 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:27:30 ]
いまさらenumハックを自信ありげに言われてもなあ

309 名前:302 mailto:sage [2009/08/09(日) 23:18:20 ]
ありがとうございます。
enumハックで行かせていただきます。


310 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:40:46 ]
よせ、あくまでハックはハックだ
正攻法には劣る

311 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:57:49 ]
>>308
いくつかの環境で開発をしたことがあるなら当たり前の知識である
enumハックのコードを見て、enumが何の略かなんて問うのもどうかと思うよねw

312 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:04:28 ]
>>305
enumハックをしらないやつがなんでまた偉そうにw

313 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:06:07 ]
>>310
劣るかなぁ?どう劣る?

読みづらいとか?

314 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 01:22:44 ]
たびたびすみません、293です
296さんのサイトを見てみたのですが、どうやらこちらの説明不足だったようです
一つのチャンネルを4バイトで表したいのではなく、ピクセルそのものを4バイトで表したい
つまり、cvCreateImage(cvSize(x, y), IPL_DEPTH_8U, 4);
このようにしたかったのです
それで実際に試してみたのですが、うまくいきません
キャプチャを cvQueryFrame で行っているのですが、おそらくここでメモリを取り直されているのだと思います
実装部分を探して改良しようとも思ったのですが見つかりませんorz
半分スレ違いみたいな内容ですが、解決方法があったらご教授ください



315 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 01:55:20 ]
>>314
Grabが3yte/pixelで行われる限り、一度は3byte/pixelから 4byte/pixelへの
拡張をしてやらないといけないと思うよ。
OpenCVでやるか(cvCopy?)、自前の関数でやるかは別として。

316 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 02:06:10 ]
>>314
「cuda rgba」でググったらぴったりのものが出てきた。
wiki.livedoor.jp/mikk_ni3_92/d/OpenCV::RGBA%B2%E8%C1%FC%BA%EE%C0%AE

317 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 04:48:35 ]
生成と同時にコンストラクタに値を与えたいオブジェクトがあるので、

CTest* ctest[10];
for(int i=0;i<10;i++){
ctest[i] = new Ctest();
}

と統一してるんですが、最初に要素数を決めなきゃいけないのと、
newとdeleteを使う分、かったるいので

vector<CTest*> ctest;
for(int i=0;i<10;i++){
ctest.push_back( ? );
}

って風にしようとしてるんですが、ここで「?」になにも入れないと
「0個の引数は指定できない」と怒られます

この場合「?」の部分はCTestコンストラクタに渡す引数になると思ってたんですが、
引数がない場合はどうすればいいでしょう?
やはりnewとdeleteを使わなきゃいかんのでしょうか

318 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 05:46:18 ]
vector<CTest*> ctest(10);
でいけたような。

319 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 06:17:46 ]
>>317
CTest*のvectorでしょ
push_backするのはCTest*じゃないの?
ctest.push_back(new CTest());
とか
ctest.push_back(NULL);
とか・・・


320 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 07:05:40 ]
ctest.push_back(new CTest());
とか
ctest.push_back(NULL);
とか
ctest.resize(i+1);
ctest[i] = new ctest();
とか試してみたけど、

error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です
error LNK2019: 未解決の外部シンボル __CrtDbgReportW が
関数 "public: class Ctest * & __thiscall std::vector<class Ctest *,class std::allocator<class Ctest *> >::operator[](unsigned int)"
(??A?$vector@PAVCtest@@V?$allocator@PAVCtest@@@std@@@std@@QAEAAPAVCtest@@I@Z) で参照されました。 Main.obj

なにこれ(゜д゜)

321 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 07:59:13 ]
失礼、ランタイムライブラリをマルチスレッド(/MT)から
マルチスレッドデバッグ(/MTd)に変えたら解決しました。
理屈はわかりませんが・・・

CTest.push_back( new CTest(引数) );
でいけそうですが、この場合、指定のオブジェクトを破棄するとき
deleteで指定のアドレスを破棄してから、vectorのポインタを破棄する、
というクドいコードになりますね・・・

かといって、vector<CTest>と、ポインタで持たずにnewを使わなければ
引数付きコンストラクタでの初期化がややこしくなりますし・・・
しかたないですかね

322 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 11:36:10 ]
>>321
それは仕方がない。というかnewした以上、deleteするのは当たり前。
vectorにオブジェクトのポインタをプールするなんてまぁよく聞く話だし。
デストラクタに全要素deleteするコード書いとけ。

323 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 11:38:19 ]
>>321
>引数付きコンストラクタでの初期化がややこしくなりますし・・・
そもそも、ここが判らん。

324 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 12:46:32 ]
>>321
boost::ptr_vectorで解決



325 名前:293 mailto:sage [2009/08/10(月) 14:50:51 ]
>>315
確かにキャプチャ部分がこうなっている以上コピーするしかないですよね
Grabを自前で実装できればよいのですが、キャプチャ自体がどのように行われているかさえ
まだ理解していないので当分コピーで済ませていこうと思います
ありがとうございました

>>316
このようなページを知らなかったとはまだまだ勉強不足のようですorz
もうちょっと自分で調べてみようと思います
ありがとうございました


326 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:59:01 ]
>>321
それなら
std::vector<boost::shared_ptr<CTest> > ctest;
ctest.push_back(boost::shared_ptr<CTest>(new CTest()));

コンパイルして書いてるわけじゃないから何か変だったら適当になおして

327 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:40:28 ]
const char * const p= "有効な文字列p";
const char * const q= "有効な文字列q";

このようなpとqに格納されている文字列が等しいかどうかを調べる場合、

strcmp
を使う方法と
std::string(p)==q

std::string(p)==std::string(q)
とする方法と、どちらが望ましいでしょうか?

328 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 19:14:12 ]
そら、態々メモリ割り当てずに strcmp が速いでしょ。

329 名前:327 mailto:sage [2009/08/10(月) 19:17:27 ]
>>328
ありがとうございます。

330 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:26:59 ]
男キャラを担当する女声優はわんさかいるけど、
女キャラを担当する男声優なんて聞いたことない

331 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:27:39 ]
超誤爆

332 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:36:20 ]
どのスレだよw


333 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:40:42 ]
class Aからclass Bへの暗黙の型変換が許されている状況で、
A hoge;
として

B piyo = hoge;
B piyo(hoge);
B piyo = (A)hoge;
B piyo = static_cast<A>(hoge);

これら4つは全く等価だと考えてよろしいですか?


334 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 23:27:55 ]
少なくとも一番目と二番目は全く違うような。



335 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 23:36:36 ]
>>334
違いますか?
どのあたりが違いますか?


336 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 02:15:35 ]
同じだよ。どれもコピーコンストラクタが呼ばれる。
ときおり初心者が1番目の式を代入と勘違いするけど
普通の教科書にはそれは代入じゃねぇンだよって説明が書いてあるので
それを知らないのは教科書をよく読んでいない証拠。

もし書いてないなら、その教科書は資源ごみにでも出したほうがいい。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<231KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef