トップページ⇒tech
1001コメント324KB

C++相談室 part69

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/05/04(月) 21:04:54
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part66
http://pc12.2ch.net/test/read.cgi/tech/1231640498/

※part63, part66 が重複していたようですので part69 としました。
01531512009/05/10(日) 22:02:27
>>152
フラグ立てですか。
読み込みに失敗したと言うことで、エラー状態にしているわけですね。
ありがとうございます。
・・・でも何で例外を投げる仕様にしなかったのでしょう?
使いづらそうな。。。
0154デフォルトの名無しさん2009/05/10(日) 22:04:40
C++の本ってみんな今何読んでる?
0155デフォルトの名無しさん2009/05/10(日) 22:05:30
今は何も読んでない
0156デフォルトの名無しさん2009/05/10(日) 22:06:21
>>153
例外を投げる事もできる
ただ歴史的経緯があって例外がC++に存在しなかった時代から
iostreamは使われて来ているわけでデフォルトで例外はOFFに
されている

例外を投げるにはメンバ関数exceptions()にトリガとなるビットを
セットすればよい
01571532009/05/10(日) 22:14:28
>>156
なるほどー!
サンクス。了解できた。
0158デフォルトの名無しさん2009/05/10(日) 22:15:39
>>154
Boost C++ libraries 第二版
0159デフォルトの名無しさん2009/05/10(日) 22:45:39
>>154
はじめてのC。

