【初心者歓迎】C/C++室 Ver.62【環境依存OK】
1 :
デフォルトの名無しさん :
2008/12/13(土) 00:23:18
/ /:;.ィ / ヽヾ:、 |ハ / // | / /´ / j ヾ ヽ 〈{::| ! // | !/ / / /\ ', ヽ V │ // | / //| / _ヽ l | j| │ /.| |l ア メ / / /´ `、| ∨ ', //| |! / ‐ 、 ´ ! ´__ l| | ヽ/ | |,、‐'' "丶´ '´ ̄`ヾ| | / /| | | | { |/| | i │ ハ ∧ !l | | _ / | ヽ あらあら、またお会いしましたね / : :V│ |  ̄‐´ /| l \ 〉 /::: : /´ | |> 、 ,.ィl: : l ,' ヽ /'"´ _\ | | : : : |` - 、 _,. ´ |l: / /\ / レ '´ ヽ! |ヽ: : :| V / \> | ハ::/rl ,. -''/ /ー-- 、ヽ | l'´/ ノ / | ヽ / ___ -‐`ヘ、 ,.、 -| | |'´ ̄` ー/ ! Y / ヽ ノ´ ヽ ,r " | l | | / /ノ レ -く_/ ' / l !/ヘ| l | / ./ / j _/ ヽ | / ! / / | l、 | / ,. ::''´/ `/ ´ { │ / V /:::::| |::::\| //::::::::::/ ノ ,.. - ''"´ ヽ ______
/ // / // ______ / // / / // /| r'7\ ,.ヘ‐'"´iヾ、/\ニ''ー- 、., / / / / | |::|ァ'⌒',ヽ:::ヽrヘ_,,.!-‐-'、二7-ァ'´|、__ `'ー-‐''" ヽ、_'´ `| |:::::|'" 二.,_> ,.へ_ / //__// / / / `ヽ7::/ か っ も | / // メ,/_,,. /./ /| i Y // ァ て う. |'´/ ∠. -‐'ァ'"´'`iヽ.// メ、,_ハ , |〉 | 約 ク ヽ! O .|/。〈ハ、 rリ '´ ,ァ=;、`| ,ハ |、 / | 束 ソ > o ゜,,´ ̄ . ト i 〉.レ'i iヽ|ヽ、.,____ | し ス / ハ | u ,.--- 、 `' ゜o O/、.,___,,..-‐'"´ | た レ | / ハ, / 〉 "从 ヽ! / | じ は |,.イ,.!-‐'-'、,ヘ. !、_ _,/ ,.イヘ. ` ヽ. ッ .ゃ .立 |/ ヽ!7>rァ''7´| / ', 〉`ヽ〉 ! ! な て .', `Y_,/、レ'ヘ/レ' レ' い .な ヽ、_ !:::::ハiヽ. // / で い ./‐r'、.,_,.イ\/_」ヽ ', / / す / `/:::::::/ /,」:::iン、 / / 〈 ,,..-‐''"´ ̄ ̄77ー--、_\.,__ / ,.:'⌒ヽ ´ | | , i |ノ `ヾr-、 (CV:緑川光)
。 ゚ | i ゜ 。i 。 ゚l 。 i ┼┼`` 。 ゜i ゚ i ! | ゜ i / ア ア ア ア ア ア ア ア ア ───‐─ ─ i l i ! ゚ ゚ 。 ゜ i ゜ i | ゜ i | ゜ i l ゜ i 。 i l i l | l ゚ ;゜ ゜ : ; ; i l l ! : ゜ i ゚ i 、i;,| i, ゚,゜ ゜ i l ゚; l 。i | 。i l l ゜;/ ̄u ̄;j\。´ i ゚ | ! ゜ 。 .| i i :。/ :j :::::\:::/\;゚ !゜ ゜ i l | ゜ l ゜ ゚ 。゜ i / u 。<一>:::::<ー>。 ! | | i ゜ | |:j ° .:::。゚~(__人__)~゚j 教えてくれるまでここに居ます |。 ! i ! \、 u ;゜.` ⌒´,;/゜ ゜ i l ゜ i l ! l 。i /゚:j⌒ヽ゚ '"'"´(;゚ 。 ! ゜ 。i 。 ゚: ! ゚ l / ,_ \ \/\ \゜ ! ゜ i ゚ 、i;, 、|; 、i;, 。 ゜ ;゚ 、i;,と___)_ヽ_つ_;_ヾ_つ.;._ 。 l 。i ゜ ;゚ 、i;, ゜ ;゚ 、i;,
期限切れたら居ても意味なくね?
>>5 _/ ∠≠ニ二ニ≧=<´ ヘ. ', ヘ\ヽ. /
_ -‐ ´/ , -‐´、_, '⌒`^ 、 \::\ } l ヽヘ ヽ} / _|_ \
 ̄ フ´, / 丶\::V| | Vl ,' |____
