STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
いちおつー
delete ++1;
Segmentation fault. [Core dumped]
Java脳の人はどうして無意味にC++に対して攻撃的なのですか?
C/C++と比べて遅い遅い遅いといわれるだけでその他の部分が正当に評価されてないように思ってるからだな。
だって本当に遅いんだから仕方ない そもそも早さで張り合おうとすること自体が間違い
C#で楽しろよ
>>12 C++に挫折した人がやってるからじゃないかな?
C++とJavaは見た目は似てるが、言語設計思想が全く異なる。というわけで、C++で 当たり前のことをやっていても、Javaをやっている人から見れば理解できないことも 多い。基本的にC++は効率重視。大体のことをコンパイルタイムで終わらせようとする。 Javaはポータビリティー重視。誰でもどこでも使いやすいように作られている。 Javaで理解できないのは、RAIIが徹底していなくて、デストラクタがない点。 これで余計に苦労しているし、例外安全にするのが難しい。さらに、 ポリモーフィズムを使わないのにクラスを継承させるのが普通な点。これらが パフォーマンスに大きな悪影響を及ぼしている。(Javaが起動時に遅いのは 深い階層で継承された各クラスのコンストラクタがひたすら走ってるから) 最近では動的言語が台頭してきたり、他言語がJVMに対応してきたりで、Javaは 中途半端になってしまった感がある。
知らないうちに時代に乗り遅れてた焦りなんじゃないかな Pascalだけしか知らないかつてのマと同様に
JavaはCPUが以前と同じペースで速くなる前提で作られたからな 予想外に早く頭打ちになったのが計算外だった
元から遅いしメモリ以外のリソースは漏らしまくるし それを何とかしようとJNI使いすぎで可搬性落ちて仕様も肥大して 最近のJavaは何が売りなのかよくわからん
そこでC#ですよb
monoって追随できてんの?
>>21 むしろ、CPUが十分早くなったらLLのほうが良かった、というオチじゃないかと。
C#使うくらいならC++/CLIにする
なぜ
企業主導の言語は使う気になれない。
どの言語のことを
C#
とりあえず JavaはもちろんC#, C++/CLIすらスレ違いなんだけど。
STL mapはメモリに確保されますけど、 ディスクを使用して、メモリ量が減らせるmapは無いですか? たとえば、char [10] -> intにmapを使用した場合、 最も使用量が減らせる場合でも一件登録するのに 8 * 10 + 4 =84バイト必要です。 100万件で84M使用します。これ以上行くと環境によって不安定になりそうです。 テンポラリファイル使えばよさげなんですが。
84バイト?
まちがえてました。 最低で10バイト + 4バイトでした。 いずれにしても、確保数が多いとメモリを圧迫します。 mapでディスク使用するライブラリなど無いですか?
GDBMとかQDBMとかBerkeleyDBとか
データベースですか。思いつきませんでした。 パフォーマンスが気になります。 こういうのは、C++で自作したとしても同じくらいの探索速度だったりしますか。 速さが大事なんです。
わかりました
効率悪そうだけど代入と暗黙変換でディスク読み書きするproxyのmapを作る、とかかな
HDD使えるならPCなんだろうけど、 100Mや200M程度で不安定になるとかどんな骨董品だ。
骨董品や、マルチタスクに対応するため、メモリ使用量が少ない方が良いです。 最低基準に合わした方が良いです。
掛ける手間と出したい実行速度によりけりだな 速度重要だけど骨董品対応でSSE命令使えませーん とかもやだし
あと、骨董品に対応するために手間暇かけて複雑な ことやって、ついでにバグ多かった、というのは困るな。
>>42 手間かけたくないのでライブラリが良いんです。
>>44 メモリアロケータを自作すれば既存のやつがつかえそうですね。
でもやり方が良くわかりません。
アロケータでぐぐればアロケータの作り方くらい出てくる。
47 :
デフォルトの名無しさん :2009/10/07(水) 19:46:52
あの、マジで質問です。 入門からテトリスを自作できるまでの知識がすべて入った本ありませんか?
>45 メモリ上で動作する事を基本としたライブラリをディスク上で使用するのと、 ディスク上で動作する事を前提としたライブラリをディスク上で使用するのと どっちが効率がいいと思う? あと >35 が挙げているのは「データベース」と言った場合に一般的に想起される RDBMS じゃなくて、 キー・バリュー・ストアだから機能としては map とほとんど変わらない。
>>47 googleで検索して印刷してまとめれば探してる本になるよ
>>49 天才すぎわろたwwww
天才乙。天才って本当にいるんだな
Windowsゲームプログラミングという本があってだな
これがテトリスのすべてだ。 <body onKeyDown=K=event.keyCode><script>X=[Z=[B=A=12]];h=e=K=t=P=0;function Y() {C=[d=K-38];c=0;for(i=4;i--*K;K-13?c+=!Z[h+p+d]:c-=!Z[h+(C[i]=p*A-Math.round(p/ A)*145)])p=B[i];!t|c+4?c-4?0:h+=d:B=C;for(f=K=i=0;i<4;f+=Z[A+p])X[p=h+B[i++]]=1 if(e=!e){if(f|B){for(l=228;i--;)Z[h+B[i]]=k=1;for(B=[[-7,-20,6,17,-9,3,6][t=++t %7]-4,0,1,t-6?-A:-1];l--;h=5)if(l%A)l-=l%A*!Z[l];else for(P+=k++,j=l+=A;--j>A;) Z[j]=Z[j-A]}h+=A}for(i=S="";i<240;X[i]=Z[i]|=++i%A<2|i>228)i%A?0:S+="<br>",S+=X [i]?"■":"_";document.body.innerHTML=S+P;Z[5]||setTimeout(Y,99-P)}Y()</script>
53 :
デフォルトの名無しさん :2009/10/07(水) 21:23:29
基本から学べます? てか、買ってみようかな。
基本ってどこから? ゲーム以外の入門書はクリアしたれべるとか。
めげる必要がどこにあるのやら
>>55 C++スレでCの理解力、JavaScriptの読解力を求める理由を教えてくれ
前者はわからなくもないが
60 :
55 :2009/10/08(木) 11:01:13
何? そんなに知りたい?
61 :
デフォルトの名無しさん :2009/10/08(木) 11:04:09
>>61 これはひどい。まともに読む気にならない。
まずは int main() に。コンパイルエラーが出るようじゃ話にならん。
次は、 18 とか 5 とか 8640 とかの意味のわからん即値を int const とかの
名前つき定数にする。ループ範囲の間違いがあればこれで見つけやすくなる
だろう。
次は、処理が ////... で区切られてるあたりを目安に関数に分ける。
ひとつの関数内でしか使わない変数はローカル変数に。複数の関数で共有する
変数は引数で渡すのがいいんだけど、難しいようならとりあえずグローバルに
しても、 main() いっこで完結してるこのプログラムならあまり問題ない。
これぐらいやれば、途中で間違いが見つかるんじゃないかなぁ?
少なくとも人に読んでもらえるコードには近づくだろうね。
確かに読む気起きないコードだね。printf を表示するとデータ0だと言うことかな。 void とか、コードのスタイルとか、CをC++に中途半端に移行させた ような感じのコードだな。(通す compiler もあるのかな。) まず、コードを削って、初めの fscanf だけで 66行目までで徹底的に調べたら? 全部0ならそこでわかるはず。 どうでも良いことだけど 61行目は62行めのカッコのあとだろうね。 60,124行目 format が %.1lf に見えるけど、これ平気なのかな。 double なら %lf だし、%.1lf だと g++ なら compile error 出す。 compile しないならわかるんだけどね。 他のところは %lfになってるのかな。
ファイル名をsprintf()のフォーマット文字列で定義しているのも問題だな。 sprintf(tmpt, "%s", FILE_NAME_2004)と言う風にしておくべきだし、それくらいなら fopen(FILE_NAME_2004, "r")でいい。
Cプログラミング診断室でしか見た事のないようなコードだな… こんなの書くヤツが実在したとは…
俺が書くともっと酷いコードになるぜウヒャヒャww
67 :
デフォルトの名無しさん :2009/10/08(木) 14:04:01
この板の住人は優しいようで、厳しいようだ。 BOSS カンコーヒー
68 :
デフォルトの名無しさん :2009/10/08(木) 14:07:36
レインボーマウンテン
あるクラスをLIBに納めたいんだが、 それは継承して使うクラスなんだけど、privateメンバを隠蔽したい。 でもヘッダに書かないと 「ヒープが壊れています」 でも書きたくない。 これ、どうすればいいんでしょ。 そもそもムリ?
べつのクラスから継承したクラスをよびだせよ
すまん、さっぱりわからんだ
公開用と開発用でヘッダファイルを分けちゃいかんのだろか。
分けてる // innerA.h (内部LIB) class A { int b; public: A() { /* うんぬんかんぬん */ } virtual ~A(){ /* うんぬんかんぬん */ } void Set(int val) { b = val; } virtual void Override() = 0; }; // outA.h (公開) class A { public: A(); virtual ~A(); void Set(int val); virtual void Override() = 0; }; で、これを継承してvoid Set(int val)を実行 → ヒープ爆破 実は本格的なLIB作成経験あまりなし
提供する機能だけのクラスを作って仲介すれば良いんでは?
普通同じクラスならヘッダは同じものを使う 君のやりたいことはFactorパターンとかを調べればおk
>>73 それじゃ違うものに同じ名前をつけているだけ。
そうではなくて、公開しないメンバには違う型と名前でダミーメンバを用意してサイズを合わせるの。
まぁ、>75だな。
どっちかと言うとfactoryよりもpimplのような気がする
79 :
69 :2009/10/08(木) 15:23:47
>>75 パターンについては(ググって)わかったけど、
実装の仕方がいまいちわかりません・・・
80 :
デフォルトの名無しさん :2009/10/08(木) 15:25:10
age
81 :
69 :2009/10/08(木) 15:34:11
Pimpl、やってみたいと思います
privateメンバの隠蔽と聞いたら真っ先にpimplを検討する
float radius に円の半径を格納するけれども描画時には その半径をそのまま使わずに10段階ぐらいに分ける プログラムを作りたいのですが速度を重視する場合 どのようにするのが良いでしょうか? 例えばraiusを0.0 〜 100.0の範囲に収めるようにして radius/10をすれば(int)radiusで整数で10段階に分ける 事が可能ですが割り算は使いたくないです。 0.1を掛ければ速いのか・・・ それにしても(int)へ変換すると遅いのかな? switch使うよりも少数のまま if(radius < 10.0) ・・・ else if(radius <20.0) って地味に分ける方がいいのかな? 何か良い方法はあるでしょうか?
>>83 本当にその割り算がボトルネックであると言う充分な観測が得られたのでなければ、
素直に割り算を使うのがいいと思うよ。
つーか、どうせ定数の割り算はまともなコンパイラなら乗算するコードを出力してくれるし。
>>84 >の割り算がボトルネックであると言う充分な観測が得られたのでなければ
円の数が多く出せれば多いほど良いという前提でプログラムを組んでいますので
ボトルネックとまで言えなくても最善を尽くしたいです。
恐らくは、「円を出す」という処理の方が圧倒的にその割り算より低速ですから、そのような考察は無意味です。
float は誤差が生まれるから素直に if にしといた方がいい。
メモリ=バッファへ書き出すんだろ。
1+(int)radius/10が最善だろうとおもうが、もしかしたら微妙に速くできるかもしれない。
0.1 = 2^-3 + 2^-4 + ・・・だから
n/10 = n*0.1 = (n
>>3 ) + (n
>>4 ) +となる。
大して変わらないとは思うがな。
>>88 そうです。
>>86 描画自体はビデオカードが担うのでここでは考慮外で構いません。
>>87 区切り方はアバウトでも良いです。
(2^(-4)) + (2^(-5)) + (2^(-8)) + (2^(-9)) = 0.0996 だな。
1 + (n
>>4 ) + (n
>>5 ) + (n
>>8 ) + (n
>>9 ) となるが、右の方は常に0だから
1 + (n
>>4 ) + (n
>>5 ) だけで正確な割り算なるな。
別に10段階じゃなくてもいいです。
>>90 の式の意味が理解できない馬鹿タレですが
floatでも8で割るなら
radius >> 3 でOKですか?
だからぁ、描画リクエストと割り算(実際には掛け算になる)一個のコストを比較しろtって。
ダブルバッファ、トリプルバッファ、4バッファなどを工夫する方が良い。 FPSを幾つにするのかも大事。 ここをうまくやらないと、どんな計算したところで無駄。 圧倒的に描写は時間食う。
>>94 描写間隔が1/60だとして、
工夫なしだと10万個が、工夫したら10.5万個だったら意味あるじゃん。
>>92 x0.1で終わりだろ。
加減算と乗算の差は高々3クロックぐらいで
それは意味が無い。
>>95 メモリの量が莫大になるので、バッファを増やすのは
どうでるか分かりませんが試せる事は全部やって見ようと思います。
だいたい分かりました。ありがとうございました。
直接描写で無いとしても、 バッファ=メモリに転送するのが、圧倒的に時間かかりそう。 描写という用途では、/10の計算を工夫したところで意味ないだろ。 画面構築を手抜きする方法でも考えた方が良いんでは?
ビデオカードの特性、アクセス方法を調べるほうが高速化になるな。
つーか命令をメモリからフェッチするだけで負荷になるんだから、ボトルネック でもないところを無駄に長々と書くのはパフォーマンスが落ちるんだよ 分かったらボトルネック以外は気楽に書け
質問の内容はradiusに値を収める手段。 いかに円を多く表示する方法じゃない。 そこんとこ勘違いしないように。
メモリfloat1個分の確保とfloatの掛け算じゃ 確保が圧倒的に時間掛かるだろうが float10万個をまとめて転送するのとfloat10万個を それぞれ掛け算するのは・・・ねぇ?
GPUプログラム研究しろ。 256並列とかの計算できるからさ。 ビデオカード直アクセスが一番効果でる。 やったことは無い。
>>105 >>104 CUDAは環境依存だしグラフィクスプログラムとの相性も悪いかも。
まぁ、計算量が増えて尚且つ並列性が確保できているなら
シェーダーでの演算とかから試してみるつもりです。
GPGPUをよく知らないで適当に張ってるだけにしか見えない
>>93 >floatでも8で割るなら
>radius >> 3 でOKですか?
ダメです
とりあえず(int)radius/10が妥当に一票
素直に書けばオプティマイザが良きに計らってくれるので
そのあとプロファイラでボトルネックを探せばいいんじゃない?
struct bound { int val_; bound(int v) : val_(v) {} }; struct range { int lw_, up_; range(bound lw, bound up_) : lw_(lw.val_), up_(up.val_) {} }; range operator , (bound lw, bound up) { return range(lw, up); } class f_array { f_array(range r) {/* rのlw_, up_を境界にもつ配列を作る */;} }; int main(void) { f_array fa(3,6); fa(3) = ・・・; ・・・ fa(6) = ・・・; 上のようにカンマ演算子をオーバーロードしたんですが期待した動作をしてくれません カンマ演算子が働く前にただのoperator ,(int, int)と判断されて片方が捨てられもう片方がintとして残ってしまいます 暗黙の変換を使う前提でint, intよりもbound, boundを優先させる方法は無いでしょうか?
>>108 マジっすか!!
御指摘ありがとうございました。
つーかね。厳しいかもしれんけど、はっきり言っちまうよ。 > floatでも8で割るなら > radius >> 3 でOKですか? こういうレベルの人にはゴリゴリの最適化とか無理。不可能じゃないけど、手探り してる時間があったらハードウェアの勉強をした方が早いくらいに非効率的。 普通に書いてプロファイラで遅いところだけ絞り込む、っていう手法がどうしても 嫌なら、floatの中身は何なのか、そもそもCPUがどうやって動いてるのか、そういう ところを勉強しなきゃ無理。じゃなきゃ、効率を上げようとしても逆に効率を落とし かねない。「ここがハードの限界に近いな」ってところを見極められない限り、どこ で最適化を終了させていいのかも分からないだろ?
試行錯誤してそれなりに高速化したつもりのコードなのに、低水準を分かってる奴が 書き換えたら数十倍速になっちゃったりするって奴だな
>>111 概ね異論はないです。
floatの中身をきちんと調べます。
地道にやります。サンクス。
char *p と 長さ size が与えられたとき、string型を作るにはどうしたらいいですか?
C++留置場
1msも調べないで聞いている
>>114 は、死ねばいいと思うよ。
string s(p, size); だけでよくなかったっけ
p[size]='0'; string s(p); とか教えてやればいいのにw
自己解決しました。 string( p, size ); で出来た気がしてたのに出来ずに質問しました。 unsigned char *だったのが駄目でした。
すみません。回答ついてたのも見なくて、後で自己解決と書いてしまいました。 サンクス。
>>121 他にもっと突っ込むべきとこがあるだろw
つーかわざとだろ
123 :
デフォルトの名無しさん :2009/10/08(木) 21:14:42
非常に不可解なことが起こっていて悩んでいます。 visual studio 2008で開発しているのですが、 ダイアログで設定して、一度変数に代入した値が、 いつの間にか書き換わってしまうのです。 その変数に代入される箇所はすべてブレークポイントを設定して チェックしたのですが・・・。 ある一つの変数だけでなく、いたるところでそのような現象が見られるのですが 原因は何が考えられるのでしょう。 他で開発されたソフトに付け足して使っているという状態ですが、 それが関係するのでしょうか? よろしくお願いします。
>>123 配列のオーバーラン
添え字の範囲を無視して代入してないかい?
それかスタックオーバーフローか
>>124 配列のサイズをオーバーして書き込んだり、
解放済みのメモリブロックに書き込んだり、
どこを指しているかわからない未初期化のポインタが指している位置に書き込んだり、
といったことをしていると、そういうことが起きる
>>123 配列やバッファのオーバーラン/アンダーランが発生している可能性。
127 :
125 :2009/10/08(木) 21:25:08
>>123 デバッガに、特定の変数が書き換えられたらとまる機能ってなかった?
129 :
123 :2009/10/08(木) 22:18:51
なるほどー。チェックしてみます
>>109 fa(3,6) のカッコ内のカンマは、関数引数の区切り。カンマ演算子じゃない。
fa((3,6)) これだとカンマ演算子。
> 暗黙の変換を使う前提でint, intよりもbound, boundを優先させる方法は無いでしょうか?
無いよ。
っていうか、そんなことができる宣言が可能だとすると、 operator , (int, int) を
使っていた既存のプログラムの意味をこっそりぶち壊すことができてしまう。
そんな危険なことはできないようになっているのが自然。
カンマ演算子や論理演算子のオーバーロードはしないのが基本だけど、何が問題と なるのかを正しく理解した上で敢えてやることはある でも、理解してるようには見えないので、やるな
>>131 > 正しく理解した上で敢えてやることはある
変態ライブラリの中にはあるよね。
全くC++には見えないようなコードになるライブラリだよなw
いちどだけ少量、多数ファイルを読み込む場合 Windowsのキャッシュを通さないほうが速いですか? キャッシュ通さない場合、 読み込み位置、読み込みサイズ、読み込むバッファ位置が セクタサイズの整数倍とか条件が面倒なのですが。 やる価値ありげならやろうと思います。
昨日か一昨日からテトリス自作を考えてるものです 将来はゲームプログラマになりたいと思います。 テトリス自作までの学習が効率良くできるサイトありませんか? (※入門〜)
つ DarkBASIC
それ有料だし。 HSPでいいだろう。 なに言語でも完成品を作れることが大事。 他の言語でも、部品の品ぞれえが悪いかもしれないが、 そこがなんとか出来ればアルゴリズムには違いはないからな
全米が噴いた( ´,_ゝ`)プッ
143 :
デフォルトの名無しさん :2009/10/09(金) 18:25:36
Stoping now! ぼくはC++で作りたいんです!
テトリスはC++っていうよりもC部分で作るのが面白そうだな。 ビット演算とかシフトといかにもCっぽい操作ばかりで作るんじゃん?
>>143 C++にこだわるな。物には順序がある。
HSPで作れなければプログラム適正がない可能性有り。
早めに見切りが付けられる。
HSPは日本語でゲーム開発するための資料が多いし、材料も揃っている。
これで駄目なら何やっても無理。
- 日本では相手にされないと嘲笑されたDarkBASICですが、VCの追い抜き体勢に入りましたね。 日本は封建主義的な社会ですので外来種は常に跳ね返す癖が付いています。 - しかし昨今の世相を見渡しますと、食料品から政権交代までダメなものは国産品でも跳ね返しますね(笑) 確かに、実際に機能しないものは実力行使で跳ね返す癖も付いてきたと言えますね。 - そもそもDarkBASICのユーザー層はどこに重点を置いているのですか。 従来の複雑なWindowsAPIに依存しない、手軽で簡素な3Dプログロミングを楽しめるところでしょうね。 これがかなりのウェイトを占めていると思いますし、Linuxのユーザー層にも移管しやすい好材料です。 - APIはそんなに複雑ですか。 いったん理解すれば難しくはありませんが、ある程度の学習とノウハウ蓄積が必要になります。 これが初心者にとっては大きな障壁になります。 - DarkBASICが日本で注目されるようになったのはいつ頃でしょうか。 まだ注目されていません(笑) DarkBASICを好んで使うと予想されるユーザー層は、現在のところHSPを使っています。 - HSPはフリー(無料、無償)で3Dプログラミングが可能な簡易言語として広く認知、普及していますね。 HSPは国産のプログラミング言語で、API、DLLを組み合わせて広範な3Dプログラミングが可能です。 中学生程度でも柔軟に使いこなしている実例があります。 - ではDarkBASICは日本での必要性を感じないのでは? ところがそうではない情勢なんですね。
147 :
デフォルトの名無しさん :2009/10/09(金) 18:59:02
>>145 っていうことはCやってるこのスレのみなさんは
HSPから始めてるんですか?
目的によるだろ ゲームプログラマならHSP→…→C++というコースはけっこういると思う それ以外だとアセンブラかCから来てる奴がほとんどじゃないの あとは関数型から来てるTMPマニアの変態ども
150 :
デフォルトの名無しさん :2009/10/09(金) 20:06:25
>>148 >>149 ありがとうございます
さっそくゲ製作板に行きたいと思います
とりあえずHSPやってみたいと思います。
151 :
デフォルトの名無しさん :2009/10/09(金) 20:11:30
なーんてね(゚∀゚)
テトリススレ行ってみましたけど、
ぱっと見た感じ知能指数が弱いように見えます
質問したら叩かれそうです
>>152 え・・そんなスクリプト垂れ流しされても困ります・・><
10/31までに完成したらここへ参加しよう
HSPプログラムコンテスト2009
HSPプログラムコンテストは、プログラム言語HSP(Hot Soup Processor)により
作られた作品を募集し表彰するイベントです。
すべての応募作品は無料で公開され、ダウンロードできますので、
作品を見てみたいという人も大歓迎です。
HSPを使っている人も、そうでない人も楽しむことができる自作プログラムの祭典にぜひご参加ください。
詳しくは、下のリンクをご覧ください。
締切りまで1ヵ月になりました
いよいよ10月に入って残り期間1ヵ月となりました。
多くの作品ご応募頂き、ありがとうございます。
ギリギリまで製作されている方は、最後の追い込み頑張ってください。
そして、これから製作する人もまだ間に合いますので、ぜひコンテストにご参加ください。
http://hsp.tv/contest2009/
HSPのお勧め入門サイト教えてください・・・ 本買おうかな・・
スレ違すいません 今すぐ、ここを出て行きますから許してください
まずは、サンプルでも動かしてみてどんなのが出来るか見てみれば? hsp\sampleにあるやつ。 HSPTVからもデモみれたとおもうが。
HSP( ´,_ゝ`)プッ
160 :
デフォルトの名無しさん :2009/10/09(金) 21:00:35
>>158 いいですね。
でもHSPって低脳がやってるイメージがあるし、やっぱりやめようかと考えてます。
・・・でもやっぱりHSPから入ったほうがいいですかね・・?
最終的には3Dのゲーム製作なんですが・・
C++とHSPの差はやることを短縮できる違いがあるだけ。速度の違いもあるが。 堀井雄二はドラゴンクエストの制作者だが、 本人はプログラム出来ないし、どんな言語で作られてるかも知らないだろう。 ゲームの面白さは言語に依存しない。
つ DarkBASIC
ドラクエは外注で開発するのは何でなんだろう。 九州の会社だろ。 合併して人材豊富と思うが。
>>161 重要なのはアイディアですね
ゲームに一番向いてる言語とかあります?
つまり
どの言語でもゲームは作れるし、大差はないってことですか?
- 間もなくVCが新種のDarkBASICに追い抜かれますが 確かにC言語の衰退は避けられない事実です。 - それはどうしてですか 趣味でC言語を体得しようとするプログラマがいないからでしょうね。 - 会社で使ってるのに趣味で使いたくない? そうでしょうね。 そもそもC言語は生産効率向上には寄与しなかったと言う事実があります。 仕様書を噛み砕くだけの、馬耳東風な感覚では愛着が湧かないでしょう。 - 将来的にCプログラマは切り捨てられる? すでに旧来のCプログラマは他の言語に移管してると思います。 職業的にもCでは使えない状況ですし。 - 加速するIT化に対応できないと言うことですか。 他の言語群がCを包括的に上回っています。 - BASIC言語の台頭の可能性はあると思いますか。 あるでしょうね。 言語仕様が簡素化されて生産効率が上がれば可能性はあると思います。 - かつてCはBASICより速い実行コードを生成すると自慢していましたが。 それは過去の幻想でしょうね。
だからゲ製作板いけっつの 知能指数が低そうだから、知能指数が低そうなスレ選んでやったのもわからないくらい知能指数低いの?
- 日本では相手にされないと嘲笑されたDarkBASICですが、VCの追い抜き体勢に入りましたね。 日本は封建主義的な社会ですので外来種は常に跳ね返す癖が付いています。 - しかし昨今の世相を見渡しますと、食料品から政権交代までダメなものは国産品でも跳ね返しますね(笑) 確かに、実際に機能しないものは実力行使で跳ね返す癖も付いてきたと言えますね。 - そもそもDarkBASICのユーザー層はどこに重点を置いているのですか。 従来の複雑なWindowsAPIに依存しない、手軽で簡素な3Dプログロミングを楽しめるところでしょうね。 これがかなりのウェイトを占めていると思いますし、Linuxのユーザー層にも移管しやすい好材料です。 - APIはそんなに複雑ですか。 いったん理解すれば難しくはありませんが、ある程度の学習とノウハウ蓄積が必要になります。 これが初心者にとっては大きな障壁になります。 - DarkBASICが日本で注目されるようになったのはいつ頃でしょうか。 まだ注目されていません(笑) DarkBASICを好んで使うと予想されるユーザー層は、現在のところHSPを使っています。 - HSPはフリー(無料、無償)で3Dプログラミングが可能な簡易言語として広く認知、普及していますね。 HSPは国産のプログラミング言語で、API、DLLを組み合わせて広範な3Dプログラミングが可能です。 中学生程度でも柔軟に使いこなしている実例があります。 - ではDarkBASICは日本での必要性を感じないのでは? ところがそうではない情勢なんですね。
チャーチ・チューリングのテーゼというのがあってだな まともなプログラミング言語は速度の差こそあれ 「出来ること」は全て同じであることがわかっている
では実証してみましょう(笑)
170 :
デフォルトの名無しさん :2009/10/09(金) 21:20:08
171 :
デフォルトの名無しさん :2009/10/09(金) 21:30:40
結論→大規模なプログラムを組むならC++ 簡単テトリスはHSP
>>163 時間が無限に使えれば、アセンブラでもコボルでもフォートランでも3Dゲーム作れるだろ。
ハードウェアにアクセスする部分は、言語単体では無理かもしれないが。そこは自作すれば。
一番、自分がやることが少なくて3Dの勉強になるのは、HSPと思う。
>>161 堀井雄二はプログラミング「できた」よ。
旧エニックスのホビープログラミングコンテストの佳作獲ったのが縁で
ドラクエ作ることになったんだから。
もちろん、現代のゲームプログラミングの技術を、現役のマと同レベルで
理解しているはずはないけど、言語もわからないような全くのプログラミング音痴ではない。
特に初期ドラクエはメモリ容量との戦いで、あと1KB削るために、1000センテンスある台詞から
平均1文字ずつ削っていったとか、そういう開発してたらしいから。
ディテールは分からずとも、ゲームを組むということの大まかなフィーリングを
マと共有することはできるはずで、それって本当の未経験者にはできない大きなことだと思う。
そもそも堀井はシナリオライターでメインプログラマーは中村なんだからどうでもいいだろ
>>173 の言うとおり堀井は全くのプログラム音痴なわけじゃない
なんか同世代らしき人を発見。
ニワンゴもチュンソフトも、ドワンゴの傘下だったんだな。いま知った。 チュンソフトは敵対的買収されたの? 経営難だったの? 買収されるとは意外だった。
- ではDarkBASICは日本での必要性を感じないのでは? ところがそうではない情勢なんですね。 - 具体的にはどういった情勢なんですか。 人的負荷(Human-overhead)の問題を回避できない背景があります。 - 分かりやすく解説して下さい。 ヒューマンオーバーヘッド(以下H.O.H.)の問題は、1つのプログラムを作成する場合に、1つの言語やプラットホーム の知識だけではなく、複数に跨る言語やプラットホームの知識を必要とする場合によく発生します。 - それがDarkBASICとどう関係するんですか。 DarkBASICはH.O.H.の問題を回避できるようにAPIやハードウェアの個体差を窺いながらプログラミングをする必要が ありません。 もちろん、すべてではありませんが(笑) - それはどのような場合に効力を発揮するのでしょうか。 3Dプログラミングにおいて抜群の生産効率を発揮するでしょうね。 - それはCやHSPでもAPIや外部のDLLを使えば簡単にできるでしょう? 確かにそのとおりです、しかしH.O.H.の問題は解決できません。 - 生産効率向上には何が必要なのですか。 体系的に簡素化された言語仕様、これに尽きますね。
178 :
デフォルトの名無しさん :2009/10/10(土) 00:05:20
教えてください。 ↓はコンパイルできるんですが、Widget()は左辺値を生じないので コピーコンストラクタには右辺値が渡され、仮引数型にconstがないので コンパイルできない筈では? struct Widget { Widget() {} Widget(Widget&) {} }; int main() { Widget w(Widget()); }
二次元コンテナのイテレーターってどういう仕様がいいんだろう やっぱイテレーターのイテレーターかな
>>178 const付けなかったらただのコンストラクタじゃん
>>178 もし、VCなら警告レベルを4にして試してみよう。
182 :
178 :2009/10/10(土) 00:27:39
>>181 g++ 4.3.3 で -Wall でコンパイルしましたが特に何も出ません。
JISX3014の「8.5.3 参照」の「5 1)」に右辺値の参照適合に関する記述がありますね。
コピーコンストラクタは右辺値でも参照できるということでいいのかなぁ
VCだと非標準の拡張機能の警告がでるけど。
最適化されて、警告を出さないみたいだけど
>178 コンストラクタの呼び出しじゃなくて関数宣言(Widget を返し、Widget を引数にとる w という関数)だと解釈されてるんじゃないの?
186 :
178 :2009/10/10(土) 00:42:41
>>185 それだとコンパイルエラーが出たんですよ。
で、「コピーコンストラクタでは?」と試したところ異なる結果が出てここに相談に来た次第で。
「12.2 一時オブジェクト」の「5」の参照が一時変数に結合される場合に当てはまってるのかなぁ
それは警告が出るから Widget w((Widget())); にして試した。
188 :
178 :2009/10/10(土) 00:44:18
ごめんなさい、関数呼び出しじゃなくて関数宣言ですか。 読み間違えました。
189 :
185 :2009/10/10(土) 00:46:42
訂正。 「引数なしで Widget を返す関数へのポインタ」を引数にとり、Widget を返す w という関数 Widget w((Widget())); これでお望み通りエラーが出ると思う。 「C++で最も奇妙な解析」(Effective STL 第6項)ってやつ。
190 :
178 :2009/10/10(土) 00:53:04
なるほど。 試しにメンバ変数xを追加してw.xをアクセスすると怒られますね。 ./test.cc:11: error: request for member ‘x’ in ‘w’, which is of non-class type ‘Widget ()(Widget (*)())’ Effective STL 読んで勉強してきます。どうもでした。
- それはCやHSPでもAPIや外部のDLLを使えば簡単にできるでしょう? 確かにそのとおりです、しかしH.O.H.の問題は解決できません。
192 :
161 :2009/10/10(土) 10:33:56
釣れた。
194 :
デフォルトの名無しさん :2009/10/10(土) 11:52:37
なになに
>>193 のゲームにウイルスでも仕込まれてんの?
197 :
デフォルトの名無しさん :2009/10/10(土) 13:41:15
JAVAとかC++とか言われても、サッパリわからん
別にいいんじゃね
199
200
200++
(´・ω・)←使用禁止
(´・ω:)
(´・M・)
(´・λ・)
(´@u@)
208 :
デフォルトの名無しさん :2009/10/10(土) 22:25:46
顔 意味 (・V・) (ははははは) p(^−^)q (ヒャ〜 おもしれ〜) (>、<) (応援ヨロシクっ!) (M) (マリオが大好きだよ) (・○・) (鼻がカユイ) (^U^) (だーい満足) (^板違い^) (板違いですよ〜) (==) (最近ゲームつまんないですね) (l l) (悲しいよ〜) (・w・) (パズルゲームが好きです) (’’) (カービィが大好き) 使用例 >>○○ そうですね。(==) でもマリオなんてどうでしょう?(M) 僕は満足でしたよ。(^U^) あ、なんか鼻がむずむずしてきた。(・○・) すみません。 (・V・) みんなどんどん使ってくださいねー。(>、<)
(´・ω・)
(´ ・ ω ・ )
int main(){bool static const ω=true;for (;ω;) ;}
int main(void) { while ( "ω" ) ;}
(+C_+ )
c++でjavaみたいにローカルスコープでスレッドオブジェクトを作成して 走らすみたいなことってできますか? スレッドプールを使うしかないような気がするのですが詳しい方教えて。
boost::threadを使えばすぐできる。 でなければ、begen_threadexを使ってthreadクラスを作る。
216 :
214 :2009/10/11(日) 11:11:57
boost::threadならjoinしてdeleteする必要があるのでは? ローカルスコープでnewして放置はc++ではできないですよね。 すると上位スコープにboost::threadオブジェクトのポインタをshared_ptr等で持っておく必要になるかと。 そうなると次回に同じローカルスコープでboost::threadがnewされたときに前回のオブジェクトをjoinして待たねばならない? join後に新規オブジェクトとswapするような実装だと、ちょっと違うかなと思うのですが。
217 :
デフォルトの名無しさん :2009/10/11(日) 11:45:42
listとか
218 :
214 :2009/10/11(日) 11:49:55
listで保持するくらいなら、ある程度の容量でスレッドプールを作りますよね。
boost::thread_groupを使えばスレッド終了時にthreadクラスのインスタンスを削除してくれるね。 newして放置というのは、C++では好ましくないと思うよ。
220 :
214 :2009/10/11(日) 13:13:40
thread_groupは抱えているスレッドが終了したからといって削除はしないでしょ? それをやるとしたらthread_groupは内部で監視用のスレッドを立てているか抱えるthreadとsignal/slotで接続されているかだと思う。 さっきから初心者と思われる人がレスしてくれているけど・・・。
- 結果としてBASICが根幹にあるんですね。 どうしてでしょうか。 簡単で手軽、誰にでも学習の機会があることでしょうね。 CやHSPだとこうはいきません。 CやHSPだとAPIのノウハウが必要になりますし、それは大きな障壁となります。
>>221 DarkBASIC厨うざい
こんな所にまで誤爆すんな
- それはCやHSPでもAPIや外部のDLLを使えば簡単にできるでしょう? 確かにそのとおりです、しかしH.O.H.の問題は解決できません。
225 :
214 :2009/10/11(日) 14:15:02
やっぱりthread_groupのサイズは抱えているスレッドが終了しても変わんないよ。 何で試さなきゃいけなかったのw?
detachしたいのかな?
newせず自動変数でboost::thread作ったらだめなの? boost::threadのデストラクタはdetachするだけで、実行中のスレッドが強制的に終了させられることはないよ。 それが嫌なら、boost::this_thread::at_thread_exitでも使ってスレッド終了時にdeleteするようにするのはどう?
void f() {} ... { // local scope boost::thread(f).join(); } newなんてどこから出てきた?
newならうちの裏山にいっぱい生えているよ
>>228 ようするに214は、そこでjoinしたくないだけだと思う。
newは216で初出。まさかとは思うけど、Javaとか言っているし、
クラスオブジェクトを自動変数にできることを知らない可能性があると感じた。
前スレにいたヒープとスタックの区別がついてない人かな?
232 :
デフォルトの名無しさん :2009/10/11(日) 16:59:00
今、プログラムを勉強してます。 スレをざっと読んで、C++がプログラミング言語だということは理解できました。 JAVAもプログラミング言語でしょうか、それともダイレクトXのようなアプリケーションなのでしょうか?
なんというツッコみどころの山
thread_groupのサイズってなんだ?
Javaしか出来ない馬鹿を相手にしちゃ駄目よ
boost::threadのドキュメント嫁
238 :
デフォルトの名無しさん :2009/10/11(日) 19:41:47
うんうん、こいつはちょっと前にもいたJa馬鹿に違いあるまい。
Java房ほんとうぜーな >さっきから初心者と思われる人がレスしてくれているけど・・・。 >何で試さなきゃいけなかったのw? 人に聞く態度じゃねーだろw どっちが初心者だよ(;´Д`)
約15年C++一筋だったけどもうC#に乗り換えるわ C++/CLIを使い続けることに疑問を感じてしまった
はいはい次の患者さんどうぞ。
C++/CLIなんて使わないというか 乗り換えるとか言ってる奴は同時に使える言語が一個しかないの?
C++のつもりでC#のジェネリックスを使おうとするとかなりダメージ受けるよな。 T min<T>(T lhs,T,rhs)が作れねえorz typedefがねえorz
C#って typedef std::vector< A > A_collection; が出来ないだっけ? だとしたら致命的だったりする。
usingでそれっぽくはできる
そうなのか。 C++03にtypedefテンプレートがない事にさえ相当苛ついてるのに C#に移行したら発狂するな。 早く0xに開発環境移行したいよー。
>>244 そうできないんだ。typedefがないからA_Collection::value_typeのようなこともできないんで、Aを明示しないといけない。
かなり苦戦する。
template慣れるとほかの言語でしんどいよねー
249 :
デフォルトの名無しさん :2009/10/11(日) 21:51:22
> 同時に使える言語が一個しかないの? 手広くやってる余裕あるか? ふつー 自らのポテンシャルの限界を晒すようでアレだが 歴史上の各時点では1言語だけ突出してて他は教養程度にならざるを得ない
ひとつの言語しか知らなかったら解決方法が狭まるからね。 解決のヒントを多く持っておくのは悪いことではないよ。
C++の限界だと思ってたけど単に昔の自分の限界でした、ってことはよくある
真逆だろC++はやろうと思えば何でも出来る そこが最大の欠点
一つの言語を知っているのなら、他の言語を学ぶコストはかなり安くなるから 費用対効果の観点からも勉強する価値はあるよ。 まあ、Javaとか触りたくないというのは理解できるが。AndroidでC++ only開発できないかなぁ
LINQが出てからC#をやる気になった。 クエリ式はどうでもいいが、Enumerable拡張メソッドはSTLアルゴリズムに通じるものがある。
255 :
デフォルトの名無しさん :2009/10/11(日) 22:50:44
勉強くらいならもちろんしてるさ だからって書いてるコードの量の桁が簡単には変わらない
C#で楽しようぜw
LINQのような異なる文法の構文を持ち込むのはどうなんだろうな。
ゲーム書くために勉強してるからC++メインだけど レポートを始末するために各種言語は軽く触ったな C++はちょっとした作業をしたいときに大掛かり過ぎる
>>255 ならいいんじゃね
C++以外知らないとか学ぶ気すら無いとかじゃないんだし
俺も使うのはダントツにC++が多い
あとはC++を生成するプログラムとか
設定ファイルの文法(最近はXMLが多いけど)とかの
こまごました作業にPerlやLISPを使うくらい
大がかりなプロジェクトにはC++のような汎用性の高い言語が向いてる 簡単なプログラム作るなら組み込みがしっかりしてるjavaとかの方が向いてるって事でおk?
いや、ガチはC++、小物は徹底的に手抜きできるPerlって感じでやってる Perlは他の似たようなのでもいいと思う(つーかあの辺は何個も覚える必要は感じないし)
そうかなー? ごく簡単なプログラムの為にインタプリタやら VMをセットアップするほうが面倒に感じるよ。
>>257 アレはC++でのboost.spiritみたいなもんじゃね
spiritはあれでもC++の文法に沿ってるし。
わざわざPerlとかの実行環境のセットアップするくらいならC++で書くなぁ 一度やろうとしたらすっっっっげえ面倒臭くてかえって時間かかって失敗した
わざわざC++とかの開発環境セットアップするくらいならHSPで書くなぁ
LinuxとかならPerl,Pythonでいいんだろうけどね 大体のディストリには最初から入ってるし WindowsでPerlとか使おうとは思わん
C++の開発環境って、エディタ、gcc、make等がインストールされてたらすぐ使えるじゃん。 OSのインストール時にインストール済の場合も多いし。
>>270 configure.ac と Makefile.am 書くのがめんどくさいだろ常考。
Windowsでも簡単にActivePerlインストールできるし, 問題無く動くからPerlで済ませちゃってるなぁ。
PerlやRubyは挫折したなあ。結局、プログラム完成させる前にC++に書き直したもんなあ。
>>271 Makefile.amはまあ仕方ないとして、他はAutotoolsですぐじゃん。
つうか、簡単な捨てプログラムなら別にmakeがなくてもいいし。
こういう開発環境談義を聞くたび思うんだけど そういうの全てひっくるめて 元々考えなくていいなら、それに越したことないよねえ。 環境作る立場の人は、それが仕事だったり趣味だったりするから 絶対考えてないよね。
ActivePerlをポンと入れる程度でも「環境作りを考えてない」ってなるなら、もう OS組み込みにしてもらうしか無いと思うが… さすがにそのレベルだとプログラミングなんかやるもんじゃないと思う
初歩的かもしれないのですが疑問というか謎なので static int test = 1; for(int i=0;i<test;i++){ } これだと定数ではないのでダメなんだろうけど (const int test = 1にすると動いたので) でも static int test = rand() % 1 + 1; にすると動くのはなぜ?
static int test = 1; for(int i=0;i<test;i++){ } でも動くでしょ。
>>278 それは本当にダメだったのか?
エラーメッセージは?
>>279-280 動かないですねぇフリーズします。
でもこのやり方でブレークポイントで止めて数値を見ると0x01' 'って
数字の横に変な文字化けみたいなのが出てるんですが…
>>277 Unix系向けのオープンソースをWindowsで無理矢理動かしたり移植品使うと
大体ヘンテコなトラブル起きるし情報も少ないし対応も遅いしロクな事がないから嫌なんだ
いくらインスコが楽になってもそれは変わらない
>>282 別のプログラムで確認するとどのやり方でも動きました。
つまり、このプログラムだけなぜかおかしな動きをするということっぽいです。
原因か対処方わかります?
>>284 for文の中身が怪しい。少なくともソース書いてくれなきゃ誰もそれしか言えない。
>>283 ActivePerlはWindows専門のメンテナがやってるだけあって、かなりまともに動くよ。
ppmでモジュール自動インストールできたり、この手のモノの中ではかなり便利。
まあposix互換の問題とかはつきまとうけどさ。
>>285 エスパーっぽいんですが、この部分に関係している部分はなさそうなんです。
というか今確認したんですが、
static int test = 1; for(int i=0;i<test;i++)
とすると今度はフリーズではなくて0x64が代入されてるんですが…
原因が全くわかりません
static 変数が初期化されるのは初回のみだぞ
>>288 他ではいじってないです
というより0x64'd'というdという意味不明な文字が出てます。
後for文の中はすべてコメントアウトにしてもなります
フリーズってもしかしてエラーでて止まるって事か? まあ、一番可能性が高いのはポインタの操作しくって変な所書きまくってるんだろな。
ぐちゃぐちゃ言ってないで問題が再現する最小ソース作って貼れよ。 それがいやならエスパースレで祈れ。
>>291 関数の中身ですが、問題のfor文以外全てコメントアウトと
for文の中身もコメントアウトしてもなります…
となると関数以外となりそうなのですが…原因を探してみます。。。
staticを外すとどうなるんだ?
C++のやりすぎて頭がおかしくなったんだろうな おとなしくJavaかC#に乗り換えることをお勧めします
static の意味がわかってないんじゃないかな。
>>214 は解決したの?
ほんとに自動変数を知らなかっただけ?
>>278 #include <stdio.h>
int main(){
static int test = 1;
for(int i=0;i<test;i++){
printf("i = %d, test = %d\n", i, test);
}
return 0;
}
出力結果
i = 0, test = 1
全く問題無く動いたぞ。(VisualC++2008)
しかしなんだってこんなに 回答者に対して自分の情報を提示しないことを 頑張って頑張って頑張り抜くんだろうな。
まぁ最低限の情報に絞るのが2chのほとんどの場所で基本だからなぁ または単純に恥ずかしいとかくだらない理由かもしれないが
でもこいつが今回書いた日本語の合計より、 最小限のコードのほうが多分バイト数少ないだろうな・・・。
301 :
214 :2009/10/12(月) 13:21:51
>>230 いや、Javaは今勉強中で仕事はずっとC++。
>ようするに214は、そこでjoinしたくないだけだと思う。
そう。joinしたら別スレッドでやる意味ないしね。
newせずスタックに作るとスコープを抜けるときにjoinすることになるよね。
伝わってないのかも知れないけどthreadをnewするのは非同期な関数の中でというのを想定してる。
予断だけどQtにグローバルなスレッドプールオブジェクトがあるね。
スレ違いだけどJavaでnewしたThreadはスレッドの停止後にGCがThreadを開放してくれるのかな?
Javaのサンプルには良く載ってるけど。
>>239 Java厨でないって。人に聞く態度じゃないけど聞いてもない人が得意顔でレスしてるからついね。
>>300 だが、この質問者を見てると、最小限のコードを切り分けるのは無理そうではなかろうか
>>301 別に俺は回答する知識はないんで、関係ないんだけど
いまいち欲しいものがわからない。
処理が終了したら、自動で消滅するself deleteを持つスレッドが欲しいの?
>threadをnewするのは非同期な関数の中でというのを想定してる。
これもわからない・・
ローカルスコープのスレッドオブジェクトを、非同期な別の関数によって生成する?
なわけないよなあ。
正直C++をマンセーしている奴ってC++しか使えなくて時代に取り残された奴なんだろ? C++とC#の両方を使いこなせている奴ならC++を崇拝する道理が無い
C++が使いこなせてないのがよくわかるレスですね
欲しい情報だけ手に入れたいならなぜ匿名掲示板を利用してるんだろう? 知ってる人に直接聞けばいいのに
欲しい情報だけ、最小の労力で手に入れたいから 匿名掲示板を使うんだろ。 このシステムは合理的でとても良いと思うんだけど、 残念なことに、使う人間がバカ過ぎてまともに機能しない。
308 :
214 :2009/10/12(月) 14:14:25
>>303 いや、こっちも大した知識はないよ。
Javaのサンプルを参考に話してたからself deleteするものが理想だということかな。
>これもわからない・・
ボタン押下されたときにイベントハンドラから別スレッド起動して、それに重い処理(画像の加工)を任せて
待機なしでイベントループに戻るとかの良くあるやつを言ってたけど伝わってなかった?
JavaのサンプルだとハンドラでThreadをnewして放置じゃなかったかと思う。
C++の場合、みんなどんな風にやってるのかなと思って聞いてる。
下手すると(前述のlistを使うなど)ボタン押される度にスレッドオブジェクトが増加するでしょ?
>>304 が言ってるC#の、BeginInvokeのようなものがあると良いなという話。
今ちょうどC#の解説ページを見ていて思った。
知ったかぶってただけか 専門用語一杯知ってる俺カコイイ!みたいな
310 :
214 :2009/10/12(月) 14:26:27
そんなつもりじゃないんだけどもね。 そう聞こえたらごめんなw。
>>308 それで、
>>230 の言う
>>228 のjoinなし
{ // local scope
boost::thread(f);
}
だと何か問題あるの?
自分の目の前の人間を「俺カコイイと思ってる奴」だと思い込みたい子は どこにでもいるよ。 それ自体が「そういうのを鋭く見破って言葉にする俺カコイイ」だったりするんだけど。
313 :
214 :2009/10/12(月) 14:32:51
BeginInvokeってスレッドプール使ってるんだよね。結局それかと。
以前に自分でこさえたときはやっぱりスレッドプール使った。
そんときboost::thread_groupも見たので
>>219 が適当にトンデモなこと言ってるなと思ったしlistがどうとかもね・・・。
苦笑するしかなかった訳。
まぁ、C++のインスタンスと記憶領域の実装面がすっぽり抜けてるJava脳の人に さんざんめんどくせぇ思いをしてるせいで、Javaがどうこう言いながらnewが どうたら言われると、またその類なんじゃねーのかっていう気持ちになっちゃって まともに読む気になれないのはある
>>313 スレ違いだが、C#のデリゲートのBeginInvokeは例外を捕捉するためなどの理由から、
あとでEndInvokeを呼ばないといけないので、C++でdeleteから逃れられないのとそう変わらない状況だよ。
>>311 { // local scope
boost::thread th(f);
}
の書き間違いだと思って話すけどfが完了する前にスコープ抜けてthが消えるとどうなるの?
というか、ほぼ100%そうなるだろうけど。
後、基本的にth.join()はした方が良いんでない?
いや投げっぱなしジャーマンが希望らしいよ
>>308 >>214 の内容で伝わるわけないだろう…
「ローカルスコープ」という単語の使い方が間違ってるからみんな混乱したんだぜ。
最初に「イベントハンドラでスレッドを生成したい」と言っていれば
こんなに責められたりしてないよ。
319 :
214 :2009/10/12(月) 14:46:24
「ローカルスコープ」って使い方間違ってたのか。 関数 { { } }
320 :
214 :2009/10/12(月) 14:47:30
変なとこで送信してしまったw。 「ローカルスコープ」って使い方間違ってたのか。 関数 { { // このスコープってなんていうの? } }
そこはローカルスコープだが問題はそこじゃねえw
スレッドのラッパクラス作って、newしっぱなしにして、消えたい時に自分で勝手に delete thisすりゃいいだけなんでないの?
>>323 でもdelete thisするとして実装はどうするの?
Windowなんかはcloseされたときにやれば良いけどね。
struct actor {
~actor() { th_.join(); }
void run() {
... // メインの処理
// 後処理
delete this;
}
thread th_;
};
だとrunを抜けてないときにdelete thisだと~actorのjoin()で無限に待機しそう。
何でデストラクタでjoinすんだろ
じゃあどこでjoinする? joinは必須だと思うけど。 runの中でjoinするの?
joinが何のために存在するのかわかってない気がする
joinは必須ではないぞ。 特に今の例みたいな処理を投げっぱなしにする場合なんか使いようがない。 それに最後にjoin必須ならC++的にはとっくにデストラクタでjoinする仕様になるだろjk。
joinってwin32APIだとWaitForSingleObjectじゃない? でthread::~threadでCloseHandleするのだと思ってたけど。
ものすごく色々誤解してる気がしまくってならない
どうも、スレッドが終了するまで呼び出し側はスレッドオブジェクトを破棄できないって考えに支配されてる気がするんだが
スレッドのデタッチとjoinについて完全に理解が間違ってた。 デタッチするとスレッド終了時にスレッドのスタックが開放されることが保障されるんだね。 mainが終了するまでにサブスレッドが終了してなくても問題ないの?
Javaのやりすぎで頭がおかしくなったのかと思った
>>256 Linux&gccで動くようになったら考えてやってもいい
小物はPython それ以外はPython&C++ 全部C++で作ることはなくなった
>>336 小物って例えばどんなプログラム?
文字列とかファイル操作とか?
自分は逆だな 基本的にはどんなアプリでもC#で作って どうしてもC++でないと実現出来ないorそうすることで効率がよくなる機能だけを C++で小さな部品として作る感じだな もしくはクライアントの環境がC#NGな場合のみ渋々C++で作る感じ
C#なんでLinuxに移植されないんだろうね 使う人増えたほうがM$もうれしいんじゃないのか?
つ MONO
M$が最初に.NET構想を立ち上げた頃の時代では OSを支配することが世界を支配することを意味していたけど 今ではそうでは無くなったから情熱が消え失せたんだろう M$CEOのバルマーも「M$がGoogleになれなかった」ことが「人生最大の失敗」だったって言っているしな
C#のC++に対するアドバンテージなんかあるんすかね。スレ違いならご容赦。
作り手の視点で見れば楽だわなC#は。 クライアントには受けが悪いが。
>>342 C#はC++に比べて標準のライブラリが充実しているのは大きい。C++は開発効率が採用から軌道に乗るまでが大変。
GCがあるのは一見楽なようだけど、リソース破棄があいまいになっていろいろ落とし穴がある。
shared_ptrが正式に仕様入りしたらC++のリソース管理はC#と大差なくなるな。
Vistaには.NET3.0がプリインスコされているから C#アプリは何もしないで動くけど C++アプリはC++ Redistributable Packageをクライアントに入れてもらわないと動かないからな どっちがクライアント受けが悪いかは明白だな
わざとらしい
>>344 Boostのshared_ptrは今のままでも十分現役バリバリで使えると思うし、使ってるけど、
何か問題あるのかな。
つうか、shared_ptrなしでまともな開発はできないと思うんだが。
shared_ptrとか信用ならん。 いくつも似たようなのがあって良くわからん。 関数内で使用した物はいつも破棄するか、staticか、グローバルで良いだろ。 この三通りの方法で困る場合ってどんなのがあるんだよ?
vectorとかに入れるときかな
shared_ptrが信用なら無かったら生ptrなんてもっとやばいだろ
>shared_ptrとか信用ならん。 >いくつも似たようなのがあって良くわからん。 そりゃお前が分かろうとしてないだけだ… オブジェクトのライフタイムが明確でない場合なんていくらでもあるだろう。 そんなときstatic変数で全部保持して、使用側にCloseHogeとか呼んでもらったりするワケ?
>>350 vector<char*>とか? 関数内で破棄しなくても、これならいつでも破棄できるが。
>>347-348 俺はもちろんshared_ptr依存症だけど、boostはあくまでも外部ライブラリなんで、導入に渋る人がいるし。
shared_ptrが標準に入れば(年内は無理そうだけど)何処でも気兼ねなく使えるってこと。
何かソフトウェア開発の基礎が分かっていないな 車の製造工場からネジが1本付け忘れられた車が出荷されないのは 従業員の能力が高いからじゃないんだぞ?
>>354 了解。まあ、そんなふうに渋る人はC++のことをこれっぽっちも理解していない、
理解する気もない奴なんだろうな。
>>349 >いつも破棄するが。
当然shared_ptrはそれを間違いなく実行してくれる。100万のnewがあって間違いなく100万のdeleteを人手で書くことができるかってことだ。
>staticとがグローバルとか
そんな使い方はよせ。
GCするならC#つかえばいいじゃん。
>>349 ポリモーフィズムを使用するときは、値でなくポインタを使わなければならない。
スマートポインタは確かに何種類かあるが、それらの一つ一つの違いを理解できない
なら、C++は止めたほうがいいよ。
必要ないと思う人にとっては必要無いんだろうけど、 俺にはshared_ptrみたいなRAII無しに 例外安全なコードを書ける気がしないなあ
> 100万のnewがあって間違いなく100万のdelete これだったらauto変数やSTLで出来るんだが。 オーバーヘッドは、汎用性のあるhared_ptrより小さいだろう。
>>358 GCとスマートポインタは全く別概念。スマートポインタはオブジェクトの破棄時に
deleteしてくれるから、newされたオブジェクトの破棄時をコントロールできる。
GCはできない。リソースはファイル、ソケット、スレッド等、メモリだけではないので、
GCだけでは不備。
>>361 autoがdeleteしてくれるの?
STLがdeleteしてくれるの?
ここ読んどけ。
shared_ptrの構築・破棄におけるパフォーマンス測定
http://www.cycleof5th.com/tips/index.php?date=2009-02-26 パフォーマンス測定では、RdTscを使って平均的なクロック数を測定する。
測定は、Windows XP/Core 2 DuoのPCで行った。
shared_ptrに付け加え、自動変数・new/delete・auto_ptr・CAutoPtr・vector<shared_ptr>・CAutoPtrArrayについて
CStringのオブジェクトの構築・破棄に対して調査した。
一つのオブジェクトの構築・破棄
自動変数として使用する場合と比べ、shared_ptrの構築・破棄に10倍以上のクロック数がかかっている。
また、CAutoPtrやauto_ptrに比べ2.3倍のクロック数がかかっていることがわかる。
複数のオブジェクトの構築・破棄
CAutoPtrArrayと比べvetor<shared_ptr>の構築・破棄に約3倍のクロック数がかかっていることがわかる。
結果としては、何度も構築・破棄するようなオブジェクトは自動変数で割り当てるのがもっとも速度が早いことがわかる。
>>363 aruclass *A = new aruclass; → aruclass A;
char *p= new char [100]; → string p(100,'\0');
でOK
shared_ptrの目標は標準として安全なスマートポインタを提供することであって、速度は重視していない もっともshared_ptrのオーバーヘッドが問題になるような使い方をしているかは知ったこっちゃないが 次期標準にはunique_ptrっていう原理的にはゼロオーバーヘッドなスマートポインタも入るんだぜ 自動変数で十分って言ってる人は、C++でOOPをしたことがないのが明らか 自動変数だけでどうやってファクトリ書くんだ?
autoってそっちのautoか。
自動変数で済むところでnewする奴なんて居る?
>>364 仮に10倍以上のクロックがかかっても(実際にはauto_ptrと比較するべきなので数倍)、
それはアプリケーション自体の実行時間のいったい何%かが問題。はっきりいって誤差レベル。
newやdeleteの実行時間に比べればわずかなものではないかな。
ちょっとお聞きしたいのですが、 C++にてGUIを作成することは可能でしょうか 目的は簡単なタブ選択から、あるテキストファイルに書式通りに出力することなのですが。。 linux環境で使えるものを作る必要があり、なにかないかと探しているところです。 すいませんがよろしくお願いいたします
思っていたよりshared_ptr速いな
不必要な場面でとりあえず付けとくてきな使用はまずいって事だ。
マルチプラットフォームのGUIライブラリ使えよ。 Qtとかfirefoxが使ってるのとか。
>>370 QtやwxWidgetsのスレを見ると作れるようになります。
性能のみを優先して汎用性を否定している人ってクラスを設計するときに A関数を呼ぶ前にB関数を必ず呼ぶ必要があるっていうルールを平気で作っちゃう人なんだろうな
>>371 アトミック操作がある割には速いと思うよ。
>>364 そこんところの速度が気になるなら、メモリプールくらい使うでしょ普通。
vectorだって、reserve()とかするだろうしさ。
378 :
デフォルトの名無しさん :2009/10/12(月) 22:56:30
>>368 実体メンバで済むのをコンストラクタで new する奴なら腐るほどいるが根は同じだな
C でも固定でいい配列をいちいち malloc するガイキチいるし
将来的にスタックに置けなくなことを考慮してヒープに置いているとか?
private 完全隠蔽のために new 必須になってるクラスはいっぱいある。 pimpl とかインターフェースクラス継承とか。
381 :
214 :2009/10/12(月) 23:02:43
今度は誰も答えてくれなくなったのでもう一度書くけど、 mainが終了するまでにサブスレッドが終了してなくても問題ないの?
はい、問題はないです。
shared_ptrを使うのは使う必要があるからであって、自動変数でいいのなら、 shared_ptrなど使う必要もない。auto_ptrもshared_ptrとは使用する場面が違う。 それなのにパフォーマンスの計測結果を出されても意味がないと思う。
>>381 君は人に訊かなくても大丈夫だから一人で頑張りなよ。
場合によるだろ つーかぶっちゃけお前がどういう構造の中でどこでワーカー走らせてどこでどう 終わらせたいのかわかんね
>>380 つうかprivateの完全隠蔽とかそんな気にするもんなのかな?
どうせtemplate使うとそんなのできないんだし気にしてもしゃーないと思うんだが
もちろんヘッダ依存やクラスサイズが気になる場合はpimpl使うこともあるけど徹底するほどでもないと思う
>>383 不要に使うのは損というのが判明する。とりあえず付けとくとパフォーマンスが悪い。
どうしてこうも情報削りすぎの相談が多いんだかなぁ…
つーかshared_ptrの速度が気になるようなボトルネックならpimpl捨てるだけの話だろ
>>387 それは自明だと思っていたが、世の中にはそうではない人もいる、だから、計測結果を
出すことにも意味はあるということは分かった。ありがとう。
「宿屋に泊まると、体力が回復しますぞ!」 って教えてくれるドラクエの町人程度には有意義だ。
C++崇拝者はスピード狂が多いからな JavaやC#の処理速度に対するアドバンテージが唯一のアイデンティティとして染みついているんだろう
・メモリ以外のリソースを安全に確保開放したいとき ・例外安全を保ちたいとき ・単純に参照構造が複雑で管理がめんどくさいとき ・コンテナに入れるとき ・返り値でnewして返すとき ↑このへんはsmart_ptrで後は生ポインタかな
394 :
214 :2009/10/12(月) 23:21:26
なんかthreadはjoinが必須でないみたいなことになってるので一言。 joinしなくてもスレッドのスタックは開放されるけど、サブスレッドが終了する前に メインスレッドが終了した場合はサブスレッドのスタックに積まれたオブジェクトは デストラクタが呼ばれないよ。それが何を意味するかはご存知だろう。 つまり基本的にboost::threadはjoinすべき。 スレッドプールを利用した方が良いってこったね。 スレッドプールは最後に必ずthreadをjoinできるからね。
は? detachすればいいんちゃうの。
396 :
214 :2009/10/12(月) 23:23:15
なんか久しぶりに香ばしいのが来てるな
ここまでくると失笑もんだな
スマポがあれば生ポインタほとんど使わないな。
>>392 JAVAやC#を使ってるとリソースの管理があやふやになってスレッドで悩むしな。
privateが完全隠匿されていない具体的なデメリットって何?
402 :
214 :2009/10/12(月) 23:32:48
デストラクタっていうc++の仕様の言葉と スレッドっていう現c++と無関係な仕様の言葉が 一緒に出てくると猛烈に楽しいです もう少しヲチしたいのでがんばってください
>>401 ヘッダ依存性
ヘッダ1つ変更しただけで全部のオブジェクトコンパイルしなおしとか嫌じゃない?
逆コンパイルの攻撃にあったときに privateに何があるか知っていると解析しやすいとか
>>403 スレッドを言語仕様に入れるとなると、今とは全く別の言語になるだろう。
というわけで、C++ではこれからもスレッドはライブラリのままだろうと予想。
>>401 Pimplイディオムはヘッダの依存性問題を解決するためにある。そのために実行時の
パフォーマンスがやや低下するのがあまりC++的ではない気もする。
そこは
>>225 にならって
>何で試さなきゃいけなかったのw?
だろ・・・
411 :
214 :2009/10/12(月) 23:46:33
具体的には、 void func() { A a; ...// すごく重い処理 } int main() { thread(&func).detach(); } だとするとfunc内のaはデストラクタが呼ばれないよ。 ただしメインスレッドが終了する前にfuncを走らすスレッドが終了しなかった場合だけども。
そりゃメインスレッドが終了したら、 d-torもクソもあるかってのw
次の言語標準で標準ライブラリにスレッドが入ることが既に決まってるんですが
だから、お前はどこでスレッドを生成してどこで破棄したいんだよ
>>411 スレッドの終了とプロセスの終了の違いを勉強して出直してこい
「mainの終了==未終了のスレッドが終わる機会を失う」ってのが本当なら どっちかっつーと、そっちの方が間違ってない?
418 :
デフォルトの名無しさん :2009/10/13(火) 00:49:22
もはや言語の範疇ではないな
mainの終了時に未開放のスレッドが残ってる設計のほうが間違ってる。
プロセスが終わった後も動かし続けたい処理なら スレッドじゃなくてforkとかで別プロセスにやらせないと
>>419 そうか?
main()が起動したら、早々にワーカースレッドに仕事を投げて、
自身は終了するって設計はありだと思うが。
main()自体が各ワーカースレッドの結果に関与しないなら尚更だ。
大体、mainだって1スレッドに過ぎないし、スレッド間で親子関係も無い訳だから
mainが終了した時点で問答無用でプロセスが終了するのは、強引すぎる気がする。
422 :
デフォルトの名無しさん :2009/10/13(火) 00:56:37
C++ って、main の終了がアプリの終了を意味してないだろ
>>421 だとしても、プロセス全体の終了を申告する何かがいないとOSが困るだろ
いつプロセスを破棄していいかわからん
それがmainである必要はないのかもしれないけど
>mainスレッドが終了するとワーカースレッドで作ったオブジェクトが正しく破棄されない 誰も知らない新事実発見おめでとうございますwwwwwwwww
いくらでも解決方法はあるのに わざとのらりくらりと道を逸らす池沼っぷりは天才的だなw
まあC++からしたらその辺は環境依存じゃない? Windowsは >If the thread is the only active thread in the process, the process is terminated. と、あるから全てのスレッドが終了するまでプロセスは終了しないっぽいけど… タメスノハメンドクセ
どう動かしたいか、どういうOSの仕様なのかによって変わる話なのに、無理矢理 どんな時でも行ける汎用的な物の話をしようとするからまとまらないんだろ。VM じゃねーんだから。 で、分かってない奴も出てきてるし、相談者はそいつらの粗探しにばかり熱中して まともな意見には全然反応しないし。
プログラムのエントリーポイントが複数あったら実装が複雑になる だからmainを作って、それの終了==プロセスの終了処理に入るように今どきのOSはなってんの ワーカースレッドはmainスレッドの子供。親子関係は存在する。
429 :
デフォルトの名無しさん :2009/10/13(火) 01:14:49
だからって init を C++ の標準に持ち込むのはどうかと
うざいからもうこの話終われよ threadの終了云々の時点でこのスレの話じゃねーだろ
プロセスの終了シグナルをハンドルして解放処理を実行する基底スレッドクラスでも作れよ
いや、WindowsだとTerminateThread的な終わり方をすると思うから、プロセス終了が
先に来たらアウトかと。
つーか、
>>218 がそもそもよく分からんけど、listの何が悪いんだろう。スレッドプール
なんかより気楽でいいんじゃね?
>>431 シグナル全部マスクして、Termが来たときだけハンドラでjoinするような?w
void A(){puts("A");} / struct S{ A(){ A(); /*上のAを呼びたい*/ } }; これどうやって名前解決を上の方にもってかせることができますか?
::A()
thx。できました
馬鹿が発生するとスレの伸びが早いなぁ
半端な馬鹿だと、もっと馬鹿も湧いてきてトンチキな叩き合いを始めるからよく伸びる 「俺以外みんな馬鹿」特性も相性がいい
じゃあ私も伸びに貢献しますo(^-^)o struct A { void gay() { std::cout << reinterpret_cast<uintptr_t>(this) << std::endl; // 1192 } }; main() { uintptr_t val = 1192; A *a = reinterpret_cast<A*>(val); a->gay(); } こんなことをしたいのですが、規格の範囲内で問題ありませんか? Aは継承関係、メンバ変数および仮想関数は持たないものとします。 (申し訳ないですが、ケータイからの投稿なのでコードが雑になっているかもしれません)
普通に駄目かと
いや待て、別に問題出ないかもしれんな 何でそんなことしたいのかは知らんけど
まあ答えは分からないからただの戯れ言だが、 farポインタやらなんかが混じってくると怪しそうだ。 uintptr_tとA *を同じようなものとして扱ってくれるという前提がいるかもしれん。
そのコードが動作しない環境ってのも考えがたいけど、 「規格の範囲内で」っつーことなら多分未定義なんじゃね?
ビットパターンは変わらないと保証されてるだろうから、メンバ関数コールの実装が どのように規格で決められてるかの問題に絞られそうだけど、詳しくはシラネ それに実用目的でもなさそうだし
>>414 言語仕様という言葉が悪かったかもしれないが、標準ライブラリに入るのは
知ってる。ライブラリでない部分の話。
int g = 0; bool Hoge(void) { g++; return true; } void Main(void) { bool b = Hoge(); if(b || Hoge()) { g++; } return; } Main()を1回コールして、Main()のreturnまで処理が流れたとき、gの値はいくつになっているでしょうか?
クイズかよw なんで2になになるのかわからないんなら、そうはっきり質問しろよw
2
いや悪いwクイズのつもりだったんだがw オマイラまじ頭いいな、自分は最近まで普通に3だと思っていたぞ。 少なくとも自分が読んだ教科書にはこんな説明は載っていなかった
動揺して日本語おかしくなってるし 俺もまだ勉強がたりねぇなぁ
短絡評価と言ってだな。&&と||だけは特別で左辺の値次第で右辺の式の評価をしないんだ。
短絡評価って教科書とかに載ってないもんなのかな。 誰でも簡単にわかるみたいなペラい本じゃなきゃ、結構罠っぽい所だから載ってそうなんだが。 Cとか他の言語知ってるの前提の本なら載ってないかなぁ。
K&Rに載ってる超基本
条件式には&&をビット演算には&を使いましょうだけで説明が終わっている本なんてゴロゴロあるぞ
K&Rは生産効率の低いパスカル野郎!
>>456 main()は状態変数でwaitしてスレッド側が終了したら状態変数に通知すればいいだけじゃないの?
>>457 それは結局joinしてるのと同じじゃないか? 214は投げっぱなしにしたいみたいなんで。
mainで何も書かずにいきなりreturnを呼びたいんだろう。
いっそatexitでjoinするコードを登録してしまえw
>>426 mainが終了するとexitが呼ばれて(ここまでは標準の範疇)、
exitの中でExitProcessが呼ばれるので、結局実行中のスレッドは全部終了させられる。
何が目的なのか知らんが素直に親スレッドでjoinすればいいのに。 親子っていうのに親の方が長生きしなくちゃいけないのがアレだけど。
>>456-
>>460 バカが掘り返してきました。
以下、第2回戦の開催です
掘り返すことを否定するのはマ向いてないと思うの。 動いてるからいいじゃん、とかいうタイプに思える
>>462 なんでもかんでも抽象化すればいいと思うなよw
漏れのある抽象化がどんだけひどい事になってるか。まったく。
掘り返すのは勝手だが、あまりにも程度の低い話をいつまで続けてるのっていう まともにMTで書いたこと無い奴同士が頑張りすぎ
釈迦の手のひらの上で踊る猿を眺めるだけか さすが釈迦は違う
467 :
デフォルトの名無しさん :2009/10/14(水) 01:31:25
大にせよ小にせよ、やってることは要はアドレス出してチップセレクト、リードかけたときにバスエラーを捕らえらそこからは異常系に入るわけで それがたまたまアセンブラでやってるか他の言語かで結局同じことをやっているかって違いだけだろ ちょっと入り組んでくるとみんな自分の得意分野にタコツボを始めやがるから無用な混乱が際限なく続くわけで はっきり言ってタコツボに食われてるような連中の無軌道な煽りはうるさいだけで、ちゃんと理論たてて襲ってこいよって感じでさー
誤爆なのか?
誤爆だろ
>>465 麻呂が猿だというでおじゃるか!?
麻呂は、麻呂は!
…ぐぅぅ、、さ、さるじゃ。。。
実際、釈迦と猿以上の差があるしな、技術屋って
君は釈迦の何を分かったと言うんだね。
ゴールドセイントなのは知ってる
コード内にSystem関数を介してコマンド(mv)を実行しているプログラムがあり LinuxではGCCをコンパイラとして使っています。 このプログラムをWindowsのMinGWでもコンパイル・実行できるようにしたいのですが Windowsのシェルでは mv → move のため、そのまま流用ができません。 なので、プリプロセッサ または 実行時にWindowsであることを認識し 実行するコマンドを変えたいと思うのですが、何か方法があるでしょうか? (ヘッダに自分で #define MINGW とか書いてifdefで判定というのは無しで)
cp move mv それかmvの実行前にmvの存在確認。
Windows環境で動く目的でWindows用のバイナリは作られるわけで 実行時にWindowsであることを認識するなんて意味あるのか
つーか、system("mv")ではなくremove()を使うべきだと思うんだが。 まあ #ifdef _WIN32 で条件コンパイルが必要になるケースももちろんあるけどな。
renameですか?
Boost.Filesystem等のライブラリを使う
ポインタについてなんだけど int i; i = 0; func( &i ); func(int *i){...} 一応思ったとおりに動いてくれるけれど、こういう書き方ってどうなのかな? int i; int *p; p = &i; func( &p ); ってやらないといけないの?
コンパイルエラー
なにがいいたいのかわからない 質問するなら相手がわかりやすいように書けよ
>>480 iのアドレスを他の変数を経由してfuncに渡したいってんなら
func(p);
ポインタについての理解が足りてない。
例を見せて「こういう〜」で済ます時は、 例の中の注目点が誰の目にも一箇所になるようにしてくれないとな。
487 :
485 :2009/10/14(水) 10:40:58
ああ、いやコンパイルエラーにはならないか。 でもfunc(p);にしないと期待する動作にならない。
引数が通常扱う整数変数じゃなくポインタ変数になってるから 仮引数、実引数ともにポインタ変数でなきゃダメなのかっていう質問じゃない? どっちでもいいけど、普通後者みたいな回りくどいことはしない。
>>488 の読解力に感動した
なるほどそういう意味だったのか
>>487 >コンパイルエラーにはならないか。
なる。int* が欲しいところに int** 渡してんだから。
世の中には物分かりの悪い人、相手が何を言ってるのか分かろうという努力の足りない人が いるってことがよくわかった。
三つの意味で奇妙なレスだなぁ。 この流れはそんなことがわかっちゃう流れとは程遠いということと、 普通の知能の人間はそんなこと小学校に入る頃にはわかるということと、 自分のその結論こそ、物分かりが悪く、相手が何を言っているのか 分かろうとしていない結果かもしれない可能性を疑う心が無いこと。
えっ、そうなの?
>>493 なにがいいたいのかわからない
質問するなら相手がわかりやすいように書けよ
>>494 質問じゃないんで。オウム返しはロボットみたいだよ。
> この流れはそんなことがわかっちゃう流れとは程遠いということと、
自分はすぐ分かったけど、普通はそうじゃないのか。
> 普通の知能の人間はそんなこと小学校に入る頃にはわかるということと、
これは意外。
> 自分のその結論こそ、物分かりが悪く、相手が何を言っているのか
> 分かろうとしていない結果かもしれない可能性を疑う心が無いこと。
言っているのは質問者であって、あとはそれに分からないと言っている
リアクションなんで、理解も何もなく、ああ、分からないんだなぐらい
しか分からない。
>>495 > 質問じゃないんで。オウム返しはロボットみたいだよ。
質問だし、オウム返しではないね。
> 自分はすぐ分かったけど、普通はそうじゃないのか。
ガムの包み紙を見て、そこに宇宙の真理が書かれていることが突如「分かっちゃう」のと
同じだからなぁ。普通とは言い難い。
>>496 えっ、そうなの?ってのは意外で驚いてる気持ちを表してるのであって、質問じゃないんだよ。
それで分からなかったら仕方ないけどね。
それと、483と同じ発言なんで、それについてオウム返しと表現しただけなんで。機械的な
繰り返し発言とでも言えば良かったかな。分かりやすいように。
> ガムの包み紙を見て、そこに宇宙の真理が書かれていることが突如「分かっちゃう」のと
> 同じだからなぁ。普通とは言い難い。
488も普通じゃないんだ。まあ、数が多いから普通って言葉を使うのかもしれないね。
論理的に1つの答えを導き出せる物とそうでない物がある。 質問者の意図の推測なんてやっても報われない。
論理なんてものはイデアでしかないよ。現実は論理みたいなものしかないよ。 ここで使ってる日本語ですら厳密には論理的でないのに、どうやって論理的な 判断ができるんだってこと。 質問者の意図の推測程度のことができないと、日々の業務もできないし、 人間関係も構築できない。
日々の業務ができず、人間関係も構築できない 低レベルな質問だからしょうがないのでは。
世の中そんな人のほうが多くて、だから、食い扶持にあずかれるんだから、 ここでトレーニングしとかないと、低レベルな人間になって干上がっちゃうかもね。
>>497 > 機械的な繰り返し発言とでも言えば良かったかな。分かりやすいように。
いや、この「分かりやすい」は無理に良い方に回ろうとしてるだけで、
正しくは「間違った日本語を使わずに、正しく言えば良かった」。
> 488も普通じゃないんだ。
>>488 は推測しているだけで、質問者の質問がわかったわけではない。
簡単な努力で消すことが可能な複数の可能性を、質問者が平然と残していることだけ
なんでそんなに寛大なのかわからんけど。
>>501 まぁ職場のレベルによるかな。
まず質問者にトレーニングが必要だけど。
>>502 日本語等自然言語は辞書に載ってない使い方をしても許容されるもんだと思うよ。
似た概念なら読むほうもある程度補える。君が言うほどおかしい表現でもないと
思うが。揚げ足を取ってるつもりなのかもしれないけど。
推測云々の件は、分かったというのはどんなときも主観でしかありえないんで。
>>503 同僚ならトレーニングさせることもできるけど、顧客は難しいかもね。
>>504 > 君が言うほどおかしい表現でもないと思うが。
基本、いい加減なことを書く側に甘いんだね。
> 同僚ならトレーニングさせることもできるけど、顧客は難しいかもね。
顧客なら、曖昧なところはこちらから聞き返して、意図の解釈を固めるでしょ。
それは、このスレの人間が「わからん」という反応をしたことの丁寧バージョンだ。
まさか、このレベルのいい加減な質問に対して折り返しの確認も取らず、「主観」で解釈して
それに基づいた回答だけして、よくわかってなさそうな先方がわかってないまま
「わかりました」とその話題終えちゃって、後々の負の布石を作るようなことはしないよね。
>>505 まあ、ここは失敗できない場でもないし。
分かりにくい質問をしてきた相手にある程度推測や予断をして「こうなの?」って
聞き返すぐらいの余裕は欲しいよね。ただ分からんじゃ進歩なさそうだし。
>>491-506 C++ とはまったく関係のない、どうでもいい話になると
そうやって湧いてくるのな、君らは。
>>488 2行目で止めておけばよかったんだね。
俺が悪かったよ。
以下C++スレに戻ります。
>>507 そういうのを見ることで自意識が変に刺激されて、
それらのやり取りよりさらに意味の無いレスをしちゃうタイプだな、君は。
>>507 悪い悪い。頭の固い連中を見てて、いてもたってもいられなくなって。
だが、わざと分からないと言って、質問者をトレーニングしていたのかも
しれないとも思えてきた。そこは反省。
以下、C++の話題をどうぞ。
>>495 大丈夫よ。俺もすぐ理解した。
というかそうじゃなきゃその二つで悩まないもんな
質問者の文章力がたりないと言ってる人は初心を忘れた、もしくは他人に教えたことのない人だよ
本当に文章力が足りない時もよくあるよ
基本、物事を自分で調べず、人に訊く人は、文章力も残念なことが多いよ。 駄目な奴は駄目に決まってるんだから、そんなトートロジーを新たに指摘しても 仕方がない。 駄目な点を踏まえて質問に答えるなり、物分かりの悪い応対をして相手を 目覚めさせるなり、無視するなりすればいいんじゃないのか。 自分も本当に物分かりが悪くなってしまったら、相手と同じレベルに落ちてしまう んで、それはまずいと思う。
わけわからん質問をしてくる奴は、大抵自分で調べようとしない奴。 自分で調べても分からないとき、初めて質問してくるタイプの人間は、質問の仕方もうまい。 ちゃんと質問できる奴は大抵できる奴だと相場で決まってる、これ教える側の人間の常識ね。
だが、これだけネットが普及してて、C++のように全部文献でなんとかなる分野 (自転車の乗りかたなどは文献や動画だけではどうしようもない)で、質問する のも疑問はある。全部自分でできるのでは。
>>516 お前宇宙工学の教科書渡されたら宇宙工学出来るようになるわけ?
物性論の教科書渡されたら物性論出来るようになるわけ?
専門的な事が全て自分だけで出来る超人なんてそうそういない。
ある程度までのレベルまでは行けるだろうが、人に頼らないと抜けられない壁もある。
そういう程度以上の質問なら歓迎なんだがな。
わざわざ「なんとかなる分野」という言い方で 対象を絞っていることを示してから言及している人に向かって 「そうじゃない分野もあるぞ!」ということをネチネチ語ってどうすんだろ。
>>517 そりゃ人によるとしか。それに、C++はそれらの分野に比べれば楽なほうではないか?
詳しくは知らないが。
所詮は自分の眼鏡を通して好き嫌いを言っているだけに聞こえるな。その眼鏡は
人それぞれであって、混乱の元。それなら、十把一絡げにあらゆるレベルの質問者を
受け入れたほうが合理的ではないかとも思えるが、2chではそんな合意は無理か。
済まなかった。
もう発狂?
今日はいろいろ勉強になったし、過去の疑問も解消してきた。ありがとな。
なんとかなるっていうのがどの程度のレベルなのかにもよるよね 両方の意見は一理あると思うけど、汎用的な言いくるめ方はどちらでも不可能だと思う。
ていうかそれ以前に、宇宙工学を独学する例なんか持ち出す質問じゃないだろ今回のコレ。
興味を持って自分で勉強する専門分野という点では似通っているともとれる 内容は全く違うのは当たり前だけど、ここで引き合いに出すのは全く的外れというわけでもない。
所詮、例え話は不毛な争いのもと
例え話は興奮するとすぐ極論に繋がる。 そして大抵は興奮状態で用いられるし。
質問者は金をくれる顧客ではないのだから 意味不明な質問には意味不明だとレスが付くのは当然だよ。
金をくれないから頭を使わないと公言して憚らないあなたの将来が心配です。
頭を使うとかわけわからん。何の話だろ。
>>529 その読解は、本気で頭を使った本気の内容ですか?
意味不明な質問に対して「意味不明だ」とだけ答えるのではなく、質問の意味を 理解しようと努力するには頭を使わないといけないよ。
533 :
デフォルトの名無しさん :2009/10/14(水) 19:00:07
>>517 結局、「そういう程度」がどういう程度なのか、肝心な点が抜けてるじゃないか
おまえさんの「好み」によらない客観的な基準を言ってみな
C++ は独学では習得できない、ということの証明から必要になるはずだが
本気を2回重ねて使うあたり程度が知れるな
なんだこれひどいな 何がそんなに悔しかったんだよ
金をくれる顧客が、意味不明な質問をした際、 意味不明だと言い返さない人がいると聞いて
顧客が意味不明なことを言う ↓ 意味不明です ↓ 顧客「えっ」 これはないわ。 顧客が意味不明なことを言う ↓ 例えばこういうことでしょうか? ↓ 顧客「いや違う違う。それは──」 大体こんな感じじゃないの。
>>536 君は客に向かって「あんたの質問は意味不明だ」と言い返すのかい?
ああそういう。
当たり前だろ 言い方は「もう少しわかりやすく説明してもらえませんか?」とか 「もう少し具体的に言い換えてもらっていいですか?」みたいにはなるだろうけど 意味のわからない質問に適当な答えを返すほど最悪なことはない
ああ、そういう話か、の略
>>540 金をくれる顧客じゃないから、
「もう少し具体的に言い換えてもらっていいですか?」
のような引き出し方をするのは面倒くさく、意味不明と突っぱねるという話だったようだよ
>>540 それは状況によるし、はっきり言わないほうがいいときもあるよ。むしろ、
そっちのほうが多いか。推測して「こうですか?」と訊くほうが好ましいのでは。
仮定の話も例え話と同じくらい不毛だな。
もう少し具体的に言い換えてもらっていいですか?と 意味不明は同じじゃないだろ
別に求めてはないだろう。各自の自主性を促してるだけで。嫌なら「意味不明だ」、 「何が言いたいのか分からない」でいいんじゃないか。
もはやスレの流れが意味不明。
>>547 一体、回答者にどれだけ求めているんだ?
→別に求めてはないだろう。各自の自主性を促してるだけで。
こんなの言葉遊びだろw
スレ違いの話をこれだけやっておいて何言っているんだ。
>>549 レスがあるからレスしたまで。もういいだろ。C++の話に戻ろうぜ。
551 :
デフォルトの名無しさん :2009/10/14(水) 20:42:02
気に入らない質問には答えなければいいのに 「聞き方の指導」まで始めるから C++ から逸れるんだよ
そうっすね。
今更だけどstatic int = の値がおかしいっていってた人だけどクリーン、リビルドしたら直りました 世話になりますた
ま、本当に迷惑な存在は わかりづらい質問者よりも 意味の無いやりとりを延々と続ける スレチな回答者ってことで 自重出来ない自称頭いい人は死んで欲しいよ
そうやっていちいち回答者を煽らないと気がすまないのか
バカはお前だ。
0-origne なのでバカ0号が
>>554 になる。
よう 釣られボーグ002と003
>>557 どうでもいいな。だからお前はバカなんだ。
005
こんなところで自己満足に浸ってる暇があったら少しでもいいコードを書けるようにしたらどうだ?
>>561 さて、第三ラウンドの相手はお前でいいのかな?
563 :
489 :2009/10/14(水) 23:13:56
えらくスレが伸びてると思ったら・・ 俺が変に合いの手入れたから質問者を調子付かせてしまったのかなスマンかった。
いや、自称インテリの勘違い回答者が調子付いただけだよ
みんなストレスでも溜まってたんじゃないの
2chでは皆結局余裕なくなってくるよね。仕方ないのかなと。
煽り屋が空回ってるだけでそ
お前らが馬鹿ばっかだっていう事は良くわかった
まだ続いてたのか。 煽り屋がシャドウボクシングしてるようで訳がわからん。 一体何と戦ってるんだ? いいかげんスレタイ読み直して、C++の話しようぜ。
C++でこの煽りあいを解決するプログラムを俺が書いてやるよ!
じゃあまずミューテックスAとBを用意して、質問者はA->Bの順、回答者はB->Aの順で 書き込み権を取得しないと書き込めないようにしようか
匿名でID非表示の掲示板じゃあ何をやっても無為だな 信頼の失墜と挽回が蓄積されないから何をやってもリスクにならない 顔写真・住所氏名・クレジットカードの番号を晒さないと書き込めないようにすればマシになるんじゃね
そこまでしなくてもIDだけでもマシになるだろ、マシには
数学とかの勉強みたいに数をこなす感じでC++身につけたいんですけど 初級から段々レベルアップしていく問題集的なものってありますか?
幾何学と統計学が同じような道を通るとは思ってないだろうけど、基礎的なところは共通して学べるので そういう意味では初心者用の本を読めとしか言えないかなぁ 取っつきやすさを求めないのならK&R
ってC++スレでした。 適当に手広く知識を拾い集めてみてはいかがか。 その後EffectiveC++などに。
>>574 宿題スレで待機。お題に答えたり、人の答えを添削したり。
>>574 C++と同時にC#を勉強することをおすすめします
C++だけやっていると馬鹿になるぞ
C#イラネ アセンブラとLispとC++で十分
windows2000+lennyの俺にもタダで使えるC#開発環境が有れば使ってやっても良い
lenny?
C#は馬鹿専用 要はVBみたいなもんだ
C#は無駄な手間が省かれているから扱いやすいだけでC++より書き手の技量が要求される言語だよ
C++の方が明らかに馬鹿専用
C#はC++落ちこぼれの為の救済言語 つまり馬鹿でもわかりやすいように作ってある その為パフォーマンスもでない上MS専用なので まだJavaやってる方がなんぼかマシ
C++CLIはC++信者からも叩かれるマジもんの産廃
なるほどなWindowsしか知らないアホならそう思うのかもな 窓開発者は低レベルな奴が多いから仕方ないが・・・
C++は言語がOOPをサポートしていないから小手先の小細工ばかりで設計がグチャグチャ
>>589 「馬鹿な僕は理解できませんでした」って意味?
C#の言語仕様は非常に優れてる。
単に言語仕様だけをC++とC#で比較したら、どう考えてもC#の方が優れてるだろう
多重継承のような「使いようによっては使えるけど、ミスるとヤバい」的な仕様を
一切削ったC#は素晴らしい。
>>590 「理解出来ませんでした」って奴をバカにしてるようだけど、
凡マに理解出来ない言語仕様こそクソ。生産性を下げるだけでしょ?
今のプロジェクトでいるんだけど、
むしろC++の言語仕様とかには神みたく詳しいんだけど、
OSとかのことを全然知らない奴がいる。
700スレッド立てて通信するような設計をしててビックリしたよ。
IO多重化の概念を知らなかったらしい。
そういう奴に限ってC#、Javaなんかを批判してる。
おまえの愚痴はどうでもいい
>>591 低レベルなお仲間同士で固まっていて幸せですね
MSは開発者を囲い込んでツール売って利益を上げたいだけだから5年後C#が主力言語かも怪しい
595 :
デフォルトの名無しさん :2009/10/15(木) 10:51:09
> ミスるとヤバい GC とかで喜んでてリソースリークでハマるような、自分を捉えられない痛い連中が後を絶たない 電子土方って何の対価でメシ食ってるんだっけな 〜〜言語は、それを使う人が何を考えることができるかを決めてしまう〜〜 ・・・とある有名本に書いてあったような気がするが 子供のオモチャと違ってプロの道具は危なくていいんだよ 根本的に要求が違うんだから
お前ら他所でやれ、と何度言われても理解できない莫迦同士 仲良くね。
つまり、プロは必要ならF1カーにも乗るが、アマチュアは市販の一般車両で我慢しておけってことですね。 でもまぁ、プロも一般道では市販車で移動した方が安心安全なわけで。
多重継承より委譲の方が良いのはわかってるけどメンドクサイんだよね。
市販車ならC#の他に便利なのがいろいろとある。別にコンパイラ言語でなくてもいい。
>>577 なるほど宿題スレか その手があったか
ありがとうございました
>>578 同時進行できるほど賢くないけど一応やってみます、ありがとうございました
M$と心中する気があるのならどうぞ。
演算子の実行順番がよくわからなくなりました。 わかりやすい解説サイトとかないでしょうか? int a[] = { 10, 20, 30 }; int *p = a + 1; int b = --*++p;
宿題スレ見たけど今の自分には難しいのが多くてあんまり使えんな・・・ 素直に基礎をもっと進めろってことか・・・
規格書に書いてるが、識別子に近い順ぐらいは想定できてほしい。
608 :
デフォルトの名無しさん :2009/10/15(木) 12:49:14
市販車が「安全」て、どこから出てきた話だ? ミスるとヤバいって引用を見なかったことにしているならわからんでもないが エアクッションを GC にでも喩えたかったのかね
>>608 立ち位置を明確に。C#が安全でないと言いたいのだろうが。
C++は安全装備を自分で付けなきゃならないから、付け方が分からないと危険に なるだけで、流して安全に書くにも問題は無いよ(つーかパレートの法則的に80% のコードは実際そのように書かれるし) ただ、ごく簡単な仕事にまで使うと開発コストが高いのは事実 でも、簡単な仕事の開発コストを下げるのはPerlやPythonやRubyの方が遙かに得意
Python+C++が最強ですよ 互いの長所を十二分に活かせて開発速度が圧倒的に速い
c++でsocketってどうやるんですか?
Pythonなら.NETでも走るよね。 どの程度の信頼性なのかは知らないけど。
IronPythonはMSがリリースしてるくらいだからそれなりに動くんじゃね? もう結構前になるから、初物のバグもある程度は取れてそうだし。
>>612 Boostを使ってもいいし、Cと同様にシステムコール直叩きをしてもいい
>>613 基本スタイルはとりあえず全部Pythonで作成し、高速化したい部分をC++
.NETは全くしらないけど、パフォーマンスが出せるならそれも有りだと思う
618 :
591 :2009/10/15(木) 13:12:49
今ここで「釣りでしたwww」って言ったらみんな怒る?w
後釣り宣言を見て怒る訳がないw
釣りにしても動機がよく分からない。
>>611 PythonがPerlやRubyよりC++と親和性が高いと言いたいのだろうか?
理由とかある? 参考までに。
Boost.Pythonが有名だからじゃねーの?
煽るだけの方はお引き取りを。
まぁぶっちゃけスクリプト言語はPerlしか使わない俺でも、Pythonみたいに欧米系が こぞって集まってる奴は最強環境になってるだろうなぁとは思う ただ、わざわざ覚えるほどのことではないとも思ってる
>>625 欧米系とは欧米の技術者たちという理解でよろしいか?
>>626 うむ
あっちじゃ完全にPython、たまに変わり種がRubyやPerl、って感じじゃね?
Perlは6.0で互換性を捨てたのが致命傷になったと思うなぁ どんなにぐっちゃぐちゃでもいい、って人達の楽園だったのに
じゃ、俺もPythonやるか。
Pythonは素で速いしライブラリも充実してるよ。速さについては普通にC++で作成するより速い事もしばしば。 C++との親和性が高いのは事実だけど他の言語と比較して・・・というのであれば詳しくないのでよくわからんです。
project eulerの問題等でpythonじゃ工夫しなきゃ終わらないやつでもC++ならbluteforceで終了〜 ってぐらいの遅さではあるけどな
さすがに「普通に」組んでてPythonに負けるようだと、「普通」の基準がずれてると思う いくらPythonがかなり頑張ってると言ってもねぇ
CやC++で書かれたインタプリタを使っていて 何言ってるんだか(微笑)って感じですかね
>>605 >>607 >>630 こういう奴らって頭がおかしいのかな?四則演算より複雑な場合は括弧は必須だろ
コードってのは自分だけが読むものじゃないんだろメカニカルには無意味でも読み手のコストを優先すべき
C++ってのは表現の自由度が高すぎて危険な暗黙的表現をいくらでも使えるってのが言語仕様の大きな欠点の一つなんだろ
言語仕様が糞だからコーダーがいちいち神経を磨り減らして気を配らなきゃいけないのに
>>605 >>607 >>630 こんなお粗末な考えしか出来ない馬鹿はC++を扱う資格なんて無いねおとなしくC#でも使っているべき
何が動機でそんな釣りばっかりやるんだw
単に質問に答えただけで叩かれるのかw
あれか、C#に対するアンチ活動か。分かりにくいよw
639 :
デフォルトの名無しさん :2009/10/15(木) 18:10:24
「四則演算より複雑」って何? 算術以外の演算子の優先順位を「暗黙的表現」するなってことなら void (hoge::hage)() { } とか書けって??
今回だけの話しじゃないぞ 「分からなかったら括弧を付ければいい」っていう「思想」がどれだけ危険なことであるか C++を扱う者"だからこそ"よく理解しておくべきだな そしてこの危険な「思想」の多くを実際に言語仕様が許容している事実もな
自由度の高い柔軟な言語だから優秀ではあるがアホに扱わせると危険 自分が本当にアホではないのか今一度考えるべきだね
アホですいません。 3ヶ月前に自分が書いたコードなのに 意味がよく理解できないとか普通…^^;
なにここ怖い
四則演算より複雑な全ての演算に括弧をつけるのだとしたら、配列参照も四則演算より複雑なので array[index]ではなく(array[index])と書くべきなのだろう。関係演算も四則演算より複雑なので当然にして、 a > bではなく(a > b)と書くことになるだろう。従って、while (array[index] > 0) function();と書く代わりに while (((array[index]) > 0)) (function(()));と書くわけだな。
>>645 まさにお前みたいなのを優秀なアホって言うんだよ
プロジェクト全体にとって危険因子でしかない
> while (((array[index]) > 0)) (function(()));と書くわけだな。 ((((;゜Д゜))) っぽいな
('a');
('_')==y--;
最近のGCCでは&&と||が連続で使われていると警告出すけどな。オプション次第だったかもしれんが。 これぐらいほっといてほしいよ。 expression1 || expression2 && expression3 // <-- Warning
( ;'e')
>>607 ,630
ありがとう。出来るだけ()つけるようにします。
もう一つ質問なんですが、enumのint昇格って
ビット数は必ず保持されるものなんでしょうか?
unsigned int a = 0xFFFF;
signed char b = 0xFF;
enum eNUM { c = 0xFF };
const char d = 0xFF;
unsigned int result_b = a & b; //0xFFFF
unsigned int result_c = a & c; //0x00FF << これがコンパイラ依存なのか知りたい
unsigned int result_d = a & d; //0xFFFF
&の式の左右辺がint型として評価されるから、そう
そもそもenumを他の型と合わせて使うとenumの利点が失われる件
>>651 expression1 || expression2 && expression3
だとどういう挙動になるの?
そもそも
>>603 の例だと優先順位迷いようがなくね
>>653 もともとcはintだから整数の昇格は関係ない。
result_bとresult_cは常に同じ結果で、result_dだけが環境依存
>>653 signed char b = 0xFF; // 未定義
const char d = 0xFF; // charがsingedな場合、未定義
>>657 expression2もしくはexpression3が評価され、falseなら次にexpression1が評価され式全体の評価が終わり、
trueなら次にexpression2とexpression3で前回評価しなかった方が評価され、falseなら次にexpression1が評価され終わり、trueなら式全体の評価が終わる。
>>657 コンパイル時の警告メッセージのこと?
-Wallオプション付けたら、
「hoge.cpp:XX: 警告: || と共に使われる && の周りでは括弧をつけることをお勧めします」
こんなのが出る。
たとえ括弧が冗長でも、(a>b)&&(b>c)とか、*(a[b])とか書きたいし
どんだけ読みづらくすれば気が済むんだよ
読みやすい書き方を教えてくれ
設計・コードレイアウト・命名などに関する良書を読むことが一番の近道だよ if (true){ } と if (true) { } のどちらを選択すべきかを数十ページに渡って解説しているような良書を読めば自ずと設計の何たるかが分かってくる
その良書とやらはどこのケツ拭く紙だ
>>663-665 >>663 の例はその括弧付けで良いと思うけど。
俺は怠惰だからこう書くかはわからんが、
そう書いた人を褒める事はあっても批判はしないな。
(a>b)&&(b>c)はさすがに間違えようがないと思うけど 脳内パーサが a>(b&&b)>c と判断するような人は謎の病気の疑いがある
こんな風に書くなよ。頼むから。 hoge+piyo * fuga+hanya
>>667 このどちらが正しいかって意味じゃないんだよ
でもお前らだって実際のコードを書く以上
何らかの判断基準があってこのどちらかを実際に採用しているわけだろ?
その結論に至る過程がとても重要なんだよ特にC++という言語にとってはね
ねえよそんなもん 大事なのはスタイルを選ぶ過程じゃなくて一度選んだスタイルを使い続けることだ 普通の良書にはそう書いてあるはず
実在のコードから一例を。 -- return ((a * ya[klo]) + (b * ya[khi]) + (((((a * a * a - a) * y2a[klo]) + ((b * b * b - b) * y2a[khi])) * (h * h)) / 6.0)); -- まぁ、書き換えても読み難いけどね。 -- return a * ya[klo] + b * ya[khi] + ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi]) * h * h / 6.0; --
>>673 まあブッチャケこういうのは、括弧がどうこう以前に一行で書くなボケと言いたくなるな俺は。
{ int lo = a * ya[klo]; int hi = b * ya[khi]; double y2 = (a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi] return lo + hi + y2 * h * h / 6.0; } とかにしろと 項ごとにそれぞれなんか意味があるんだろ? あと(a * a * a - a)は(a * (a * a - 1))にするべき
長い式は誤差が不安
const 付けようぜ
>>661 そなの?
1が2,3よりも先に評価されそうなもんなのに、そうなっちゃうのか
>>678 661は間違ってる
expression1 || (expression2 && expression3)
評価される順序は1,2,3。ただし短絡評価
681 :
679 :2009/10/15(木) 21:11:08
>>679 それに短絡評価であればいいのでしょうか?
||と&&のオペランドは常に左右の順に評価されるんだよ
&&の方が優先順位が高いからexpression2が最初だよ
____ / \ / ⌒ ⌒ \ 何言ってんだこいつ / (●) (●) \ | 、" ゙)(__人__)" ) ___________ \ 。` ⌒゚:j´ ,/ j゙~~| | | | __/ \ |__| | | | | | / , \n|| | | | | | / / r. ( こ) | | | | | | ⌒ ーnnn |\ (⊆ソ .|_|___________|  ̄ \__、("二) ̄ ̄ ̄ ̄ ̄l二二l二二 _|_|__|_
結合順位と評価順には何も関係がないんだが
686 :
678 :2009/10/15(木) 21:30:15
だよね。びっくりした。
expression1の評価にexpression2 と expression3は影響されないし expression2 と expression3を評価せずとも expression1 が評価されて真だった時点で終了できるし で、評価順は1,2,3
実験して確かめたらすぐですけどね
こういう場合は実験で確かめろは危険だと思うな。俺のコンパイラではこうだから、 そうなんだ、で痛い目に合うことある。この場合に限ればちゃんとルールが 決まってるし、間違ってるコンパイラは無いと思うが。 ただ、そこまでわかってる人なら知ってるだろうし、ルールすぐ見つけられるだろう。
待て待て expression1 + expression2 * expression3 なら 普通はexpression2が最初だろ つまりそういうこと
決まってないけど、レジスタの割り当て考えたら2か3を先にやるに決まってるだろ まともなコンパイラなら
>>690 1-3-2の順でもなんら問題ない。
つまりはそういうこと。
>>692 VCとICCともに123でした。まともじゃないらしいです。
予測分岐って知ってるか?
分岐予測なら知ってる。
どっちでもいいよ 知ってるなら見かけ上1-2-3の順であることなど大した問題ではないとわかるはずだ
評価順は大事だよ。 class fuga { int a; public: fuga() :a(1) { } int hoge() { return a++; } }; int main(int argc, _TCHAR* argv[]) { fuga b; cout<<b.hoge()+b.hoge()*b.hoge(); }
VCとICCでは7になるな。
expression1 + expression2 * expression3
は
優先順位の高い演算子が結合規則に従って先に評価されるので
*演算子が先に評価され、*演算子は左結合なので、exp2, exp3の順で評価されて演算。
次に、+演算子も左結合なので、exp1と(exp2*exp3)の結果が評価されて演算。
参考:
http://msdn.microsoft.com/ja-jp/library/2bxt6kc4 (VS.100).aspx
間違ってるかも知れない・・・
うん、だから避けないといけない。
そういう意味で評価順が大事になるようなケースは
>>698 みたいなコードは書かない。
>>700 あらかじめ評価した結果を結合する順序って考えればいいんじゃないかな。
規格でオペランドの評価順が決められているのは以下の3つのケースだけでーす。 1. &&の左オペランドがtrueの時、左→右 2. ||の左オペランドがfalseの時、左→右 3. ?:の条件がtrueの時、条件→左、条件がfalseの時、条件→右 なので、明示的に評価順を決めたいときは 一時オブジェクトを生成せよとされています。 規格票の該当番号をコピペするのは 誰かがやってくれマース。
論理演算子が例外的に短絡評価されるだけで 演算子の優先順位と評価順序は無関係のはず。 expression1 + expression2 * expression3とかいたとき (expression1 + expression2) * expression3ではなくexpression1 + (expression2 * expression3) となる以上の意味はない。 k=e3; j=e2; i=e1; i+j*k; となる可能性もある。
int a = 0; cout << ++a << ++a << ++a << ++a << ++a << endl;
これはアリ? cout <<0,++a << 0,++a << 0,++a << 0,++a << 0,++a;
アリだげどすごく無意味
すまんぜんぜんでたらめだった。訂正。これはアリか? cout <<(0,++a) << (0,++a) << (0,++a) << (0,++a) << (0,++a)<<endl;
だれにも理解できないような奇抜なC++を書けるように日々頑張ります!!
>>717 なんじゃこりゃ!!
だめだ笑いが止まらん
719 :
デフォルトの名無しさん :2009/10/16(金) 00:20:28
#include <iostream> int main() { std::cout << "Hello, C++" << std::endl; } これだけでも出場資格ありそうだな
迷路ワロタwww
俺には未定義と書いてあるようにしか読めない…
ああそうか、たしかに未定義では無いね 普段さらっと避けてることだから、定期的な再確認をしとかないと忘れてしまうなぁ ありがとん
このスレって
>>661 を筆頭とする無能な解答者が多くって
。。。
間違った結論のまま終わらなきゃ問題ない
>>724 お前みたいに一々煽る奴が居ないのが一番いいんだよ
いい加減にしろ
一度でいいから
>>717 のサイトにあるようなプログラムで客先に納品してみたい
以下のコードを書いたのですが、 template class A<int>;と書くところをtemplate A<int>; と書いてしまったんですけど、VC9 でコンパイル通ります。 なぜですか? g++4.4.1 ではコンパイルエラーです。 template<class T> struct A{}; template A<int>; // 明示的なインスタンス化のつもりで書いたがtypo
◆宣伝、広告◆
腕に自信のあるプログラマは、以下のコンピュータ大富豪大会に参加しましょう。
ひろゆき杯コンピュータ大富豪大会
http://uecda.nishino-lab.jp/2009/ ○What's UECda?
大貧民(または大富豪)は、我が国で最もポピュラーなトランプ・ゲームのひとつでしょう。
このゲームは、1960年頃に日本で生まれたと言われており、海外では、ほとんどプレイされていないようです。
本大会は、その日本固有の人気トランプ・ゲームである大貧民を、人が直接プレイするのではなく、
プレイするコンピュータ・プログラムを作成して持ち寄り、対戦させる大会です。
主催
電気通信大学
C#より、VB.NETやれよ。 楽しいぞ。
欠陥言語C#の話題はスレ違いなんで自粛してください
C#にtypedefが追加されたらずいぶん改善されるのにな。
スレ違いだが、参考まで。
>>732 つ[using 別名 = 型];
スレタイ読め 二度と来るな
735 :
653 :2009/10/16(金) 21:32:34
符号有無のキャストは奥が深いんですね・・。 enumはintと覚えておきます。 また優先順位の質問ですが、スレを見てて()の重要性がわかった気がしました。 いろいろ情報ありがとうございました。
737 :
736 :2009/10/16(金) 22:31:14
プロファイラとC++コンパイラが一緒にやっているはないですか。
あなたの言語は日本語ないですか?
739 :
736 :2009/10/16(金) 23:17:37
教えて
thx
const bool x=foo(); const bool y=bar(); このとき if(x||y){〜} と if(y||x){〜} はより効率の良いコードに最適化されたりしますか?
意味不明。 評価しやすいほうが前方にあれば速度は速くなると思う。
744 :
742 :2009/10/18(日) 12:45:17
>>743 重大なカンチガイをしていました。
済みません。
ありがとうございました。
x、yのうち真になる確率が高いほうを前にしたほうが効率が良くなるんじゃないか。 どうせほとんど変わらないだろうけど。
つーか、最適化なんて環境依存もいいとこなんで。C++みたいに環境依存の 多い言語だと何とも答えようがないとしか。
747 :
デフォルトの名無しさん :2009/10/18(日) 13:38:51
これは最適化という域ではなく、アルゴリズムの改善だろ
C++は標準ライブラリがマクロを多用する欠陥言語 ただ1つのintに対してM$は狂ったように無数の別名を与え続けた 1つの言語の世界の中では移植性や汎用性を高める為の技術のはずが 複数の言語の世界にまたがるとただの障壁としかならずまさに本末転倒 C++からCLIを利用する時はすんなりと行けるが C#からWin32APIを呼び出すとその欠陥っぷりが如実に現れることが全てを証明している こんなウンコC++に未来はない みんな大人しくC#に移行しよう
intにそんな別名ってあったっけ?
>>748 MFCもwindows.hもC++の標準ライブラリじゃないから。
C#は全部System.Objectの派生だろ。
>>748 C++を知らないヤツが知ったかぶっちゃって恥ずかしいwwwwwwwww
必死の切り返しw
> C++からCLIを利用する時はすんなりと行けるが > C#からWin32APIを呼び出すとその欠陥っぷりが如実に現れる ならC++使いなよっておもうんだが
WindowsのAPIはたしかにアレだけど、あんなの決めたのM$なんで、C++のせいにしないで ほしいわ。というか、ほとんどC的な使い方しかしてない。当時はC++も今より 仕様が未熟だったし、仕方ないところもある。 typedefは一つに移植性の向上という目的があるからするんで。そこんとこよろしく。
>>748 > C++は標準ライブラリがマクロを多用する欠陥言語
> ただ1つのintに対してM$は狂ったように無数の別名を与え続けた
この2つを結びつけるあたり
お前の頭が欠陥だとしか。
WTL使えよ
まあ、整数型のtypedefの正体を知らなきゃならない場面が多いのは確か 整数関係は意外と罠多いからなぁ
WTLのいい本教えてください。マジで。orz
これならどうなんですか? (((cout <<(0,++a) ) << (0,++a) ) << (0,++a) ) << endl;
だから結合順位と評価順位は別だと何度言ったらわかるのだ。 ひとつの文である限り、環境依存。
766 :
765 :2009/10/18(日) 19:51:39
> 実装により定義された(implementation-defined)動作、不定の (unspecified)動作、未定義の(undefined)動作を区別することを世の 中では重視するようだ。違いは?> > A: >簡潔に説明する。実装により定義された動作とは、どう振る舞うかを実装が選択して、その振る舞いを文書にすることを意味する。 >不定の動作とは、どう振る舞うかを実装が選択しなければならないが文書にする必要はないことを意味する。 >未定義とは、本当にどんなことがおこっても不思議ではないことを意味する。 >どの場合にも規格は、必要条件を課していない。 >最初の2つの動作について規格は時々ありそうな振る舞いの集合について少し提案している(その集合から選択しなければならないかもしれない)。 >規格は未定義の動作に直面したときのコンパイラの動作について何も必要条件を設定していないことに注意すること。 > だからコンパイラは本当に何をしてもいいことになる。
769 :
デフォルトの名無しさん :2009/10/18(日) 20:15:26
> 不定の (unspecified)動作 アホ
770 :
デフォルトの名無しさん :2009/10/18(日) 20:15:26
const std::string name[] = {"aaa" , "bbb" , "ccc" , "ddd" , "eee" , "fff"}; このとき、 配列nameの要素数を取得するにはどうすれば良いでしょうか?
>>770 booost::sizeを使う
#include <boost/range/size.hpp>
#include <cassert>
int main(int argc, char *argv[])
{
const std::string name[] = {"aaa" , "bbb" , "ccc" , "ddd" , "eee" , "fff"};
assert( boost::size(name) == 6 );
return 0;
}
>>771 ありがとうございます。
それで行きます、
774 :
デフォルトの名無しさん :2009/10/18(日) 20:41:04
>>774 template<class T,int N>
int size(T a[N])
{
>>775 送信されちゃった
return sizeof(T)*N;
}
確認してないけどこんな感じなのかな?
要素数を知りたいならNを返すだけでいいだろう
778 :
デフォルトの名無しさん :2009/10/18(日) 21:03:02
>>777 しまった、後送信して動転してしまった。
「マクロをつかわずにどうやって」って、テンプレートでやると難しいの?
実際boost::sizeの実装はラッパにラッパを重ねて見た目より多少面倒なことになってる で、最終的に定数(sizeof(なんか)/sizeof(なんか) + 配列の先頭アドレス)と定数(配列の先頭アドレス)になって コンパイラによる展開、除去ののち定数埋め込みになる…のかな?
>>781 引数が配列とは限らないからいろいろやってるんだとは思うけど。
たとえばコンテナが渡された場合など、sizeメンバー関数を持つオブジェクトだった場合の切り替えってどうやってるんだろう?
C言語の範囲で、バイナリ文字列を画面に出力できるんですか? stringだと出来ますが。
スレチ
char型を一字ずつやれば出来そうですが。ほかにないですか、%sだと\0で止まると思います。
type_traitsってやつですな しかし特定の名前のメンバ関数を持っているかどうかの判定は環境依存しない方法でできるんだろうか
>>784 c++でもいいです。
char *p が1MBあったとして、それをstringにコピーせず=別メモリの確保無し
でまるまる画面に出す方法ありますか。
>>787 forで1バイトずつ処理してください。
それしかないんですか。トンクス
cout << string は一括で出力できる気がしてます… これを真似する方法でできないでしょうか。・
fwrite
std::copyとstreambuf_iteratorでどうにかできそうな気がせんでもない
最初からvectorとかstreambufに格納しておけば、後から何とでもなるのに。
わかりました。ファイルポインタの代わりに stdoutにしてバイナリ出力したらいいんですね。 サンクス
796 :
デフォルトの名無しさん :2009/10/18(日) 21:54:26
>>786 C++ の流儀では、それはコンパイルエラーで対応する範疇のことで
どうしてもランタイムでっていう場合はインターフェースと dynamic_cast だろ
icu::UnicodeStringなどは、stringと違って 実体持たずにポインタ保持してるみたいですね。 char * strをUnicodeStringに代入してから 空きができたとおもい別用途で使用したらデータ消えてるみたいです。
コンセプトがあれば786なんて楽勝だったのにっ!
799 :
797 :2009/10/18(日) 22:33:07
すみません。別の原因でした。コピー作られてるようです。7
std::basic_ostream<>にもfwriteのように使えるメンバ関数writeがあるぞ。
宣伝厨死ね
>>802 確か2chでは宣伝には相応の対価を払わされるんだよな。
それは非営利目的でも、だ。
なぜDelphi製のJaneの宣伝をC/C++関連スレに爆撃したんだ
JaneってDelphiなの?
さすがに違うだろ…Delphiでこんな良いソフト作れるわけがない。たぶんHSPだな。
JaneがDelphiなのではなく「Delphi製のJane」
JaneViewは一部C++だったかな
派生クラスの型定義を基底クラスで使いたくて、 template<class T> struct A { typedef typename T::b_type value_type; // error void test() { T::b_type n; } // ok }; struct B : A<B> { typedef int b_type; }; みたいにしたら、 vc2008eeとgccに'b_typeはBのメンバじゃない'って怒られた。 結局、b_typeで渡すのはあきらめて、Aにテンプレート引数を追加して、それで渡すことにしたんだけど、 これはどうしようもない?
b_typeがA<B>に依存しない型かどうか分からないからな。
環境依存だが template<class T> struct A { __if_exists(T::b_type){ typedef typename T::b_type value_type;} __if_not_exists(T::b_type){ int value_type;} void test() { value_type n; } }; struct B : A<B> { typedef int b_type; }; struct C : A<C> {};
815 :
814 :2009/10/21(水) 07:59:59
ごめん、どうやらこのやり方は間違いのよう。 __if_existsには型は渡せなかった。
しかし.NET便利すぎだな C++用にアンマネージドの.NET3.0も作って欲しいくらい
.NETw
>>816 C++に比べて具体的にどういうところが便利なのかい?
820 :
812 :2009/10/21(水) 22:34:31
C++に未来は無い C++は近い将来に必ず滅ぶ
C++は滅びぬ。 何度でも蘇るさ。 それがプログラマの夢だからだ。
const string class::STR1[2] = {"A","B"}; const string class::STR2("C"); これを関数内でstatic string str3(STR1[2]); とやるとCが表示されるんだが…なぜ? こういうやり方はしないほうがいい?char*ですべき?
STR1の要素は2なんだから添え字は1までだろう
まぁそうなんだが、なぜか[2]でも使えるんだよなぁ
使えてないだろ馬鹿かこいつは
単に範囲外へのアクセスだから未定義。何が起きてもおかしくない。論外。
相談です メインのクラスに巨大な配列(int型の1000*1000*1000ぐらいの配列)を定義していて ある操作AをするためにクラスAにその配列全体の中身をいちいちクラスAのメンバ配列にコピーして結果をまたメインクラスにコピーしなおすということをしているのですが さらにその後メインクラス内で別の操作BをするためにクラスBを作りました この操作をするためにはまたクラスBのメンバ配列にメインクラスの配列をコピーするようなことをしなくてはならないのですが 毎回これをやってると処理が重くなってしまいます そこでメインのクラスからもクラスAからもクラスBからもアクセスできるような配列を定義したいのですがどうするのがいいのでしょうか? ちなみに巨大な配列をグローバル配列として定義してみたのですがうまくいきません (VCのMFCを使っています。グローバル配列はstdaf.hで定義しようとしました。全てのクラスの処理とクラス定義はそれぞれc++ファイルとヘッダファイルを作り分けています) またそういったどのクラスからもアクセスできる配列っていうのは作ることができるんでしょうか?
他のインスタンスから直接触らせて構わないならポインタか参照を投げればいい つーかクラスとインスタンスの呼び分けをしてくれないと何が何だか分からん 「メインのクラス」の意味がまず分からん
stdafx.hにグローバル配列を定義という時点でかなり初歩的な問題があるな ここでいちいち教えるにはあまりにも長すぎるから、どっかにいい解説無いかね
>>829 すいません
書き直してみます
mainインスタンスに巨大な配列(int型の1000*1000*1000ぐらいの配列)を定義していて
ある操作Aを行うクラスAのインスタンスAをmainインタンスで宣言し、mainの配列全体の中身をいちいちインスタンスAのメンバ配列にコピーして結果をまたmainにコピーしなおすということをしているのですが
さらにその後main内で別の操作BをするクラスBのインスタンスBを作りました
この操作をするためにはまたインスタンスBのメンバ配列にmainの配列をコピーするようなことをしなくてはならないのですが
毎回これをやってると処理が重くなってしまいます
そこでmainのインスタンスからも、その中で宣言したインスタンスA・インスタンスBからもアクセスできるような配列を定義したいのですがどうするのがいいのでしょうか?
ちなみに巨大な配列をグローバル配列として定義してみたのですがうまくいきません
(VCのMFCを使っています。グローバル配列はstdaf.hで定義しようとしました。全てのクラスの処理とクラス定義はそれぞれc++ファイルとヘッダファイルを作り分けています)
またそういったどのクラスからもアクセスできる配列っていうのは作ることができるんでしょうか?
>>830 プロジェクト全体で使えるグローバル変数の定義ってどこでやればいいんでしょうか?
>>831 そんな「巨大な配列」を「グローバル」にして「stdafx.h」に「定義」するって?
もう突っ込みどころしかないんだ。
まさに
>>830 の2行目なので、できれば成書を読んで基礎理解を深めてほしい。
その質問に対する答えだけほしいなら
>>829 が1行目で書いてる
>>831 うん、まぁ、素直に書き直してくれたのはいいんだが…
クラスとインスタンスの意味がちゃんと理解できてないようにしか見えないっつーか
結局意味分からん…
寧ろ余計判らなくなった。 どうやら、最初の方は無意識に補っていたらしい。
よし、MFCという単語が出てきた時点でわかったぞ。
つまり、mainクラスとはCWinAppの派生クラスであり、
mainインスタンスとはその唯一の実体、theAppの話だな。
…普通、そういう呼び方はしないが。^^;
それはともかくとして、やっぱり
>>829 の一行目が答え。
hoge fuga(piyo &p); fuga(piyo()); hoge fuga(piyo *p); shared_ptr<piyo> foo(); fuga(foo().get()); ↑のように一時的な参照タイプの引数を関数に渡した場合、インスタンスの寿命はどこまで保証されるんでしょうか?
fugaを呼び出しているステートメントが終わるタイミングでfooの寿命は消える
文末まで生きるんですね、安心しました レスありがとうございました
>>836 参照の右辺に一時オブジェクトは置けないよ。
hoge fuga(piyo &p);
fuga(piyo());
も禁止。ポインタにしましょう。
840 :
デフォルトの名無しさん :2009/10/22(木) 21:47:00
hoge fuga(piyo *p); fuga(&piyo()); ならいいって?
841 :
デフォルトの名無しさん :2009/10/22(木) 22:03:06
すみません。 「Crypt: bitwise not / Password: nYXR-lZml-yZXd-hbGw-1a2c 」から連想されるアプリ(偽装解除ソフト)を探しています お分かりになる方、いませんでしょうか?
スレチ
>>839 それを言うならconst参照にしましょうだろ
とりあえずvirtualつけろよ
const参照でも右辺に変数以外は置けないよ。 VC++は通っちゃうけど。
小さい頃は近所の駄目人間おじさんをバカにしてたっけ・・・。
よれよれの紺のビニールジャンパー、べた付いてそのままよりも少なく
見える髪の毛。猫背。生気のない瞳。ただその存在そのものを見下して
たね。将来自分は絶対に出世するんだって何の根拠もなく思ってたね。
小さい頃からの日々の積み重ねが大人になるまで続いてくなんて夢に
も思わなかったよ。中学生の頃通っていた塾の先生が言ってたな。
「俺はあんまり頭良くないから法政にしか行けなかったんだ、ははは。」
クラスのみんなで大笑いしてたっけ。あの内何人が法政以上の大学に
行けたというのだろうね。毎日会社に通って夜遅くまで働いてるお父
さんがいかに大変で偉大かって、やっと分かりました。
転職を繰り返して人に馬鹿にされて初めて分かりました。生きるって
本当に大変。何をやっても後悔が待ってるもんね。特別じゃない。
自分は特別な人間でも何でもないんだって、20代後半になってやっと
分かりました。あの頃、白い眼で見てしまったおじさん、ごめんね。
あなたのぶんまで生きようと思います。
でも、時間が必要だったことだけは分かって欲しいんだ、おじさん。
さようなら、青い鳥★69羽目
http://gimpo.2ch.net/test/read.cgi/news7/1250876574/
>>844 >struct impl_ab : public iface_ab, public impl_a, public impl_b
struct impl_ab : public impl_a, public impl_b
iface_abはいらない
>>846 VC++で通っちゃうのは非 const 参照を一時オブジェクトで初期化するコードだろ。
const 参照なら一時オブジェクトで初期化できるのが標準。
右辺とか変数以外とか言ってるのもよくわからん。
>>846 お前、理解できてなさすぎるww
>>849 の
> VC++で通っちゃうのは非 const 参照を一時オブジェクトで初期化するコードだろ。
> const 参照なら一時オブジェクトで初期化できるのが標準。
これが全て。
851 :
デフォルトの名無しさん :2009/10/23(金) 06:03:48
C++って参照の参照が現れると未定義の動作になるんでしょうか? 例えば MyClass foo(const MyClass&){〜}; この時 const MyClass& x =foo(MyClass());//一時オブジェクトをconst参照で束縛 foo(x);//参照の参照 この動作が未定義になるんでしょうか?
852 :
デフォルトの名無しさん :2009/10/23(金) 06:16:55
Cのコードを再利用してプログラミングしています。 pow関数などで、オーバーロード関数があいまいです と出るのですが、もちろんキャストしてやるか、powfなどをつかえば 問題はないのですが、できればコードを書き替えずにプリプロセッサなどで エラーを出さない方法を探しています。 何か良い方法があれば教えてください
>>851 ならないよ
てか、参照の参照なんて現れて無いじゃん
(そもそも参照の参照なんて文法上存在しないし)
未定義の動作として有名なのはこれだな
const MyClass& foo(const MyClass& n) { return n; }
const MyClass& x = foo(MyClass());
x->hoge();
一時オブジェクト MyClass() の寿命は x の宣言文のところまでなので、
hoge を呼ぶ時には既に寿命が尽きている
戻り値として返してそれを const 参照に入れてはいるけど、
こういう間接的なルートを通ると寿命は伸びない
この例と
>>851 との違いは、戻り値が参照かそうでないか
戻り値がコピーになってると、
そのコピーされた戻り値オブジェクト(引数のオブジェクトとは別物)が
const 参照に束縛されるので問題が無い
結局のところ参照引数にコンストラクタ渡すのは×、const参照引数にコンストラクタ渡すのは○ということ? 状態をもっていて呼び出すと状態がかわる関数オブジェクト(乱数とか、ストリームへの参照を持ってるとか)を渡したいときに func(x, func_obj(a, b)); とかやりたい場合はオーバーヘッドはあきらめて値渡しにする(かconst_cast)しかないんでしょうかね
>>854 なんか何言ってるのか分からなくなってきたが、
基本的に関数オブジェクトは値渡しできるように作らなきゃ駄目
内部に状態を持つ場合も注意深くコピーコンストラクタ定義すれば問題ないはず
お前らって本当に頑固な奴らだな いい加減C++を使うのは止めにしないか?
それくらい脳内変換しろよ
C++のやりすぎで柔軟な思考が出来なくなっているんだろう
柔軟な思考とぞんざいな思考は紙一重だからなあ
ご託を並べていないで どうすれば生産性の低いC++でも納期を短く出来るのかを考えろよ会社のお荷物どもが 実際にタイムリソースを消費しまくっているだろうが!うちは慈善事業団体じゃねーんだぞ エンジニアのオナニーに付き合わされるのはもうまっぴらなんだよ!!!
>うちは慈善事業団体じゃねーんだぞ じゃあ、慈善事業団体にしちゃいなよ
矛盾も無理もなく確定して変更されることのない仕様を提示してくれ。
プログラマでも完璧な仕様作るのは無理ですわ。
> どうすれば生産性の低いC++でも納期を短く出来るのかを考えろよ会社のお荷物どもが うちのチームはJavaチームより遙かに生産性高いよ Windows組はC#とかつかっているけどJavaチームより出来が悪い これはWindowsエンジニアでまともなのが少ないからだけどな
クラスのprivate変数として初期値を持った配列を定義したいのですが、どうも出来ない様子。 ぐぐると、コンストラクタで初期値を入れるのがおすすめらしいのですが疑問があります。 初期値はどこに持っておけばいいの???
どこにでも持っていいよ
できないのはポインタの参照だっけ?
872 :
851 :2009/10/23(金) 21:34:26
>>853-855 レスが遅れまして大変申し訳ございません。
@> MyClass foo(const MyClass&){〜};
A> const MyClass& x=foo(MyClass());//一時オブジェクトをconst参照で束縛
ここまでは仕様上OKだと思うのですが
B>foo(x);//参照の参照
fooの引数がconst参照となっていますので
x自体がAのようにconst参照であるがゆえに
参照の参照になるのではないかと思ったのです。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
そもそも私がこれを気にした理由は
letsboost::call_traits
ttp://www.kmonos.net/alang/boost/classes/call_traits.html ここに
>「参照型への参照型」はC++的にはイリーガル
という記述を見つけたからなのです。
みなさまどうかご指導よろしくお願い申し上げます。
template 中で形式的に「参照の参照」が出現した場合、 コンパイルエラーになるってだけでは。 template が絡まない限りは関係ない話。
874 :
デフォルトの名無しさん :2009/10/23(金) 21:58:29
>>873 ああなるほど、そうでしたか。
const MyClass x;
const MyClass& y=x;//参照
const MyClass& z=y;//参照の参照
これが未定義の動作になるのかと思っていました。
(動作するのは偶然で仕様上はダメなのかと思っていました。)
ありがとうございました。
>>872 「参照型の参照型」と「参照の参照」を混同してるのが原因
参照型の参照型ってのはポインタでいうとこのT**
T&型の参照型はイリーガルって話。
876 :
872 :2009/10/23(金) 22:05:15
>>875 それで理解できました。
template <typename T>
class XX{T&うんぬん}
で
XX<std::vector &>とかした場合って事ですね。
ありがとうございます。
参照は別名、って覚えてからコード見やすくなったわ int x; int& r(x); xの別名r int& rr(r); xの別名であるrの別名rr、つまりxの別名
>>877 それだとまずいこともあるぞ。
別名だとすると処理に一歩時間がかかることが
説明できないし。
いえ、ただの別名です。
>>881 さらに言うと
現実の実装は別に処理系が好き勝手に決めて良い。
すなわち仕様上は参照渡しがポインタを使って実装されているとは限らない。
まあ常識的にはポインタだけどな もしくは本物を直接見るコードに最適化されるか
インライン化されれば間接アクセスは消える可能性が高いな
正直.NETって凄いよね
>>885 定期的に宣伝してるのか?
具体的にどういうところがC++に比べて凄いのか書いたら?
>>885 じゃないけど
マイクロソフトはC++よりもC#を推進しているような気がする。
理由の1つ目はVC++を単体売りしなくなったこと。
理由の2つ目は2010でStandardエディションを廃止して
「誰でも簡単にリッチなアプリを作れるライブラリ」であるところのMFC/ATLを
(以前よりも)手に入れにくくしたこと。
理由の3つ目は2008でモバイル開発環境をProfessional以上に限定したこと。
理由の4つ目はC++/CLIとC#を比較したとき、C#の方が.NETの全機能によりスマートに対応していること。
Windows上でのC++による開発は
高度な技術を持つ職業プログラマだけのものへと押し上げて、
残りはすべてC#やVBで吸収(結果的にネイティブから.NETベースのプログラムに)
指定校というむにゃむにゃ。
>>885 ええと2ch宣伝は相応の対価を払わされるんだと
何度言えば分かるんだヴォケ!
>>887 >
>>885 じゃないけど
お前が
>>885 じゃなかろうが何だろうが
スレ違いかつ2ch宣伝厨であることには代わりないんだよ。
何でそれが分からないの?
ライブラリがすごいのね
ぜんぜんわからん^^
>>887 VC++もVC#も無料で手に入るわけだが?何言ってんの?
どうせ書けずに逃げるんだろうと高をくくって「書いたら?」を水を向けたら ホントに書いてきた奴がいるので、今度は「スレ違い」と言ってみた。
スレ違いというレッテルにそこは関係ない件について
>>887 を読んだが、.NETの方がC++よりなぜ凄いのかはわからんな。
MSがC#に力を入れてるというのは知ってるけど。結局それだけ?
むしろ、その議論だと現MS路線にロックインして他の事、環境には一切
手を出さない人には良いという風にも感じられる。ついでにMSの
気が変わったらどうするんだろう。
言語仕様として凄いところとかは?
スレ違いという人もいるが、C++と他の言語の比較は別にここで
話しても良いのでは。
.NETとC++の比較って、言語と言語の比較じゃないよね。
.NETとネイティブの比較か、VB・C#・C++/CLIとC++の比較にしてくれないと 何とも話しようもない
あと、.NETでC++を使うことの利点、あるいはC++で.NETを使う事の 利点とかが話になるのかな。
.NET凄いよ。 岡三オンライン証券のツールが採用してるけど、 寄り付きでいつも遅延w トラブルなんて慣れっ子ww 毎週のようにでかいパッチを強制ダウンロード。 凄すぎるぜwwww
.NetというよりWPFが凄い
いやだから、自分は
>>885 じゃないから、,NET>C++とは思ってないよ^^
Microsoftは今までサンデープログラマのようなアマチュアプログラマのために
VC++を安価に提供してきたけど、2010からはしなくなる。
で、知ってのとおりVC++のExpressエディションではMFC/ATLは使えないので
手の込んだアプリケーションを作るにはC#やVBを使ったほうが断然速い。
そういう層には、VBやC#(.NETベースのプログラム)の魅力は
VS2010でぐんと上がってくることになるだろう、と。
Windowsという開発環境に限って言えば、
VC++はアマチュアプログラマの世界から消えてなくなって
もう誰もC++名にソレ?みたいな世界におまんこ。
windows自体が何ソレ?みたいな世界になればいいのに
別にWindowsだけが開発環境でないし。
905 :
デフォルトの名無しさん :2009/10/24(土) 16:46:36
>>902 Express がないのと「速い」のと関係あるんか?
それと PC 用の C++ コンパイラが 4 〜 5 万くらい、PC も 20 万以上で、
本来であればワークステーションが必要、という時代にもアマチュアは腐るほどいたぞ
よーするにコンパイラがフリーかどうかってのは言い訳に過ぎないと思うぜ
MSはC++にもC#にも普通に力入れてるっつーか、最近のVC++の改善実績や 改善予定は結構凄いと思うけどな。
907 :
デフォルトの名無しさん :2009/10/24(土) 16:51:30
あ、Express がないんじゃなく、Express にライブラリがない、だったか まあどっちでもいいや
>>905 コンパイラの基本部分ではなく部品が足らないから
作業時間が多くかかるって事だろ。
>>887 C#を推進してるかも知れんが、.NetFrameworkを使う為の言語としてはC++/CLIを推奨してなかったか
NetFramework = C# C++/CLIは暇で作った。
実際には、実行環境と言語は別なのだが。 どのプラットホームに対応するかはコンパイラの次第で。 C#コンパイラがバイナリを生成してもいいんだが。
文章の最後に「まんこ」って書いたのがいけなかったのかな。 あんまり良く伝わらなかったみたい。 ニホンゴヘタデゴーメンナサイヨー。
.NerFrameworkの利便性を得たいがためにC++からC#に乗り換えるぐらいなら C++/CLIつかいなさいよ、程度だろ
まぁ実際、ATLなしでCOMプログラミングやってみたり、 MFC(やWTL)なしでドキュメントビューアーキテクチャのアプリを作ってみれば どんだけめんどいか(これらのライブラリがどれだけ便利か)わかりますです^^ リボンコントロールをAPIと生のCで実現するのもうんこ漏れると思う。 やってないからわからんけど^^;;;;;;;;;
楽したいならVB使えよ。
>>916 GUIが楽になるという物でもないように思った。
けど、STL好きにとっては便利そうに見えたな。
>>915 MFCが無いならQtを使えばいいじゃない
920 :
デフォルトの名無しさん :2009/10/24(土) 17:24:33
>>915 アマチュアが COM を憶えるのに ATL は必要ないし、
憶えていくうちに自作のライブラリが充実していくから
結局 Express にそんなものはなくても大した問題じゃない
(ライブラリがコンパイラに付いてないってことが、
そのままライブラリが永久に使えないことを意味する
ような奴はそもそも適性に問題がある)
COM ではなく ATL を憶えたい場合にも授業料としてそんなに高いわけじゃなし
仮にそれらがフリーで手に入っても、自分に投資する気のないような奴は結局実らない
その理屈はおかしい
>>920 たしかになぁ。
ポインタ周りも自作のライブラリが充実していくから
boostとか無くても大した問題じゃないよな
(boostが禁止されたプロジェクトに配属されたからといって
メモリリークを起こす奴は適正に問題があるよな)
ユーザーの適性とかの話はしてないのよ。 マイクロソフトがスタンダードエディションとそれを利用する層に対してどのように振舞うかを見たとき、 VS2010におけるマイクロソフトのVC++へのスタンスをどのように解釈するかって話をしているんだけど ・・・やっぱりまったく伝わってなかたあるよっていうか会話がかみ合って中田アルヨ。 ニポンゴムツカシイネ。ちょわいよん。
>>919 Qt は良いと思うが、実際 Windows 開発で Qt 使ってる、
ってどの程度の割合いるんだろうね。滅茶苦茶低そう…
boostがなければtr1::shared_ptrを使えばいいじゃない
>>925 充実した自作ライブラリがあるからいらないんだと思うよ
>>923 俺としてはコンパイラのみ無償提供だった時期が一番よかったように思うけど。
Expressは豪華すぎる。
統合環境はいらないならWindows SDKだけDLすればいいじゃない
>>916 GUI関係はあまりなかったと思う。
CoInitialize/CoUninitializeをクラスにしたり、
FindFirstFileやToolHelp32をイテレータ化するものだったり、
(いい意味で)誰もが思いつくものをそのままクラスにした感じ。
自作ライブラリと機能かぶるなんて人も多いと思う(自分は自作ライブラリを捨ててWinSTLにした)。
一言で言えば地味。
だから積極的に薦めるという気にならないけど、。使ってみて自分に合うと思ったら使い続けたらいいと思う。
.rcを手書きするなんていやじゃー!
と思ったなら買えばいいじゃん
932 :
デフォルトの名無しさん :2009/10/24(土) 17:55:07
>>926 だからライブラリを憶えたいのかアーキテクチャを憶えたいのか言語を憶えたいのか、何の話をしてるんだよ?
それと、いちいちアンカーつける気がしなくなったが
ゲイツがどういう商売をする気かはゲイツの問題で
気に入らなきゃいつでも離れられるのが C++ を選ぶ理由でもあるわけで
あくまでゲイツと心中って前提がある奴の自分語りをこんなとこで聞きたくねえ
C#ってバイナリー吐かないのか・・・Linux屋だから知らなかったよ そんな中途半端な代物をC++と比較するのはちょっとおかしいんじゃないか?
>>932 何で俺にアンカーついてんだ
既に作られたライブラリがあるにもかかわらず、自作ライブラリを
充実させることに心血を注ぐタイプなんだろ?
なのにポインタ周りのライブラリが充実してないとか基礎をおろそかにしすぎじゃん。
935 :
デフォルトの名無しさん :2009/10/24(土) 18:25:16
>>934 心血を注ぐことに批判的な姿勢を感じるレスだったからアンカーつけたんだよ
既に作られているライブラリでも採用するかどうかはアマであろうとプロであろうと場によるぜ
ライセンスがらみで結局同じものを「あくまでオリジナル」で作るなんて話はそこいら中にあるし、
基礎のできてない奴が増えていることは恵まれすぎている環境を背景としている
おまえさんの論法では Hello, wold でさえ既にあるから自分で作るなってことだろ
その理屈はおかしい
>>933 Linuxでもwindowsでも動作して、速度はバイナリ並みなんですよ。
初回起動後にバイナリイメージが生成されます。
Javaのような仮想マシーンはないんです、
938 :
934 :2009/10/24(土) 18:33:02
> 基礎のできてない奴が増えていることは恵まれすぎている環境を背景としている
俺も
>>927 でも書いたとおり、Expressは豪華すぎると思うよ。
そこは意見一致してんのにな。
いつでも離れられるために自作ライブラリに固執するのか、郷に入って郷に従うのか、
その差かねぇ。
コンパイラだけ仕えよ。clは総合環境でも使えるぞ。
そういうのも普通にVMと呼ばれるから注意な インタプリタ方式じゃなくてもVMはVM
941 :
デフォルトの名無しさん :2009/10/24(土) 18:48:59
話の発端が 「.NetというよりWPFが凄い」 「具体的にどういうところがC++に比べて凄いのか書いたら?」 であることを忘れている人たちがいるようだ。 終始.NETとC++の比較の話であり、 それ以外の結論は無意味なのである。
あ、間違えた。 「正直.NETって凄いよね」 「具体的にどういうところがC++に比べて凄いのか書いたら?」
しかしmonoではWPFを使えるようになる見込はないとのこと…
だから実行環境とプログラミング言語じゃ比べようがないだろ 1グラムと1円どっちが熱いかと聞いてるようなもんだ
型名と同じ名前の変数を作りたいんですが、C++だと、構造体等を宣言した直後に付ける以外できないのでしょうか? struct Hoge{}Hoge; ○ static Hoge& Hoge = *(Hoge*)0; × staticメンバに「.」演算子でアクセスしたいんですが・・・ ていうか、そんなことしたら殺されますか?
static Hoge Hoge; じゃだめなの?
あ、ごめんなさい。 重いクラスとかでもできるようにしたかったんで、参照じゃないとあまり意味がないんです。 それに、ヘッダに書くのであまり、実体を置きたくなかったもんで
中身のない参照でいいだろ。 実際それはそういう風に使われてる。
>>946 クラス名と同名の変数なら struct Hoge Hoge; でいける。
でもそんな動機でヘッダに宣言するのはいただけない。
>>946 static struct Hoge& Hoge = *(struct Hoge*)0;
じゃなくて?
>>949 それの宣言方法がわからなかったんです・・・。
>>950 やっぱりいただけないですよね〜
>>951 できました。C言語のレベルでしたね・・・。精進せねば
みなさんありがとうございました。
>>949 > 中身のない参照でいいだろ。
そんなん作れないよwwwwww
Cスタイルのキャストは使わないでください。
キャストの記法もそうだけど、structが鬱陶しい。 ぱっと見はC言語なのに実はC++とか、なんか嫌だ。
static_cast<Hoge>(aaa)とか面倒です
>>957 自分は
>>951 のようなのを書くときでもstatic_castを使ってるよ。慣れの問題かも。
スタイルの問題だけど、俺の場合typedefかコンストラクタが一番上に来ることが多い(publicなことが多い)からstructのほうがprivate:一回分楽 それにインターフェイスとか関数オブジェクトとかポリシーとか使ってると普通に全公開のクラスもよくあるからstructのほう使いたくなる
cast は明示的に使った方が良いよ。 いざと言う場合に、どこで使っているかを拾う簡単な方法がそうでないと無い。
>>960 賛成。使うべき。でももうちょっと短いキャスト名にして欲しかった。
入力補完とか使って入力してるからタイプ数はどうでもいいんだけど 沢山あると凄く見辛い… あれか、キャストなんか使うなということか
メイヤーズはそういってるね。 reinterpret_castはいらいらするほど長いから すごく使いたくなくなる。 それは海洋遭難者のために救命ボートに備え付けられた非常食が わざとゲロが出るほどまずく作られているのと同じ理由だって。
964 :
デフォルトの名無しさん :2009/10/24(土) 22:16:39
> あれか、キャストなんか使うなということか まずそこだよな static_cast<hoge*>(0) とか・・・
>>951 これ未定義動作になるよな?
少なくとも Hoge.なんとか で参照したら。
新キャストはWinAPIとかキャスト使いまくりを強要されるコードを書くときイライラする。 せめてstatic_castはもうちょっと短くして欲しかった…。 1文に2個も入ってたりすると、すげぇ横延びて困る。
reinterpret_castはコンパイラへの詐欺、 dynamic_castは設計の脆弱さが露呈した結果、 const_castは恋の予感。
入力補完なんて頼ったことないぜ
template <class T, class U> T &scst(U &u) { return static_cast<T>(u); }
それ使うときにscst<int,long>(42L);とか書かなきゃならないじゃない めんどくせえよ
>>970 Uの方は勝手に推測してくれるんじゃないかな?
972 :
961 :2009/10/25(日) 00:16:27
>>962 > 沢山あると凄く見辛い…
俺もこっちの意味。
可読性がちょっとアレになっちゃう。
c_castとかにして欲しかった。
>>969 なるほどね。
でも標準でそれを採用してくれていないと、
結局他の人が読んだときに困るだけだから
可読性がさらに悪くなる。
まあ標準仕様に文句付けてもしょうがないんだけどさあ・・・ねぇ。。。
キャストするな、必要だとしても関数にまとめるなりしろ、ってことに決まってるだろ。
>>967 dynamic_castだらけです。
むしろ愛してます。
>>975 dynamic_castだらけってのはなんかまずいんじゃないか?
結構欠陥プログラミングに見られる傾向だぞ。
欠陥って言えば欠陥だが、 どちらかと言えば継ぎ接ぎだらけ。
dynamic_cast+ifelseの羅列が目に浮かぶようだ
975自身はまともだけど、糞ライブラリを使わされているせいで、 dynamic_castの多用せざるを得ないという可能性もまだ考えられるぞ。
dynamic_castなんて軟弱なもの一回も使ったことないわ
(意訳)使い道が分からないわ
タイプが面倒なんですけど
(意訳)綴りが覚えられないんですけど
興奮状態で煽ると内容がどんどん自己紹介化していくって 偉い人が言ってた。
985 :
951 :2009/10/25(日) 01:52:16
あ。structつけないとダメじゃんってだけで機械的にやってしまった。
エイリアス使ってるからC++だよね。お騒がせしました。
>>965 未定義になるの?
C++だと0とnullは違うんだっけ?
ヌルぽの参照剥しは未定義じゃない?
>>985 ヌルポインタをデリファレンスして使うと未定義動作逝き。
988 :
951 :2009/10/25(日) 02:17:34
あ、そうなんだ?
これは勉強になりました。
>>946 にも届きますように。
989 :
デフォルトの名無しさん :2009/10/25(日) 09:06:28
dynamic_cast 嫌いな人って QueryInterface も否定されます?
スレ違い
>>985 NULL == (void*)0;
これが違う
NULL == 0
はOK
dynamic_castってクラス名を文字列で保持してて比較してるだけって聞いたんだけど本当だろうか
>>992 実装の詳細は各々ベンダの自由であり、
何だっていいんだろう。
まあ実際問題としては名前使って比較するしかないんだけどな 後でどんな派生クラスが新しく追加されるかわからんから
995 :
946 :2009/10/25(日) 13:55:03
>>988 staticメンバにアクセスするのが目的なので、基本的には大丈夫です。
あと、非staticメンバにアクセスしたときに起こる問題も把握しております故・・・
ありがとうございました。
ume;
埋め
埋め
じゃ、もらいます
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。