電車の中で立ち読みして
JKやOLからの冷たい視線でたまらなく興奮する人にお勧め。
0160デフォルトの名無しさん2009/05/10(日) 22:48:21
>>154
やさしいC++
電車の中で読む度胸はないぜ
0161デフォルトの名無しさん2009/05/11(月) 00:01:31
配列に配列を代入したいときは、
配列1[i]=配列2[i]などとしてforで回すのが一般的でしょうか
0162デフォルトの名無しさん2009/05/11(月) 00:04:14
C++なら<algorithm>のcopy関数を使う方が一般的
0163デフォルトの名無しさん2009/05/11(月) 00:05:59
memc(ry
0164デフォルトの名無しさん2009/05/11(月) 00:07:18
つ std::copy
一見関数だらけになるが、恐ろしいほど最適化される。
0165デフォルトの名無しさん2009/05/11(月) 00:09:03
>>162-164
ありがとうございます
とりあえず全部試して見ます
0166デフォルトの名無しさん2009/05/11(月) 08:04:07
>>154
Programming - Principles and Practice Using C++
0167デフォルトの名無しさん2009/05/12(火) 22:16:57
std::vector<char> v(256);

で &v[0] を char 256個の配列として扱って良いものですか?
0168デフォルトの名無しさん2009/05/12(火) 22:41:08
>>167
> &v[0] を char 256個の配列として扱って良いものですか?
v[0]でvの先頭要素のリファレンスが返ってくる。
そして&v[0]はそのアドレスを取得している。
よって先頭アドレスが取得できるのか?ということかい?

たしかOKと聞いたことがあるなぁ。
C++編(標準ライブラリ) 第2章 vector
ttp://www.geocities.jp/ky_webid/cpp/library/002.html
の○生の配列との関連のところで。

0169デフォルトの名無しさん2009/05/12(火) 23:11:26
>>167
ええよ
C++98とC++03間の変更点の一つにvectorはリニアアドレス↑に
取られる事が保証されたというのがある

規格票を見れば書いてあるはず

stringはまだでc++0xで保証される予定
0170デフォルトの名無しさん2009/05/13(水) 05:29:54
GUIを考えています。
例えば、ボタンの上にマウスを持っていった時に、ヘルプメッセージを出す事を考えます。
所謂コマンドパターンによる実装になると思うのですが、
ボタンが親子関係でもないオブジェクトの参照を持つ事になり、気持ち悪く感じます。
これは気にしても仕方ない事なのでしょうか?
0171デフォルトの名無しさん2009/05/13(水) 08:13:10
仕方ないというより、別に気持ち悪くないし。
0172デフォルトの名無しさん2009/05/13(水) 18:48:03
履歴一覧を表示する元に戻すボタンでも実装するのか?

>所謂コマンドパターン
って言ってみたかっただけなんじゃ
01731672009/05/13(水) 21:17:48
>>168, 169
ありがとうございます。
std::string の c_str() のようにポインタを取得するというメソッドが
無いので、もしかしてやっちゃいけないことなのかと不安に思ったのです。
0174デフォルトの名無しさん2009/05/13(水) 21:43:46
C/C++の趣味グラマなんだけど、
アセンブラも勉強した方がいいのかな?
0175デフォルトの名無しさん2009/05/13(水) 21:47:28
わざわざしなくていいと思うよ
意識せずとも、いずれ自然に必要になって自然に勉強してる
01761742009/05/13(水) 21:52:03
>>175
ほほう、そんなもんなのか。ありがとう。
むしろもうちょっと高級言語も知っとこうかなぁ。。。
0177デフォルトの名無しさん2009/05/13(水) 23:27:37
C/C++をやると平気でインラインアセンブラを書くようになるよな
特にSSE2/SSE3関連は
0178デフォルトの名無しさん2009/05/14(木) 00:48:26
>>171,172
クラスの関連が複雑になるのと、オブジェクトの寿命管理の点が気になりました。

> 履歴一覧を表示する元に戻すボタンでも実装するのか?
これも1つです。
ソースの見通しが悪くなり、あとで機能を追加したいと思った時に困るのではないかと思いました。
0179デフォルトの名無しさん2009/05/14(木) 01:13:32
ササビーってIntelから出るけどあれどうなの?
0180デフォルトの名無しさん2009/05/14(木) 01:53:25
俺、趣味でオセロプログラム書いてるけど、>>177みたいなことに手を出してみた。
最初は難しいイメージがあったが、やってみるとそうでもなかった。
0181デフォルトの名無しさん2009/05/14(木) 02:25:47
0から1の乱数を表示させるプログラムがほしいんですがわかる人いますか?
調べてみてはいるのですが、なかなかうまく動きません。
乱数生成のためのソフトとかはいるのでしょうか?

もしお暇がありましたらよろしくおねがいします。
0182デフォルトの名無しさん2009/05/14(木) 02:30:59
>>181
今、どれくらいの知識を持ってるの? どんなコード書いてみたの?
とりあえず、標準Cライブラリの rand っていう関数は知ってる?
0183デフォルトの名無しさん2009/05/14(木) 02:31:35
double r;
srand((unsigned int)time(0));
r = rand() / RAND_MAX;
printf("%lf", r);
0184デフォルトの名無しさん2009/05/14(木) 02:44:00
static_cast<double>(rand()) / RAND_MAX;だろとツッコミがほしいんだろ
0185デフォルトの名無しさん2009/05/14(木) 02:54:43
>>183
きっと0か1しか返さないぞ。

>>178
>ボタンが親子関係でもないオブジェクトの参照を持つ
ここでいってるオブジェクトってコマンドクラスのこと?
同じボタンの機能がころころ変化するのでもなければ
参照を持つ必要なんて無いと思うけど?
どうしてもUIにヘルプ文字列を埋め込みたくないのなら
コントロールクラスに自分(ボタン)が今どんな機能なのか
問い合わせるメソッドでも作ったら?
0186デフォルトの名無しさん2009/05/14(木) 03:34:01
>>182
rand関数はさっきから学びはじめたばかりです。
知識は基本的なプログラムならつくれる程度です。
0187デフォルトの名無しさん2009/05/14(木) 03:38:42
randは本格用途では使い物にならんぞ
ゲームのサイコロ振るくらいに使うならいいけど
0188デフォルトの名無しさん2009/05/14(木) 03:40:12
>>186
rand関数は、0 から RAND_MAX までの範囲の整数を返す。
(RAND_MAX は実際にはある特定の数値であり、コード中に RAND_MAX と書けばその数値として扱われる)

後は、0 から RAND_MAX までの範囲の整数を、0 から 1 までの間の小数の値に変換すればよい。
>>183-185あたりを参考に。まだ分からんところがあったら聞いてくれ。

もし本格的な乱数を使用したいなら、boostのrandomってのを調べてみるといいが、
まあそこまでする気がないならrandでいいよ。
0189デフォルトの名無しさん2009/05/14(木) 03:43:14
>>187
本格用途ではなくごく簡単なプログラムで、サイコロを振る程度です。

>>188
rand関数について自分でも調べていたところです。
丁寧におしえていただきありがとうございます。
もしわからないことがあったら書き込みたいと思います。
ありがとうございました!
01901892009/05/14(木) 04:34:11
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
double random;

srand((unsigned) time(NULL)); // rand関数による乱数生成を不規則にする
for(int i=0; i<20; i++){
random = (double)rand()/RAND_MAX; // 0から1までの乱数の生成
printf("%f\n",random); // 表示する
}
}