. //./ `Vヽl | ヽ ' . | /| ヽ
/ ,イ/ Y/, ヽ.\ |. l (_ノ _ノ
|/ / | ∨ヘ. ト、 \_ |. |
. / / / l: / l ∨i 、 |  ̄ ! l lヽ│/ /
l│ / イ ,イ. l ト、ヽ / | :l :| | l | ヽ_ノ !ー┼‐ |‐┬
| | l_メ、」_,;./l L l V ∧ / :|/ ハ. ト、 | |./│ヽ l |
| ト. |.____ ヽ l´ヽ{ _⊥イ イ / / / l/⌒ヽ .| ー┼─ └── l |
| | ヽ | 、i┘::::i \ | r┬┬‐┬ァ V ,∧. ,' ´ | ー┼−
レ ヽ! ゝ- ' \l i,.┘:::::iノ / ,/〉│ :| { | _⊥_ l |
. 7/l/l/ 、 `'ー‐ ' ∠≠r'ノ:jノ :| | | (__丿 ヽ レ |
λ `i`ァー-- 、 /l/l/l ∧‐'.:|:::| ハ ', | l
`、 レ' ', ,/| ::| :|:::| ./ ヽ_> _| __|_ _ノ
` = 、 '、 ノ ,.イ∧'|:l.:/l:::|´ \ ._|
`>-r =ニi´、.,_`::: |:| { |:::l | .(_|
_,.イ´ヽ.7 / /:\;八:V:ノ | ノ
/7:::::! ○O'´ /::::::::/ヽ.
/ /:::::::レ'/ムヽ. /::::::::/ ヽ.
基底クラスBaseと、Baseの派生クラスDeriveがある時、 Baseでvirtualを付けて定義した関数は、Deriveでもvirtualを付けたほうがいいのですか?
>>8 必要に応じてつけたらいいよ
ライブラリで公開するときなんかは全部につけておかないと
派生したときにオーバーライド不能の関数になるっしょ?
でも、みんなで共同で開発してるときに全部の関数につけまくったら
今度は派生先でオーバーライドされてんのかどうなのかわからないし
あんまり付けまくらないほうがいいかもね
OfficeOutlook2003のemlファイルをテキストにしたいのですが便利なAPIないでしょうか?
11 :
デフォルトの名無しさん :2008/12/13(土) 14:42:45
しつもんです。 JAVAで書かれたCコンパイラって無いのでしょうか?
それ以上派生させないなら付けない
>>8 どちらでもいいよ。普通は冗長だから書かない。
>>11 (誰かが作っているかもしれないので)あるかもしれないが、多分ない。
>>10 そもそもemlファイルはテキストだと思うのだが。
>>17 virtualの仕様を理解した上でいってるか?
>>11 なぜそういうものをほしがるのかを書くと他の道が開けるかもしれない
20 :
8 :2008/12/13(土) 15:33:54
解答ありがとうございます 基底クラスの仮想関数を、派生クラスでオーバーライドした時、 派生クラスではvirtualを書いても書かなくても同じように動く、で合っているでしょうか?
>>20 あってる。
なので13はそういう意図で付けなくても強制力はない。
自分は付ける。設計を見直すときに仮想関数か否かぱっとみて分かったほうが便利だから。
C++にもfinal欲しいよなぁ まぁ、どうやったとしても、結局はオーバーライドがらみって「正しく、詳しいドキュメントが存在する」必要があるんだけどさ。
midiを直接出力するプログラムを書こうとしていて、 和音の出力でつまづいています。 MIDIフォーマット(SMF)は、♪の開始、♪の終了を指定して音を鳴らします。 例えばドの音は次のように鳴らします 時間0 ドの開始 時間10 ドの終了 (時間0とあるのは、前の音符からどれだけ経過してから音を鳴らすか) ミも同様に 時間0 ミの開始 時間10 レの終了 しかし、これを和音にすると次のようになります 時間0 ドの出力 時間0 ミの出力 時間10 ドの停止 時間0 ミの停止 つまり、合成することによって、(同時に音がなるため) ミの停止の前の時間が0になってしまいました。 このように、単音の場合を単純に合成したものが和音の出力にならないのですが 考えやすいやり方ってありますでしょうか 同じタイミングでなり始めたことを調べるため ♪の開始、♪の終了ではなく ♪の開始、♪の長さ、からなる中間データを考えてみましたが 中間データ→MIDIデータの箇所で結局つまづいてしまいました。
♪を見ているうちにだんだんいらいらしてきた
>>22 そんなあなたにC++0x
クラスやメンバ関数に[[final]]を付けるとオーバーライドを禁止できるぞ!
クラス設計の時点で継承を考慮してないならつけるべきじゃない
>>23 開始と終了を別々のイベントとして扱って、
イベントの時間は曲の先頭からの時間で表現すれば、
合成も簡単じゃね?
>>23 出力直前に
map<int,event&> sequence; // <時刻, 命令>
に放り込むようにしてはどう?
で、全部放り込んだ後で出力する
for(iterator it=sequence.begin(),time_prev=0;it!=sequence.end();++it){
time_cur=it->first;
output(time_cur-time_prev, it->second);
time_prev=time_cur;
}
29 :
23 :2008/12/13(土) 17:16:12
>>27 ,28
出来そうな気がしてきました。
28さん具体的なコードまでくださって助かります。
30 :
23 :2008/12/13(土) 18:20:17
コードはほぼ28さんのものでうまく行きました、感謝。 同じイベント時間に複数和音も入ることがあるので map→multimapでうまく行きました。
31 :
デフォルトの名無しさん :2008/12/13(土) 23:21:38
template <typename T> class Foo { private: typedef void (T::*func)(); }; というコードを見たのですが、これってどういう意味がありますか? (コードとしてどういう使い道がありますか?)
>>31 引数をとらず戻り値が void であるクラス T のメンバ関数へのポインタ型を
Foo<T>::func と書くことができる・・・かと思ったが、 private かよ。意味ねー。
実際には Foo 内に別のメンバもあるんじゃね?
Tが構造体やクラス以外だとエラーになりそうだね
多分Fooの内部にTを抱えていて それにアクセスする時に使ってるんだろう
template <> class Foo<void> { private: typedef void (*func)(); };
>>36 それやるならintやdoubleなど他の組み込み型の特殊化もやらんと不十分な気が。
メタテンプレートで組み込み型かどうか判断すれば一発でできそうだな。
まあ特殊化が必要かどうか分からんが。
32ビットの最大値を求めるにはどうすればいいですか?
template <> class Foo<int> { private: typedef void (*func)(int); }; こういう意味け?
pow(2,32);
>>38 ~0u とか INT_MAX, UINT_MAX とか
(std::numeric_limits<int>::max)() とか (std::numeric_limits<unsigned int>::max)() とか
>>40 1 引けよ
pow(2,32)-1 thx!
オーバーf・・・・・・・
pow は小数だから大丈夫なのだが、 pow の引数は結構オーバーロードされてるので pow(2,32) だと解決できなくてコンパイルに失敗するはず。 古いコンパイラでなければ。
41が色々教えてくれてるのになんで最悪の方法を選んじゃうの?
環境によってintのサイズが違うからダメだろう
(std::numeric_limits<DWORD>::max)() みたいなことすればいいだろ。
(1 << (sizeof(int) * 8)) - 1 但し1byteが8bitだという保障はない。
わかってるならマクロ使ってやれよw
>>48 32ビットの最大値って言ってるんだよ。
intの最大値じゃないし。
だいたい、intの最大値は (1 << (sizeof(int) * 8)) - 1 じゃ得られない。
vector<int>の場合は動くのですが vector<自作構造体>にすると わけわからんエラーがでます。 何でか教えてください。 #include <vector> #include <algorithm> struct note{ int a;}; typedef std::vector<note> VN; int main(){ VN v; v.push_back(note()); VN::iterator q = find(v.begin(),v.end(),note()); }
>>51 ベクターにつっんだあといろいろやるにはいくつかの演算子オーバーロードが必要
struct note { int a; int operator==(const x&) const { return a == x.a }};
代入演算子もデフォルトがキチガイ設定になってなかったっけ?
全部代入するだけだが
54氏を参考に書き換えてみたら動いた・・ つまり、vectorは、自作構造体の比較の仕方なんて シラネーヨってことか 10分で解決してしまったが、皆さんマジプロフェッショナルですねw THY struct note { int a; int operator==(const note& x) const { return a == x.a; } };
>>56 俺の昔のソースにはこんなのが残ってるけどこれってなんだっけ?
昔、入門書に書けって書いてあったからとりあえず入れておいたけど
いまみてもやっぱりワケワカランw
教えてエライ人!
BlockData(const BlockData &_BlockData);
const BlockData & operator=(const BlockData &_BlockData);
BlockDataは自作のクラスね
>>58 コピーコンストラクタとコピー代入演算子の宣言。
privae に書いて代入を禁止するときにもよく使う。
あと、予約識別氏が入ってるから未定義動作とか。
>>58 とりあえずprivateにおかれてるならコピー禁止
>>59-60 ああ、つまり勝手にインスタンスを増やすようなコードを書くとエラーになるって奴ですね
なるほど・・・w
これは・・・たしかに書いておいたほうがいいかもしれないですね
ありがとうございました
勉強になりました
そういうクラスをあらかじめ作っておいて それを private 継承するようにしとくと楽だでよ
63 :
37 :2008/12/14(日) 19:29:59
39は37へのレスだよな? いや、ちょっと違う。 36は34をうけて、組み込み型の場合は typedef void (*func)(); に特殊化してコンパイルできるようにする意図と思った。 でも36はvoidしか特殊化していないので、不十分と思った。 で、組み込み型を全部特殊化するのは面倒なので、 メタテンプレートの組み込み型かどうか判断する方法を使えば 特殊化はひとつで済みそうだなと思った。
for(int i=Pos-1; i<= Width+Pos; i++){ } でiの初期化部分を分岐する方法はありませんか? for(if(Pos == 0)int i=0; else i=Pos-1; i<= Width+Pos; i++){ } こんな感じで書きたいです
>>48 つーか、単に
0xffffffffUL
でよくね?
66 :
デフォルトの名無しさん :2008/12/14(日) 19:36:27
i = (Pos == 0) ? 0 : Pos - 1 条件演算子
if(Pos == 0){ i=0; }else{ i=Pos-1; } for(i; i<= Width+Pos; i++){ }
ありやっす!
while(1){ とすると警告レベル4だとwarning C4127: 条件式が定数です が出ますが、pragmaを使わずに警告を消す事はできますか?
72 :
37 :2008/12/14(日) 20:19:25
こんな感じかな。boostにも:isFundamental相当があるだろうけどよく知らんのでLokiを使った。 #include <loki/TypeTraits.h> template <typename T, bool b = Loki::TypeTraits<T>::isFundamental>class Foo{}; template <typename T> class Foo<T, false>{ private: typedef void (T::*func)(); }; template<typename T> class Foo<T, true>{ private: typedef void (*func)(); }; struct UserDefined{}; int main() { Foo<UserDefined> fu; Foo<int> fi; Foo<double> fd; // Foo<void> fv; // コンパイルエラー.:isFundamentalにvoidも含まれてそうなんだが return 0; }
>>70 while (1)は推奨されていない。for (;;)を使え。
for(;1;)と書くことにしてる俺には関係ない話だ forで条件を省略するとなんで真扱いになるのか納得のいく説明を聞いたことがない ifやwhileは条件省略するとコンパイルエラーだというのに 詳しい人教えて
>>74 そう決められたから。なんせ、forはあっちこっち省略可能だ。
仕様書には非0定数になるとしか書いてないし B言語にfor文がないならC言語を作った人に 聞くしかないんじゃないかな。
>>57 クラスの振る舞いはクラスが知ってわけで、クラス以外のものが勝手に決めたらダメだろ。
>>72 何でもかんでも入れられたら、
void と int じゃ何か動きが違うのか? とか誤解を招く可能性があるので
void だけにしておいた。
何でもかんでも入れられる事が常に正しいというわけではないと思う。
>>74 for で条件を省略すると真になると C/C++ の仕様で決められてるから。
これで納得できないわけが無いだろう。
for は3つの機能が複合されている文だが、
常にその全てが必要になるとは限らない。
そういうことで、それぞれ省略できるように作られているんだろう。多分。
理論上の背景がどうなのかってことでは
省略したら偽になるという選択肢もあったはずだということか?
省略したら何もしないよりは、省略したら永久ループが作れるほうが使い勝手はいいわな。
i<0<iの分岐を使わないで iに絶対値?を足したり引いたりする関数ってありますか?
絶対値はabsで求まるが内部で分岐してないかは知らん アセンブラレベルで分岐しないでって事?
一行で書ける関数があればきれいだから使いたいなと。 今のところ実現できる方法は if(i < 0) i - 10; else i + 10; でこれを i + 絶対値関数(10); もしくは i - 絶対値関数(10); 内部で一生懸命やってようが気にしないです。書いたときに綺麗なのがいいんですが、 i + abs(10); とできるんでしょうか?
i += (x ^ (i >> 31)) + ((i >> 31) & 1) こんな感じか? いろいろ環境依存だけど
>>86 単に1行で書きたいというだけなら
i + (i < 0 ? -10 : 10)
とか
自作します。87,88さん、参考にさせてもらいます。ありがとうです。
自作関数ライブラリを作る時って cppファイルなし、クラスなしで、hファイルに関数をインライン付けてどんどん追加していって 使う時にプロジェクトにインクルードする流れでいいんですよね?
普通のパソコンでゲームの1フレームは体感的に約何行ぐらい書けますか? 5000行が限界とか、10万行までいけるとかでいいんで教えてください。だいたいですだいたい
3Ghz100FPS アセンブラで3000万行 C#のコードで1000行 安全をとって100行以内
質問の意味がよく判りません。いずれにしても、C/C++言語に関係があるようには思えませんが。 1フレーム描画に間に合う処理量と言うことなら、描画内容次第でしょう。 因みに、私が書いたコラムスクローンは約1000行です。 知り合いが書いたテトリスクローンは約5000行だそうです。
だいたいであっても、知ってどうすんだって思う。 何行でもいいから、フレームにおさまればそれでいいじゃない。
1フレームに何行書けるか、と言われても 俺、タイピング遅いし。
>>92 それって、使ってるCのライブラリ関数やOSのAPIの中の行数もカウントしなければならないと思うんだが、
どうやって数える気だ?
フレーム落ち経験者に対して、毎フレーム行う処理の行数がどれくらいであったかを問うているだけだと思うよ。 俺はゲームとか作ったことないから分からんが、APIの中の行数がどうとかいうのはあまりに的はずれであることは分かる。
だってねぇ、線描画で10000行あっても高が知れているけど レンダリングが100行もあったら大事じゃないか。
そうだね。だから知ってどうすんの?って話になるわけで。 アセンブラで3000万行というのもおかしな話だなあとおもう。
>>98 一行で時間のかかる処理もあるし
ループなんかもあるし
行数が意味のないことであることも分かってほしい
>>91 時と場合による。
しかし、サボらないでcppとhファイルを1対で扱った方がいいとは思う。
書ける書けないの話だったらHDDの許す限り書けるだろう。 それで処理落ちがするかどうかは知ったことじゃないが。 これでおk
1Hzでアセンブラ1命令処理してんの?
1クロックと言いたかったのか?
108 :
デフォルトの名無しさん :2008/12/16(火) 00:54:24
質問です。 関数strncpy(s1, s2, n)についてなのですが、 引数nはs1の長さですか、それともs1の長さとは関係のない値ですか。
自分で好きな値にしてください
>>108 s1の指す領域のサイズにあわせる必要があればそうして下さい。
そうでなければ必要な値にすることも出来ます。
111 :
デフォルトの名無しさん :2008/12/16(火) 01:03:20
112 :
デフォルトの名無しさん :2008/12/16(火) 12:52:56
void disp(int p[][5]); int main(void){ int a[3][5] = {・・・ disp(&a); ・・・ } void disp(int p[][5]){ ・・・ } これをVC++2008でコンパイルすると「'int [5]' から 'int [][1]' に変換できません。(新しい機能 ; ヘルプを参照)」 とエラーが出ます ヘルプを見てもそれらしい事は載ってなかったのですが、これはどういう問題ですか?
型が違うというエラー ×disp(&a); ○disp(a);
114 :
デフォルトの名無しさん :2008/12/16(火) 13:03:44
それは試してみました
>>112 断片でなく、エラーを再現できる最小限のソースを張ってくれたまえ。
116 :
112 :2008/12/16(火) 13:09:39
非常に申し訳ない!こっちのケアレスミスでした!自己解決しました
ほほぉ、他人に聞いて、レスまで貰って、それでも「自己」解決かね。
自己解決でしょ。他人を巻き込んではいるが。 まあ、もう少し落ち着いて質問しなよって思うけどねー
まあ怒るなよ
法則発動はまれにある
if分岐いくつからSwitchがいいですか?
122 :
デフォルトの名無しさん :2008/12/16(火) 14:30:01
俺は4つ以上だな
3つから
内容による
なるべくIFは使わないようにした方が良いと、どっかで読んだんだけど 分岐一つからSwitchはどう?おなじこと?
そのなるべく使わない方が良いとかいう理由によるんじゃないか 分岐予測ミスがパフォーマンスに響くからとかいう理由ならswitchでも同じことだし
比較が定数だからって言うのと片方の値が不変だからって言うので switchは若干パフォーマンス良くなかったか? 同じ値を比較するのにelseif使ってるならswitchの方が良かった気がする。 最適かかかると同じかもしれん。違っても体感できないほどの差だろうけど
すいません質問です。 Aというクラスに、private変数aaaを定義し、 Aクラスから、test1、test2というスレッドを作った場合 test1で変数aaaを操作したら test2のスレッドでもaaaの内容は変更されるのでしょうか?
test1とtest2がクラスAの同じインスタンスを参照してたら変わる
130 :
128 :2008/12/16(火) 15:27:31
ありがとうございます 変わってしまうのですね。。 その場合同じアドレスを指しますよね
>>127 今時のコンパイラなら、あんたがうだうだ考えるよりももっと適切に最適化してくれる。
結論:
ifを使うかswitchを使うかは保守性を考慮しつつ、見易さ重視でよい。
>>127 が最適化かかると同じかもと言ってるのに念を押してまた言うか
すみません質問です。 ヘッダーファイルで class A { class B { void test(); } } と書いた場合、ソースファイル側でclass Bのtestを定義するにはどうしたら良いのでしょうか?
void A::B::test() { ....... }
ああ、なるほどそう言うことか! 何で気がつかなかったんだろうw ありがとうございます!
>>127 例えば分岐先が合計4つで分岐確率が等分だった場合はテーブルになるswitchの方がいい。
これがもし60%、25%、10%、5%なんて並びだったら分岐予測の分ifの方がいい。
特定の一つが80%で、20%を残りが等分とか偏りがあるならifの後にswitch。
ジャンプテーブルだと常に予測ミス状態だからCPUの分岐ミスと相談して決めるしかないけど、
これらが致命的にかかってくる処理ってそう多くはないんだよな。
80%と20%だとswitchで最初に80%を持って来た方がいい、の間違いでは?
いや、そういうのはもういいから
Whileとforどっちでもかける場合はどっちで書いたほうがいいのでしょうか
読みやすい方で書いてください
書き個数少ないほうだろ
forの条件部分は、forに入る前に定数化した方がいいんでしょうか? デカイ式が入っていても最適化されるんですか?
式の結果がループによって、またはスレッドによって変更されないであろうことが予測される場合には最適化されると思う。
どっちみちforの前じゃなくて一つ目の初期化部分でやればいいのでは?
147 :
デフォルトの名無しさん :2008/12/16(火) 20:04:19
関数strncpyについて質問です。 昨日も質問しましたが・・・ 自分でこんなプログラムを作ってみました。 #include<stdio.h> #include<string.h> int main(){ char *s1="abcd"; char *s2="ABCDEF"; int n; for(n=3; n<=10; n++){ strncpy(s1, s2, n); printf("s1 = %s\n", s1); } return 0; } この実行結果は s1 = ABCd s1 = ABCD s1 = ABCDEABCDEF s1 = ABCDEFBCDEF s1 = FBCDEF s1 = F s1 = s1 = となります。 実行結果の3つ目のs1以降がなぜそうなるのかわかりません。 教えてください。
>>147 むちゃくちゃしてるのはわかるか?
その上で内部がどうなってるのか説明を求めてるのか?
strncpyの第3引数は好きな数字を入れていいという解答を得たからそうやったんだよねー s1、s2のどちらよりも短くないとだめだよ。
たまたまs1とs2がアドレス連番値に格納されてるから s1を突き抜けて表示しただけでは?
配列じゃなくてポインタを第1引数に入れてる時点で罵倒したくなってくる。
指してる先が問題であって、ポインタは別に問題ないだろ
確かにそうだった。 頭冷やしてくる。
それ以前にstrcpy使っていい対象ですらないな
以前に?
それを言おうとしたが言い方を間違えたのが
>>152 だろ
>>156 ごめんリロードしたつもりがしてなかったんです
配列って32ビットマシンで32ビット最大値の添え字を超えて扱えるんですか?
>>158 アドレス空間自体が32bitなので、オーバーフローして反対側から出てくる。
32ビットのアドレス空間を自由にさわれるわけではないのでアクセス違反で落ちる
今思ったんだけどもしかして、 pow(2,32)って32bitPCだと無理なの?
>>161 なにをいまさらw
即レスでオーバーフローとか言われてただろ
そのあと即効でdoubleじゃね?とも言われたな
そういうことだったのか! でも正常に動いてるんだけど内部でも絶対扱えてないの?
((*pv8)[(*pVec)[i*2+0]][si.nPos] <= (*pVec)[i*2+1]) すいませんこれ (((*pv8)[(*pVec)[i*2+0]][si.nPos]) <= ((*pVec)[i*2+1])) <=の左右式ごとにカッコでくくらないとまずいですか?
配列の添え字の範囲とdoubleが扱える範囲は全く関係ない。
doubleってすげー
>>165 そんだけ書けててわからないのがそこかよ・・・
何を心配してくくらないといけないと思ったのかを知りたいわ
心配で悩む位ならカッコでくくれば良い。
A && B || C とかそういうたぐいではなく、 ((*pv8)[(*pVec)[i*2+0]][si.nPos] <= (*pVec)[i*2+1]) を ((*pv8)[(*pVec)[i*2 ( +0]][si.nPos] <= (*pVec)[i ) *2+1]) こうされたらどうしようとか ((*pv8)[(*pVec)[i*2+0]] ([si.nPos] <= (*pVec)[i*2+1])) こうされたらどうしようとか そう思うのは逆に珍しいので、どう悩んだのか教えてもらえると、今後他の人に 教える時に役に立つかもしれない。
172 :
デフォルトの名無しさん :2008/12/17(水) 01:56:35
環境はMacです。 以下のプログラムをstdio.h型ではなくiostream型に書き換えるとどうなるんでしょうか? printfとかscanfとかはcinやcoutに書き換えられるってのは自分で調べて分かったのですがどうもコンパイルするとエラーになってしまうんです。 printfとかscanf以外にも書き換えられる部分があればお願いします。 あと、それぞれの行がどういった命令を出してるのか解説もお願いします…。 for(i=0;i<8;i++){//最初i=0でi<8まで増えていく と言った感じで…。 #include <stdio.h> int p,t,a,d,c,v,i,m[90]={0},s,r[]={-10,-9,-8,-1,1,8,9,10}; void k(){if(m[p]==0) for(i=0;i<8;i++){ for(c=0,v=p+r[i];m[v]==3-t;v+=r[i])c++; if(c&&m[v]==t){a+=c;v=p; if(d)do m[v]=t,v+=r[i]; while(m[v]!=t); }}} char*h="・○●\n"; int main(){for(i=1,m[41]=m[49]=2;i<10;m[i++*9]=3)m[40]=m[50]=t=s=1;for(;;a=d=0){for(p=9;p<82;++p)k(),printf("%.2s",&h[m[p]*2]); if(a)for(d=a=s=p=8;a==8;k())t-2?(scanf("%d %d",&p,&i),p+=i*9):++p; else if(s)s=0,printf("pass"); else break;t=3-t; } return 0; }
どうせマルチするなら七行スレに書けよ。
175 :
例外 :2008/12/17(水) 04:37:19
C++で例外を投げたい場合、 書いたら例外を投げてることが分かるという利点と、 例外の種類が多くなるとソースが長くなると言う欠点があると思うのですが、 関数定義にthrowは書いたほうがいいのでしょうか?
エラー処理をシンプルに記述できるという多大な利点
177 :
デフォルトの名無しさん :2008/12/17(水) 06:11:08
質問。 std::codecvtの使い方、および説明された書籍、URLなどを教えてください。 特に、~codecvt()がvirtualな理由を知りたい。 std::localeからの利用を意図し、std::codecvt自体はインターフェースなのか? 環境はVC90及びgcc4を想定。 説明用サンプルソースなどもあればよろしく。 以上よろしくお願いします。
178 :
デフォルトの名無しさん :2008/12/17(水) 06:17:00
間違えた。 ~codecvt()がprotectedな理由を知りたい。
codecvt のことはよく分からんが デストラクタが protected な場合は 派生クラスだけ作れるようにしたい場合じゃね。
>>175 例外仕様のことだね?
例外を投げないことを示す throw () 以外は付けないのが C++ での流儀として定着しつつある。
>>180 それは流儀というより、実用上仕方なくでわ?
例外投げる場合も throw(投げる例外)とかけるだろ しかしそうは書かないから流儀って言ってんじゃね?
>>181 たとえば Java のチェック付き例外仕様が使えたとしても、使う使わないの
それぞれにどっちが良いとも言いきれないようなメリット・デメリットがある。
後発の言語で同様のチェック付き例外仕様を採用した言語が少ない(無い?)ことから
考えても、「仕方なく」という感じはしない。
>>182-183 throw(投げる例外)を付けるとエラー吐くコンパイラがあるからだと思うけどね。
もちろんそのコンパイラが標準C++に準拠していなければ、その仕様で正しい。
というか、時代的に仕方なかった。
と、俺は思う。
一方、仕方なくではなく単なる流儀だとした場合、つけるデメリットって何?
そしてつけないメリットって何?
付けるデメリット マンドクセ 付けないメリット マンドクサくない
>>184 読んどけ。
http://www.gotw.ca/publications/mill22.htm > So here’s what seems to be the best advice we as a community have learned as of today:
> Moral #1: Never write an exception specification.
> Moral #2: Except possibly an empty one, but if I were you I’d avoid even that.
today つっても 2002 年なんだな。いいかげんに対応する日本語の文書がほしいところだ。
187 :
デフォルトの名無しさん :2008/12/17(水) 10:25:15
規格策定後5年が過ぎてもエラー吐くコンパイラを新製品として発売した ベンダーがあるけどな。 C++自体終わってるんじゃないか?
190 :
デフォルトの名無しさん :2008/12/17(水) 10:39:41
使い捨てカイロを再生させる方法はありませんか?
192 :
デフォルトの名無しさん :2008/12/17(水) 15:44:08
硫酸(r
193 :
デフォルトの名無しさん :2008/12/17(水) 15:52:13
はじめたばかりで恐縮なのですが書き込ませていただきます たとえば次のようなコードがあったとします class ClassA{ public: ClassB cB; //他の記述 }; class ClassB{ public: ClassA cA; //他の記述 }; とした場合、ClassAではClassBより先に書いているのでcBは作ることが出来ないのということで、 もし、どちらもクラス内部で、inline関数として書きたい場合は、あきらめてヘッダーでクラスを書いてその後に inline void ClassB::関数名... としていくしかないのでしょうか?
ない
Aの中のBの中のAの中のBの中のAの中のBの中の・・・ 無限ループってこわくね?
>>193 先に〜に関しては
class ClassB;
で解決するが、それでも
>>195 の言っている状況になるのでポインタで持つしかない
(いやほかの手もあるけどさ)
197 :
デフォルトの名無しさん :2008/12/17(水) 17:27:58
株式の持ち合いみたいだな。
マウスダウンのnFlagでMK_LBUTTONが押されているのは当たり前だとおもうのですが、 MK_CONTROL+ MK_LBUTTON と書かないで if(MK_CONTROLが含まれているか?) { } これどう書けばいいんでしょうか?
知らないけどきっとnFlag & MK_CONTROLじゃないの てかフラグを足し算するな
足し算で済んでしまうこともあるが、OR演算するようにしよう
if(nFlag & MK_CONTROL) { } こうですか?
すこしでもエラーがあるとアプリがすぐ終了するんですが、 これ異常部分だけ初期化終了とかさせられないんですか? 立ち上げなおしてバグのところまでいくのも一苦労なんですが・・・ アザートが多すぎて泣きそうです
言ってる意味がわからない 本当にC/C++の質問ならコード片を貼るなどしてもっと分かるように言え
204 :
デフォルトの名無しさん :2008/12/17(水) 20:01:57
>>201 そうですよ。
>>202 ASSERTをコメントアウトするか、ASSERTが
出ないようにプログラミングすればよいと思うよ。
エラーが発生して終了したら、別プロセスで監視しておいて
再起動をかけるのも有用な対策の一つだよ。
ifだけを抜けたい時はどうすればいいのでしょうか? returnだと全部抜けるし breakとcontinueの違いがよくわかりません。 : goto a; : : gotoPoint a; : のようなことはC++では出来ないんでしょうか?
OS:Linux コンパイラ:gcc コンパイルすると 無効なプリプロセスディレクティヴ #! ってでるんですがどうすればエラー消えるでしょう?
制御文の前で必ず1行あける規則は細かすぎると思いますか?
>>208 俺はif文がネストする場合の2段目以降のif文だけかな。詰めて書くのは。
大抵そうしてる。
>>205 gotoあるよ
continueはループの中で使うよ
>>205 C++でもgoto文あるよ。
continueとbreakの違いと使い分けも考え付かない程度なら
絶対使わないぐらいの考えでプログラムしといたほうがいいと思うけど。
コンストラクタ内で自身がconst宣言されているか 確認する方法ってないでしょうか?
コンストラクタはとにかくメンバを初期化しないといけないので const で宣言されていようがメンバをいじれないと困る。 だから確認する必要も無いし、確認する方法も用意されていない。
やっぱり無いですか。ありがとう。
goto使ってるC++のサンプル見たことない
エラー処理は例外に取られたから 多重ループ脱出くらいしか使い道ないな
217 :
175 :2008/12/17(水) 21:40:15
>180-189 返信ありがとうございます。 throw(A)と書くとエラーを出すコンパイラもあるんですね。 例外を投げないことを明示したい場合以外は宣言にthrow(A)を書かないことにします。
例外を嫌う人は代わりに goto を使う。
>>199 なんで足し算しちゃだめなの?どういう不具合がある?
>>219 MK_CONTROLやMK_LBUTTONが実際には複数のビットの組み合わせで、
それに重複がある場合は、足し算すると繰り上がって予期せぬビットが立つ可能性がある
フラグはビット演算子で扱うのが基本
nFlag == MK_CONTROL+ MK_LBUTTON というものを書いた場合、Shiftも押されてた場合はどうするのってなる
>>219 MK_* が互いにビット位置の重複がないという保証があって、尚且つ最上位ビットをマスクして
比較できるという条件がなきゃ使えないから。
よくわかった。みんなありがとう!
>>218 それはありじゃないか。少なくとも少し前にパフォーマンス比較したら
exception 関係入れて測定できるほど実行速度落ちた経験ある。
それは使い方に問題があるんじゃないか? try catchを頻繁に通過するとか、例外が頻繁に発生してるとか throw用の一時オブジェクトを例外が発生しなくても生成してたりとか…
横やりだけど、try自体はコスト0だよね? throwしたときだけ専用のフローに入ると思ってるんだけど。
オブジェクト宣言時に初期化をしなかった場合、コード中で初期化をするにはどうすればいいんですか? .h クラス名 obj(引数1, 引数2); こうしないで .h クラス名 obj; .cpp obj(引数1, 引数2); こうしたいのですが
ヘッダファイルの方にexternをつけとけばいいんだけど、 今どき、グローバル変数を使ってると嫌われるよ。
>>226 関数と同じでスタック積んでたと思う
じゃないと例外発生時にジャンプ先が分からない
230 :
229 :2008/12/18(木) 16:57:16
気になったから詳しく調べてみた。 まず、関数内にtry catchがある場合、関数実行時にアセンブラで5命令位増える tryやcatchの数を増やしてもそれ以上命令数は増えない 次にtry実行時、mov命令で整数値を何所かに書き込んでる try毎に同じ場所に違う値を書きこんでいるため、これを元にthrow時に現在のブロック化を特定している throwでは関数をコールしているので、try時にセットした値をもとにブロックを特定し、 catchを順次検索して型が当てはまる場所へジャンプしていると思われる 実装依存の可能性もあるけど大体はこんな感じかと 以上、参考になれば。
>>226 多分、setjumpと同じ様な事をしていると思う。
try catch に直接関係ないところでも、例外発生時にデストラクタが呼び出されるような仕掛けをしている。
>>228 externをつけたんですが、ストレージクラスが正しくないと出てコンパイルできません
やりたいのはこれです。
.h
extern CPen pen;
.cppのコンストラクタ内
pen = pen(PS_SOLID, 1, RGB(0,0,0) );
pen = pen(PS_SOLID, 1, RGB(0,0,0) ); ↓ pen = CPen(PS_SOLID, 1, RGB(0,0,0) );
すいません。ありがとうございました。
あ、いやなんでもない
あれ?それでよかったん?^^;
ん?グローバル変数じゃないのか。クラスのメンバ変数なら extern は不要だ。
これifのpCにNULLもポイントも入ってないんですがなんでですか? class A { void Func() { if(B::pC != NULL) { B::pC = CClassC(); } } }; class B { CClassC* pC; B(){ pC=NULL; } };
>>239 >これifのpCにNULLもポイントも入ってないんですがなんでですか?
何を根拠にそう判断したのかね。
それ以前に文法むちゃくちゃ
さすがに少々どころでない間違いだらけだと、 コンパイルが通らないようなコードでは、何が言いたいのか分からないとしか言いようがない……。
「だらけ」ってほどじゃないと思うがなぁ。 >241>242には私に見えない何かが見えているのだろうか。
>>239 pCの値をチェックしたタイミングがいつなのか謎過ぎるがNULLも有効なアドレスも入ってない訳無いだろ。チェックの仕方がおかしいんじゃないか?
あとB::pCっていうのは、一回変数を作ってb.pCみたいにしないと駄目。
そしてさらにpCはポインタだから*(b.pC) = CClassC();ってしなくちゃ。
ポインタがどういう物なのか分かってる?
>>243 class Aでclass Bを参照しているのに定義が後
friend classでもないのにBのprivate要素をAが参照
static memberじゃないpCをstaticのごとく使っている
これが間違い「だらけ」じゃなければ、いったいなんだというのだ?
そもそもオマエは他人のフリをした239じゃないのか?
間違えだらけのことをえらそうに言えば教えてもらえるテクニックと思わせるレベル。
答える気のない知ったかは黙ってて下さい privateだのstaticだのは省略されてるだけでしょ それくらい汲み取れるだろ
いったい何が入ってたんだろう・・・・・・
>>247 最低限コンパイルが通る形にしてから質問しろ。
質問する側もそうやれば自分で問題点が見えてくるだろ。
private省略ならまだしもstatic省略はしない
分からないならレスしないで下さい。ウザイだけです。
>>251 オマエが他人に問題点を伝えられてないだけ。
ちゃんとコンパイルが通る形で書いて来い。
低脳はレスしないでください。ウザイだけです。
くされ脳みそはレスしないでください。ウザイだけです。
賢くてごめんね。
256 :
デフォルトの名無しさん :2008/12/19(金) 02:23:43
void print(int depth, struct node* p) { int i = 0; if(p == NULL){ return; } for(i = 0;i < depth; i++){ printf(" "); } printf("%d¥n",p->data); print_tree(depth+1, p->left); print_tree(depth+1, p->right); } print(0,root); のような再帰についての質問です。 木構造をデバッガで追っていて不思議に思ったのですが、 a->b->c->d->b->e のようにノードを移動していて、 dからbに移動した時、引数のdepthの値が bが初めて呼び出されたときとかわらない1という事に気づきました。 再帰というのは、引数の値を初めて呼び出された時と同じように とっておくのでしょうか?
>>256 再帰の場合、繰り返し使われるのは関数内の実行コードとstatic変数だけ。
自動変数の類(引き数も含む)は関数の呼び出し毎にスタックに積まれて、
上位の関数に戻るまではキープされるよ。
解の公式を加算減算だけで表したいんだがどういうプログラムになるのかわからない・・・
ルートのあたりが大変ってことかな。 それならループでまわしてある程度の近似を行えばいいかなあと
>>252 もう知障のコピペに反応するのやめないか?
やめないよーん
262 :
デフォルトの名無しさん :2008/12/19(金) 10:23:53
inline void InitPos(D3DXVECTOR3 &m_pos) { m_initpos = m_pos; } inline D3DXVECTOR3 *InitPos() { return &m_initpos; } 同じクラスの中にこういう関数が2つあるのですが 両方InitPosという部分が同じなのですが例えば、 CModell::InitPos(m_lastpos); とした場合上の関数だけが適用されるのですか? 説明不足ですいません;;
263 :
デフォルトの名無しさん :2008/12/19(金) 10:31:06
>>262 >同じクラスの中にこういう関数が2つあるのですが
関数オーバーロードだね。
>上の関数だけが適用されるのですか?
おっしゃる通りです。
264 :
デフォルトの名無しさん :2008/12/19(金) 10:35:27
std::listで質問があります。 イテレータを値として保存した場合、元のstd::listの要素に変更があった時に その保存したイテレータは同じ値を指すことは保障されるのでしょうか?
sareteru
ありがとうございます。安心しました。
gotoって使うときは使いますか?限界まで避けますか?
その「限界」が人によりけりだからな。 多重ループ抜けるのに、あるひとはフラグを使い ある人はgotoを使い、またある人は その部分を別関数にして return で抜ける。
自分ひとりでプログラム組んでるなら余裕で使いまくる けど多人数の人が一緒に開発とかやってるときは「ソースの読みやすさ」が最優先されるからまったく使わないな…
エラー処理と多重ループ脱出には使ってもいいと思うが、 それ以外の場合はよっぽどのことが無い限り使わない。 それ以外ではただの1度しか使った事無い。
for{ for{ if{ break; これは2段目のforをキャンセルして、1段目のforを続行してくれるんですか? breakじゃなくてcontinueにすれば2段目のforを実行してくれるんですよね?
うん
4番目のfor
ありがとうございます! gotoはまた今度にします まだいけそうです
2つとも抜けたいときは start: ; for{ for{ if{ goto start; }else{ goto end; } } } end: ; ですね。勉強になりました。
クラスのメンバ関数に馬鹿でかい処理を書く場合、直接メンバ関数に実装するより、 静的なグローバル関数として別に作って、メンバ関数はそいつを呼ぶだけのほうが効率がいい?
static付けるほうがいい
>>279 メンバ関数はthisが見えない引数で与えられてるだけで、普通の関数と一緒。
284 :
279 :2008/12/19(金) 22:14:02
みなさまありがとう。 素直にメンバに書きましゅ
>>279 設計を見直すべき。お前には無理だろうけど。
そもそも一つの関数に馬鹿でかい処理を書くという発想がおかしい まず処理単位ごとに関数分割しろ その上で、クラス自身の振る舞いはメンバ関数に、そのクラスを使って何かしたいという処理は グローバル関数なりインスタンスを管理してるクラスのメンバ関数に書いたりするもんだ
設計がどうのこうの言ってる奴らも実は大したこと無いんだけどね
>>287 趣味だからこそ、納得いくまで設計練れるんだろ。
職業プログラマに設計うんぬん耳にタコができるほど言いまくりたい
金になるソフトウェアなんて妥協の産物だからな
そうやって適当に作って ひどい品質のプログラム作ってんだよな・・・
まじめにやっても評価されないし それどころか馬鹿を見るし
そして潰れる会社
マ板ネタやめれ
な、設計を語りだすとこうなる。
動作の品質は確保してるよ! リファクタリング工数なんて理解されないよ!
参照戻しについての質問です。 class Hoge{ private: int x; public: Hoge(int val){ x = Val; } int &getX(){ return x; } }; において、 int main(){ int& a = Hoge(10); int b = Hoge(20); return 0; } は問題ありません。どうしてでしょうか? int b = Hoge(20)はエラーだと思うのですが。 (その分変数bには参照戻しの効果がでていませんが。)
いや、どっちもエラーだろ。
ちなみに、参照から実体へのコピーができなければ参照なんてまるで使えたもんじゃないよね。
どうしてintにHogeを代入できると思ったの?
×代入 ○初期化
>>297 デバッグ工数と言って工数とりゃいいんだよ。
getX 使ってねー
hoge.cpp hoge.h dir hoge.cpp hoge.h みたいに、サブディレクトリに同名のソースがあるとうまくリンクできないんですが C++はそういうものなんですか
いいえ、それはC++のせいではありません。 ユニークなオブジェクトとしてコンパイルしてリンクすれば解決できます。 コンパイラに文句を言うか、自分でMakefileを書きましょう。 それが嫌なら、ユニークなファイル名にするとよいことがあるかも知れません。
わかりました。ありがとうございます。 フリーのコンパイラなのであきらめて違うファイル名にすることにしました。
どちらも同じディレクトリに hoge.o (hoge.obj かもしれんが)を作ろうとしてるんだろう。 ファイル名変えるのが一番手っ取り早いが、 無理ならオブジェクトファイル名を両者で変更するよう設定いじれ。
while(a==c) { a = a + b; } とするより b = func(); while(a==c) { a = a + b; } とした方が速度速いと思うんですが、 while(a==c) { a = a + e->count; } この場合は f = e->count; while(a==c) { a = a + f; } としたほうがいいんでしょうか?
つ[実測しろ]
なるほど すべてとことんまで実測しようと思います。
>>309 >a = a+b
これさっぱりわからないんだけど
上のは
a = a+func();
の間違い?
コンパイラがfuncの内容をループに依存しない処理と判断したら 勝手に最適化されて変わんないとかいう可能性も考慮したほうがいい希ガス
>>312 そうでした。すいません。関数は遅いから一回にするということでした。
>>313 f と e->count のメモリの位置の差によって
キャッシュヒット率が変わるかもしれない、
ということまで考えると、
やっぱ実測しかない気もする。
>>318 キャッシュ - 関連ページ
↑
これをクリック!
あーわかったthx!
実測とかいって初めてやった。すごい楽しいかも 関数は絶対呼び出しちゃダメだとわかった forとswitchの違いも図るぞ! 関数中 経過時間 : 58110 msec 関数外 経過時間 : 2578 msec ポインタ中 経過時間 : 2594 msec ポインタ外 経過時間 : 2594 msec int func() { return 1; } clock_t tickStart, tickEnd; int b = INT_MAX/2; int a = 0; tickStart = clock(); while(a < b){ a = a + func(); } tickEnd = clock(); long time = tickEnd - tickStart; printf( "test1 経過時間 : %d msec\n", time );
>>321 >関数は絶対呼び出しちゃダメだとわかった
コンパイラの最適化チェックは?ON?OFF?
実際にプログラム内で使う処理に対して直接実測しようぜ。 もし実測できない程速い処理なら、 そもそもそんな関数呼ぶか呼ばないかの違いなんて関係ない。
最適化最大にしたら 関数中 経過時間 : 0 msec 関数外 経過時間 : 0 msec ポインタ中 経過時間 : 0 msec ポインタ外 経過時間 : 0 msec テンション下がりまくり・・・
>>324 深淵なるベンチマークの世界にようこそ。
意味の無い処理だから最適化で処理が全部消えちゃったんだよ。
だっせ
そこはコンパイラのかしこさに感動する所じゃないのか
そこに感動するのは半世紀前まで
初心者歓迎で特にDQNって訳でもないのにフルボッコにしててワロタw
王道を行くボケだったから 突っ込まずにはいられなかったのだと思う
C言語についての質問です。コンパイラはgccなのですが、下のソースにおいて char str[100]; char *str2; はどういった違いがあるのでしょうか?(変数名やサイズは除いて・・・) str2はscanfで文字列入力を渡せませんでした。 私の考えでは、後者はアドレスを指定しただけで、文字列を入れるだけのメモリ領域を 確保していないからだと思うのですが・・・、違うでしょうか? #include<stdio.h> int main(void) { char str[100]; char *str2; scanf("%s", str); printf("str = %s\n", str); scanf("%s", str2); printf("str2 = %s\n", str2); return 0; }
334 :
333 :2008/12/21(日) 05:26:13
すいません、文字列入力を渡せないというのは、 文字列を入力するとSegmentation faultとなるということです。
335 :
デフォルトの名無しさん :2008/12/21(日) 05:41:16
メモリが確保されていない
>>333 ポインタだけ作ってそのポインタが指す先の入れ物を作ってないから。
「ほら、そこに入れて」とポインタは言っているのですが、その指さす場所
に箱がない。もっと正確に言うとポインタ変数に入っているデタラメな
アドレス値先に入れようとしてSegmentation faultを起こす。
>>333 str2 = str;
とやってからstr2に入れようとすればうまく行く。それはstr2の指す先を
strという入れ物に合わせてやったから。
338 :
333 :2008/12/21(日) 07:44:42
速い回答ありがとうございます!ポインタ関連がやはりあやふやですね・・・
よく考えてみると確かにアドレスstr2に文字列を入れろと言われても、
なにも指定されてないですよね・・・
>>337 その場合、strに入力した文字列は消えてしまうと解釈でいいですよね?
>>338 その通り。strに入力した文字列はstr2を通じて入力した
文字列で上書きされてしまう。
%99sとかにしたほうがいいよ
質問です。 stringをreverseで逆順にしようとすると文字が壊れるんですが、stringはreverseに入れるとまずいのでしょうか? void reverse(std::string& buf) { std::reverse(buf.begin(), buf.end()); } int main() { std::string buf("あいうえお"); reverse(buf); std::cout << buf << std::endl; // "おえういあ"にならない }
マルチバイト文字って知ってる?
むしろwstringならうまくいく
合成文字やらサロゲートやら
ヒント:2byte文字
質問者わかったらわかったって書けや! ホントクズだなお前は!
クズの上にグズだなお前は!
うまくない
ヘイヘイ、回答者、ビビってる〜
353 :
341 :2008/12/21(日) 14:37:26
すいません。調べてて返信に時間がかかってしまいました。 wstringでやるとうまく行ったんですが、色々分からないことが… printf("%X, %X\n", 'a', 'あ'); // シフトJIS printf("%X, %X\n", L'a', L'あ'); // UTF16 ここまでは分かったのですが、英語と日本語を混合させたい場合にはどうすればいいのでしょうか? wchar_t a[3] = {'a', 'あ', '\0'}; char b[3] = {'a', 'あ', '\0'}; printf("%s\n", a); // aしか表示されない printf("%s\n", b); // 改行もされない
setlocaleしたら何か変わるかもしれない
>>353 >wstringでやるとうまく行ったんですが
「なぜかうまくいった」状態だな。
>char b[3] = {'a', 'あ', '\0'};
1バイトしか入らない char に 'あ' とか排卵。
>printf("%s\n", a); // aしか表示されない
printfじゃねえ。wprintf。
お前ら楽しそうだなw
分かる話題はテンションアゲアゲ
358 :
341 :2008/12/21(日) 15:30:12
>setlocaleしたら何か変わるかもしれない 書くのを忘れていましたが、setlocaleは先頭で宣言してありました。 > printfじゃねえ。wprintf。 wprintfを使うということはUnicode文字列を使わないといけない? と言うことはwchar_t*にはマルチバイト文字列を入れてはいけない?? wprintfの使うときにマルチバイト文字列を引数に取れるのでしょうか???
10年前の本でメモリマップトファイルを読んだんだけど 今ならもっと簡単に書けるよね?ね?
>>345 規格だと、wchar_tは、ひとつ一文字だからreverseとか問題なく実行できなければ
ならないはずだけど。(そうなってないな)
VC だと wchar_t は2バイトで 文字コードも今は普通 UCS2 じゃなくて UTF-16 だから サロゲートペアがあるんだよな。
宿題レスでこのレスを指示されたのでこちらに書き込みます。 よろしくお願いします。 C++でvectorと配列の両方で動くmedian関数をつくっているのですが template<class T> double median(T hw){ int size=sizeof(hw)/sizeof(hw[0]); if(size==0){ throw domain_error("hwの中身がない"); } sort(&hw[0],&hw[size-1],my_compare2); int mid = size/2; return size%2==0 ? (hw[mid]+hw[mid-1])/2 : hw[mid]; } のようにtemplateを利用していますがsizeofで配列の要素の数は求められるのですが vectorの要素の数が求められなくて困っています。 両方の要素数をもとめる方法を教えてください。
普通vectorと配列の両方で動く関数テンプレートを作る場合、 引数にはbeginとendをとる。
サイズでやりたいなら配列とvectorそれぞれで特殊化テンプレートを書くしかないな 全くオススメしないが
関係ないがサイズにはintじゃなくてsize_tを使え
配列サイズ事に実体化とかやめてくれよ。
>>361 結合文字やbidiもあるでよ……。
結合文字はともかく、bidiのreverseってどういう結果になるのが正しいんだろう。
>>362 真面目に書いたプログラムを作ってみたが、
宿題のようなのでうpはやめといた。
とりあえず T が整数型の時、
戻り値の型が double なのに 2 で割っていいのかなーとか言っとく。
template<class T> double median(T* begin,T* end){ int size=0; while(!(begin+size==end)){ size++; } if(size==0){ throw domain_error("サイズ0"); } sort(begin,end); int mid = size/2; return size%2==0 ? (begin[mid]+begin[mid-1])/2 : begin[mid]; } こんなんでもだめでした。 目が痛くなってきました
>>369 注意ありがとうございます
キャストしておきます。
サイズが 0 かどうかは begin == end で確認する。 サイズは std::distance 関数(<iterator> ヘッダにある)を使って得る。
template<class T> double median(T* begin,T* end){ int size; distance(begin,end,&size); if(begin==end){ throw domain_error("サイズ0"); } sort(begin,end); int mid = size/2; return size%2==0 ? (double)(begin[mid]+begin[mid-1])/2 : (double)begin[mid]; } こんな感じにしましたがコンパイルが通りません。 memory.cpp: In function `double median(T, T) [with T = __gnu_cxx::__normal_i terator<double*, std::vector<double, std::allocator<double> > >]': memory.cpp:132: instantiated from here memory.cpp:87: error: no matching function for call to `distance(__gnu_cxx:: __normal_iterator<double*, std::vector<double, std::allocator<double> > >&, __g nu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >&, int*)' 引数にはvectorのbegin()とend()を渡してるんですが 引数がまちがってますか?
374 :
デフォルトの名無しさん :2008/12/21(日) 22:02:42
[1] 授業単元: 乱数 [2] 問題文(含コード&リンク):半径1の4次元球の体積を求めよ。ただし疑似乱数の組数をK(独立した疑似乱数の組の数)から2Kに変化させたときの面積の計算値の相対変化が10^(-2)以下となった場合収束しているものとする。 得られた結果は解析的に計算した値とあっているか? ちなみにn次元球の体積は、 nが偶数のとき:{(r^n)/n!!}*(2π)^(n/2) nが奇数のとき:{(r^n)/n!!}*2*(2π)^((n-1)/2) である。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:今年まで [5] その他の制限:特になし お願いします
T* じゃない。 イテレータはポインタではない。
>>373 size = std::distance(begin, end);
配列の場合ポインタを vectorの場合イテレータを利用し関数をつくるんですよね? その場合templateはどのように定義すべきなのでしょうか?
* なくせばいいだけだろー
memsetの逆をするには何を使いますか?
逆ってなにしたいんだよ・・・・・
エスパーの登場を待つ
memcpy?
データを1バイトずつ読み取りたいんですが
>>362 そもそも、これで配列のサイズが取れるって言ってるが、
どんな引数をわたしてるんだ?
>>386 配列そのまま渡せば T が配列型になってサイズとれるっしょ。
>>385 charのポインタにキャストして、アクセスすれば?
>>387 いやいやいやいや。
T はポインタになるから無理だ。
390 :
373 :2008/12/21(日) 22:18:13
>>380 見事に通りました
がセグりました。 原因がsortくらいしか思いつかないのですが。
sortがSTLなだけに遺憾ともしがたい感じです。
392 :
373 :2008/12/21(日) 22:23:10
>>386 double型のvectorです。それのbegin()とend()を渡しています。
ちなみにsizeの中身が
5105
613
5-95
1123
4-16
3-53
4-16
359
715
613
424
613
4-16
02
4-16
359
2-22
31388
3-1438
5105
1-1
613
31444
13
こんな感じになってました。
他の人のせいにする前に まず自分を疑え。 プログラミングの鉄則だな。
394 :
373 :2008/12/21(日) 22:24:24
>>391 >>378 さんのアドバイス通り修正しましたが。Segmentation Faultでした。
396 :
373 :2008/12/21(日) 22:28:05
配列はvector成功時に試したいと思うのですが vectorと同様配列もdouble型の配列で先頭と後尾のポインタを渡そうと考えています。
397 :
373 :2008/12/21(日) 22:38:26
あ、ちなみにこのvectorのデータもいくつかあって medianをその回数分まわした結果sizeの中に代入されたものが392です
T* begin って書き方が気に入らないなあ 書くなら RandomAccessIterator begin だろ
sizeが5-95とかどういうことなの
373はまず普通の配列とvectorの両方で動くという目標を 一時中断して自前のアルゴリズムを自由自在に書けるようにしろ そうすれば自然と目的は達せられる
どれちょっとやってみようか
とりあえず最終的なコードをさらすべきだな。
こういう書き方をしたいんだがこうすると配列のコンパイルが通らないしな template <class RandomAccessIterator> typename RandomAccessIterator::value_type median(RandomAccessIterator begin, RandomAccessIterator end) { int size = std::distance(begin, end); if (!size) throw std::domain_error("サイズ0"); std::sort(begin, end); int mid = size / 2; return (size % 2) ? (begin[mid] + begin[mid + 1]) / 2 : begin[mid]; } int main() { double a[] = {1.0, 1.1, 1.2}; double b[] = {10.0, 11.1, 12.2, 13.3}; std::vector<double> vd(b, b + 3); //std::cout << median(a, a + 2) << std::endl; std::cout << median(vd.begin(), vd.end()) << std::endl; }
std::accumulate()みたいなインターフェースにするか あー面倒臭い InputIteratorを使うからoperator[]が使えなくなるから std::advance()を使うしかないな
もうこれでいいだろ 思い切り手抜き template <class RandomAccessIterator, class T> T median(RandomAccessIterator begin, RandomAccessIterator end, T& result) { int size = std::distance(begin, end); if (!size) throw std::domain_error("サイズ0"); std::sort(begin, end); int mid = size / 2; return result = (size % 2) ? (begin[mid] + begin[mid + 1]) / 2 : begin[mid]; } int main() { double a[] = {1.0, 1.1, 1.2}; double b[] = {10.0, 11.1, 12.2, 13.3}; double d; std::vector<double> vd(b, b + 3); std::cout << median(a, a + 2, d) << std::endl; std::cout << median(vd.begin(), vd.end(), d) << std::endl; }
こうだろ template <class T> typename std::iterator_traits<T>::value_type median(T begin, T end){} //-- median(a,a+sizeof(a)/sizeof(*a));
>>406 int 配列渡しても double で返して欲しいだろ・・・
CStringをSwitchで使うのは無理?
無理
enum CStringとかなら出来るよ。
411 :
デフォルトの名無しさん :2008/12/22(月) 09:34:29
return valueとしてポインタを返すということは return *s; ということですか。
sの型は何ですか
enumでどう書けばいいんですか CString a = _T("ね"); CString b = _T("うし"); CString c = _T("とら"); enum eto {a, b, c}; Switch(eto) { case a: case b: case c: } ぜんぜんわかりません。すごい適当です
414 :
デフォルトの名無しさん :2008/12/22(月) 10:46:37
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ 富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ 富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ 富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 死ぬとき このレスの事思い出してから地獄へ行けよ ニヤ(・∀・)ニヤ(・∀・)
415 :
デフォルトの名無しさん :2008/12/22(月) 10:53:29
>>411 return &value;
でアドレスが返る
リテラルを返すなら問題ないが一時変数を返しちゃだめよ
char配列を返すなら&はいらないか char *test() { return "test"; }
418 :
411 :2008/12/22(月) 11:09:22
char *s = "abc"; (省略) return s; これは間違いですか。
省略部でsを触ってなければおk
でもどうせ、実はchar s[] = "abc"でしたとか、ろくでもない落ちな希ガス。
せめてconstをつけれ
char s[] = "abc" って実態生成されるんだっけ? 使ったことないから意識したことなかった・・・
>>424 スタックに4バイト確保してそこに"abc"をコピーする。
たまたま作業領域を文字列で初期化するような用途でもなければ使えないね。
マルチスレッドプログラミングに関しての質問なんですが、 関数ローカルな静的オブジェクトの初期化位置に、複数のスレッドが同時に到達した場合、 複数のスレッドで初期化される可能性はあるのですか? もし、可能性があるなら、どういった手法で回避するのが定石なのでしょうか。 どなたかお教えください。
>>427 現規格ではスレッドの概念が無いので、どうなるかは実装依存。
回避法も環境依存。
次期規格でどうなるかはシラネ
>>427 タイムアウト付きのmutexでシングルトンとか
>>429 で、そのmutexの初期化を保護する何かが必要になるわけか。
やっぱマルチスレッドに入る前に何かしらでインスタンス生成するしかないのかね?
>>430 何か別に必要か?クリティカルセクション内でフラグを立てる
だけのような気がするんだが
そのクリティカルセクションをどうやって作るんだい?
boostのシングルトンもその辺保証できずに破棄された気がするんだが どうだったかな…
犬糞ならアトミック変数使えばいい話だし、 Win なら static な Mutex 作っといて WaitForSingleObject するだけ。
だからそのstaticなMutexをどのタイミングで作るかって話してんだろうが ↓以下無限ループ
すいません、質問です char* aaa の、aaaで if(aaa=="") という判定があったのですが aaaに""が代入されることはありえるのでしょうか?
aaa = "";
WindowsならInterlocked系のAPIでいいんじゃねえの
ありえないし if(aaa=="") なんて比較できない
441 :
437 :2008/12/22(月) 15:54:55
>>438 ヌルポインタ?になるのかと思ってましたが
そういう代入が出来るんですね
それなら比較文が必要ですね
ありがとうございます
>>441 a = "" が意味するのはどこかに確保した "" という (つまり長さゼロの) 文字列のアドレスを a に入れるということ。
その後に a == "" と比較したときの "" は前の "" と別の場所に確保されるかもしれない。
コンパイラが充分に賢ければ同じ場所を指すこともあるが、規格では未定義。
つまり、 aaa=="" なんて比較がどうなるかは処理系による。
普通はやるべきではない比較とだけは言っておく。
char* aaa = ""; と if(aaa == "") の""が同じアドレスという保証はあるのかな
>>439 そのInterlockedで使うintとかを0なりで初期化しなければならないんだが
その初期化が同時に走ったら…
>>443 ないよ。
でも最適化によっては、あると言われればあるかもしれない。
初心者向けには、「文字列の比較は strcmp 使いなさい」でおわり。
>>444 JIS X 3014 3.6.2 「非局所オブジェクトの初期化」あたりを読む限りでは、
静的初期化=(ゼロ初期化/定数式初期化)は、mainの実行前に行われることが
保障されているようだが
おーいenameでCString教えてくれーコンパイルできないよー
>>410 がいってるのはこういうことだろたぶん
enum CString {a, b, c};
enum CString {_T("ね"), _T("うし"), _T("とら") }; CString eto; int num; switch( eto ) { case T("ね"): num = 1; break; case _T("うし"): num = 2; break; case _T("とら"): num = 3; break; } コンパイル通る気配すらないです
>>446 非局所オブジェクトはそうだけど。
ということで、非局所オブジェクト無しでは無理。>427
だったら目的の静的オブジェクト自体を非局所にするのが素直。
これならVCで通るだろw enum CString {ね, うし, とら }; CString eto = ね; int num; switch( eto ) { case ね: num = 1; break; case うし: num = 2; break; case とら: num = 3; break; }
default
>>446 mainが始まる前に(グローバルオブジェクトの初期化処理の中からとか)アクセスしたらどうなるんだろう
むきーーーg−あs−g−sgs
フレンドクラスは公開したいクラス名を公開元に書いておけばいいんですよね? でもフレンドクラスが書いてない元クラスのプライベートにアクセスする方法はないんですか?
何の為のprivate
#define private public
The Pickpocket乙
462 :
デフォルトの名無しさん :2008/12/23(火) 15:24:56
win32APIやりたいけど何からやればいいのか分かんない #include<window.h> ここから進まない……
464 :
デフォルトの名無しさん :2008/12/23(火) 15:29:18
>>463 天才すぎてびっくりした
そうか猫でも分かる辺りを見てこよう
465 :
デフォルトの名無しさん :2008/12/23(火) 15:55:33
おまいらヌルポも知らねーのか 出直してこい!
class CHoge{ Point *m_pPoint; void hogepoint(Point); } void hogepoint(Point point){ m_pPoint = new Point; *m_pPoint = point; } ってやったら、しばらくしたらpointが消えてしまっているんですがどうしたらいいんでしょう?
しらねぇよwwwwww
469 :
デフォルトの名無しさん :2008/12/23(火) 17:22:05
void hogepoint(Point point){ ↓ void CHoge::hogepoint(Point point){ じゃねーの? しらねーけど
>>469 まさか、本当にCHogeってやってるわけじゃなし例としてこんなことをってかいたからないだけだろ
intとかだと意味わからないしコメントを減らすためにも すべての型に別名をつける規則にしようと思うんですが、問題ありますか?
>>471 なんでそういうことをしようとするのか意味分からない
引数チェックのため?
他人とやってるならその人に聞く 一人なら何も問題ない
例外を投げるときに std::domain__error に TCHAR* を渡しているんですが、VCのプロパティでUnicode文字を指定するとコンパイルが通りません。 std::domain__error にUnicode文字を渡すことは出来ないのでしょうか?
what()はconst* charだけだっけ
>>476 例外ってワイド文字版がないんだっけ。
マルチバイト文字に変換して渡せば?
そして変換の最中に例外が発生するんですね
まぁその場合は文字列変換失敗の例外が飛べばそれでもいいかなと思う。
482 :
デフォルトの名無しさん :2008/12/24(水) 03:08:34
正しい対処法
まあ問題ないと思う でも面倒だから、OLE関係みたいに常にW版だけ用意というのもありだな。
std::set<int>のcount()が、2を返すことってありますか?
うん
setには同じものは1つしか入らないので、count()の戻り値は0か1ではないのですか?
異なるものなら2つ入るよ
int と UINT を比較すると警告がでるんですが、 これを解決するにはどうすればいいんですか? UINTの方は表現が失われるのでintにできないし intの方はマイナスも比較したいのでUINTにできないんです
符号有り64bit整数を使え
>>488 比較したい瞬間のみどっちかに合わせるか>489ということになる。
2^31以上を検出できなくていいなら、int foo; UINT bar;としてbool foz = foo == int(bar);などとなる。
あそうか64があったのかthx
>>487 size()と勘違いしてるだろ
それかmultisetとか
ええっww char *portname = "\\\\.\\COM10"; にしたらどうなるよ
スタックを微妙な具合に壊してんじゃないか?
>>495 できました。。
どういうことなんでしょう。。
配列に格納した場合は問題あるのでしょうか。。。
>>496 一応確認してみましたが怪しいところはみつかりません。
二人とも早い返信ありがとうございます。
それで出来るって事はどこか壊してると思われ
499 :
494 :2008/12/24(水) 12:34:46
>>498 了解しました。
調べてみます。
ありがとうございます!
なんでわざわざLPCSTRにキャストしてるんだろう
メモリリークを検出しようと思い_CrtSetDbgFlagを使ったんですが、何もしていないのにメモリリークを検出してしまいます。 _CrtSetDbgFlagの使い方が間違っていたりするのでしょうか? #include <iostream> int main() { #ifdef _DEBUG // メモリリークを検出する ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_CRT_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF); #endif }
>>501 何て事をしてくれたんですか!
常にメモリリークしているという事実を明らかにしてくれましたね!
_CRTDBG_CHECK_CRT_DFはデタラメ吐き散らかすからやめた方がいい
504 :
501 :2008/12/24(水) 19:29:57
>503 メモリリークがなくなりました。ありがとうございます! _CRTDBG_CHECK_CRT_DFはこれから使わないようにします。
505 :
501 :2008/12/24(水) 19:37:47
新しい疑問が出てきたんですが、 _CRTDBG_CHECK_CRT_DFを指定するとメモリリークを検出するということは、>502の通り ランタイムライブラリでメモリリークが発生しているということでしょうか? それとも本当にデタラメを吐き出しているのでしょうか?
CRTが持ってるグローバル変数が解放される前に検出処理が走ってんじゃねーの?
>>494 へー、そんなことがあるんだ。
Tcl/Tkでwindowsのcomポートが9までしか使えない仕様なのは
そこらへんの回避ができなかったからなのかな。
回避って、\\.\を頭に付けるだけだろ。
>>488 一例だが。
BOOL eq(int lhs, UINT rhs) {
if (lhs < 0) {
return FALSE;
} else if (rhs > INT_MAX) {
return FALSE;
} else {
return (UINT)lhs == rhs;
}
}
eq 以外の時も同じ発想で出来る。
2の補数だと !((lhs | rhs) & INT_MIN) & (lhs == (int)rhs) とかでもいいんかね
>>488 long long みたいのを使える処理系なら、それにキャストすれば。
C99ならint64_tでいいだろう MSの場合はlong longは無いし__INT64とかになると思うが doubleという手もあるけど、いかにも遅そうだ
64ビットキャストしても
64ビット機でもなければ
>>509 より効率悪いしなあ。
>>512 VC++も最近はlong longが使える。
>>514 おお、それは知らんかった、トン
そんな化石をサポートするぐらいならstdintぐらい使えたほうが
なんぼか嬉しいが……
え?double使うより
>>509 書いた方が速いってマジ?
なにlong longって、普通に型として使えるの?まさか25*12とか特殊な書き方が必要なの?
>>517 509は分岐してるし今のCPUだと遅そうに見えるわな
誰かベンチマークよろ
VCで bool eq2(int a, unsigned b) { return (long long)a == (long long)b; } と比べたら、計算に10秒かかるくらいまわしても、差がでなかった。 最適化はしてない。
>>519 それは、long longでキャストしてもしなくてもってこと?
環境は32bit?
つーか、関数にしてそれをループしてるんなら、関数呼び出しのコストのが 全然高いのでは inlineにするか、中身をループしないと意味ないんじゃないの
525 :
507 :2008/12/24(水) 23:40:13
>>508 そんなん俺に言われても。
Tcl/Tkのwindows版は仕様としてcom9までしか使えない。
だけだろ、とか言うならTcl/Tkの作者に言ってくれよ。
>>522 最適化して、INT_MAX回まわしても、あまり差がなかった。
計測は秒単位で、最適化で呼び出し消えるのを防ぐために、余計な処理を入れたり
したけど。
何回か実行するると、
>>509 のほうが早いときがあって誤差かとおもったけど、
>>519 が早いときは一回もないから、微妙に
>>509 のほうがはやいっぽい。
>>524 関数呼び出しのコストが、中身の数十倍とかだったら、まあそうだけど、
そんなに差がなかったら、処理が秒単位でかかるくらいやれば差がでるのでは?
この程度の処理だったら関数呼び出しの方が十倍くらいコストあっても不思議じゃないと思うけどな
と思ったけど、アセンブラのコードを見てみたら、どっちもインライン展開されてて、 ほとんど同じコードになってたよ。 呼び出しを工夫して、最適化の邪魔をしないと比較できねーな。
100万*100回比較でこんな感じだった CPUはCeleron1.7G Conditional: 0.906[s] Double: 1.609[s] LongLong: 2.328[s] StaticCast: 0.765[s] NoOp: 0.14[s]
>>531 Conditionalな奴は、intが負/unsignedのMSBが立っているかどうかで
速度が変わりそうだけど、その辺の条件はどうなってる?
ともあれ、少なくとも32bit環境だとint64_tにキャストするよりは doubleにキャストするほうが速いみたいだな 俺のとこでもそうなった
これでどうだ? inline int eq(int lhs, unsigned rhs) { return ((unsigned)lhs == rhs) & ((~(unsigned)lhs & ~rhs) >> (sizeof (int) * CHAR_BIT - 1)); }
最適化をかけられないように、グローバル変数で、 int xxx = 1000; として、 eq(i, xxx); みたいに呼び出したら、xxxを定数の1000に置き換えてたよ。 xxxが、どこからも変更されないって把握してんだな。 (ソースが複数あるプロジェクトなのに) 最近のコンパイラは頭いいな。
xmat = xmat * xmat; xmat = xmat * xmat; xmat = xmat * xmat; xmat = xmat * xmat; xmat = xmat * xmat; みたいな計算結果を使用してさらに計算する・・・みたいな処理 かいて最後は出力しないとコンパイラに消されたり 最適化されちまったりして安定しない
537 :
デフォルトの名無しさん :2008/12/25(木) 00:10:59
x'mas = x'mas * x'mas;
結局速度面では大差ないから、可読性と移植性考慮でdoubleがいいのか? でも、intとunsigned intの比較のためにわざわざdoubleにキャストしてる ソースみたらすげー悩みそうだ……
かかった時間
>>509 (292) < long long (306) <<<
>>534 (509) << double (686)
( ) 内は時間(型は clock_t)
2.16 GHz Core 2 Duo
DDR2 SDRAM
i686-apple-darwin8-g++-4.0.1 -O3 -foptimize-sibling-calls
>>518 分岐してない。
比較結果をストアする命令に最適化されるだけだから。
>>539 long longとかint64みたいのでいいんじゃね?
お前らこだわるなーw
>>541 そうだったんか、サンクス
つーかアセンブラの出力見れよなって感じだな>俺
最適化止めたいならvolatile付けろって誰か教えてやれよ
最適化はされないと困るだろう・・・。
>>546 ベンチで実行して欲しいコードまで省かれたらベンチにならんだろが
doubleって遅せーーー
>>547 省かれないようなコードを書くのが普通だろ・・・。
>>547 volatile だと実際に実行されるコードと全くの別物になっちゃうだろ・・・。
>>549 いやだから、省かれないようにするヒントがvolatileなんだろ?
俺は
>>545 じゃないけどさ
お前さん、一体何がいいたいの
>>551 お前は volatile 言いたいだけなんじゃないかと。
目的の範囲内で最適化された結果で速度を比較したいのに、
最適化を阻害するって正気の沙汰じゃないぜ。
>>538 が解読できないんですが、この人のC++レベルはどの程度なんでしょうか?
>>552 目的の範囲外のところで volatile を使えばいい。
確実にループさせるためにループ変数にvolatile付けたりとかしない?
>>553 単にお前がSTLとboost全く知らないだけだろw
>>553 boost入門レベルってところじゃね?
>>552 inline int func(){/*測定したい処理*/}
volatile int dum;
for(volatile int i = 0; i < 1000000; ++i){
dum = func();
}
これってキチガイだったの?
そりゃぁ、そう言われても仕方ない。
今時のコンパイラはvolatileなんて無視するから何の意味もない
んなこたーない。
ねーよwwwww
おまえら釣られすぎ
void hoge(short s){ } int main(){ short a,b; hoge(a+b); return 0; } これをコンパイルすると変換によって有効桁が失われると出るんですが、どうすれば解決できるんでしょうか? コンパイラはBorland5.5.1です。
>>564 short じゃなくて int を使う。
同じ型の変数同士を+で組み合わせても有効桁は失われない。
つまりBCCが糞
>>564 それ、intに格上げされて足し算されてるんじゃねえの
汎整数拡張とかいう奴
それをshortに書き戻してるから警告出てるんだと思うぞ
そうなのかー!!
テンプレートについて質問です。 typedef vector< vector< shared_ptr<MyClass> > > DoubleList; このDoubleListはあちこちで使っていたところ、プログラムサイズが馬鹿でかくなってしまいました。 ちょっと思いついたことがあり class DoubleList { public: vector< vector< shared_ptr<MyClass> > > m_list; void push_back(MyClass &s); //その他、vectorに存在する色々な関数を宣言。 }; として、関数群の実体をcppファイル側に書いてみました。 そうしたところ、プログラムサイズは劇的に小さくなりました。 「まさか前者のやりかただと、各.cpp毎でテンプレートを展開しDoubleListクラスを作ってしまうのか?」 と思っているのですが、この認識は正しいでしょうか? それまでの自分の認識ですと、<>内が同じテンプレートがあちこちで使われていたとしても、コンパイラが1つだけ実体を作ってくれる。 という認識だったのですが…。 3重テンプレートが悪いのかと思い、 typedef vector< shared_ptr<MyClass> > SingleList; typedef vector< SingleList > DoubleList; としてみてもダメでした。
>>571 だからexport予約語をサポートしない処理系を怨め
答えになってない
>>572 exportについて調べてきました。
テンプレートの各種関数の宣言などを、別の場所で書けるようにするためのキーワードだそうで。
非常に欲しいですね。
ということは、認識としては「テンプレートを使うと、翻訳単位(.cppファイル)毎にその実体を作ってしまう」という認識でよいのでしょうか?
shared_ptrとか使うのをちょっとためらってしまいますが・・・
exportは単に宣言を別の場所に書けるだけ 実体化は普通のテンプレートと同じようにやっぱり翻訳単位の中でやる 諦めろ
環境による、が答えじゃないの? コンパイラの段階では各翻訳単位でインスタンス化するけどリンク時に一つにまとめる環境もありそう。 C++0x で入る extern template で今やってることと同じようなことをもうちょい簡潔に書けるようになるはず。
>>571 デバッグ情報が増えてるだけじゃないかなぁ?
関数の実体については、たとえばアドレスを取って比較すれば
同じにならないといけないんで、さすがにそこを違反してるコンパイラは
無いと思うよ。
アプリファイルがどんどんデカくなっていくんですが、 機能ごとにDLLにして使うときだけ呼び出すようにすればアプリ起動が早くなったりするんでしょうか? リソースとかも埋め込まないでフォルダから参照するようにしたほうがいいんでしょうか まだ始めたばっかなんですが、未来のことが気になってしょうがありません。
>>576 残念だなあ。
君は何か勘違いしている様だけど、聞いて揚げ足取りをしたいんじゃなくて、
単純に君の意見が面白そうだから聞いてみたかっただけなんだよ。
もっとまともなレスを期待してたんだけど。ごめんね。
ちなみに君は揚げ足を取られる事を恐れているようだけど、それは違うと思う。
揚げ足を取られるのは、君に隙があるから。
隙だらけの人間ってのはそうやって余計な所でつまらない恥をかく事になるもんだよ。
他人につっこまれる事は、自身の知識をより客観的で多角的なものとする為に
有益な指針となるものだと思うな。
a/0 はダメなんですよね? 0/aもダメですか?
>571 個々にインライン展開されていた処理が 1 箇所だけになったという点も影響あるかもしれないね。
>>577 なるほど!と思い、リリースコンパイルを行ってみました。
でもやはり、容量は天地の差といった感じで…。
コンシューマ実機系のコンパイラだから・・・とかかなぁ。
ちょっと他の件でも
class Test
{
public:
static Test &getInstance()
{
static Test s;
return s;
}
};
こうやってシングルトンを作ってみたんです。
で、このヘッダをプリコンパイルヘッダに登録したところ、すべての(プリコンパイルヘッダを使っている)cppファイルで、40KB以上の増加を確認。
自分の意識だと当然唯一の実体が作られると思っていたのですが…。
この実機ですと、プログラム翻訳単位での「プログラムのロード」もサポートされているのが原因かもしれません。
(その機能使っていないのですが)
そのために、テンプレートやstatic変数も翻訳単位毎に作るのかも…?
なんだか翻訳単位毎に、勝手に無名ネームスペース内に取り込まれてしまっているような印象ですね。
そのわりに、きちんとシングルトンとして動作するから気味が悪い
一応、環境依存での動作ということでクローズということで。
後でVC2008あたりでも実験してみます。
>>584 シングルトンとかは実行時のことで、コンパイル時のこととは別の話だというのは大丈夫?
(大丈夫ならいいんだけど)
各.cppにそのclass Testの定義が書いてある(実際はincludeだけど、includeは書いてあるのと同じ)
んだから、各.objにTestのオブジェクトコードがあるのは当然でしょう。
コンパイルは翻訳単位毎に独立ですよ。だから翻訳「単位」という。
シングルトンとして動作する=実体は一つのはずなのに、実行ファイル容量が増えているから不思議がっているんだろう
「すべてのcppファイルで増えた!」 つってんだから、 …あれ?どゆこと? コンパイルしたオブジェクトファイルのサイズが 増えたと言いたいんだろうな。 でも、コードが増えたこととインスタンスがひとつしかないのは 別の話だから。
iostream系の<<演算子についての疑問なんですが、 stringstream ss1, ss2; int src[] = {1,2,3}; ss1 << src[0] << src[1] << src[2]; int cnt = 0; ss2 << src[cnt++] << src[cnt++] << src[cnt++]; 結果 ss1 : 123 ss2 : 321 上のように配列のインデックスが定数の場合と演算がある場合で、 処理順序が逆になるのですが、なぜなのでしょうか?
関数の引数に副作用のある式を入れたときの評価順序は決まってない。 int cnt = 0; f(cnt++, cnt++); // f(0, 1) が渡るか f(1, 0) が渡るかわからない 演算子オーバーロードは単なる関数呼び出しなので、 同じことが起こっているだけ。
>>589 結果にあるとおり最後のsrc[cnt++]が最初に評価されたってことだろ
順番は保証されてないからそのようなコードを書いてはいけないってことだ
ss2 << src[cnt++];
を3回書くかループで回せ
>>589 シーケンスポイント間で cnt に複数回変更を加えているので、未定義動作。
副作用完了点について勉強すべきだな
なるほど、ありがとうございました。
>>592 >>595 おいおい、偉そうに嘘を言うんじゃない。
未定義 (undefined) じゃなくて不定 (unspecified; 未規定ともいう) だぞ。
ちゃんと引数は評価されるが、評価の順番は処理系が適当に決めてよい。
597 :
596 :2008/12/26(金) 22:37:18
ああ、読み間違ってた。589,590は確かに未定義動作だな
いいえ、未定義です 同じ変数を不定順に操作したら未定義 f(cnt1++, cnt2++);なら確かに評価順が不定なだけだけど 590はf(0,0)やf(1,1)やf(825699101,-600359841)やabort()やsystem("rm -rf /")が呼ばれるかもしれないし 何も呼ばれないかもしれないし、関数呼び出しではない恐ろしいものが呼ばれるかもしれない
リロードしろよ俺
f1(f2(cnt++), cnt++); x = cnt++ - (cnt++); 上の2例のように、ネストした関数や、括弧で演算順序を 指定した場合でも、未定義or不定なんでしょうか?
>>600 同じく未定義。
「シーケンスポイント」(副作用完了点)で区切られてないとダメ。
602を読むと関数の呼び出しの直前も副作用完了点になってるのですが、
>>600 の1例目、f2の呼び出しはそれには当てはまらないのでしょうか?
また、
void inc(T &v) {
++v;
}
x = inc(cnt) - inc(cnt);
のように関数に置き換えた場合は、式の左から処理されると考えて良いですか?
>>603 関数の呼び出しには副作用完了点があるが、最初の式内の引数の評価タイミングは
関数呼び出しの前ならいつでもいいので関係ない。
減算演算子の二項の評価順もコンパイラの勝手。
void で引き算はできねぇな。
>>603 それにしてもなぜそんなことに興味あるの?そんなコーディングしたいの?
それとも単に純粋な学術的な興味?
int inc(int& v) { return ++v; } x = inc(cnt) - inc(cnt); だな。
>>606 今まさにそんなコーディング(
>>589 )してしまって軽く嵌ってたので、
良い機会だからもうちょっと突っ込んで知りたいなと思いまして。
知らずにまた似たようなことをやらかさないように。
>>607 そうそう、戻り値必須でしたね。
>>603 限らない
左のinc(cnt)と右のinc(cnt)が呼び出される順序は不定だから
xが1になるか-1になるかも不定
未定義ではないけど
>>604 ,609
なるほど、ありがとうございました。
if() if() ; これって if(){ if() ; } と同じですか?
試せ
>>611 違います。
前者はif文が二つとも成り立った時には単文しか書けませんが
後者は複文が書けます。
じゃなかった、後者は直後の単文を一つ実行した後 一つめのif文が成り立った時の複文を実行します。 前者は一度元に戻ります。
>>613 >>614 日本語が苦手なら、わざわざ回答しなくても大丈夫ですよ。
>>611 if (...)
if (...)
a;
b;
c;
と
if (...) {
if (...)
a;
b;
}
c;
では、前者はbもcも常に実行されるが後者は常に実行されるのはcだけ。
逆に言えば、(一番目のifが成立し)二番目のifが成立しない場合には、
bを実行するかしないかで前者と後者の差が出る。
まぁ、自分で書く場合は迷うくらいなら{}で括っておけということ。
ふくふく
617 :
デフォルトの名無しさん :2008/12/28(日) 05:38:24
VC+ 6.0を使っているC/C++初心者です。 「こんにちは」など簡単な音声をPCアプリケーションから出力したい のですがやり方が全くわかりません。 どなたかどのようにプログラムを組めば良いのか具体的に教えて いただけますか? よろしくお願いします
まず VC++ をアップグレードします。
619 :
デフォルトの名無しさん :2008/12/28(日) 06:16:53
mci使うといい
SofTalkすればいい
624 :
デフォルトの名無しさん :2008/12/28(日) 11:41:26
m_modelクラス ---- inline void InitPos(D3DXVECTOR3 &pos) { m_initpos = pos; }; inline D3DXVECTOR3 *InitPos() { return &m_initpos; }; --- 他のクラスで D3DXVECTOR3 position; position += m_model->InitPos(); 二項演算子 '+=' : 型 'D3DXVECTOR3 *' の右オペランドを扱う演算子が見つかりません (または変換できません)。 と出てコンパイルできませんでした。 ちなみにm_modelクラスに inline D3DXVECTOR3 InitPos2() { return m_initpos; }; を加えてそれを使ったら一応できました。 他にやり方があったら教えていただけませんか。
position += *(m_model->InitPos());
626 :
デフォルトの名無しさん :2008/12/28(日) 11:53:19
>>625 ありがとうございます!できました!
なんで*をつけるとできるか調べてきます。
>>626 ポインタを返してもらったら、自前でデリファレンスしないといけないというだけの話。
調べ直さないといけないくらいなら、ちゃんとポインタについて勉強してこい。
628 :
デフォルトの名無しさん :2008/12/28(日) 11:58:15
単体だとアドレスを示しているだけだから*をつけて値にしただけだろw 調べるまでもないしwwwwwww
631 :
デフォルトの名無しさん :2008/12/28(日) 12:05:10
>>630 そのままだと
こんにち「ハ」って言ってくれるのかw
「これは、うんこです」 は言ってくれてる気がするけどな
>>633 SofTalk は発音記号に変換してから DLL に渡してるんじゃないかな?
AqueTalk の素のままだと余計なことはしない
ただ、受け取った発音記号を喋るだけ
::ImmGetConversionListとのコラボが結構いいな
C++でのポート出力について質問です。 現在、研究室のWindows95で使っていたシリアル出力プログラムを改修中です。 これをWindowsXP上でパラレルから出力するプログラムに修正したいです。 元のソースを見ると、以下のような動きをしています。 CreateFileでCOM1またはLPT1(INIで設定)のハンドルを取得 ↓ GetCommStateでポートの状態を取得 (COMかLPTかの判定はせず、必ずGetCommStateにいく) ↓ SetCommStateでポートの状態を設定 ↓ WriteFileでポートに出力 ただ、XP上でLPTに出力しようと動かすとGetCommStateのところで必ず落ちています。 GetLastErrorでエラーを取ってみましたが、「ハンドルが無効です」という内容でした。 (ただし、CreateFileでのLPT1のハンドル取得は成功しているみたいです) 調べた結果、そもそもLPTではGettCommStateとSetCommStateは不要なのではないかと思い CreateFile後にLPTであればこの処理を飛ばすようにすればいいのではないかと思うのですが LPTの場合はGetComm/SetCommの代わりに別の関数を実行する必要とかはあるのでしょうか? 実機は稼動中かつ遠隔地にあるため、デバッグしながら作業をすることが出来ず 事前にある程度、改修の方針を確実にしておきたいのですが Win2000/XPでのLPT出力に関するまとまった情報が少なく、決断できないでいます。 Windows2000/XPからLPT1で出力する手順はCreateFileとWriteFileだけでいいのか、 もしこれ以外にも手続きが必要な場合は何が必要か、教えて頂けますよう、お願いします。
>>617 適当でいいなら PlaySound で
639 :
デフォルトの名無しさん :2008/12/28(日) 14:56:02
617です。 書き込んで下さって、ありがとうございました。 環境をアップグレードしてから試してみます。
>>637 そもそも何のためにSetCommState()しているのか判っているの?
その概念はどんなハードウェアプロトコルに依存するか判っているの?
# 判っているならこんなすっとこどっこいな質問はしないか。
>>640 いや、よく分かってないです…
調べたところ、COMでのボーレート等を設定する為の関数らしい、という程度の確認をしたところで
これはCOM限定なんじゃないか?と考えてLPTの手続きの検索に入ってしまったので…
あまりに知識が不足していると思うので、XPでLPTを扱うための情報を探しているのですが
オススメのサイト、もしくは書籍などでもあればご紹介いただけると嬉しいです。
COMについてのサイトは結構あるのですが、探し方が悪いのかLPTは意外と少なくて…
アルゴリズムの勉強がてら、こんな風にテンプレート関数使ってみたら、 リンカエラー吐いちゃいました。どこが間違ってますか? //main.cpp #include <stdio.h> #include "search_linear.h" int main(void){ int data[] = {13,252,120,43,723,4623,268,93,60}; printf("%d",linear_search(data,sizeof(data) / sizeof(int),43)); return 0; } //line_search.h(インクルードガードは省略) template<typename T> int linear_search(T *data,int num,T key); //line_search.cpp #include "search_linear.h" template<typename T> int linear_search(T *data,int num,T key){ for(int i=0;i<num;i++){ if(data[i] == key){ return i; } } return -1; } 1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl linear_search<int>(int *,int,int)" (??$linear_search@H@@YAHPAHHH@Z) が関数 _main で参照されました。 1>D:\中略\test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
あ、書き間違えてました。 line_search.hはsearch_linear.hで、 line_search.cppはsearch_linear.cppです。
>>642 テンプレートの定義を.cppではなく.hに書く。
templete< >の実装は、ヘッダに書くか、exportでググってみる。
>>644-645 .cppの中身をそのままそっくり.hに持ってくればいいって事ですよね、確かにできました。ありがとうございます。
exportでググってみましたけど、今一つリンクってのが何をやってることなのか分かってないので理解できなさそうです。
もうちょっと知識を身につけたらまた調べてみることにします。
コンストラクタ初期化子で配列を0クリアする方法はありますか?
>>647 ありません。
コンストラクタ本体でおこなうか、std::vectorなどを使ってください。
>>641 ボーレートの設定などは、シリアル転送にのみ使われる。
パラレルポートの場合も本来なら時間設定が色々あってもいいところだが、
一般的にはBUSYチェック程度しかしていないと思う。
いずれにしても相手機器との相性の問題があるから単純に置き換えるわけにはいかないかもしれないが、
パラレルの場合は相手機器に対して規定の文字列を出力するだけで済む場合が多いと思う。
# 逆に、微調整しようがないので現地でダメだったらお手上げになるけどw
よく判っていないのなら相手機器側の資料をよく読んで、必要なら代理店に問い合わせるとかするこったね。
# 弊社にご依頼いただければ稼動実費+αでお請けしますがw
650 :
641 :2008/12/28(日) 23:00:28
>>649 ありがとうございます。
パラレルで出力する際にはパラメータ設定系の処理は必要無いということらしいですね。
出力対象がLPTであればCommState関連の処理を飛ばすように直してみる事にします。
BUSYチェックも、LPTに繋いでるのはラインプリンタだけで
出力も作業者が行うのでそう問題は無いかなと…
ラインプリンタの資料があるかちょっと分かりませんが、探して確認してみることにします。
今までCOMやLPTなんてレガシーだもう使わないなんて思ってましたけど、
実際に関わるとLPTのBIOS設定の意味すら知らない自分の知識の乏しさを痛感させられてます…
//…うちの研究室、カネが無いんですよ…
//だから少しだけC++知ってる自分に改修が頼まれた…
スレ違いは承知なのですが、KAT-TUNをカッツンと読んでしまいます どうすればいいでしょうか
なんだ、繋がっているのは単にプリンタか。
マイクロソフトが、.NETでハンガリアン記法を禁止したのはどうしてなんですか?
wikipediaでもみたらおk
そもそもマイクロソフトの使っていたハンガリアン記法は、 本物のハンガリアン記法ではない。 ハンガリアン記法の論文の文意が誤解され、 間違った形で解釈されたもの。 あんなもの役に立つわけが無い。
656 :
デフォルトの名無しさん :2008/12/29(月) 20:57:36
TCHAR m_str[MAX_PATH]; sprintf(m_str, "%d FPS", m_fps); でコンパイルするとTCHAR[260]からCHAR*に変換できませんと出るのですが 解決方法教えていただけませんか
wsprintf
_stprintfでもいける。
660 :
デフォルトの名無しさん :2008/12/29(月) 21:02:30
ありがとうございます できました
それは気のせい。よく考えて見れ。
両方に1.0つけちゃだめじゃね?
>>661 例えば、RAND_MAX が 0x7fff だとすると 0〜0x7fff までの乱数が出るから
値域の幅は RAND_MAX + 1 になる
最大 - 最小の方も同様
>>661 順番を変えて考えるべし。
rand() / (double)RAND_MAX とした場合、
rand() が 0 〜 RAND_MAX の値を返すのだから、
rand() / (double)RAND_MAX は 0 〜 1 の値になる。
このまま (max-min+1.0) をかけると 0 〜 max-min+1 の値になり、
min を足すと 0 〜 max+1 の値になる。
rand() が RAND_MAX を返した時だけ、max+1 が現れてしまうことになるわけだ。
これに対し、rand() / (1.0+RAND_MAX) とした場合は
0 〜 RAND_MAX/(1+RAND_MAX) の値になる。
RAND_MAX/(1+RAND_MAX) は 1 より少し小さくて、
上記のような問題は発生しない。
667 :
661 :2008/12/29(月) 21:51:54
仮に
min=0
max=1;
RAND_MAX=1
1.0を外して
rand()の戻り値が0だったら
min + (int)(rand()*(max-min)/(RAND_MAX))
= 0 + 0*(1-0)/1
= 0
rand()の戻り値が1だったら
= 0 + 1*(1-0)/1
= 1
となっておかしいところはないと思うのですが例えばどのような場合に辻褄が合わなくなるか具体例を教えていただけないでしょうか。
>>664 すいません。
値域の幅がなぜRAND_MAX + 1になるのかがわかりません。
>>665 >このまま (max-min+1.0) をかけると 0 〜 max-min+1 の値になり、
(max-min+1.0)も必要がないのではないかということです。
説明不足申し訳ありませんでした。
>>667 0〜5の値をランダムで返す関数があるとしてとりうる値の数は何個でしょう
>>667 ちょっとは考えようぜ。
rand() / (double)RAND_MAX とした場合、
rand() が 0 〜 RAND_MAX の値を返すのだから、
rand() / (double)RAND_MAX は 0 〜 1 の値になる。
このまま (max-min) をかけると 0 〜 max-min の値になり、
min を足すと min 〜 max の値になる。
しかし、max になるのは rand() / (double)RAND_MAX が
「正確に RAND_MAX になった時だけ」で、max が極端に出にくくなってしまうことになる。
670 :
661 :2008/12/29(月) 22:10:34
>>668 0を含めるのを忘れていましたorz
>>669 要するにmaxが出にくくなるのをふせぐための1.0ということでしょうか。
>>670 だからな、仮にサンプルの通り1-6の変数が出て欲しいものとすると、出てくる値の数は6個だろ?
で、お前の言うとおり1を抜くと、6-1で5個になってしまう。おかしいだろ?
672 :
661 :2008/12/29(月) 22:52:39
_ .,r'"_`''i、 l i´ .゙i | !-' 丿丿 /,/ l | 二 | | ゙‐' )フ ウ--,, ノ フ フ  ̄ ̄ヽ...--.../ フ フ ......ヽOノ.............フ___ フ /::::::::::::::::::::::::::::::::::ヽ/ っ <>/==─::::::::人::::─==ヽ つ っ >ノ:::::::::::::::::::::ノ ヽ:::::::::::::::::ヽ クノ_ノノ_ノ/_ノ, \ヽ:::_ヽ_ヽ __ノ::::::::::r ( ヒ_] ヒ_ン人::::::) ∠:::::::::::::::::|// ,___, //|::::::/ ノノ >:::::::人. ,'::::ヽ /:::::::::::::::::>,、 ______, .イ::::::::::(
>>670 まあそうなる。
防ぐためというか、まあ、全部の値が均一に出るようにするため、だな。
>>673 いや均一にするためというより1抜いたら最大値が絶対に出なくなるだろ
>>675 つまり+1.0したらmax+1が出ることもあるってことか?
というかここまでしなくてもサイコロ程度なら普通にrand()%6+1で良いと思うんだ。
しょぼい乱数生成だと下位ビットの精度がやばかったりするんだよ その対策
679 :
661 :2008/12/30(火) 02:49:33
回答者同士で意見がバラバラって・・・。 「知らないならレスしないで下さい」というあれが ちっとも煽りではない場面ですね、ここはw
681 :
661 :2008/12/30(火) 08:08:31
>>679 は私ではありません。
なんとなくは納得できました。
皆様ご回答ありがとうございました。
>>677 randですむような用途なら%で十分って気もするけどね。今どきの処理系なら下位ビットの周期が極端に短いなんてないし
下位ビットを捨てる対策はあるけど、単にマシになるだけで、 2の累乗で割った場合は周期が短くなる事に変わりはない。
短いと言っても数万くらいはあるし、randで間に合う用途なら、まあ、だいたい%でokだと思う。
tr1/random で頑張ろう。
少なくともrand()が線形合同法である以上、必ず偶数と奇数が交互に出てくる それが気にならないなら%でいいんじゃね
>>686 だから下位ビットの周期がそんなに短い処理系なんて今どき無いって言ってるじゃん。
短いって基準は目的によって変わるからな。 rand() / (1.0+RAND_MAX) * で十分だけど、 rand() % だと困るという状況はなくはないかもしれない。
randは自分で一つクラス(or関数)を作って使い回すと便利 線形合同法なら数行だしその時点で下位ビットを捨てておけば悲惨なことにはならないし
boost::random使うし
>>690 だな。俺も random で済む用途は random 使うし、ちょと心配な場合は boost。
変に小細工して悩むよりずっと簡単で確実。
質問。 struct S_P1{ int x,y; }; void Function(){ std::list<S_P1> P1; } という感じで構造体をリストにしたいと思ってます。 P1. と入力した時点で出てくるメンバ一覧にもxやyは含まれず、listのメンバしか出てきてないように思えます。 P1.x.push_back(10); とか P1.push_back(10); とかではうまくいきません。 構造体のメンバを指定して値を入れるにはどうしたらいいんでしょうか。
S_P1 tmp; tmp.x = 10; tmp.y = 10; P1.push_back( tmp );
P1はリスト全体でしょ その要素が S_P1 構造体のデータで、S_P1 構造体が x とか y を持つ。
>>693-
>>694 とてもよく分かりました。
いろいろ謎が解けました。ありがとうございます。
CTestというクラスがあったとしてそれを継承したCTestAとCTestB。 CTestA a; CTestB b;って宣言したとして aとbでひとつの変数を共有するってできますか?
その宣言でやろうと思うとかなりアレな感じになるかとw
>>696 static変数なら、クラス全部で共有できるけど、そういうのじゃなくて?
>>696 出来ると思う。 CTest が static なメンバ変数を持っておいて、
CTestA と CTestBでそれへの参照を持てば実質的に共有することになる.
a と b だけで共有じゃないのかな・・・どっちなんだろ
>>696 共有させたいオブジェクトをaとbから参照させればいいのだ。
boost::shared_ptrを使おう。
int a[b*c]; 配列数がコンパイル時不明なのですが、こうすると定数式が必要だというエラーが出てしまいます。 メモリの大きいサイズを確保して、あとからint区切りで添え字でアクセスできるようにするにはどう書けばいいんでしょうか?
int* a = new int[b*c];
std::vector<int> a(b*c);
C99
>>708 -std=c99で堂々と今やgcc拡張ではないと胸を張って言えますよ。
iccならオプション指定さえ必要ない。
gccもいらないよw むしろ抑制するのに必要になる
iccのlambdaってどう?
>>711 >710は、gccの場合c99準拠にするためにオプションが要るけど、iccではそれが要らないと言うこと。
>>713 gccは独自拡張でも可変長配列をサポートしていてc99とかなにもつけないとそれが有効になるということ
715 :
デフォルトの名無しさん :2008/12/31(水) 14:57:55
JavaからC++に来たものですが基本的なところでつまづいています。 class Person { Name* name; } class Name { char* family_name; char* first_name; } Person** personList; Person* person = new Person("山田"); //realloc personList[0] = person; person = new Person("鈴木"); //realloc personList[1] = person; ここでperson = personList[0]; とやるとpersonの中身が壊れてしまいます。(Nameクラスのところ) これを壊れずにやる方法ってないんでしょうか?
>>715 めっちゃ基本的だな。 あまりにありがちすぎてフいた。
personListは単なるポインタ。
単に宣言しただけではそれが指す先は不定。
メモリを確保してその場所を入れろ。
>>715 class 定義の最後にはセミコロンが要るぞ。
それは単なる書き間違いなのか?
と、いうわけで
>>719 に同意。
privateとpublicとprotectedの違いがよくわからないんですが、publicは公開って事でおkなんですが プライベートとプロテクテッドは何が違うんですか?
継承するとき
派生クラスから見えるか見えないか
>>721 protected は継承したクラスからは見える。
private は friend 指定したクラス (あるいは関数) 以外からはまったく見えない。
>>724 ようするに、
Privateは「そのクラス内のみ」で「継承したクラス」で実装した関数では操作できないが、継承していれば
クラス内変数自体は存在しているってことですかね?
Protectedは継承したクラスからも見れるって事でおkですか?
726 :
715 :2008/12/31(水) 16:38:38
class Person { Name* name; }; class Name { char* family_name; char* first_name; }; Person** personList; Person* person = new Person("山田"); personList = realloc(personList,sizeof(Person)*(index+1)); personList[0] = person; index++; person = new Person("鈴木"); personList = realloc(personList,sizeof(Person)*(index+1)); personList[1] = person; index++; person = personList[0]; ここでpersonの中身をデバッガで見ると、もともとの値が化けています。
>>726 初っ端から realloc 使うなら NULL で初期化するべし
person の値は書き換えられて当然
index はどこからきた?
friend使いまくりなんだが・・・ お前らはどうだい?
>>726 class Name のメンバが指す領域が確保されていない
std::string でも使えば?
>>726 コンパイルできなくない?
すごいデバッガ使ってる?
>>729 俺も使うよ。
どうせそんなに汎用的なクラスは作らんし。
それなら依存関係が明確な方がいい。
>>732 俺はむしろライブラリ作ってると、ライブラリ内だけで行き交わせたいデータがあるとfriend指定使ってしまう。
なんかいい方法あるのかな・・・。まぁライブラリはDLLとかにしちゃえば、あとは使わせる部分だけヘッダで公開すればいいだけなんだろうけど
>>729 特定のクラスだけ変更できるデータとかに使うな
>>729 immutable である事をインタフェース的に保証したいクラスと
そのファクトリに使う事があるかも。
class immutable { // 普通の奴らにはgetしかして欲しくない
friend shared_ptr<immutable> create_immutable();
int data_;
public:
int get_data() const { return data_; }
};
shared_ptr<immutable> create_immutable() {
shared_ptr<immutable> r(new immutable);
r->data = 10;
return r;
}
737 :
デフォルトの名無しさん :2008/12/31(水) 19:12:09
聞く前に試してみよう。
#include <limits.h> #include <stdio.h> int main() { int x[] = {0, 53, 22, -10}; int min = INT_MAX; for (int i = 0; i < sizeof(x) / sizeof(x[0]); ++i) { if (x[i] < min ) min = x[i]; } printf("min = %d\n", min); return 0; } 的な最小値探索をdoubleやるために、 最大値がほしいので double min = 1 / 0.0; でinfにしているのですがこれは、なにかまずかったりするのでしょうか なんとなく不安なので、質問しに来るました
DBL_MAX
それだと、探索対象にinfがあったときにおかしくなりません? infがあるのに最小はDBL_MAXになっちゃう気がするんですが
class X { const int p[4]; 〜略〜 }; ひょっとしてこういう感じのことはできないのでしょうか、初期化子では配列に入れられないですし
最大値が欲しいのにminにいれるとはなにごとか!
>>744 すいません
何をいっているのでしょうか?
配列から最小値を探すために、
結果を入れる変数に初期値としてその型の最大値を入れておきたいのですけど
>>740 比較の前にinfチェックして使っとけば?
そーすがすらすらかけますよーに
749 :
デフォルトの名無しさん :2009/01/01(木) 08:13:44
ゼロ割りって出力ウィンドウにエラーでねぇ?
「出力ウィンドウ」ってなんじゃらほい Windowsなら異常終了のダイアログが出ないこともなかったような
VCのデバッグ実行で表示されるアレじゃねの? 固有名詞で「出力ウィンドウ」ってーとそのぐらいしか思いつかん
char *words[] = {"stately", "plump", "buck", "mulligan"}; size_t words_size = sizeof(words)/sizeof(char *); これのsizeof(chara *)の*はなんで必要なんですか? sizeof(char)ではだめなんですか?
>>752 charaだけだと、chara型の配列じゃなくって一文字になっちゃう
char *words[] -> char * words [4] に変換される。 そしてcharを指すポインタの4つの配列は、それぞれどこかの文字データの入ったアドレスを指していることになる。 words[0] ---------------------------------------->"stately" (0x234fee) words[1] ------------>"plump" (0xdd4540) words[2] ----------------------------------------------------->"buck" (0x001101) words[3] --------------------------->"mulligan" (0x0d7100) まぁ普通は連続的になるだろうが、オプション次第ではこういうのも作れるよね…? これであってる?
>>752 そもそもそのコードが何を計算してるのか理解してるか?
756 :
デフォルトの名無しさん :2009/01/01(木) 13:14:55
ゼロ割りは英語でゼロディバイトなんたらなんたらってでてくるよ
Class内にProtectedでstatic付の変数を作ると未解決のエラーが出てしまうんですが Class内でStatic付なのはPublic以外ではできないのでしょうか?
ごめんなさい、static付はpublicでも未解決って言われました
>>757 cppに
type classname::membername=initialvalue;と書いてみれ
グローバル変数のexternだけ書いたのと似たようなもんだ 実体がない class Foo { static int Bar; }; なら何処かのcppに int Foo::Bar = 100; とか書く必要がある
マルチスレッドのサーバを作っています。 複数の処理スレッドが入力を受け付け(accept)、処理を実行し、1つの管理スレッドが スレッド数の管理や処理に関する統計処理等を行っています。 (処理数が処理スレッド数を上回った場合は、管理スレッドが処理スレッドを増やすなどを行う) ここで質問なのですが、管理スレッドを定期的に実行させるにはどのような方法がよいでしょうか? スレッドのpriorityも関係しそうですが、管理スレッドのpriorityをあげるのは、 なんかおかしいかなと思ってます。(実際にpriorityが高いのは処理スレッド) 環境は、linux(centos)上でpthreadを使っています。
>>761 単純な方法はsleepじゃないかな。
あとaccepetしたときやsocketをクローズさせたときに管理スレッドにイベントを送るようにしたら効率がいいと思うよ
マルチにレスしてしまった。はずかすいorz
764 :
デフォルトの名無しさん :2009/01/02(金) 22:33:44
#include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } このプログラムで以下のエラーが出ました。 Unable to open include file 'stdio.h' Call to function 'printf' with no prototype in function main どうすればいいでしょうか?
borland の BCC ?
>>764 どうすればって、stdio.hがひらけねぇっていわれてるんだからあるのおかどうか確認せーよ
コンパイラの設定ミスってんじゃない? 主に標準インクルードパス
コンパイラにstdio.hのある場所を教えてやらなかったからじゃないの
これでもかというぐらい環境依存だなw
実は組み込み用だったとか
まあ環境依存OKスレだし。 環境は書いて欲しいが。
いままでlinux環境でvalgridをつかってメモリリークとかみてたんですが、 VisualC++2008のでそういうことってできます?
VC++ を使うわけじゃないが、 purify とかいうソフトがある。 試用期間があったはず。
VC++デバッグ版ランタイムにもメモリリーク検出の機能があるな。 _CrtSetDbgFlag
775 :
デフォルトの名無しさん :2009/01/03(土) 08:32:37
>>774 何そのウンコ機能
newをオーバーライドしたほうがいい
int a[5]; int b[50]; a = &b[10]; aの先頭にbの先頭にしたいアドレスを入れたらbのa配列分がaからアクセスできるようにしたいんですがこれ無理ですか?
それは無理 int *a; a = &b[10]; じゃだめなのか?
なるほど、それでいけそうです。ありがとうです。
malloc,freeの書き換えだけじゃvalgrindの代用にはならんだろ。 leakcheckerだけなら色々あると思うが。
g++3.4.4を使いmapのconst char*で下記の様に定義しようとしています。 文字列を直接char*に代入した時は成功するのですが、 strcpyでコピーした時は失敗するのは何が原因なのでしょうか。 void read(map<const char*, int> &index){ char *l = (char*)malloc(256*sizeof(char)); strcpy(l,"*abcd"); index.insert(make_pair(l, 1)); l="*efgh"; index.insert(make_pair(l, 2)); } int main(void){ map<const char*, int> index; read(index); cout<<index["*abcd"]<<endl;//失敗 cout<<index["*efgh"]<<endl;//成功 return 0; }
ヒント : std::less
>>781 すみません、std::lessをどう使えばいいのでしょうか…。
std::strcmpをラップする
コンテナ map は比較演算によって key を区別している。 通常は opreator < 相当の std::less が使われる。 const char* の比較ではポインタ値の大小によって判定され、文字列の中身を見ない。 使ってる環境では同じ内容のリテラル文字列は共有される(同じ領域が使われる)ようなので、 たまたま同じポインタ値が使われてうまくいっているように見える。 解決方法としては、 1. std::less を const char* で特殊化する。 namespace std { template <> struct less<const char*> : binary_function<const char*,const char*,bool> { bool operator()(const char* x, const char* y) const { return strcmp(x, y) < 0; } }; } 2. 比較関数オブジェクトを指定した map を使う。 struct MyLess : binary_function<const char*,const char*,bool> { bool operator()(const char* x, const char* y) const { return strcmp(x, y) < 0; } }; std::map<const char*, int, MyLess> index; 3. const char* の代わりに std::string を使う。 std::map<std::string, int> index; お勧めは 3 > 2 > 1 の順。
>>784 なるほど、そういう事だったのですね。
stringよりはポインタの方が早いようなので、
1か2の方を使ってみようと思います。
ありがとうございました。
>stringよりはポインタの方が早いようなので、 思い込み乙。
string の方がサイズを保持しているので 文字列の動的コピーが必要になった際に strlen しなくて済む分速いよね。
788 :
デフォルトの名無しさん :2009/01/03(土) 13:18:32
stringはデータの追加が出来ないよ。 新たな領域を確保してそこにコピーするんだ。 だからノロイ部分はある。
>>788 妄想しすぎだろう・・・。
メモリは文字列のサイズ丁度に確保するとは限らない。
それに、自分でメモリ確保する場合も同じだろう。
790 :
デフォルトの名無しさん :2009/01/03(土) 13:23:16
あるデータ処理に特化するんだったらchar*のほうが速いだろ。
場合による。 ノードの追加は明らかに std::string の方が遅くなるが、 文字列のサイズを取得する処理は std::string の方が速い、など。
つまり、実測しろ、ということだよな。 速度の話題が出たときには毎回誰かが言ってんのにまたこの流れか。
794 :
デフォルトの名無しさん :2009/01/03(土) 13:30:27
文字数は、char*でもint型に入れておけばいいだろ。
795 :
デフォルトの名無しさん :2009/01/03(土) 13:49:01
汎用性のある処理している分、どうやってもchar*には敵わないんだよ。 実測してみるのが良いとは思うけど、大抵極端な差は出ないか、char*の方がコードが長くなるから 人間のミスによりchar*の遅いかも知れない。
796 :
デフォルトの名無しさん :2009/01/03(土) 15:24:16
実測してみたけどlength()が2倍になるまではstringのほうが速いみたいだな。 2倍を超えるところで遅くなってその時点からまた2倍になるまで速くなる。
797 :
デフォルトの名無しさん :2009/01/03(土) 15:28:12
stringのソース見たらアセンブラになってたわ。 てことわ、char*版もアセンブラで書き直さないと比較にならないのか?
798 :
デフォルトの名無しさん :2009/01/03(土) 15:33:30
比較ってなんの比較だよ?
ある意味予想通りの展開だな。 暗黙的にコピーが発生する可能性が高い分、気をつけないと std::string の方が char* より速度が遅くなる可能性は高いが、 質問のレベルからしてメモリ関連のバグを抱え込むか、メモリを確保しっぱなしのような行儀の悪いプログラムを書くかする 危険性も高いと思うんだ。 char* と string の速度差が意味を持つようなプログラムを書くつもりなのか、考えてみた方がいいと思う。
map だからノードを追加するときくらいしかコピーは発生しないはず。
一応言っとくとダミーノードnilが発生するからstd::stringのデフォルトコンストラクタとそれに対応したデストラクタも走る。 一方POD型の分も発生するが、同じデータ量を持った未定義の内容のメモリが確保されるだけに過ぎないので コンストラクタとデストラクタのコストが著しく高い場合はPOD型に置き換えた方が良い。
ただし、著しく高いコストも許容範囲ということが意外とある。
CString str; int num = 12; str.Format(_T("%d"), num); numが何桁だろうと012と3桁表示にフォーマットする書き方はありますか?
>>803 仕様に書いて歩けど
%03dってかけばおk
0=空いてる桁は0梅、3=3桁
%03d
どうもです
「numが何桁だろうと」と書いてあるけど、4桁のときは4桁でいいのかな?
MS Platform SDK(x64)をインストールしてみたんだけど、cl.exeは動くが ml.exe(アセンブラ)が存在しないっぽい。以前入れた時にはあったような 気がしたんだけど、どうすれば手に入るか教えてくだせえ。
自己解決。ml.exeではなくml64.exeでした。いやすまんかった。
c++の入門書なんか教えてください ちなみに今まで読んだ本は 新版 明解C言語 入門編 柴田望洋 著 Cプログラミング専門課程 藤原 博文 著 です もしすれ違いだったら誘導お願いします。
・ ロベールのC++入門講座 ・ 独習C++ ・ Accelerated C++ ・ やさしいC++(高橋麻奈) ・ 詳説C++ 好きなの選べ。
どれでもいいとおもうけど注意すべきは、古いものは避けたほうがいい 規格が現行のものでないものが多いから
文法の本はともかく、EffectiveC++だけは絶対読んどけ。
Effective C++ が必読なのは同意だが、 それより先に C++ の入門書を読まないとな。
>>812 発行が新しいという意味ではこの2つが新しいな。
・ やさしいC++(高橋麻奈)
・ ロベールのC++入門講座
ごめんそこまで新しさを追い求めるひつようはない 名前空間の概念がないから using・・・ せずに vector・・・・とかやってたり strstreamを普通につかってたり そんなの
Webのロベール読んどけば
1998年以降の発行が目安かな C++が規格化されたのは1998年だから 最新版は2003年だけど、大筋は変わらないから2003年以前でも問題はない 1998以前が悪いとも限らないけど
819 :
デフォルトの名無しさん :2009/01/04(日) 01:04:16
質問です。 C言語における「文字列の配列」とはどういうものですか。
char 型の配列の配列。 char (の配列をさす)ポインタの配列。 とか。
const char table[2][10] = { "foo", /* 実際には 10 バイトの領域が割り当てられる */ "bar", /* 実際には 10 バイトの領域が割り当てられる */ }; /* table は文字列へのポインタを保持する配列となる */ const char *const table[2] = { "foo", "bar", }; 普通は後者を使うが、 文字数が決まっていて文字数が全部揃っている場合は 前者を使う事もなくはない。
822 :
810 :2009/01/04(日) 01:59:15
ありがとうございます ロベール買うことにしました
823 :
819 :2009/01/04(日) 02:18:50
ありがとうございました。
i = 0; i = ++i; が、1を足してから代入されるのはわかるんですが、 int a[x]; for(i=0; i<x; ++i) { a[i] = i; } は、どうなるんでしょうか 一発目から1ではじまるんでしょうか? 2週目はiが2でいいんでしょうか?
> i = ++i; この結果は未定義じゃね? まあ、変になることはない気はするが・・・。 >は、どうなるんでしょうか i を表示してみれば分かるだろ・・・。
boostライブラリのコンパイル、お茶でも飲みながら待ってましょうとかいって2時間もかかったどんぐらいかかるかぐらい最初から教えろ!!
>>824 i = ++i; は未定義。書いてはいけない。
1を足して代入するのは、++i; か i++; か i=i+1; か i+=1;
for(i=0; i<x; ++i) はi=0からi=x-1まで、x回のループ。
>>824 i = 0;
while(i < x)
{
a[i] = i;
++i;
}
と同義
continue がなければ、な。
ないじゃん
>>826 それでも目安くらい出せるとは思うけど、コンピュータの性能で本当に違う。
Core 2だと十数分とかからない。
OOoのコンパイルも一時間かからないんだろうなぁ…恐しい話だ
実際にプログラムを書いて試してみたんですが違いがでません int a; start: cin >> a; int b = a; cout << "i++\n"; for(int i=0; i<10; i++){ cout << a << '\n'; a++; } cout << "++i\n"; a = b; for(int i=0; i<10; ++i){ cout << a << '\n'; a++; } goto start;
>>831 まじで?
俺3Ghz*2なのに2時間かかったぞ
PenDとcore2じゃ3Gでも違うのか?
NetBurstの3Gとかもはやローエンドでは
つかNetBurstアーキテクチャとコンパイラみたいな処理は相性悪いと思う
837 :
831 :2009/01/04(日) 17:35:02
>>834 俺も自分のPCはPrescottで、フルビルドなんて時間がかかってしょうがないから、
最近は使うものだけ個別にビルドするようにしている。
数値の二次配列でvector< vector<int> >ではなく、 vector< int[2] > みたいな事は可能なのでしょうか。 出来る場合はどういう風に宣言すれば良いのでしょうか。
>>838 それはできない
boost::array 使うとか
struct array {
int item[10];
};
みたいなのを作るとか
C2Qだとboostのビルドに10分もかからないらしい… 恐しき哉
vista c++ #include <stdio.h> int main(void) { double pi; printf("あなたは何歳ですか?\n"); scanf("%lf",&pi); printf("あなたは%f歳です。\n",pi); return 0; } コンパイラ後に少数を入力しても小数点以降がカットされてしまうのですが どこが間違っているのでしょうか
同じく。 Vista VS2005
gccの -lm オプションってscanf()とかにも効いてきたっけか?
>>844 -lmオプションなんだとおもってんだよwww
846 :
841 :2009/01/04(日) 22:33:43
3.14を3,14と入力していました 申し訳ないです
>>845 確かmath.hの関数ライブラリのリンクの指示だよな
フランスだっけ<小数点がカンマ
いや確かドイツ人もだろ
ほかにドイツ、スペイン、イタリア、オランダ、北欧とか。 英米日韓中は同じだね。世界は2分されてるな あとは帝国主義時代にどこの植民地になったかで決まってるかんじ
C++にlocaleが導入されたのも無理ないな まあ開発者がスウェーデン人だったからという事もあるが
カンマだと書きなぐった時に 数値を列挙しているのか小数点なのか 分からなくなりそうだ。
>>853 そこで列挙の区切り文字にはピリオドですよ。
いや、まじで日付を2008.1.6って区切る国もあるらしいね
日付はいいけど、 文章内でもピリオドで区切るんか? そうなると列挙と文章の終端の区別が・・・。
アプリケーションを起動後最初化するとメモリ使用量がぐんと下がるんですが なんでデリートもしてないのに勝手に解放されるんですか? すごい一生懸命メモリ意識して作ったのに納得できません どうなってるんですか?
857 :
デフォルトの名無しさん :2009/01/05(月) 08:29:22
HDDに移されるんだろ
HDDに行かないようにするにはどうすればいいんですか? ハードディスクの可動部分の負担をなくすために普通は限界までメモリで回す設定じゃないんですか? 最小化してメモリが減るアプリ初めて見たんですけどひどくないですか?自分で作ったんですけど・・・
859 :
デフォルトの名無しさん :2009/01/05(月) 11:09:16
アクティブで無くなると、HDDにスワップされるソフトは多いよ。 メモリの使用量は同じだけど、実メモリの使用量が下がるだけでは? 画面で見えていない部分を実メモリに置いておくよりは、見えている方をメモリにのせた方が効率良いので。 スワップさせないように出来るとは思うけど知らない。
スワップはソフトじゃなくてOSがやってるだろ メモリ管理はOSの重要な機能の1つ スワップさせない方法は探せばあるのかもしれんが >最小化してメモリが減るアプリ初めて見たんですけどひどくないですか? 限りあるリソースの中で動かす工夫だよ
OSが勝手にやってるんだからOSに文句を言え # 本当に何が起こってるか知りたいならOSのメモリ管理をよーく勉強しろ あとWindowsのタスクマネージャを見てるんなら ちゃんと数字の意味を調べて知っておいた方がいい (Windows XPのタスクマネージャで出てくるメモリ消費量の数字は いわゆる「ワーキングセット」の数字で、直感的なメモリ消費量とはやや異なる意味を持つ)
>>856 Windows XPなら、それがOSの仕様
ウィンドウ最小化 ワーキングセット
あたりのキーワードでぐぐれ
もしかして、タスクマネージャ見ながらメモリリーク潰してた俺って、めちゃくちゃ恥ずかしいやつ?
>>863 うん。そもそもわかりやすいメモリリーク以外見つからないと思うが
メモリリークの対処はリーク検知ツール(LinuxではValgrindとか)を使うか、
自前でallocateとdeallocateのログをとって突き合わせるとかの手法を使うべき
C++なら動的に確保したオブジェクトはすべてスマートポインタに突っ込むといった
そもそもリークしないコードを書くように心がけるのがよろしい
べーむGC使おうぜ
べーむってクラスに対応してんの?
調べておーすごいと思ったんだけど ある確率で回収されそこねる危険がある とか最後に書いてあったんだけど
CならBoehm使えば確実に楽になるだろう C++だとかえって苦労が増えるだけのような MSはGCベースの.NETとの共存のためにわざわざC++/CLIとか作ったわけじゃない
↑否定系なのか疑問形なのか分からんがな・・・
ごめん 否定じゃないよ 「作ったわけでしょう」 といいたかった
shared_ptrとかの参照カウント式のものと併用しようとなると面倒らしい(kiryouの中の人の日記参照) けどmosh等C++プロジェクトでもべーむ使ってるのはあるよ
すごい適当に言うけどMFCのCObjectに: public gc 付けたら一発でガベージコレクション対応になる? あと、vectorは宣言してあるクラスに: public gc付ければswapしなくていいようになるかな
C言語なんですけど getchar()で文字列を10文字以内の2件入力(11文字以降は読み捨て)、 char型に格納。 というプログラムを作りたいのですが、どうすればいいでしょうか?
>>873 宿題なら宿題スレへ。そうでないならfgets()を使って工夫しましょう。
カウンタまわす
>>874 わかりました。
ありがとうございます。
>>867 保守的GCはそういうもの。
他のGCだって循環参照だと回収出来なかったりとか、
回収が特定のタイミングに集中するとかいった問題はある。
GC有りならメモリを気にしなくていいなんてことは無い。
メモリ開放を個別に指定しなくていいってのは大きいけど、それだけだな。
BoehmGCってマシンスタックを直接走査したりする。
環境依存しまくりで#ifdefの嵐だでよ。
主要な環境ではだいたい問題なく使えるけど…
878 :
デフォルトの名無しさん :2009/01/05(月) 15:36:23
構造体についての質問です。
typedef enum {
OP_CHAR,
OP_CONCAT,
OP_ALTER,
OP_CLOSURE,
OP_NULL
} Op_t;
ypedef struct Tree {
Op_t Op;
union {
char c;
struct {
struct Tree *_left;
struct Tree *_right;
}X;
}U;
}Tree_t;
という構造体があった時、
メモリの中は
http://upload.fam.cx/cgi-bin/img-box/wpq90105153437.png な感じですか?
leftとrightは構造体内にあるから共用されない
言い方変えれば、unionで括られているのはcharと無名structだけ。 ついでに言えば、ポインタのサイズはintと同じとは限らない。
881 :
デフォルトの名無しさん :2009/01/05(月) 15:59:19
アドレスとって "%p" で出力してみるとか、 offsetof() を見るとかして自分で確かめるといいよ。
883 :
デフォルトの名無しさん :2009/01/05(月) 16:16:15
offsetofなんて知らんかった!
>>881 まずはその小汚い絵を何とかしろ。draw系のツールを使うかせめてスプレッドシートで描いてキャプチャしてくれ。
別に見えないレベルじゃないだろ
WindowsXPにすればペイントという無料ソフトがついてくるのにね。
俺はあまりにも下手すぎて感動してしまった!
struct tagB { 〜組み込み型のメンバ変数のみ〜 }; struct tagA { tagB m_array[N]; }; となっている時、必ず sizeof tagA == sizeof tagB * N になりますか?
>>890 効率よく実装しようと思ったらおおかたそうなるんだろうけど、
規格は m_array の後ろにパディングを入れることを禁止してないから
「必ず」とは言えないね。
jpeglib の example.c に以下のようなエラーマネージャ の例が出ていて、 struct my_error_mgr { struct jpeg_error_mgr pub; /* "public" fields */ jmp_buf setjmp_buffer; /* for return to caller */ }; ライブラリへの設定には pub のアドレスを渡して、エ ラーハンドラで与えられた(というか返ってきた)ポイ ンタを my_error_mgr にキャストしてるんだけど、これ を C++ でやるにはどうしたらいいでしょうか?
>>892 C++らしくするなら、継承でいいと思う。
struct my_error_mgr : jpeg_error_mgr
{
jmp_buf setjmp_buffer; /* for return to caller */
};
STLのvectorで質問なのですが、 staticで定義されたvectorの1要素のアドレス(例えば &container[5] 等) を取得した後、 そのvectorに対してpush_backなどの要素の追加削除を行わなかった場合、 そのアドレスが生きている事は保障されているのでしょうか? あと、vector::reserve未満の範囲でpush_back等を行った場合はどうなのでしょうか
要素いじらない限りは保証される たとえ尻に追加するだけだとしても、何かやったら無効
俺、そういうの気にするといつもバグらせるから vector <MyClass*> mMy; STLはこうやってポインタ配列しか作らなくなった これならモリモリ増やしても大丈夫、多分
897 :
894 :2009/01/07(水) 00:02:12
>>895 reserveの範囲内でpush_backしてもアドレスは無効になるのですね
参考になりました。
ありがとうございました。
>>895 23.2.4.3
capacity超えない限り再確保は起きず、その場合
挿入位置より前の要素の参照とイテレータが有効なままなのは保証されている。
>>896 あんたにゃSTLは無駄だ。つーか、何を使ってもメモリリークさせそうだ。
せめてvector<shared_ptr<MyClass>>にしようよ……
shared_ptrはデカイからだめです。
ではptr_containerで
intrusive_ptrは?
>>904 struct X {
int a; // public
};
class Y {
int a; // private
};
#include<>と#include""の違いってなんですか!
<>は自身のディレクトリから参照してくれないんだっけかな
<>はincludeディレクトリ ""はソースと同じディレクトリかな?
class ClassA { protected: void func(); }; class ClassB : public ClassA { 〜〜〜 }; 上のような継承時にprotectedなメンバを publicに引きずり出す指定子があったような気がしたんですが、 なんて名前でしたっけ? 或いは継承元のメンバ関数を明示的に使わせる指定子だったかも?
< >は標準ヘッダで " "はその他のヘッダ かな
using
""でもincludeディレクトリから参照できるな
ありががとうございます。自作も標準も""で統一すれば解決ですね!
いやそこは意識して分けようよww
916 :
892 :2009/01/07(水) 17:20:24
jpeg_error_mgr を継承したエラーマネージャクラスに public な jmp_buf 持たせて、利用する側で setjmp し てエラーハンドラで longjmp させたらうまくいったっ ぽい(setjmp でエラー検出して例外投げる形)。 jmp_buf を隠してエラーマネージャで setjmp させると うまくいかないんだけど、ここは凝っても仕方ないので とりあえずこれでいいや。
逆に言うと<>はincludeパスからしか探さない 君が""で統一するのであれば、僕は君のヘッダファイル置き場に 秘密のコードを記したstdio.hを配置するとしよう
メモリを操作する最小単位はバイト。と書いてあるんですが、 何で型はBYTE,short,int,doubleしかないんですか? 24ビットとか、40ビットで数を表現したい場合はどうすればいいんですか?
大は小を兼ねるということで大きいのを選んでください。 あるいはビットフィールド。
24bitの場合だったら32bitの型を取り合えず使って、24bitまでマスクして3byteずつ保存。
STLとかいってめちゃくちゃすごくないですか? 他に有名なライブラリって何があるんですか?
ビットフィールド面白そうなので勉強してきます。ありがとうございます。
移植性無いけどな・・・
アドレス取れないしな・・・・
移植性のあるコードにすればいい
24ビットの型ってありそうでないよね
あるよ。 構造体なら。
そりゃそうだろww
>>921 次期C++にも一部採用され、準標準とも言われるboost。
__int64とdoubleって同じですか?
ちがいます
何を以って同じとするかによる
__int64 a; a = 123.456; a は 123 に丸められるってことですか? 不動小数点を指示しないといけないんですよね?
不動小数点ということは固定小数点か
不動小数点てw
間違えました、浮動です。 32bitのintとfloatも同じ32bitじゃないですか でもintに123.456入れると123になりますよね? 64ビット型に入れたら123になるのは__int64ってことですか?
暗黙型変換とサイズって関係ないと思うんだが。 int a = 123.456;でも__int64 a = 123.456f;でも両方とも123になる。
double a = 123.456; だと123.456 ですよね 浮動小数点型ってなんなんですか? もしかして型って、中ですごい複雑になってるんですか?
ずばり16ビットの不動小数点型の作り方を教えてください。
浮動小数点は工夫して有限精度の実数を表す方法の1つ。
intや__int64は整数型に分類されるので、実数を格納することができない。
>>939 C: typedef short float16_t;して、各種演算はCの演算子を使わず自前で行うこと。
C++: クラス作れ。あとはCと大体同じ。
そういう話になっちゃうんですね。 演算子とかオペレータとかできれば避けたかった部分ですが、これはもうやるしかないですね・・・ じっくり勉強します。ありがとうございました。 あともうひとつだけ教えてください。64ビットパソコンで32ビットパソコンで作ったintのあるプログラムを動かすと64ビットになっちゃいますよね。 それを避けるためには__int32を使っておけば大丈夫という理解であってますか?
64ビットパソコンでも int は32ビットなのが普通。 でも、必ずそうというわけでもない。詳しくは IPL64 でググれ。 というわけで、stdint.h の int32_t を使うのが良い。
どうもです!
「Numerical Recipes in C」という本のコードを使って逆行列を求めたいのですが main() から抜ける時にセグメンテーション違反が出て困っています GDB で様子を見たところ main() を抜けるまでは,通常通り動くのですが, return 文を実行してもプログラムが終了せずに (gdb) cont Continuing. Program received signal SIGSEGV, Segmentation fault. 0x00000008 in ?? () (gdb) cont Continuing. Program terminated with signal SIGSEGV, Segmentation fault. The program no longer exists. ↑みたいになります.どうしたものでしょうか..OTL
Numerical Recipes in C にはいくつもバグがある。 あんまりコードは信用せずにデバッグしよう。
#ifndef MACRO #define MACRO 777 #endif を #define_ifndef MACRO 777 みたいに一行で書く方法ってありますか。
ない
わかりました。ありがとうございます。
>>917 <> と "" の違いは実装依存だよ。
ただし "" に対する検索が失敗したときには同じ名前に対して <> に対する検索をすることと
だけ決まっている。
floatの有効7桁とはどういう意味なんでしょうか 表現範囲は10の38乗となってるので38桁ではないんでしょうか? 内部で38桁まで計算できて最終的に7桁にされるってことなんでしょうか? だとするとこの7桁は小数部分のことですよね?でないと整数部分も32ビットもあるから表現しきれないですよね
>>950 38桁の上位7桁にしか意味が無いということだろ
1.234567E38
7桁というか、ひとくくりにするなら実質6桁だと思うんだけど
ということは、 1234567.89012345 だと 1234567 になるってことですよね つまり、数値の小さい順に並べると char short float long int double long long ですね新発見です
1.234567 * 10^35 みたいな数字も表現できるってことだよ まあ詳しく知りたければIEEE754の浮動小数点数フォーマットを調べてみれ
それが本当なら確かにびっくりな新発見だ
理解できました。 char short long int long long float double でした。 ありがとうございます!
整数の正負を反転させる関数はありませんか?
* -1
単項-演算子でいいじゃない。 関数が必要なら自分で作れ。ただし、C++なら<functional>にnegateがある。
int a, b; a = -b; ってことですか? なんか頭の出来の問題なきがしてこなくもないですが、ありがとうです。
>>956 なんか全然理解できてない気がするよ……。
とりあえず「浮動小数点数」でぐぐっとけ。な。
c++のエディターで一番使いやすいのは何ですか?
>>963 やはりそうですか・・・
あれってc++の解説サイトのソースをそのまま乗せるとcoutが定義されてないって出ますよね・・・
std::を先につけるとできるんですがこれってなんとか省けませんか?
省けるけど、省かない方で慣れた方が幸せになれる。 どうせ std:: ってやったときに候補が出るし。
「C++のエディタ」って表現も凄いな。 それはさておき、using namespace std;。
ああ、教えてしまった。禁断の呪文を。 ヘッダファイルにだけは絶対書くなよ! お兄さんとの約束だ!
初心者の私には何言ってるのか全くわかりません・・・
俺も学びはじめのころはstd::うざいと思ってたけど 今は妙な名前衝突させないためにむしろ書かないと安心できない
>>964 それVisual C++特有の問題ではなく、現代のC++はそういうものと決まっているからだぞ。
#undef みたいに unusing が欲しいなと何度か思った。 まぁ{}でくくれってことなんだろうけど。 あと untypedef とか
uninlineは欲しいと何度も思ったが
コンパイラが勝手にインライン化するかもしれないのに何故w
>>974 関数へのポインタを static const で持つんだ!
>>974 そもそも inline 使いすぎなんじゃねーの。
例えばpimplの実装を.cpp内に書くとき 外部にインターフェースを公開するわけでもないのに わざわざメンバ関数の宣言と実装を別々に書くのがわずらわしいんだよ。 公開しない=固定する必要は無いわけで パラメータの変更とか内部使用の関数追加とかしょっちゅうだし。
>>978 ???じゃぁ別々に書かずにいっしょに書けばいいじゃん。
MAX_PATHっていうのは、終端文字も含めた長さなのか、そうでないのかどちらですか?
>>979 だからclass内に関数を書くと
強制的にinline指定したのと同じになるのが嫌だと言ってるんだろ?
もしかして日本語苦手?
それを知らなかっただけだろ
>>981 それは知ってるが、 .cpp 内でしか使わない関数が inline になって何かデメリットあんの?
>>981 class hoge {
:
private:
#include "hoge_privates.c" // お悩み解決!!
:
};
>>983 実装が複数のコンパイル単位に渡る
超巨大クラスたったんだよ!
速度なんか微塵も求められてない部分がinlineで肥大化する まさかとは思うけど、 実装が.cpp内にあるものは1箇所からしか呼ばれない、なんて思ってはいないよね
特にWin環境でスタック上にオブジェクトを確保して デストラクタやら例外処理コードやらが何回も詰め込まれたら もうメロメロですよ。
class内関数をインラインにしたくなかったらvirtualを付ければいいよ
VCならinlineのみインライン展開するってオプションがあるんだけどな
VC8では、pdbを生成せずにイメージにデバッグ情報を付加することはできますか?
VCのことはVCスレでやれよ
>>992 たらい回しでもう3回質問しました;;
半分諦め気味なのですがそちらでも聞いてみます。
ありがとうございます。
>>988 virtualを付けると実体がどこかに確保される、というだけで
コンパイル時にはそれとは別にinline展開されたコードが埋め込まれると思うよ。
大抵のコンパイラでは。
C++の規格ではvirtualな関数をinline展開することを禁止していないし
両方指定すること(class内に書いた関数にvirtualをつけること)も当然出来るから。
あ、でも、実体の型が明確に判明している時しか実際には展開できないね。 例えばpimplだったら、コンストラクタ内で呼び出しているものしか 実体の型は判別出来ないから、展開されないか。
>>981 は inline 関数が必ず inline 展開されるとでも思っているのだろうか・・・。
inline 展開を最適化するのも最適化の範疇だろ。
人間のアホな頭で考えるより、全部コンパイラ様に任せた方が良い。
失礼します コンストラクタについての質問なのですが C → B → A の順で自身のコンストラクタを呼び出すことは可能でしょうか? 可能であればどのように書けばよいか教えてください 下の例は簡略化しているので全パターン書いても大したことはないですが 実際のものはもう少し引数が増えます class hoge { int m_foo, m_bar; public: hoge(int foo, int bar) : m_foo(foo), m_bar(bar){} // A hoge(int foo) : hoge(foo, 100-foo){} // B hoge(void) : hoge(rand()){} // C }; ※これはコンパイルエラーになります
>>996 おまえはコンパイラが
「この部分は何百万回も呼び出されるから速度を優先」
「この部分は例外的な時にしか呼ばれないからサイズを優先」
といったことを判断できると思っているのか。
そりゃすげーや。
inline指定がヒントに過ぎないなんて誰でも知ってる。 どんな入門書にすら書いてある。
static宣言された関数と勘違いしてるのでは?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。