スレを勃てるまでもな ..
186:デフォルトの名無しさん
09/07/31 02:23:01
vectorはそもそも配列じゃないですし
可変長なので固定長にもなりません。^^
vectorではなく、配列を使ってください。
hoge_sub a[20]; のようにするのです。
187:デフォルトの名無しさん
09/07/31 02:52:31
>>185,186
ありがとうございます
class型の配列を扱いたいなと思った時に調べましたところ
vectorを使う方法が紹介されてましたので、誤って認識していました
188:デフォルトの名無しさん
09/07/31 07:17:30
>>187
せめて入門書一冊分くらいは基礎を学んでおいた方がいいとおもうぞ。
189:デフォルトの名無しさん
09/07/31 22:45:01
>>188
入門書として適切なものを教えてください。
いや、手元には独習がありますが、ぜんぜん足りないような気がしているのです。
190:デフォルトの名無しさん
09/08/01 00:53:20
ハーバートシルト先生に教えてもらっておいてまだ足りないとな?
191:デフォルトの名無しさん
09/08/01 08:06:09
独習C++なんて捨ててaccelerated C++とexceptional C++を読むんだ
192:デフォルトの名無しさん
09/08/01 10:16:59
独習C++半分ぐらい読んで、EffectiveC++、More〜を全部読んで、独習デザインパターンも半分ぐらい読んで、ゲーム作る程度にはそれで十分だった
193:デフォルトの名無しさん
09/08/01 10:36:12
あまりの糞さに独習(ryは半分で飽きたということですね…わかります
194:デフォルトの名無しさん
09/08/01 11:42:47
マナたん(藁)→ロベールの次に読めるまともな本を教えて下さい
195:デフォルトの名無しさん
09/08/01 18:27:53
#include <iostream>
class hoge {
private:
int x;
private:
class in_hoge {
public:
in_hoge() {std::cout << x << std::endl;}
};
in_hoge ihoge;
public:
hoge() : x(100), ihoge() {}
};
int main(void) {
hoge h; // output: 100
return 0;
}
コンパイルできないんだけど、どうやれば実装できるかな?
196:デフォルトの名無しさん
09/08/01 18:36:36
>>195
in_hogeのコンストラクタにxを渡せばいいんじゃね?
197:デフォルトの名無しさん
09/08/01 18:51:33
in_hogeの配列を確保する予定なので、コンストラクタに引数を渡せないのです・・・
198:デフォルトの名無しさん
09/08/01 18:57:14
配列使うかわりにvector使えばいいんじゃね?
199:デフォルトの名無しさん
09/08/01 21:48:17
stringのreserve()ってメモリをここでいっぺんに確保して後の操作で動的確保をなるべくしないようにってことでいいの?
resize()との違いがようわからん
200:デフォルトの名無しさん
09/08/01 21:48:44
URLリンク(d.hatena.ne.jp)
忍法ししちょびれ。
201:デフォルトの名無しさん
09/08/01 21:50:28
>>199
Yes, 高洲クリニック。
reserveは指定したサイズになるように「空き容量」を増やす。
resizeは指定したサイズになるように要素の数を増やすか減らす。
増えた要素は例えば0で埋められるし、減らされた要素は削除される。
202:デフォルトの名無しさん
09/08/02 18:41:23
VS C++ 2008 EE で コマンドラインから cl をつかってコンパイルする方法はないものですか?
パスをとおし、バッチファイルvcvers32.bat を実行しただけはうまくいかないようです。
203:デフォルトの名無しさん
09/08/02 18:45:50
>>202
それだけでできると思うけど、スタートメニューの中に
Visual Studio 2008 コマンドプロンプトとかいうのがあるはず。そっちが確実。
204:202
09/08/02 18:49:23
自己解決です。
URLリンク(msdn.microsoft.com)
に詳細がありました。でも専用のcmd を使わないとダメなようです。cygwin プロンプトから実行というわけにはいかないようです。
205:202
09/08/02 18:50:11
>> 203
ありがとうございます。
206:デフォルトの名無しさん
09/08/02 19:01:09
Javaスレ、 C++スレ迷いましたが、上のほうの板は荒れ気味なのでここで質問させてください。宜しくお願いします。
g++ (GCC) 4.2.4 です
java からC++ で作ったプログラムを使いたいのですが、どのような手順で作成すれば良いのでしょうか、
参考になるHP とかがあれば教えてもらえませんか。
207:デフォルトの名無しさん
09/08/02 19:01:53
>>204
Cygwin上で使いたいのなら、自分で環境変数INCLUDEとLIBとPATHを設定すればいい。
C++/CLIを使うならLIBPATHも。
内容はVisual Studioコマンドプロンプトの丸写しでいい。
あるいは、Visual Studioコマンドプロンプト上でCygwin.batを呼んで起動するという手もある。
208:デフォルトの名無しさん
09/08/02 19:02:37
>>206
まずはJNIでググるんだ。
よく分からなかったら、どこがどう分からないかを書き添えてもう1度聞きに来るといい。
209:デフォルトの名無しさん
09/08/02 19:16:43
>>208 さん、早速の回答ありがとうございます
やはりやり方といいますかjava で呼び出すことができるんですね、よく分かりました
Windows でもLinux でもdll を作成してJava Native Interface 機能を用いて呼び出すことができるんですね、どうもありがとうございました。
210:デフォルトの名無しさん
09/08/02 23:29:35
質問です。
C++でソケット使ったメール送信プログラム組んでます。
ループ内でコネクト・ライト・シャットダウン、クローズを
繰り返して複数メールの送信をしているのですが、
データ量が有る場合に送信されずにクローズしてしまいます。
送信バッファの指定・リンガ設定もしたのですが、変わりませんでした。
ソケット内での解決法やロジックでの解決法があれば
教えて下さい。。
211:デフォルトの名無しさん
09/08/02 23:32:05
ソースを晒さないとなんとも
212:デフォルトの名無しさん
09/08/03 00:54:59
>>210
パケットダンプ追えば、何がおきてるかわかるんじゃね?
213:デフォルトの名無しさん
09/08/03 01:47:48
関数の終了コード(errnoとか)は見てる?
214:デフォルトの名無しさん
09/08/03 16:07:40
msdnのドキュメントなんだが、関数別に投げる可能性のある例外とか書いてあるページって無いものかな?
知りたかったらいちいちソース読まないといけないんだろうか・・・
215:デフォルトの名無しさん
09/08/03 16:18:48
ないよー
ちなみに何の関数について知りたい?
216:デフォルトの名無しさん
09/08/03 16:36:11
>>215
今回知りたいのはtr1のmt19937とuniform_intですけど、ほかのも結構頻繁に気になります
217:デフォルトの名無しさん
09/08/03 18:19:23
最近の SDK には boost が含まれてるのか?
218:デフォルトの名無しさん
09/08/03 20:18:14
0xだろ
219:デフォルトの名無しさん
09/08/03 21:48:05
>>217
0xの先取りTR1
randomのほかshared_ptr, regex, unordered_map/setなんかのライブラリが入っている。
VC++では2008に拡張パックまたはSP1で導入できる。
URLリンク(msdn.microsoft.com)
220:デフォルトの名無しさん
09/08/03 21:52:33
VC++のSTLのソースってすごい見づらい
221:デフォルトの名無しさん
09/08/04 17:33:29
関数オブジェクトとかよくいうけど関数ポインタでいいじゃんっておもう
なにがすごいのこれ?
222:デフォルトの名無しさん
09/08/04 17:44:50
インライン展開できる
223:デフォルトの名無しさん
09/08/04 19:34:41
インスタンスが持てる
224:デフォルトの名無しさん
09/08/04 21:34:17
operator =ってコピコンみたいに継承元のコピー勝手に呼んでくれる、みたいな思いやりの精神は無いの?
225:デフォルトの名無しさん
09/08/04 21:47:11
コピコンにそんな機能あったのか
226:デフォルトの名無しさん
09/08/04 21:51:21
ないはず
勝手に呼ばれるのは継承元のデフォコンでは?
227:デフォルトの名無しさん
09/08/04 22:12:57
おまえら普通にコピコンとかデフォコンとかやめてください
228:デフォルトの名無しさん
09/08/04 22:13:45
Base::operator=を最初に呼ばないといかんのかめんどくさいな
229:デフォルトの名無しさん
09/08/04 22:15:28
じゃあシスコンで
230:デフォルトの名無しさん
09/08/04 22:18:21
デスコンとか超強そう
231:デフォルトの名無しさん
09/08/04 22:22:29
デスコン使うとか必死ですねwww
232:デフォルトの名無しさん
09/08/05 13:07:10
例外って難しいです・・・
233:デフォルトの名無しさん
09/08/05 16:30:13
さじを投げてるだけじゃん。
誰かが拾って続きやるかもしれないけど、そいつもさじ投げるかもね。
234:デフォルトの名無しさん
09/08/05 22:01:09
Enterを押したら処理が進むようにするにはどのようにすれば良いのでしょうか?
char dammy;
cin >> dammy;
cout >> "Hit";
のようにしてもEnterだけだと入力を受け付けられず、
なにか文字をいれてEnterをおさないと進みません。
よろしくおねがいします。
235:デフォルトの名無しさん
09/08/05 22:47:39
int dummy;
dummy = cin.get();
cout << "Hit";
236:デフォルトの名無しさん
09/08/05 23:00:53
>>235
ありがとうございます。
ぶじかいけつできました。!!
237:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/06 01:29:08
Hoge a;
Hoge b;
Hoge c;
hit = rand()%3 + 1;
じゃなくて
Hoge class_array[3];
hit = rand()%3;
じゃだめ?
まあfooは参照かアドレスで渡すべきというのは置いておいて。
239:デフォルトの名無しさん
09/08/06 01:31:37
>>238
すみません、大事な部分を忘れていました。
a,b,cのコンストラクタにはいくつかそれぞれ別の引数を渡したいのですが、
それもふまえた上でよろしくおねがいします。(上のコードのclass Hogeのコンストラクタは引数をとる物に変更してください)
240:デフォルトの名無しさん
09/08/06 01:36:19
こら。
Hoge *class_array[3];
にして、それぞれ new すれば良いでしょ。
>それもふまえた上でよろしくおねがいします。
>(上のコードのclass Hogeのコンストラクタは引数をとる物に変更してください)
どんだけ上目線なの。
241:デフォルトの名無しさん
09/08/06 01:38:35
>>240
なるほど、なんとなくわかってきました。
ありがとう御座います。
>どんだけ上目線なの。
すいませんでした、いま自分の望んでいる動作を日本語にするのが難しくて
変な日本語になっていました。すいません。
242:デフォルトの名無しさん
09/08/06 01:40:17
実際はインスタンスが100個以上あるので、できればもう書いて生成してしまったインスタンスを
けしてそれぞれnewし直す事なく修正したかったのですが、無理なようですね。
とりあえずがんばろうと思います。
243:デフォルトの名無しさん
09/08/06 01:43:27
ポインタ知ってる?
244:デフォルトの名無しさん
09/08/06 01:49:11
どうやったらコンテナじゃないインスタンス100個とか糞みたいなコード書けるんだ
245:デフォルトの名無しさん
09/08/06 01:57:56
>>244
すいません、まだC++についてよくわかっていないのです..
おなじ種族に属する物で名前やジャンルが違うものを
100個の内50個はデフォルトでひつようで残りの50個は条件の違いによって
生成時に与えられるパラメータが違うという妙な仕様になっていて
しかも100個どれが使用されるかはわからないという変なプログラムなんですよ。
まあ簡単にいうと動物園みたいなものです。
246:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/06 02:08:50
246は何の解決にもなってないので却下として、
生成時に与えられるパラメータでインスタンスの生成方法が変わるものを
100個分書いた時点でなんかもう…。ま、書き直しを勧めます。
普通はパラメータは外部配列にしておくか、アルゴリズムで与えて、
オブジェクトが100個だろうが100000個だろうがループで回して配列に
入れながら new するでしょうね。
#スケーラビリティと言います。
この後はアドレス渡しではまって、継承ではまって仮想関数ではまって…
となるのね。出題者は「わん」とか「にゃー」とか呼び分けたいだけなのに、
その手前で悩んでるパターンですかね。。。
248:デフォルトの名無しさん
09/08/06 02:25:46
static変数にパラメーターリストを入れて
デフォルトコンストラクタでそれを参照しながら初期化するとか
でもなんか気持ち悪いな・・・
249:デフォルトの名無しさん
09/08/06 02:30:53
オレだったらコンストラクタをテンプレート関数にして個々のメソッドの中にconstメンバを基にSTATIC_ASSERT吐く様にする
250:デフォルトの名無しさん
09/08/06 02:32:32
モンスターのパラメータ
ランダムエンカウント時のモンスター決定
かと思った
251:デフォルトの名無しさん
09/08/06 11:49:18
URLリンク(racanhack.sourceforge.jp)
このページのコードを実行したいのですがGlibはどうやって導入すればいいんでしょうか
WindowsXPでVisual Studio 2008 Expressを使ってます
252:デフォルトの名無しさん
09/08/06 13:37:37
>>251
GTK+の本家サイトでWin32版がダウンロードできるみたいだよ
URLリンク(www.gtk.org)
253:253
09/08/06 21:02:01
CもしくはC++でウェブ上の画像をURLを指定してhttpでダウンロードしたいのですが
できなくて困っています。
環境は下の通りです。
OS:windows XP
開発環境:Visual C++ 2008 ExpressEdition(win32プロジェクト)
htmlファイルならwininetを使ってダウンロードできたのですが、
画像だとできません。htmlファイルと同様に画像もできないのでしょうか?
また、wininet以外でいい方法があるなら教えてください。
サンプルプログラムは次に書きます。
254:253
09/08/06 21:06:00
HINTERNET hInet, hUrl;
char szBuf[128], *lpszSrc;
DWORD dwRead;
int nTotal = 0;
HGLOBAL hMem;
//目的のURLの入力
char szUrl[] = "URLリンク(hogehogehgoe.co.jp)";
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:デフォルトの名無しさん
09/08/06 21:07:14
strcat?
画像の途中に 0x00 があったら、そこで切れない?
256:253
09/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
09/08/06 21:21:11
>>255
そうなんですか?
じゃあ画像ファイルの場合どうしたらいいのでしょうか?
258:デフォルトの名無しさん
09/08/06 21:30:44
どこまで格納したか覚えておいて、memcpyで
memcpy(&lpszSrc[現在の位置], szBuf, dwRead);
現在の位置 += dwRead;
みたいな感じで
259:253
09/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:デフォルトの名無しさん
09/08/06 22:20:19
おまえは、まず、バイナリデータをファイルに書き込んで、それを読み込むことが出来るのか?
話はそれからだ。
261:デフォルトの名無しさん
09/08/06 22:37:57
fprintfで書いてるんじゃなかろうな
262:253
09/08/06 22:51:10
>>おまえは、まず、バイナリデータをファイルに書き込んで、それを読み込むことが出来るのか?
うぅ、できません・・・
どうやら全然基礎が足りないみたいです。
もう一度勉強しなおします。
スレ汚してすいませんでした。
263:デフォルトの名無しさん
09/08/07 00:21:20
今時ポインタがあるプログラミング言語なんてゴミ
らしいのですが
いまどき一番需要のあるプログラミング言語は何でしょうか?
264:デフォルトの名無しさん
09/08/07 00:30:01
>>263
スレタイ読め
・・・っとただの釣りだったか。
265:デフォルトの名無しさん
09/08/07 02:05:25
char (*a)[10];
a = malloc(10 * n * sizeof(char*));
とすれば、n行10列のメモリ領域を確保できると思います。
しかし、実際にこの領域に格納したいデータは、
hoge0、hoge1、…、hoge100、… のように、添え字がついており、長さがどんどん長くなります。
極端な話、char (*a)[100]; のように、十分に大きい値に設定しておけば問題ないのですが、
何かメモリ領域をうまくとる方法はありませんか。
266:デフォルトの名無しさん
09/08/07 03:06:38
char (*a)[10];
a = malloc(n*sizeof(char [10]));
sizeof(char *)で何をしようと思ったのか理解できないのだが
もう少し詳しく書いてくれると良い情報が聞き出せるかもね
267:デフォルトの名無しさん
09/08/07 04:37:52
reallocしたいとか
vector使えとか
そういう話じゃないかね
268:デフォルトの名無しさん
09/08/07 05:15:11
ジャグ配列が欲しいって話だろ
269:デフォルトの名無しさん
09/08/07 12:06:41
explicitをコピコンに使うと値渡し・返しができなくなるんだけどそういうもんなの?
270:phenix
09/08/07 16:16:32
>>269
hoge a=b;で渡せないって意味ならそう。
hoge a(b);で渡せる。
271:デフォルトの名無しさん
09/08/07 18:47:28
フェニックスさんキタ!!
272:デフォルトの名無しさん
09/08/08 12:24:01
関数の仮引数名に悩む場合
(どうすれば分かりやすくなるかな?とか)
どう考えて付ける?
273:デフォルトの名無しさん
09/08/08 12:32:22
変数名と同じ扱いでいいんじゃない?
274:デフォルトの名無しさん
09/08/08 12:36:32
>>273
俺は
同じ型の引数を持つ場合、
void foo(hoge_1, hoge_2)
の様にしているんだが、
果たしてこれで分かりやすいと言えるのだろうか。
void foo(hoge_lhs, hoge_rhs)
とどっちが分かりやすいだろう?
と言うか分かりやすい引数って何だろう?
275:デフォルトの名無しさん
09/08/08 12:56:01
ユニークな名前付ける方がいいよ
file_copy(file1, file2) より file_copy( src, dst ) みたいに
276:デフォルトの名無しさん
09/08/08 13:01:10
判り易くしようとすると変数名が長くなりがちだから、
そこらへんのバランスをどうするかが難しいな。
277:272
09/08/08 13:06:24
みんなありがとう。
指針とさせてください。
278:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/08 16:34:08
LPCWSTR は Long Pointer to Const Wide String なので
C++標準に置き換えると const wchar_t *になるよね?
なので、std::stringでは扱えません。
std::string を使う場合は LPCSTR を使いましょう。
280:デフォルトの名無しさん
09/08/08 16:50:05
>>278
AとWを相互に変換するライブラリがあるらしいよ。使ったことないけど…
URLリンク(msdn.microsoft.com)(VS.80).aspx
#include <atlstr.h>
std::string s = "test.jpg";
LPCWSTR lpszFilePath = CA2W(s.c_str());
281:デフォルトの名無しさん
09/08/08 16:55:57
俺も>>279だな
LPCWSTR → LPCSTR
PathFileExists → PathFileExistsA
282:デフォルトの名無しさん
09/08/08 17:03:47
Standard Edition 以上なら CString ですんじゃうんだけどねぇ。
MFCは嫌い? あ、そう。
283:278
09/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では使えないみたいです。
URLリンク(www.microsoft.com)
もう、やりたいことができたのでいいんですけど・・・
ともかく皆さんありがとうございました。
284:278
09/08/08 17:09:20
更新しわすれた・・・
>>282
そうですね、Cstringも同じですね。
嫌いというか今はただお金をかけたくないんだけなんですけどね・・・
285:デフォルトの名無しさん
09/08/08 17:18:30
ナロー文字とワイド文字の混在は厄介だね。
char、wchar_t のかわりに TCHAR マクロを
"文字列", L"文字列"のかわりに _T("文字列") マクロを使い、
さらに
プロジェクト→プロパティ→構成プロパティ→全般→文字セットで
「設定なし」を選んでプロジェクト全体をshift-JIS標準に。
そうすればlocaleとかwstringとかwcoutとかostream_iterator< wchar_t >とか
いちいち考えなくてすむ。
286:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/08 20:44:49
toutを作ればいいじゃない
289:デフォルトの名無しさん
09/08/08 20:56:39
Microsoft標準に従うというのはプロジェクト全体をshift-JIS標準にすること?
290:デフォルトの名無しさん
09/08/08 21:07:05
汎用テキストマッピング(_T()とかTCHARとか使うやつ)なんて破綻してるから使わないほうがいいよ。
実際の現場で、文字列の編集のある処理で、ワイド文字とマルチバイト文字の両方で
動くように書いてるやつなんて、すごい少数だろ。
さらに、両方でテストしてるところなんて皆無だろうし。
(テスト以前に両方でコンパイルを通してるところもなさそう)
汎用テキストマッピングを使っても、実際には片方でしか動かないコードしかできないし、
いまさらwin9x系に対応する意味とかないし、最初からワイド文字きめうち問題ないよ。
問題ないっていうか、変にワイド、マルチ文字両たいおうしたつもりのコードのほうが
問題おこしそう。
291:デフォルトの名無しさん
09/08/08 21:16:41
つーか、相当処理がカツカツじゃなければ、一旦なんらかの内部コードに変換して統一した方がいいと思う。
まぁ、扱う入力データの種類にもよるが。
292:デフォルトの名無しさん
09/08/08 22:49:27
>変にワイド、マルチ文字両たいおうしたつもりのコードのほうが問題おこしそう。
まったくそのとおりだと個人的にも思うが
tstring のようにC++標準を両対応にするくらいなら
まだTCHARとか使っておいたほうが安全だと思う。
293:デフォルトの名無しさん
09/08/09 00:45:30
C言語で動画処理をしようと思っています
aviファイル読み込み→キャプチャ→RGBに対してフィルタ処理→表示
というようにしたいのですが、キャプチャしたときにRGBをしまう配列を指定できないでしょうか?
具体的には unsigned char を四つ持つ構造体に対して、ひとつメンバを余らせて一画素ずつ入れたいです
現在OpenCVで試しているのですが、RGBはunsigned char型の配列に自動的にしまわれてしまい、
キャプチャの値を構造体に入れなおすと時間がかかってしまいます
これができればOpenCVでなくてもかまわないので、誰かお知恵をお貸しください
294:デフォルトの名無しさん
09/08/09 01:17:04
なぜ「ひとつメンバを余らせ」たいのか、OpenCVがキャプチャしてくれた
配列じゃなぜダメなのか?C言語が良いのか?
その辺をもう少し詳しく。
でないとDirectShowって言っちゃう。
295:デフォルトの名無しさん
09/08/09 02:58:51
293です、詳しく説明します
実はCUDAというものでGPUを使った画像処理を行っているのですが、それを動画に応用したいのです
簡単にいえばCUDAでは4バイトずつデータにアクセスすると高速化する特性があります
そこでひとつ空きを作って無理やり4バイトにし、構造体単位でアクセスを行っています
これを空きなしの3バイトにしたところ10倍近く遅くなったので、1バイトのchar型だとさらに遅くなる可能性があります
C言語がいいのはCUDAがC言語を拡張したものだからです
296:デフォルトの名無しさん
09/08/09 03:28:51
>>295
OpenCVを使うのであれば
IplImageを作るときにIPL_DEPTH_8Uにするのではなく
IPL_DEPTH_32S又はIPL_DEPTH_32Fにして宣言すれば4Bになるんじゃないでしょうか?
imageDataのR,G,Bは8bit*4なのに注意してください。
参考にどうぞ
URLリンク(rest-term.com)
297:293
09/08/09 12:55:44
ありがとうございます!
ためしてみます
298:デフォルトの名無しさん
09/08/09 15:08:07
引き数にだけ文字列を使いたい時でもconst string&使ったほうがいいの?
299:デフォルトの名無しさん
09/08/09 15:12:42
>>298
何を言っているのかわからん。
300:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/09 15:55:20
そんなかんじですね
ヘッダ解析のコストもあるしchar*でわたして必要ならソースでstringにかえればいいかなと・・・
302:デフォルトの名無しさん
09/08/09 16:01:04
C++ code - 21 lines - codepad
URLリンク(codepad.org)
struct Animalのstatic constなメンバであるweight = 10;
を、Animalを継承したHumanで別の数字に変更したい場合、
このような方法でよろしいでしょうか?
303:デフォルトの名無しさん
09/08/09 16:25:57
>>302
それでおk。
あと
struct Animal
{
static const int weight = 10;
};
が他人が作った物である場合、
struct Human : Animal
{
enum{ weight = 50 };
};
こうやって書き換えた方が良い。
互換性が高い。
304:デフォルトの名無しさん
09/08/09 20:06:43
>>303
互換性ってなんの?
305:デフォルトの名無しさん
09/08/09 20:14:18
>>303
enum って何の略か分かってる?
306:デフォルトの名無しさん
09/08/09 20:18:36
>>305
enumハックしらないの?
307:デフォルトの名無しさん
09/08/09 20:20:52
互換性って古めのコンパイラだと前者を配列の宣言に使用できないとかそういうこと?
308:デフォルトの名無しさん
09/08/09 22:27:30
いまさらenumハックを自信ありげに言われてもなあ
309:302
09/08/09 23:18:20
ありがとうございます。
enumハックで行かせていただきます。
310:デフォルトの名無しさん
09/08/09 23:40:46
よせ、あくまでハックはハックだ
正攻法には劣る
311:デフォルトの名無しさん
09/08/09 23:57:49
>>308
いくつかの環境で開発をしたことがあるなら当たり前の知識である
enumハックのコードを見て、enumが何の略かなんて問うのもどうかと思うよねw
312:デフォルトの名無しさん
09/08/10 00:04:28
>>305
enumハックをしらないやつがなんでまた偉そうにw
313:デフォルトの名無しさん
09/08/10 00:06:07
>>310
劣るかなぁ?どう劣る?
読みづらいとか?
314:デフォルトの名無しさん
09/08/10 01:22:44
たびたびすみません、293です
296さんのサイトを見てみたのですが、どうやらこちらの説明不足だったようです
一つのチャンネルを4バイトで表したいのではなく、ピクセルそのものを4バイトで表したい
つまり、cvCreateImage(cvSize(x, y), IPL_DEPTH_8U, 4);
このようにしたかったのです
それで実際に試してみたのですが、うまくいきません
キャプチャを cvQueryFrame で行っているのですが、おそらくここでメモリを取り直されているのだと思います
実装部分を探して改良しようとも思ったのですが見つかりませんorz
半分スレ違いみたいな内容ですが、解決方法があったらご教授ください
315:デフォルトの名無しさん
09/08/10 01:55:20
>>314
Grabが3yte/pixelで行われる限り、一度は3byte/pixelから 4byte/pixelへの
拡張をしてやらないといけないと思うよ。
OpenCVでやるか(cvCopy?)、自前の関数でやるかは別として。
316:デフォルトの名無しさん
09/08/10 02:06:10
>>314
「cuda rgba」でググったらぴったりのものが出てきた。
URLリンク(wiki.livedoor.jp)
317:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/10 05:46:18
vector<CTest*> ctest(10);
でいけたような。
319:デフォルトの名無しさん
09/08/10 06:17:46
>>317
CTest*のvectorでしょ
push_backするのはCTest*じゃないの?
ctest.push_back(new CTest());
とか
ctest.push_back(NULL);
とか・・・
320:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/10 07:59:13
失礼、ランタイムライブラリをマルチスレッド(/MT)から
マルチスレッドデバッグ(/MTd)に変えたら解決しました。
理屈はわかりませんが・・・
CTest.push_back( new CTest(引数) );
でいけそうですが、この場合、指定のオブジェクトを破棄するとき
deleteで指定のアドレスを破棄してから、vectorのポインタを破棄する、
というクドいコードになりますね・・・
かといって、vector<CTest>と、ポインタで持たずにnewを使わなければ
引数付きコンストラクタでの初期化がややこしくなりますし・・・
しかたないですかね
322:デフォルトの名無しさん
09/08/10 11:36:10
>>321
それは仕方がない。というかnewした以上、deleteするのは当たり前。
vectorにオブジェクトのポインタをプールするなんてまぁよく聞く話だし。
デストラクタに全要素deleteするコード書いとけ。
323:デフォルトの名無しさん
09/08/10 11:38:19
>>321
>引数付きコンストラクタでの初期化がややこしくなりますし・・・
そもそも、ここが判らん。
324:デフォルトの名無しさん
09/08/10 12:46:32
>>321
boost::ptr_vectorで解決
325:293
09/08/10 14:50:51
>>315
確かにキャプチャ部分がこうなっている以上コピーするしかないですよね
Grabを自前で実装できればよいのですが、キャプチャ自体がどのように行われているかさえ
まだ理解していないので当分コピーで済ませていこうと思います
ありがとうございました
>>316
このようなページを知らなかったとはまだまだ勉強不足のようですorz
もうちょっと自分で調べてみようと思います
ありがとうございました
326:デフォルトの名無しさん
09/08/10 15:59:01
>>321
それなら
std::vector<boost::shared_ptr<CTest> > ctest;
ctest.push_back(boost::shared_ptr<CTest>(new CTest()));
コンパイルして書いてるわけじゃないから何か変だったら適当になおして
327:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/10 19:14:12
そら、態々メモリ割り当てずに strcmp が速いでしょ。
329:327
09/08/10 19:17:27
>>328
ありがとうございます。
330:デフォルトの名無しさん
09/08/10 20:26:59
男キャラを担当する女声優はわんさかいるけど、
女キャラを担当する男声優なんて聞いたことない
331:デフォルトの名無しさん
09/08/10 20:27:39
超誤爆
332:デフォルトの名無しさん
09/08/10 20:36:20
どのスレだよw
333:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/10 23:27:55
少なくとも一番目と二番目は全く違うような。
335:デフォルトの名無しさん
09/08/10 23:36:36
>>334
違いますか?
どのあたりが違いますか?
336:デフォルトの名無しさん
09/08/11 02:15:35
同じだよ。どれもコピーコンストラクタが呼ばれる。
ときおり初心者が1番目の式を代入と勘違いするけど
普通の教科書にはそれは代入じゃねぇンだよって説明が書いてあるので
それを知らないのは教科書をよく読んでいない証拠。
もし書いてないなら、その教科書は資源ごみにでも出したほうがいい。
337:デフォルトの名無しさん
09/08/11 05:33:53
すんごい初歩的な質問だと思うんですけど、
deleteで解放をし忘れしているプログラムを何度も動かした場合、
不要なデータはPC上に残り続けるんでしょうか?
溜まったそれらのデータをなんとか解放、削除したい場合は
どうすればいいんでしょ?
338:デフォルトの名無しさん
09/08/11 06:04:39
一度プログラムを終了させれば
まともなOSなら
deleteしていなくても問題ない。
少なくとも、普通の方法で確保したメモリを
プロセスが終了しても解放しないものはまず無い。
メモリ以外のリソースはそうでもない場合もある。
339:337
09/08/11 06:10:01
多謝
340:333
09/08/11 10:32:22
>>336
やっぱり全く等価ですよね。
どうもありがとうございます。
341:デフォルトの名無しさん
09/08/11 10:37:12
explicitを付けて(1)を使えなくしてやるー
342:デフォルトの名無しさん
09/08/11 10:53:55
>>334
こいつ恥ずかしいなwww
>>338
メモリ管理問題
URLリンク(kmaebashi.com)
熟読せよ
343:デフォルトの名無しさん
09/08/11 11:17:26
>>342
言いたいことがあるなら自分の言葉でどうぞ。
344:デフォルトの名無しさん
09/08/11 11:24:16
共用体について質問です
union AB{
A a;
B b;
};
void init(union AB ab){
union AB ans;
ans = ab;
}
void main(){
init( (A)10 ); // 10をA型にキャストして引数に与える
init( (B)10 ); // 10をB型にキャストして引数に与える
}
・・・このソースでなにがしたいかと言うと、
引数に与えた型を判別して、A型ならans.aに、B型ならans.bに
自動的に代入してほしいのです。
考え方が間違えてるのか「AからABに変換できません」とエラーが出ます
この場合、どうしたらいいのでしょうか?
345:デフォルトの名無しさん
09/08/11 11:27:14
共用体にA用とB用のコンストラクタを設ける
346:デフォルトの名無しさん
09/08/11 11:28:05
>>344
>引数に与えた型を判別して
C++ でも使いましょう。
347:デフォルトの名無しさん
09/08/11 11:29:05
>>344
まて、その前にクラスはまともに使えるのか?
例えば
>>333
この様なclass Aとclass Bを記述することは出来るだけの技量はある?
348:デフォルトの名無しさん
09/08/11 11:36:51
クラスは普通に使ってます。
というかこの質問が、同じクラスのメンバ変数が2タイプに分かれる場合があって、
2つ変数を設けて片方を空っぽにするのが気持ち悪いので、共用体を使おうとしてるのです
(初期化関数を統一したいのもあります)
ただ「共用体にコンストラクタを設ける」といわれるとなんのことやら・・・
共用体がクラスのように扱える、ということでしょうか
349:342
09/08/11 11:39:39
>>343
こいつ(は無知なのに「全く違う」という強い否定を使い
それが全くの初歩の話題であったことを知り)
恥ずかしい(とさぞかし思っているだろう)なwww
で満足?
350:343
09/08/11 11:41:05
>>349
あ、いや、後段の方。
351:デフォルトの名無しさん
09/08/11 11:41:40
>>348
クラスと同じように共用体もコンストラクタやデストラクタを持てる
union AB{
....
AB(A a){ this->a = a; }
AB(B b){ this->b = b; }
};
352:347
09/08/11 11:41:42
>>348
>クラスは普通に使ってます。
じゃあとりあえず、
自分のコードのunionになっている場所をclassに単純に書き換えて
実現してみてよ。
それがすぐ答えにつながる。
353:デフォルトの名無しさん
09/08/11 12:06:41
>>342
理屈上はそうかも知れんが、
free()しないとメモリを管理できてないような気がする。
特にdeleteしないとデストラクタがどう動くかよく分からん。
354:デフォルトの名無しさん
09/08/11 12:11:00
つーか、共用体にする意味があるのか?
気持ち悪いと言う理由だけでは意味がなさ過ぎる。
どちらかだけ有効だと言うのであれば、boost::optionalでも使って有効性をチェックすればいいだけの気もするが。
355:342
09/08/11 12:12:23
いや俺はfree()しないことに反対な人だから。
ただこういう意見な人も居るよっていいたかっただけだ。
356:デフォルトの名無しさん
09/08/11 12:12:23
>>353
deleteしなければデストラクタが動くわけないじゃん。
OSは、クラスの管理までしてくれるわけじゃないよ。
357:デフォルトの名無しさん
09/08/11 12:13:11
>>354
boost::optional
の使いどころおかしくねぇか?
valiantじゃなくて?
358:デフォルトの名無しさん
09/08/11 12:23:55
>>357
元質の趣旨が判らんから勝手に推測した。valiantを使うべきならそうしてくれ。
359:デフォルトの名無しさん
09/08/11 20:28:12
class hoge {
public: static fuga();
};
これって普通の関数と比べてなんかいいことあんの?
360:デフォルトの名無しさん
09/08/11 20:35:16
>>359
静的メンバ関数でググれ
361:デフォルトの名無しさん
09/08/11 20:38:17
>>359
1・それがいいか悪いかは別として、似たようなstatic関数が100個くらいあったとき
まとめて他のクラスのfriendにできる
2・hogeのstaticじゃないprivateなメンバに触れる
362:デフォルトの名無しさん
09/08/11 20:55:02
あぁプライベートメンバに触れるのかそれは便利そうだ
二項演算しとかに使えそう
363:デフォルトの名無しさん
09/08/11 20:59:09
とおもったらオペレーターは静的にできなかった・・・
ぬかよろこびだったでござる
364:デフォルトの名無しさん
09/08/11 21:33:44
てか、コンストラクタをprivateにしてstaticなファクトリ作るくらいじゃない?
365:デフォルトの名無しさん
09/08/11 21:44:24
>>359
コールバック関数に使える。
366:デフォルトの名無しさん
09/08/11 22:04:07
URLリンク(codepad.org)
の
std::numeric_limits< double >::quiet_NaN()==std::numeric_limits< double >::quiet_NaN()
の部分はfalseとなるようですが、
これは言語仕様そうなるものですか?
それとも実装依存でしょうか?
367:366
09/08/11 22:05:34
なお、
g++, VC++2008に食わせた後実行したらURLリンク(codepad.org)と同じ結果でしたが、
bccに食わせた後実行したらその実行ファイルは不正終了しました。
> これは言語仕様そうなるものですか?
368:デフォルトの名無しさん
09/08/11 22:22:22
URLリンク(codepad.org)
VC++だと実行結果が100になる
この記述でコピコンが呼ばれるかどうかは仕様で決まってないのかな
369:367
09/08/11 22:26:58
>>368
私の環境のg++ 4.4.0では100になりましたよ。
bcc 5.5.1でも100になりましたよ。
codepadが100にならないのは不思議ですね。
370:デフォルトの名無しさん
09/08/11 22:33:58
>>342の知ったかバカ
>>337の質問が
>deleteで解放をし忘れしているプログラムを何度も動かした場合、
>不要なデータはPC上に残り続けるんでしょうか?
という内容で、
>>338の回答が
>一度プログラムを終了させれば
という、限定された条件なんだけど、わかってるのかね?
371:デフォルトの名無しさん
09/08/11 22:36:28
>>366
TがNaNである値nを持つとき、
型Tの値nがNaNである ⇔ すべてのTの値xに対してx ≠ nである
ゆえにNaN ≠ NaNである
quet_NaNは型がNaN値を持つとき、
LIA-1(ISO/IEC 10967-1)の要求を満たすとあるので(ISO/IEC 14882:1998 18.2.1.2.45)
恐らく規格準拠だと思うよ
詳しくはC++98とLIA-1をあたってくれ
多分NaNに関してはLIA-1に1段落目で書いたことのようなものが載ってる筈
372:366
09/08/11 22:39:12
>>371
ありがとうございます。
助かりました。
373:デフォルトの名無しさん
09/08/12 00:12:29
URLリンク(codepad.org)
URLリンク(www1.axfc.net)
二回目のバイナリ書き込みがなぜかテキスト書き込みになってしまいます
なぜでしょう?
374:デフォルトの名無しさん
09/08/12 01:52:18
>>373
おおざっぱに言うと、式の中にcharが出てくるとint型に拡張される。「汎整数昇格」で検索すると解説が出てくるかも。
だから2回めの書き込みは、cout << (int)(ch * 2) と同じこと。
375:デフォルトの名無しさん
09/08/12 02:03:11
>>370
どうした?
>>337 >>338 >>342の流れはfreeしなくていいよ派の滞りない流れではないか?
376:デフォルトの名無しさん
09/08/12 03:10:30
もしかして、単に優越感に浸りたいだけの基地外さん?
もしかして、単に優越感に浸りたいためだけに、自分に都合の良い解釈しかしない人?
377:デフォルトの名無しさん
09/08/12 03:19:45
バカは相手にすんな
378:デフォルトの名無しさん
09/08/12 03:41:01
>>375
342はfreeしろ派じゃねーの?
379:デフォルトの名無しさん
09/08/12 04:04:11
freeしろ派があのリンク先を持ってくるかなあ?
リンク先を見た上で、しかしこういう考えのもと、やはりfreeすべきだという内容がレスにあるわけでもないし
380:デフォルトの名無しさん
09/08/12 04:41:00
いい加減freeの話題で荒れるのは勘弁してくれないかな。
381:デフォルトの名無しさん
09/08/12 05:16:11
今までの話を纏めると
結論:必ずfreeすべし
382:デフォルトの名無しさん
09/08/12 05:47:53
この話は明示的なメモリの解放を行うことができる言語がある限り繰り返されると思うよ
片手間で作ったちょっとしたツールでせっせと例外捕捉して必死でメモリ解放するとかやってられんしょ
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5021日前に更新/231 KB
担当:undef