ここでのアドバイスなどをもとにして自分でつくりました。
コメントは自分でつけたので語弊があるかもしれません。
01911892009/05/14(木) 05:08:06
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
double random;

srand((unsigned) time(NULL)); // rand関数による乱数生成を不規則にする
for(int i=0; i<20; i++){
random = (double)rand()/RAND_MAX; // 0から1までの乱数の生成
printf("%f\n",random); // 表示する
}
}

ここでのアドバイスなどをもとにして自分でつくりました。
コメントは自分でつけたので語弊があるかもしれません。
01921892009/05/14(木) 05:11:06
すみません一つはまちがいです。

上のプログラムだと乱数表示はされるのですが
一個だけ乱数表示するプログラムを実行すると、何度実行してもほとんど変わらない乱数
(例えば、0.963742 ⇒0.972378 ⇒0.981201など)
になってしまいます。

良い解決方法はないでしょうか?
0193デフォルトの名無しさん2009/05/14(木) 05:37:58
win32環境ならtime()をGetTickCount()なりQueryPerformanceCounter()なりで置き換えるとか。
0194デフォルトの名無しさん2009/05/14(木) 06:28:58
>>185
> ここでいってるオブジェクトってコマンドクラスのこと?
> 同じボタンの機能がころころ変化するのでもなければ
> 参照を持つ必要なんて無いと思うけど?
ヘルプメッセージを表示するクラスのメンバ関数をboost::functionに入れてボタンクラスに渡すという意味です。
Clickなど他のイベントも同様に「他のクラスのメンバ関数をboost::functionに入れて〜」とやっていったらクラスの関連が複雑になるのではないのかと。
また、boost::functionの中で保持されているポインタの寿命(有効か)の不安を感じます。
0195デフォルトの名無しさん2009/05/14(木) 06:33:38
random = (double)rand()/(RAND_MAX+1.0); // に、しとけ。
0196デフォルトの名無しさん2009/05/14(木) 07:42:43
struct A{virtual void operator()()=0;};
struct B:A{virtual int operator()(int)=0;};
struct C{A&x;C(A&a):x(a){} int operator()(int i){return static_cast<B&>(x)(i);}};
struct D:A{void operator()(){}} d;

int f(){
C c(d);
c();
return c(1u); // これ・・・
}
コンパイルを通ってしまわない様にするにはどう改造すればいいのでしょう?
0197デフォルトの名無しさん2009/05/14(木) 08:01:28
>>196
コンパイルが通らないようにする方法ならいくらでもわるわけで、
何がしたいのか挙げてもらわないと望む答えは得られないでしょう。
01981962009/05/14(木) 08:10:12
void operator()(){x();} を書き忘れ
struct C{A&x;C(A&a):x(a){} int operator()(int i){return static_cast<B&>(x)(i);} void operator()(){x();}};
0199デフォルトの名無しさん2009/05/14(木) 09:03:46
>>195
なんのために+1.0するの?
0200デフォルトの名無しさん2009/05/14(木) 09:06:17
>>199
結果に整数 N をかけることで、簡単に N とおりの選択に使う乱数が得られる。
「0 から 1 の乱数」が 1.0 を含んでいると、こうはいかない。
0201デフォルトの名無しさん2009/05/14(木) 09:12:53
>>200
今回の目的は
「0から1の乱数を表示させる」
だけど、いいの?
0202デフォルトの名無しさん2009/05/14(木) 09:20:22
>>201
日本語だけでは閉区間なのか開区間なのか、区別がつかないんで、
質問者に判別してもらうしかないな。

簡単なサイコロの用途であれば 200 の性質が役に立つはずなんだけど。
0203デフォルトの名無しさん2009/05/14(木) 09:22:50
簡単なサイコロの用途であれば、
random = rand()%6; // で、十分。
02041892009/05/14(木) 11:12:04
>>193
「GetTickCount()識別子が見つかりませんでした」とでます。
変数として扱われているのですかね・・・
他のプログラムをみてみたのですが使い方がわかりません
勉強不足ですよねスミマセン

