1 名前:デフォルトの名無しさん [2006/08/22(火) 09:21:31 ] はきだめのスレへようこそ ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。 なお、質問する人は回答はあまり期待しないでください。 前スレ:はきだめC/C++下級者の質問箱 pc8.2ch.net/test/read.cgi/tech/1124256027/
101 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 21:18:35 ] >>100 仮引数と同じ、tagDataへのポインタ。としか言いようがない。
102 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 10:12:05 ] ポインタの学習中でその質問はないだろー
103 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 10:33:44 ] ×学習中 ○たった今学習を始めたところ
104 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 15:33:01 ] たとえば、(tagData* p)と、(tagData *p)を別物と思ってるとか。
105 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 17:51:29 ] 初心者以前のレベルの質問なのでこちらにきました。 telnetのクライアントの送受信の並列処理(マルチスレッド)について質問です。 telnetクライアント並列処理(親スレッドは受信、子スレッドは送信)を 実装することは、どういうことができるようになることなのでしょうか? 受信と送信のスレッドが起動していて、受信も送信もどちらでもできて、 単純な"送信→受信"だけじゃなくて、 「接続が確立したらいきなり"受信だけ"とか"受信→送信"というのもできる」ように なることをいうのでしょうか? サーバーの場合は、親スレッドがアクセプトして、 子スレッドを作って処理をさせることによって、 「複数のクライアントを相手することができる」というのは勉強しました。 よろしくお願いします。
106 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 18:14:08 ] >>105 送信が連続している状況でも安定して受信できる。 telnetのプロトコルはチャットほど単純じゃないから敢えてそうすることもあるんでないかな?
107 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 21:15:07 ] >>106 ありがとうございます。 >送信が連続している状況でも安定して受信できる。 スレッドがたくさん作られるということでしょうか? スレッドだとちょっと複雑で自分的に難しいので、マルチプロセスで考えさせてください。 以下かなり省略した物になりますがコードです。 if(pid>0){ //親プロセス while(1){ //受信処理 } //シグナル送信、プロセス終了の処理 } else if(pid=fork()){ //子プロセス while(1){ //入力と送信処理 } //シグナル送信、プロセス終了の処理 } サーバーの場合、たくさんのプロセスが作られることになると思いますが、 上記のコードの場合は、親と子2つしかプロセスが作られないことになりますでしょうか? アプリケーションを起動すると"標準入力から送信"、"受信"この2つのプロセスが起動して同時にできるだけ。 送信を連続でした場合、受信は並列ではなく、送信した命令の順番どおり受信することになるでしょうか? 長文すみません。変なところあると思いますので ご指摘ください。補足させていただきます。 よろしくお願いします。
108 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 01:46:54 ] >スレッドがたくさん作られるということでしょうか? いいえ。 >上記のコードの場合は、親と子2つしかプロセスが作られないことになりますでしょうか? はい。 >送信を連続でした場合、受信は並列ではなく、送信した命令の順番どおり受信することになるでしょうか? サーバの御心次第です。 telnetプロトコルもそうだが、例えば標準入出力をみても必ずしも対になっていないことに注意。
109 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 08:23:15 ] >>108 ずばりの回答ありがとうございます。 すっきりできました。
110 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 03:42:09 ] pthread_createで複数スレッドを作ったときの プロセス内のスレッドの数が知りたいんですが方法 ありますでしょうか。 よろしくお願いします。
111 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 01:24:23 ] linuxのfork+execについて質問です。 下記のコードは10回繰り返し、execvを繰り返して、 プロセスが生成できなかったときは、もう一度繰り返したいため 失敗したときに、i--;してます。 ・このコードでエラーのときの処理できているか確認したいのですが、 プロセス生成をわざと失敗するようにすることできるでしょうか? ・i--で繰り返しの処理はできてるでしょうか? for(i=0;i<10;i++){ //子プロセスの生成 if((pid=fork())==0){ execv(path,opt); }else if(pid>0){ //親プロセス }else{ //子プロセス生成失敗の時はiを一つ減らして繰り返し i--; } }
112 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 03:10:28 ] >>111 実験してみたいだけならこんなマクロでも用意すればよろしかろ。 #define myFork(x) (fgetc(stdin) != (x) ? fork() : -1) #んで、fork()の代わりにmyFork('\n')とでもすればいい。
113 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 07:36:29 ] >>112 関数のマクロ定義ってこういうふうに使えるんですね。 はじめてみました。 ど初心者なので感動しました。 どうやって勉強していけば、こういう感覚が身につくんだろう。。。
114 名前:デフォルトの名無しさん mailto:sage [2006/09/24(日) 20:28:57 ] 「勉強」しているうちは無理。
115 名前:デフォルトの名無しさん mailto:sage [2006/09/25(月) 09:28:13 ] 君は勉強をやめたの?
116 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 00:58:06 ] >>115 やってることは同じでも「勉強」だと認識してやってるようなうちは芽が出ないってこと。
117 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 09:10:23 ] なにその理屈w
118 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 12:04:37 ] 勉強をやめてしまうことこそ芽がしぼむだろ普通に考えて。
119 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 12:09:54 ] 日々是勉強
120 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 10:52:48 ] ファイルの排他制御をしたいのですが、open()関数を使って、 ファイルディスクリプタをflockの引数に入れてロックする方法はできました。 ディスクリプタではなくて、ストリームを使って排他モードで開きたいと思ってます。 コードです。 #include <fstream> int main(){ using namespace std; ifstream fin; fin.open("filepath",ios::in, filebuf::sh_none); return 0; } こんなエラーが出ます。 error: `sh_none' is not a member of `std::filebuf' tp://www.codeguru.com/forum/printthread.php?t=293846 こういうページが見つかったので、filebuf.sh_noneにしてみましたが だめでした。 買ったばかりのlinuxのパソコン壊れて、現在の環境はcygwinです。 ・filebuf::sh_noneはどのようにすればよいでしょうか。 ・排他制御は、他にスマートで簡単な方法ありますでしょうか。 よろしくお願いします。
121 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 11:49:22 ] filebuf.sh_noneなんて非標準だから使えないのは別に悪く無い。 正攻法ではファイルディスクプリタで読み書きするバッファクラスを自分で作れということになるのだが、まあ面倒。
122 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 14:42:23 ] >>121 お返事ありがとうございます。 >filebuf.sh_noneなんて非標準だから使えないのは別に悪く無い。 非標準とかそういうこともあるんですか。知りませんでした。 tp://www.kumei.ne.jp/c_lang/cpp/cpp_38.htm 有名そうなページでもfilebufってでてきたので、エラーがでるのは、 自分の書き方が変だと思いこんでました。 いろいろ検索してみると、ifstreamで排他モードはできない と書いてある掲示板の書き込みもありました。 windowsだとライブラリあるんですが、linuxだとそういうの 簡単にできるの無いっぽいです。 boostもちょっと見てみたんですが良くわからないし、 自分のスキル的にopen+flockじゃないとだめのようです。
123 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 15:04:29 ] 実はflock()は完全ではない罠。
124 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 00:01:02 ] >>123 flock調べたんですが、どういうところが完全じゃないんでしょうか? cじゃなくてperlのページなんですが、自分でファイルのある無しの 関数作るよりも、flock使うほうがいいってあったんですが。 検索していたらこういうページを発見しました。 tp://www.tietew.jp/cppll/archive/4753 [io]fstream <=> fd こういうことできるってことしか読み取れませんでしたが、 1、[io]fstream で開く、 2、[io]fstream => fdでディスクリプタ取得 3、flockでロック 4、[io]fstreamで操作 っていうことができないでしょうか。 ストリームとディスクリプタがどんなものかわかって無いので、 並行して操作できるのかどうかわかりませんが。 4番目の操作が、ストリームで操作できないと、 はじめからディスクリプタで開くしかないですよね。 読んでもわからないので、とりあえずやってみるしか無いでしょうか。
125 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 06:50:45 ] flock()は、flock()を使わないプロセスからのアクセスを制限できないんじゃないのか? 誰もがflock()使ってアクセスする保証があるなら問題ないが。
126 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 09:43:57 ] それを問題あると言っちゃうのか・・・。
127 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 11:25:46 ] >>125 >>126 お返事ありがとうございます。 >flock()は、flock()を使わないプロセスからのアクセスを制限できないんじゃないのか? なんかひらめいたかもしれません。 はじめfdで開いてflockします。同じプロセスならそのままfstreamでファイルを 開いて操作できそうです。 違うプロセスでもflockを呼び出さなければfstreamでファイルを開いて 操作できそうですね。実験したらflockを呼び出さなければ待機しませんでした。 fstream.openって返り値ないので、ちゃんとオープン してるのかわからないんですが。書き込みしてみて確認してみたいと思います。 なんかflockの仕組みがやっとわかってきました。 >>124 みたいなややこしいこと考えなくてもよさそうです。 ○自前のflockでも他のプロセスは同じ自前のflockを、 呼び出さないとだめなので、その点はシステムコールの flockと同じということよろしかったでしょうか? ○必要なくなってしまいましたが、[io]fstream <=> fd の関数はどれでどのような使い方かご教示 お願いできないでしょうか。 参考になるのかわからないですが tp://www.tietew.jp/cppll/archive/4767 環境が対応していないのか、わかりませんせんがいろいろ 試しても動きませんでした。 よろしくお願いします。
128 名前:デフォルトの名無しさん [2006/10/01(日) 13:49:36 ] Cで、ある一定時間内に入力がなければ 次の処理に移る、ということをしたいんですが どのように書けばいいのでしょうか。
129 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 14:01:09 ] 一定時間内に入力が無いってどういうこと? 関数内で、tm構造体からforかwhileで時間取ってはその時間の差分とって 条件満たせば、関数を抜け出すようにしてみれば?
130 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 14:15:22 ] キーボードからの入力のことです。 ずっと入力待ちなるんじゃなくてしばらくしたら飛ばしたいんです。 while(時間の条件){ scanfとか; ←ここでずっと止まったりしないですかね? }
131 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 14:24:45 ] 標準Cでは無理だね。 「キーボードが押されたか」の検出は。
132 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 14:37:52 ] そうですか・・・。ありがとうございました。
133 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 14:48:47 ] 標準Cでできないとはつまり、 WindowsならWindowsの関数、UnixならUnixの関数使えばできるよということ。
134 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 15:14:13 ] 機種依存スレに行けばいいかも。 Windowsだったら思い切ってAPIスレへ。
135 名前:デフォルトの名無しさん mailto:sage [2006/10/02(月) 01:13:41 ] 夜遅くにすみません… 今、VC++でプログラミングしてるんですが、 ダイアログボックスから変数を持って行きたい時はどうすればいいですか? 例えば ダイアログボックスで 次の数の二乗を算出します とか書いてユーザに入力を求めて、そしてユーザが入力したら その値を元に計算→出力 的な感じなんですが…
136 名前:デフォルトの名無しさん [2006/10/03(火) 03:14:22 ] ヘルプを見ろ。それで全てが解決する。
137 名前:デフォルトの名無しさん [2006/10/04(水) 22:20:22 ] class CDSig : public CDialog { // コンストラクション public: CDSig(CWnd* pParent = NULL); // 標準のコンストラクタ ・ ・ ・ 以下略 ------------------------------------ VCでダイアログを作成しクラスCDSigを作成したところ自動で上のようなクラスが 自動で作成されました。 標準でコンストラクタが出来ているようですが、自前でクラス内の変数を初期化する コンストラクタを作成するにはどうしたらよいのでしょう? 名前CDSigの定義を追加すると error C2668: 'CDSig::CDSig' : オーバーロード関数の呼び出しを解決することができません。 と怒られます。
138 名前:デフォルトの名無しさん mailto:sage [2006/10/05(木) 00:05:25 ] >>137 その「標準のコンストラクタ」の定義を変更しろ。
139 名前:デフォルトの名無しさん [2006/10/07(土) 14:42:09 ] C++で 「変数aとbの符号が同じ場合」という条件を判断する関数があれば教えてください。 自分はif ( ( a < 0 ) == ( a < 0 ) ) と書いてるのですが、あまりに非効率な気がするので...
140 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 14:49:07 ] a*b > 0
141 名前:139 mailto:sage [2006/10/07(土) 14:53:15 ] >>139 スミマセン 変数a,bは有効数字15ケタなんです。書き忘れました。 それでも掛け算は避けた方がいいかな〜と思ってます。
142 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 15:22:13 ] >>141 有効数字15桁ってどんな型? まぁ、何をもって効率とするかが未定義なのでそもそも答えようがないけど。 ・コーディングの効率なら、テンプレート関数でそういう関数を一個作っておけばいい。 ・実行効率なら、型ごとに大抵は符号ビットを持っているだろうからそれを見ればいい。
143 名前:141 mailto:sage [2006/10/07(土) 15:37:59 ] >>142 double型です。 符号ビットの見方を教えてください
144 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 15:41:46 ] IEEE754 変数(のbit)同士でxorでも取ったあと、 符号bitのみ見ればいいんじゃないかね。
145 名前:141 mailto:sage [2006/10/07(土) 16:00:07 ] 1bitが符号判定に割り当てられてるのは勉強しましたが、 どうやって1bitを見ればいいのかさっぱりわかりません。 コードを書いてもらえませんか...
146 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 16:12:58 ] &
147 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 16:46:54 ] ja.wikipedia.org/wiki/IEEE754
148 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 17:05:08 ] ( a < 0 ) == ( b < 0 ) これが画像処理の1ピクセルごとに繰り返されるのなら 気になるかもしれんが、そうでもないならこれで十分。 double使ってるんだからそんなにシビアなものを組んでるとも 思えんし。シビアなところならdouble使うのをやめる工夫をして、 整数タイプでxorしたらいい。 もしどうしてもって言うなら>>146 だけど、エンディアンには気を つけてね。
149 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 17:12:14 ] つーか、パフォーマンスを期待しているならそんなところよりも他にやることが山ほどありそうだが。
150 名前:141 mailto:sage [2006/10/07(土) 17:20:38 ] >>146 , 147, 148, 149 2000回ほどのループなので、計算負荷が高すぎて困っているというわけではないのですが Cの先輩方はどのように書くのか知的好奇心から質問しました。 &も使えるように練習してみます。ありがとうございました。
151 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 17:27:28 ] ひとつだけアドバイスしておくが おまえが小手先でごちゃごちゃやろうとしている方法よりも 単純な>>139 のままのコードの方がが、最適化されて速くなっている可能性も十分ある。 とりあえず、何か小技を使おうとする前に 必ずアセンブラ出力を見て不満があるかどうかを判断すべき。 もちろん、それ以前に、そこまで速度を求める必要があるのか あるいは他の部分で工夫すべき点がないのか、ということをよーーく考えるべきだが。
152 名前:デフォルトの名無しさん mailto:sage [2006/10/07(土) 18:14:19 ] PXOR
153 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 12:42:50 ] ( a < 0 ) == ( b < 0 ) 何に使うのか知らないけど、これじゃ、ちゃんと動かない可能性ある罠。 a<0が、1返して、b<0が2返したら、!=になるし。 また、aかbのどちらかがゼロだったらどうする?(プラス扱いするならいいけど) おいらなら、signって関数(符号に応じて-1,0,1を返す)を作って、 sign(a)==sign(b)って書く。 おそらく関数の中でif文使うから、実行効率は最悪だけど、 実行効率より、バグ鳥する時のコードの読みやすさ考えないと。 あと、どうしても効率最優先でも、何に使うのかが分からないと、最適な判別式は決められない。
154 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 12:47:33 ] pugya-
155 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 13:15:16 ] >>153 a < 0 が0か1であることは保証されている。
156 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 13:30:28 ] >>153 Cの比較演算の仕様を勉強しなおしてからお越しください。
157 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 14:36:37 ] 0 か 1 になるのは C.質問者は C++ で聞いている.まあそれでも The operands shall have arithmetic, enumeration or pointer type. The operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) all yield false or true. The type of the result is bool. であって,bool 同士の == が正常に動くことも保証されてるから >>153 はアホ.
158 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 23:56:38 ] #include <string> using std;;string; struct A { string a; }; struct B { string b; B &operator=(const string &s){ b = s; } }; int main(void){ A a; A aa = a; // xxx B b; B bb = b; return 0; } --- 質問なのですが、main()のxxxのところってまずいですよね?
159 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 23:59:42 ] 別に。
160 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:00:15 ] 間違えた。 B &operator=(const B &b0){ b = b0.b; }
161 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:02:14 ] >>159 stringのメンバにポインタがないことは保障されているのですか?
162 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:09:21 ] >>161 stringはコピーコンストラクト可能かつ代入可能。 ポインタは含まれているが、コピー時は生ポインタを明け渡すわけじゃなくって ポインタが指し示す内容をコピーする様に作られてる。 よって何の問題も無い。
163 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:15:33 ] A のデフォ代入演算子がmemcpy() だとまずいと思ったのですが。 つまり、デフォの実装が A A::operator=(const A &a0){ memcpy(this, &a0, sizeof(A)); }
164 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:17:34 ] 送信失敗、すみません。 デフォの実装が A A::operator=(const A &a0){ memcpy(this, &a0, sizeof(A)); return *this; } これだと、メモリ二重開放にならないかと心配したわけです。
165 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:21:22 ] C++のクラス(=構造体)の代入処理は、各メンバの代入処理を行なう形になる。 たまたまPODメンバがまとまっていれば、memcpy()相当の実装をするかもしれない。
166 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:21:48 ] なるよ。 つーかそんな馬鹿な実装はしちゃいかん。 C++におけるmemcpyは純粋に生のバイナリデータ転送用で、メンバのコピー用じゃない。 余談だけど、thisがポインタなのはthis登場時にC++がまだ参照をサポートしてなかったからで、 thisがポインタであることを副作用的に使うコード(memcpyの引数にする、this[2]とか書く、エトセトラ)は 総じて何か勘違いしている傾向。 忌避したくらいで丁度いいぞ。
167 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:22:32 ] >>159 ,>>162 は間違い。自前で代入演算子をちゃんと定義してやらないと >>163-164 で心配している通り memcpy な実装になってメモリリークする。
168 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:27:03 ] >memcpy な実装になってメモリリークする。 服脱いで正座してbasic_stringのコード読んで来い。 そんなになってたまるか。アホらしい。
169 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:29:57 ] >>168 コンパイラが A A::operator=(const A &a0){ a = a0.a; } と解釈してくれるものなのでしょうか?
170 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:36:15 ] >>169 >165
171 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:37:51 ] 158の場合では代入演算子ではなく、コピーコンストラクタが使われる。まあ話は変わらないが。 operator =が定義されていないときのデフォルトの実装は、 各メンバと基底クラスに代入演算子を使用したのと同じ動作をするということになっている。 また、コピーコンストラクタにも同じような規定が存在する。 162の言うとおりstd::stringが適切なコピーコンストラクタやoperator =を持っているため、 158/164の心配は杞憂だということになる。
172 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:38:56 ] ああ、ごめんみんなもう書いていたね。
173 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:41:26 ] >>168 それ全然問題の本質じゃないから。
174 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 00:43:06 ] >>171 >158の場合では代入演算子ではなく、コピーコンストラクタが使われる。 例が悪くてすみません、全くもってその通りでした。 >>165 これがFAでしたか。 皆様ありがとうございました。
175 名前:153 mailto:sage [2006/10/09(月) 00:44:02 ] >>155-157 そうだったのか。申し訳ない。
176 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 01:56:06 ] 質問させてください。 ちょっと説明が下手でわかりにくいかもしれませんが、 ある関数の中で、引数の配列の長さを知ることはできるでしょうか? 例えば配列の平均を求める関数averageを作りたいとき main関数内でa[100]とかb[80]とかを定義して、average関数に引き渡すとします。 (average(a)みたいな感じで) このとき平均を求めるには当然、配列の要素の数が必要になるわけですが、 これをaverage関数内で求めることはできるのか?という質問です。 今は配列とともに要素の数もaverage関数に渡しているのですが、他に良い方法があったらご教授ください。
177 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 02:01:26 ] >>176 C++なら関数テンプレートにすればできんことはないよ。 多分↓こんな感じにすればおk template<int array_size> int average(const int array[array_size]) { ... }
178 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 02:15:52 ] template <int N> int average(int (&array)[N])
179 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 02:16:34 ] で、後は要素の数は sizeof(array) / sizeof(array[0])
180 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 02:17:14 ] Nでもいいかもしれん。
181 名前:デフォルトの名無しさん mailto:sage [2006/10/09(月) 02:22:05 ] Cなら要素数を別の引数で渡すこと以上の方法はないし、それが最も一般的だと思う。 C++なら177-178のように直接要素数をテンプレート引数にして配列への参照を引数にするのもいいが、 Boost.Rangeを使えばついでにstd::vectorなんかも渡せるようになってお得かもしれない。 ただしコードが難解になりやすいきらいがある。 #include <iostream> #include <numeric> #include <boost/range.hpp> template<typename RandomAccessReadableRange> typename boost::range_value<RandomAccessReadableRange>::type average(RandomAccessReadableRange& r) { typedef typename boost::range_value<RandomAccessReadableRange>::type value_type; return std::accumulate(boost::begin(r), boost::end(r), value_type()) / boost::size(r); } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; std::cout << average(arr) << std::endl; }
182 名前:176 mailto:sage [2006/10/09(月) 12:05:08 ] なるほど…Cでは引数として渡すしかないんですね。 実はC++はまだ勉強してないんですが、これを機に勉強してみようと思います。 みなさんご丁寧にありがとうございました!
183 名前:デフォルトの名無しさん mailto:sage [2006/10/10(火) 17:29:20 ] >>182 Cなら配列と要素数を構造体にまとめる方法もある。 配列の要素数を知りたいという問題の解決には全くなっていないが、多少管理が楽になる?
184 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 03:17:22 ] >>151 がいいこといった。みんあ、よく聞いておけよ!
185 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 22:40:17 ] 連想配列みたいなことをしたいのですが質問です。 以下コードです。 #include <stdio.h> #include <string> #include <vector> int main(){ std::vector<std::string> data;//連想配列を想定 enum key_type {name,street,tel} _key; //name=val_name&street=val_street&tel=val_tel //この文字列を分割して、一番目のkeyとvalueを取り出す std::string key="name"; std::string value="val_name"; //連想配列と仮定して代入したいのですが、 //'_STL::string' から 'key_type' へのキャストはできないというエラーがでます data[(key_type)key]=val_name; printf("%s",data[(type)key].c_str()); return 0; } 文字列を分割して取り出した、key値を列挙型の値にできれば うまく連想配列に代入できるんですが、上のようなコードで 動くようにできないでしょうか。 よろしくお願いします。
186 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 22:47:07 ] 訂正お願いします。 ×data[(key_type)key]=val_name; ○data[(key_type)key]=value; もうちょっとはっきり違う名前にすればよかったですが、 _keyは列挙型で、keyはstd::string型です。 よろしくお願いします。
187 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 22:55:28 ] >>185 key_typeのname, street, telなどといった列挙子は、 コンパイル時定数で、基本的に実行時に参照する方法はない。 C++は、どちらかというと何でも静的(コンパイル時)に解決するのが特徴。 どうしても実行時に文字列から列挙子を取り出したければ、 std::map<std::string, key_type>を使えば何とかなるだろうが、 だったら、初めからそのdataをstd::map<std::string, std::string>にすればいいだろということになるわけで。
188 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 22:57:01 ] std::map<std::string, std::string>
189 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 23:07:25 ] >>187 >>188 std::map検索してみました。 連想配列みたいなことができそうですね。 ありがとうございました。
190 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 23:11:07 ] まあvectorでも大きめに取っておいて、push_heap()などのアルゴリズムを 使って、中にはstd::pair<std::string, std::string>を入れておけばそこそこの 速度は出るが。
191 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 23:34:12 ] >>189 みたいな事じゃなくてそのまんま。
192 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 23:35:36 ] うわっごめん std::search_heap()ってalgorithmにはないのね。 素直にstd::sort掛けてからstd::binary_search()使うしかないか。
193 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 23:40:22 ] Loki::AssocVectorという手もある。
194 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 00:11:20 ] >>193 それ良さそうだね。今std::mapと、std::pairをぶち込んだstd::vectorを 作って比較したら、std::mapの方がstd::vectorのstd::lowerbound()を 使ったバージョンより2倍速かった。自分の環境でですが。
195 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 07:01:35 ] for(double t=0;t<100;t+=0.1) { ///// } このようなforループで、変数tを増加させているのですが、 途中でtの値を出力すると、 10.000000000018849 のように、小さな誤差が蓄積しています。 割り算とかはではなく、単純な足し算のみしかしていないのですが、 このような誤差はどこから来るのでしょうか?
196 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 07:15:11 ] 0.1 を有限桁数の二進数で厳密に表現することができないから。 それにしても誤差が大きいな。こっちだと 10 に対応するのは 9.9999999999999805。 理論的には 0.1 を有限桁数の二進数で表したときの誤差が 1e-16 くらいで、 これを 10/0.1 = 100 回くらい足すから 1e-14 くらいの誤差になるはずだけど。 こっちの結果はそれに適合してるんだけどなあ。
197 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 13:15:49 ] なにか誤差を蓄積しない方法はないでしょうか? for(double t=0;t<1000;t+=1) { ///// } とかなら、誤差が蓄積しないのでしょうか?
198 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 15:13:38 ] >>197 基本的に浮動小数は誤差が入ると思え。 ループ回数が重要ならループ変数は必ず整数にするのが原則。 ただし、 >>197 の例だと(おそらく)誤差は全く出ない。 詳しくは浮動小数の表現(IEEE754方式)を調べるべし。
199 名前:デフォルトの名無しさん mailto:sage [2006/10/15(日) 17:42:36 ] windowsのマルチスレッド、排他制御についてなのですが、 こちらでも良かったでしょうか。 スレッドA,B,Cがあるとします。 このA,B,CをCriticalSectionクリティカルセッションを使うと 他のスレッドが処理していたらお互いに待つことになると思います。 そうじゃなくって、 Aが処理しているときはB,Cはストップ Bが処理しているときは他のスレッドは待たない Cが処理しているときは他のスレッドは待たない ということがしたいです。 クリティカルセッション使うと、B,Cが処理しているときも 他のスレッドが待つことになってしまいます。 Aの排他制御する区間に入るまでに、B,Cは区切りのいいところまで処理して(ループの最後など) 待機をさせるというイメージです。 Aのスレッドだけコードのイメージです。 void thread_A(void){ //いろんな処理 //B,Cを区切りのいいところで、待機させる命令 EnterCriticalSection(§ion); //排他制御 LeaveCriticalSection(§ion); //いろんな処理 } 説明がくどくてすみません。 そもそもクリティカルセッションの話じゃないんでしょうか。 よろしくお願いします。
200 名前:デフォルトの名無しさん mailto:sage [2006/10/15(日) 18:03:24 ] 1.マルチスレッドプログラミング相談室に行く 2.Win32API質問箱に行く 3.最高にド低脳な発言してください in ム板に行く
201 名前:デフォルトの名無しさん mailto:sage [2006/10/15(日) 18:24:04 ] クリティカルセクションだし