>>195
お返事ありがとうございます
プログラムの下から4行目のことですよね?
してみたのですがほとんど値がかわりませんでした
何かまちがっているでしょうか
02051892009/05/14(木) 11:13:50
>>193
「GetTickCount()識別子が見つかりませんでした」とでます。
変数として扱われているのですかね・・・
他のプログラムをみてみたのですが使い方がわかりません
勉強不足ですよねスミマセン

>>195
お返事ありがとうございます
プログラムの下から4行目のことですよね?
してみたのですがほとんど値がかわりませんでした
何かまちがっているでしょうか
02061892009/05/14(木) 12:43:26
>>193
GetTickCount()は識別子が定義されてませんとでてしまいます
変数としてあつかわれてしまっているようです

>>195
お返事ありがとうございます
1を足したのですがあまり乱数はかわらなかったのですが
何かまちがっているのでしょうか
02071952009/05/14(木) 12:45:45
コンパイラは Borland だろ。
02081892009/05/14(木) 12:49:10
>>193
GetTickCount()は識別子が定義されてませんとでてしまいます
変数としてあつかわれてしまっているようです

>>195
お返事ありがとうございます
1を足したのですがあまり乱数はかわらなかったのですが
何かまちがっているのでしょうか
02091892009/05/14(木) 12:51:07
すみません何度もかきこんでしまいました
02101892009/05/14(木) 12:55:04
>>202
[0,1)区間となっています。0以上1未満ということです。
サイコロの乱数程度といってしまいましたが
サイコロは関係ありません
0211デフォルトの名無しさん2009/05/14(木) 13:25:26
>>208
windows.hをインクルードしてないとか言うなよ
0212デフォルトの名無しさん2009/05/14(木) 13:29:26
だって、それを書けなんて誰も言ってないじゃないですか。
02131892009/05/14(木) 13:30:44
>>211
ご指摘ありがとうございます。
してませんでした。
02141952009/05/14(木) 13:41:16
>>212 コンパイラの名前とバージョンは?
0215デフォルトの名無しさん2009/05/14(木) 23:50:55
すごく初歩的な質問ですが、C++で数字の小数点以下を
繰り上げるには何をつけたらいいんですか?
0216デフォルトの名無しさん2009/05/14(木) 23:53:45
std::ceil()だろ
Cにもある
0217デフォルトの名無しさん2009/05/14(木) 23:55:09
つceil
0218デフォルトの名無しさん2009/05/15(金) 00:16:28
それは「切り上げ」じゃん。ちゃんと答えてやれよ
因みに俺は小数点以下の「繰り上げ」なる概念について知らないので答えられん
0219デフォルトの名無しさん2009/05/15(金) 00:17:50
くだらねえ…
02202152009/05/15(金) 00:21:12
おかげさまで解決しました。どうもありがとうございましたm(_ _)m
0221デフォルトの名無しさん2009/05/15(金) 00:25:23
ちなみにceil()は負の数は0から離れる方向になるからな
0222デフォルトの名無しさん2009/05/15(金) 09:52:02
>>203
それって偏りが出るよね。
0223デフォルトの名無しさん2009/05/15(金) 10:02:11
RAND_MAXが極端に小さい環境ならね。
32767程度あれば、5461回が5462回になる程度のばらつきだよ。
0224デフォルトの名無しさん2009/05/15(金) 10:22:09
マジで⁉
0225デフォルトの名無しさん2009/05/15(金) 10:23:33
>>222
サイコロに偏りが無いとでも?
0226デフォルトの名無しさん2009/05/15(金) 10:45:40
線型合同法は下位ビットの周期性が
0227デフォルトの名無しさん2009/05/15(金) 12:14:07
テンプレートのテクニックをまとめた、テンプレートの著書を教えてください。
知っているのは、modern C++ と、テンプレートテクニックという本です。

良いサイトや良い本の情報ください。
0228デフォルトの名無しさん2009/05/15(金) 12:26:08
C++ Template Metaprogramming: Concepts, Tools, And Techniques From Boost And Beyond
0229デフォルトの名無しさん2009/05/15(金) 12:53:18
マウスでいまクリック、もしくはドラッグしているファイルやディレクトリのパスを
取得する方法ってありますか?常駐ソフトのような形で、起動してからクリック、ドラッグ
したファイルのパスをテキストログとして、出力するようなものを作りたいのですが・・・。
0230デフォルトの名無しさん2009/05/15(金) 12:56:30
なんでこっちに来たんですか?
0231デフォルトの名無しさん2009/05/15(金) 13:00:38
>>226
そんな乱数でもない数列をrand()という名前の関数の出力にする処理系が悪い。
ゴミだから早急に廃棄しろ。
0232デフォルトの名無しさん2009/05/15(金) 13:39:39
>>225
製作工程の都合で、1,6の面積が微妙に大きいという話しか?
それとも、くりぬかれた目による重心のずれ、密度の偏りの方か?
0233デフォルトの名無しさん2009/05/15(金) 13:55:52
>>228
ありがとうございます。
翻訳出てないんですかね……残念です。

C++の一番の特徴であるテンプレート関係の本が少ないのは何故?
わかりやすくテクニックを知りたいのに
0234デフォルトの名無しさん2009/05/15(金) 15:54:15
すみませぬ JAVAから入っていまC++を勉強し始めたのですが、
C++で、配列で宣言した変数は、跡になってから自らがいくつの要素を持つ配列なのかチェックする方法ってありますか?


Javaだと、
String str[] = new String[3]
のように宣言した場合、
str.length を見れば要素数を見ることができますが、C++の場合は方法ありますか?
0235デフォルトの名無しさん2009/05/15(金) 15:56:52
>>234
ないから素直にstd::vector使っとけ
0236デフォルトの名無しさん2009/05/15(金) 15:57:32
>>234
sizeof(str) / sizeof(str[0]) で自分は調べてる
0237デフォルトの名無しさん2009/05/15(金) 15:58:40
>>236
アホか
0238デフォルトの名無しさん2009/05/15(金) 16:03:46
え?駄目なの
俺も>>236を常用してるけど・・
0239デフォルトの名無しさん2009/05/15(金) 16:07:00
大丈夫、話が噛み合ってないだけだ。
char * foo = new char[3];
した場合は要素数を知る手段はない。
char foo[] = "abc";
した場合は要素数(≠文字数)を>236で得られる。
02402342009/05/15(金) 16:20:29
ありがとうございます。
C言語の場合、
配列を作ったら作りっぱなし、メモリのどこまでがその配列に割り当てられた場所かという情報はどこにもないという認識で良いですか?

たとえば10要素の配列を作ったあとに20番目の要素にアクセスしようとすると、JAVAだとぬるぽが出て教えてくれますが、
Cの場合はシステムから見てそれが分からずに、20番(に相当する場所)を読みに行ったり、書き込んでしまう という理解で良いですか?
0241デフォルトの名無しさん2009/05/15(金) 16:25:57
良いです。
ちなみにここはC++のスレです。
0242デフォルトの名無しさん2009/05/15(金) 16:39:03
>>240
そうです
運が良ければアプリ自体が吹っ飛んでくれますが運が悪いとそのままメモリ破壊して動き続けます
なのでJavaしかできない人が集まってC++案件とかやるととても楽しいことになります
0243デフォルトの名無しさん2009/05/15(金) 16:41:59
そもそも、10要素の配列を作ったあとに20番目の要素にアクセスしようとするような奴は
「Javaしかできない人」ではなく、「Javaもできない人」
0244デフォルトの名無しさん2009/05/15(金) 16:47:00
>>240
大きな勘違いをしている。
>配列を作ったら作りっぱなし、メモリのどこまでがその配列に割り当てられた場所かという情報はどこにもないという認識で良いですか?
配列は、>36でサイズを得ることができる。
つまり、newなんていう外道なモノを使わずに、(昔なつかしの)固定長配列を使うかstd::vectorを使えと言うことだ。
0245デフォルトの名無しさん2009/05/15(金) 20:48:50
Cに配列なんてなかった
0246デフォルトの名無しさん2009/05/15(金) 21:16:41
>>245
何??
0247デフォルトの名無しさん2009/05/15(金) 21:18:10
何の話?
0248デフォルトの名無しさん2009/05/15(金) 21:19:50
ついに狂ったか?
0249デフォルトの名無しさん2009/05/15(金) 21:22:37
Cなんてなかった
0250デフォルトの名無しさん2009/05/15(金) 21:50:31
コンピュータなんてなかった
0251デフォルトの名無しさん2009/05/15(金) 21:52:47
平行世界とつながったな
0252デフォルトの名無しさん2009/05/15(金) 22:09:27
仕事なんてなかった
■ このスレッドは過去ログ倉庫に格納されています