【初心者歓迎】C/C++室 Ver.62【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/12/13(土) 00:23:18ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.61【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1226347371/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0002デフォルトの名無しさん
2008/12/13(土) 01:27:010003デフォルトの名無しさん
2008/12/13(土) 02:07:16/ // | / /´ / j ヾ ヽ 〈{::|
! // | !/ / / /\ ', ヽ V
│ // | / //| / _ヽ l | j|
│ /.| |l ア メ / / /´ `、| ∨
', //| |! / ‐ 、 ´ ! ´__ l| |
ヽ/ | |,、‐'' "丶´ '´ ̄`ヾ| |
/ /| | | |
{ |/| | i │ ハ
∧ !l | | _ / | ヽ あらあら、またお会いしましたね
/ : :V│ |  ̄‐´ /| l \ 〉
/::: : /´ | |> 、 ,.ィl: : l ,' ヽ
/'"´ _\ | | : : : |` - 、 _,. ´ |l: / /\ /
レ '´ ヽ! |ヽ: : :| V / \>
| ハ::/rl ,. -''/ /ー-- 、ヽ
| l'´/ ノ / | ヽ / ___ -‐`ヘ、
,.、 -| | |'´ ̄` ー/ ! Y / ヽ ノ´ ヽ
,r " | l | | / /ノ レ -く_/ '
/ l !/ヘ| l | / ./ / j _/ ヽ |
/ ! / / | l、 | / ,. ::''´/ `/ ´ { │
/ V /:::::| |::::\| //::::::::::/ ノ ,.. - ''"´ ヽ ______
0004デフォルトの名無しさん
2008/12/13(土) 02:12:48/ // /| 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:緑川光)
0005デフォルトの名無しさん
2008/12/13(土) 05:40:52。 ゜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;,
0006デフォルトの名無しさん
2008/12/13(土) 10:31:250007デフォルトの名無しさん
2008/12/13(土) 11:46:31_/ ∠≠ニ二ニ≧=<´ ヘ. ', ヘ\ヽ. /
_ -‐ ´/ , -‐´、_, '⌒`^ 、 \::\ } 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'´ /::::::::/ヽ.
/ /:::::::レ'/ムヽ. /::::::::/ ヽ.
0008デフォルトの名無しさん
2008/12/13(土) 13:33:02Baseでvirtualを付けて定義した関数は、Deriveでもvirtualを付けたほうがいいのですか?
0009デフォルトの名無しさん
2008/12/13(土) 13:39:04必要に応じてつけたらいいよ
ライブラリで公開するときなんかは全部につけておかないと
派生したときにオーバーライド不能の関数になるっしょ?
でも、みんなで共同で開発してるときに全部の関数につけまくったら
今度は派生先でオーバーライドされてんのかどうなのかわからないし
あんまり付けまくらないほうがいいかもね
0010デフォルトの名無しさん
2008/12/13(土) 14:27:420011デフォルトの名無しさん
2008/12/13(土) 14:42:45JAVAで書かれたCコンパイラって無いのでしょうか?
0012デフォルトの名無しさん
2008/12/13(土) 14:43:34なにからなにまで間違ってる
0013デフォルトの名無しさん
2008/12/13(土) 14:45:310014デフォルトの名無しさん
2008/12/13(土) 14:46:43どちらでもいいよ。普通は冗長だから書かない。
0015デフォルトの名無しさん
2008/12/13(土) 14:54:29(誰かが作っているかもしれないので)あるかもしれないが、多分ない。
>>10
そもそもemlファイルはテキストだと思うのだが。
0016デフォルトの名無しさん
2008/12/13(土) 14:57:08?
0017デフォルトの名無しさん
2008/12/13(土) 15:10:04Javaでいうfinal?
0018デフォルトの名無しさん
2008/12/13(土) 15:10:54virtualの仕様を理解した上でいってるか?
0019デフォルトの名無しさん
2008/12/13(土) 15:25:51なぜそういうものをほしがるのかを書くと他の道が開けるかもしれない
00208
2008/12/13(土) 15:33:54基底クラスの仮想関数を、派生クラスでオーバーライドした時、
派生クラスではvirtualを書いても書かなくても同じように動く、で合っているでしょうか?
0021デフォルトの名無しさん
2008/12/13(土) 15:48:46あってる。
なので13はそういう意図で付けなくても強制力はない。
自分は付ける。設計を見直すときに仮想関数か否かぱっとみて分かったほうが便利だから。
0022デフォルトの名無しさん
2008/12/13(土) 16:36:48まぁ、どうやったとしても、結局はオーバーライドがらみって「正しく、詳しいドキュメントが存在する」必要があるんだけどさ。
0023デフォルトの名無しさん
2008/12/13(土) 16:48:32和音の出力でつまづいています。
MIDIフォーマット(SMF)は、♪の開始、♪の終了を指定して音を鳴らします。
例えばドの音は次のように鳴らします
時間0 ドの開始
時間10 ドの終了
(時間0とあるのは、前の音符からどれだけ経過してから音を鳴らすか)
ミも同様に
時間0 ミの開始
時間10 レの終了
しかし、これを和音にすると次のようになります
時間0 ドの出力
時間0 ミの出力
時間10 ドの停止
時間0 ミの停止
つまり、合成することによって、(同時に音がなるため)
ミの停止の前の時間が0になってしまいました。
このように、単音の場合を単純に合成したものが和音の出力にならないのですが
考えやすいやり方ってありますでしょうか
同じタイミングでなり始めたことを調べるため
♪の開始、♪の終了ではなく
♪の開始、♪の長さ、からなる中間データを考えてみましたが
中間データ→MIDIデータの箇所で結局つまづいてしまいました。
0024デフォルトの名無しさん
2008/12/13(土) 16:56:580025デフォルトの名無しさん
2008/12/13(土) 16:58:15そんなあなたにC++0x
クラスやメンバ関数に[[final]]を付けるとオーバーライドを禁止できるぞ!
0026デフォルトの名無しさん
2008/12/13(土) 17:02:340027デフォルトの名無しさん
2008/12/13(土) 17:04:19開始と終了を別々のイベントとして扱って、
イベントの時間は曲の先頭からの時間で表現すれば、
合成も簡単じゃね?
0028デフォルトの名無しさん
2008/12/13(土) 17:08:01出力直前に
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;
}
003023
2008/12/13(土) 18:20:17同じイベント時間に複数和音も入ることがあるので
map→multimapでうまく行きました。
0031デフォルトの名無しさん
2008/12/13(土) 23:21:38class Foo {
private:
typedef void (T::*func)();
};
というコードを見たのですが、これってどういう意味がありますか?
(コードとしてどういう使い道がありますか?)
0032デフォルトの名無しさん
2008/12/13(土) 23:31:39引数をとらず戻り値が void であるクラス T のメンバ関数へのポインタ型を
Foo<T>::func と書くことができる・・・かと思ったが、 private かよ。意味ねー。
0033デフォルトの名無しさん
2008/12/14(日) 00:19:360034デフォルトの名無しさん
2008/12/14(日) 00:58:240035デフォルトの名無しさん
2008/12/14(日) 02:18:57それにアクセスする時に使ってるんだろう
0036デフォルトの名無しさん
2008/12/14(日) 02:59:09class Foo<void> {
private:
typedef void (*func)();
};
0037デフォルトの名無しさん
2008/12/14(日) 08:35:08それやるならintやdoubleなど他の組み込み型の特殊化もやらんと不十分な気が。
メタテンプレートで組み込み型かどうか判断すれば一発でできそうだな。
まあ特殊化が必要かどうか分からんが。
0038デフォルトの名無しさん
2008/12/14(日) 14:36:050039デフォルトの名無しさん
2008/12/14(日) 14:36:37class Foo<int> {
private:
typedef void (*func)(int);
};
こういう意味け?
0040デフォルトの名無しさん
2008/12/14(日) 14:39:260041デフォルトの名無しさん
2008/12/14(日) 14:40:34~0u とか INT_MAX, UINT_MAX とか
(std::numeric_limits<int>::max)() とか (std::numeric_limits<unsigned int>::max)() とか
>>40
1 引けよ
0042デフォルトの名無しさん
2008/12/14(日) 14:42:42thx!
0043デフォルトの名無しさん
2008/12/14(日) 15:13:140044デフォルトの名無しさん
2008/12/14(日) 15:52:40pow の引数は結構オーバーロードされてるので
pow(2,32) だと解決できなくてコンパイルに失敗するはず。
古いコンパイラでなければ。
0045デフォルトの名無しさん
2008/12/14(日) 16:17:130046デフォルトの名無しさん
2008/12/14(日) 16:24:320047デフォルトの名無しさん
2008/12/14(日) 16:57:080048デフォルトの名無しさん
2008/12/14(日) 17:58:36但し1byteが8bitだという保障はない。
0049デフォルトの名無しさん
2008/12/14(日) 18:01:440050デフォルトの名無しさん
2008/12/14(日) 18:21:4532ビットの最大値って言ってるんだよ。
intの最大値じゃないし。
だいたい、intの最大値は (1 << (sizeof(int) * 8)) - 1 じゃ得られない。
0051デフォルトの名無しさん
2008/12/14(日) 18:23:29vector<自作構造体>にすると
わけわからんエラーがでます。
何でか教えてください。
#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());
}
0052デフォルトの名無しさん
2008/12/14(日) 18:25:12ベクターにつっんだあといろいろやるにはいくつかの演算子オーバーロードが必要
0053デフォルトの名無しさん
2008/12/14(日) 18:29:09エラーメッセージは?
0054デフォルトの名無しさん
2008/12/14(日) 18:29:440055デフォルトの名無しさん
2008/12/14(日) 18:34:280056デフォルトの名無しさん
2008/12/14(日) 18:35:210057デフォルトの名無しさん
2008/12/14(日) 18:35:27つまり、vectorは、自作構造体の比較の仕方なんて
シラネーヨってことか
10分で解決してしまったが、皆さんマジプロフェッショナルですねw
THY
struct note {
int a;
int operator==(const note& x) const { return a == x.a; }
};
0058デフォルトの名無しさん
2008/12/14(日) 18:38:20俺の昔のソースにはこんなのが残ってるけどこれってなんだっけ?
昔、入門書に書けって書いてあったからとりあえず入れておいたけど
いまみてもやっぱりワケワカランw
教えてエライ人!
BlockData(const BlockData &_BlockData);
const BlockData & operator=(const BlockData &_BlockData);
BlockDataは自作のクラスね
0059デフォルトの名無しさん
2008/12/14(日) 18:42:36コピーコンストラクタとコピー代入演算子の宣言。
privae に書いて代入を禁止するときにもよく使う。
あと、予約識別氏が入ってるから未定義動作とか。
0060デフォルトの名無しさん
2008/12/14(日) 18:42:44とりあえずprivateにおかれてるならコピー禁止
0061デフォルトの名無しさん
2008/12/14(日) 18:46:48ああ、つまり勝手にインスタンスを増やすようなコードを書くとエラーになるって奴ですね
なるほど・・・w
これは・・・たしかに書いておいたほうがいいかもしれないですね
ありがとうございました
勉強になりました
0062デフォルトの名無しさん
2008/12/14(日) 18:56:01それを private 継承するようにしとくと楽だでよ
006337
2008/12/14(日) 19:29:59いや、ちょっと違う。
36は34をうけて、組み込み型の場合は
typedef void (*func)(); に特殊化してコンパイルできるようにする意図と思った。
でも36はvoidしか特殊化していないので、不十分と思った。
で、組み込み型を全部特殊化するのは面倒なので、
メタテンプレートの組み込み型かどうか判断する方法を使えば
特殊化はひとつで済みそうだなと思った。
0064デフォルトの名無しさん
2008/12/14(日) 19:33:01}
でiの初期化部分を分岐する方法はありませんか?
for(if(Pos == 0)int i=0; else i=Pos-1; i<= Width+Pos; i++){
}
こんな感じで書きたいです
0065デフォルトの名無しさん
2008/12/14(日) 19:35:34つーか、単に
0xffffffffUL
でよくね?
0066デフォルトの名無しさん
2008/12/14(日) 19:36:27条件演算子
0067デフォルトの名無しさん
2008/12/14(日) 19:36:44i=0;
}else{
i=Pos-1;
}
for(i; i<= Width+Pos; i++){
}
0068デフォルトの名無しさん
2008/12/14(日) 19:37:07見辛れ〜
センス悪〜
ウンコ臭〜
0069デフォルトの名無しさん
2008/12/14(日) 19:39:240070デフォルトの名無しさん
2008/12/14(日) 20:01:52とすると警告レベル4だとwarning C4127: 条件式が定数です
が出ますが、pragmaを使わずに警告を消す事はできますか?
0071デフォルトの名無しさん
2008/12/14(日) 20:11:44コンパイラはなんや?
007237
2008/12/14(日) 20:19:25#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;
}
0073デフォルトの名無しさん
2008/12/14(日) 20:47:54while (1)は推奨されていない。for (;;)を使え。
0074デフォルトの名無しさん
2008/12/14(日) 20:53:40forで条件を省略するとなんで真扱いになるのか納得のいく説明を聞いたことがない
ifやwhileは条件省略するとコンパイルエラーだというのに
詳しい人教えて
0075デフォルトの名無しさん
2008/12/14(日) 21:04:26そう決められたから。なんせ、forはあっちこっち省略可能だ。
0076デフォルトの名無しさん
2008/12/14(日) 21:16:50B言語にfor文がないならC言語を作った人に
聞くしかないんじゃないかな。
0077デフォルトの名無しさん
2008/12/14(日) 21:33:59クラスの振る舞いはクラスが知ってわけで、クラス以外のものが勝手に決めたらダメだろ。
0078デフォルトの名無しさん
2008/12/14(日) 21:42:59何でもかんでも入れられたら、
void と int じゃ何か動きが違うのか? とか誤解を招く可能性があるので
void だけにしておいた。
何でもかんでも入れられる事が常に正しいというわけではないと思う。
0079デフォルトの名無しさん
2008/12/14(日) 21:43:330080デフォルトの名無しさん
2008/12/14(日) 21:45:32for で条件を省略すると真になると C/C++ の仕様で決められてるから。
これで納得できないわけが無いだろう。
for は3つの機能が複合されている文だが、
常にその全てが必要になるとは限らない。
そういうことで、それぞれ省略できるように作られているんだろう。多分。
0081デフォルトの名無しさん
2008/12/15(月) 07:34:010082デフォルトの名無しさん
2008/12/15(月) 15:48:320083デフォルトの名無しさん
2008/12/15(月) 15:54:580084デフォルトの名無しさん
2008/12/15(月) 16:22:55iに絶対値?を足したり引いたりする関数ってありますか?
0085デフォルトの名無しさん
2008/12/15(月) 16:26:46アセンブラレベルで分岐しないでって事?
0086デフォルトの名無しさん
2008/12/15(月) 16:35:08今のところ実現できる方法は
if(i < 0)
i - 10;
else
i + 10;
でこれを
i + 絶対値関数(10);
もしくは
i - 絶対値関数(10);
内部で一生懸命やってようが気にしないです。書いたときに綺麗なのがいいんですが、
i + abs(10);
とできるんでしょうか?
0087デフォルトの名無しさん
2008/12/15(月) 16:35:30こんな感じか? いろいろ環境依存だけど
0088デフォルトの名無しさん
2008/12/15(月) 16:37:59単に1行で書きたいというだけなら
i + (i < 0 ? -10 : 10)
とか
0089デフォルトの名無しさん
2008/12/15(月) 16:38:05関数を自作すればいいじゃない
0090デフォルトの名無しさん
2008/12/15(月) 16:46:030091デフォルトの名無しさん
2008/12/15(月) 17:05:22cppファイルなし、クラスなしで、hファイルに関数をインライン付けてどんどん追加していって
使う時にプロジェクトにインクルードする流れでいいんですよね?
0092デフォルトの名無しさん
2008/12/15(月) 18:21:475000行が限界とか、10万行までいけるとかでいいんで教えてください。だいたいですだいたい
0093デフォルトの名無しさん
2008/12/15(月) 18:34:36アセンブラで3000万行
C#のコードで1000行
安全をとって100行以内
0094デフォルトの名無しさん
2008/12/15(月) 18:36:001フレーム描画に間に合う処理量と言うことなら、描画内容次第でしょう。
因みに、私が書いたコラムスクローンは約1000行です。
知り合いが書いたテトリスクローンは約5000行だそうです。
0095デフォルトの名無しさん
2008/12/15(月) 19:05:41何行でもいいから、フレームにおさまればそれでいいじゃない。
0096デフォルトの名無しさん
2008/12/15(月) 19:12:58俺、タイピング遅いし。
0097デフォルトの名無しさん
2008/12/15(月) 19:22:18それって、使ってるCのライブラリ関数やOSのAPIの中の行数もカウントしなければならないと思うんだが、
どうやって数える気だ?
0098デフォルトの名無しさん
2008/12/15(月) 19:45:31俺はゲームとか作ったことないから分からんが、APIの中の行数がどうとかいうのはあまりに的はずれであることは分かる。
0099デフォルトの名無しさん
2008/12/15(月) 19:49:47レンダリングが100行もあったら大事じゃないか。
0100デフォルトの名無しさん
2008/12/15(月) 19:54:47アセンブラで3000万行というのもおかしな話だなあとおもう。
0101デフォルトの名無しさん
2008/12/15(月) 19:59:20一行で時間のかかる処理もあるし
ループなんかもあるし
行数が意味のないことであることも分かってほしい
0102デフォルトの名無しさん
2008/12/15(月) 20:20:53時と場合による。
しかし、サボらないでcppとhファイルを1対で扱った方がいいとは思う。
0103デフォルトの名無しさん
2008/12/15(月) 20:23:31それで処理落ちがするかどうかは知ったことじゃないが。
これでおk
0104デフォルトの名無しさん
2008/12/15(月) 20:32:28絶対値と符号とに分けて扱えばいい。
0105デフォルトの名無しさん
2008/12/15(月) 21:20:200106デフォルトの名無しさん
2008/12/15(月) 21:35:20どんだけ遅いんだよw
0107デフォルトの名無しさん
2008/12/15(月) 21:36:010108デフォルトの名無しさん
2008/12/16(火) 00:54:24関数strncpy(s1, s2, n)についてなのですが、
引数nはs1の長さですか、それともs1の長さとは関係のない値ですか。
0109デフォルトの名無しさん
2008/12/16(火) 00:58:190110デフォルトの名無しさん
2008/12/16(火) 00:59:44s1の指す領域のサイズにあわせる必要があればそうして下さい。
そうでなければ必要な値にすることも出来ます。
0112デフォルトの名無しさん
2008/12/16(火) 12:52:56int main(void){
int a[3][5] = {・・・
disp(&a);
・・・
}
void disp(int p[][5]){
・・・
}
これをVC++2008でコンパイルすると「'int [5]' から 'int [][1]' に変換できません。(新しい機能 ; ヘルプを参照)」
とエラーが出ます
ヘルプを見てもそれらしい事は載ってなかったのですが、これはどういう問題ですか?
0113デフォルトの名無しさん
2008/12/16(火) 12:57:36×disp(&a);
○disp(a);
0114デフォルトの名無しさん
2008/12/16(火) 13:03:440115デフォルトの名無しさん
2008/12/16(火) 13:05:08断片でなく、エラーを再現できる最小限のソースを張ってくれたまえ。
0116112
2008/12/16(火) 13:09:390117デフォルトの名無しさん
2008/12/16(火) 13:26:090118デフォルトの名無しさん
2008/12/16(火) 13:29:08まあ、もう少し落ち着いて質問しなよって思うけどねー
0119デフォルトの名無しさん
2008/12/16(火) 13:32:480120デフォルトの名無しさん
2008/12/16(火) 14:20:040121デフォルトの名無しさん
2008/12/16(火) 14:25:480122デフォルトの名無しさん
2008/12/16(火) 14:30:010123デフォルトの名無しさん
2008/12/16(火) 14:30:220124デフォルトの名無しさん
2008/12/16(火) 14:41:190125デフォルトの名無しさん
2008/12/16(火) 14:58:18分岐一つからSwitchはどう?おなじこと?
0126デフォルトの名無しさん
2008/12/16(火) 15:02:46分岐予測ミスがパフォーマンスに響くからとかいう理由ならswitchでも同じことだし
0127デフォルトの名無しさん
2008/12/16(火) 15:09:38switchは若干パフォーマンス良くなかったか?
同じ値を比較するのにelseif使ってるならswitchの方が良かった気がする。
最適かかかると同じかもしれん。違っても体感できないほどの差だろうけど
0128デフォルトの名無しさん
2008/12/16(火) 15:11:57Aというクラスに、private変数aaaを定義し、
Aクラスから、test1、test2というスレッドを作った場合
test1で変数aaaを操作したら
test2のスレッドでもaaaの内容は変更されるのでしょうか?
0129デフォルトの名無しさん
2008/12/16(火) 15:13:110130128
2008/12/16(火) 15:27:31変わってしまうのですね。。
その場合同じアドレスを指しますよね
0131デフォルトの名無しさん
2008/12/16(火) 15:48:38今時のコンパイラなら、あんたがうだうだ考えるよりももっと適切に最適化してくれる。
結論:
ifを使うかswitchを使うかは保守性を考慮しつつ、見易さ重視でよい。
0132デフォルトの名無しさん
2008/12/16(火) 15:56:080133デフォルトの名無しさん
2008/12/16(火) 15:58:58ヘッダーファイルで
class A
{
class B
{
void test();
}
}
と書いた場合、ソースファイル側でclass Bのtestを定義するにはどうしたら良いのでしょうか?
0134デフォルトの名無しさん
2008/12/16(火) 16:02:23{
.......
}
0135デフォルトの名無しさん
2008/12/16(火) 16:04:25何で気がつかなかったんだろうw
ありがとうございます!
0136デフォルトの名無しさん
2008/12/16(火) 16:14:23例えば分岐先が合計4つで分岐確率が等分だった場合はテーブルになるswitchの方がいい。
これがもし60%、25%、10%、5%なんて並びだったら分岐予測の分ifの方がいい。
特定の一つが80%で、20%を残りが等分とか偏りがあるならifの後にswitch。
ジャンプテーブルだと常に予測ミス状態だからCPUの分岐ミスと相談して決めるしかないけど、
これらが致命的にかかってくる処理ってそう多くはないんだよな。
0137デフォルトの名無しさん
2008/12/16(火) 16:38:54>>131
0138デフォルトの名無しさん
2008/12/16(火) 16:40:000139デフォルトの名無しさん
2008/12/16(火) 17:24:000140デフォルトの名無しさん
2008/12/16(火) 18:50:260141デフォルトの名無しさん
2008/12/16(火) 18:58:410142デフォルトの名無しさん
2008/12/16(火) 19:24:330143デフォルトの名無しさん
2008/12/16(火) 19:31:42意味的に分かりやすいほう
0144デフォルトの名無しさん
2008/12/16(火) 19:33:25デカイ式が入っていても最適化されるんですか?
0145デフォルトの名無しさん
2008/12/16(火) 19:51:190146デフォルトの名無しさん
2008/12/16(火) 19:53:360147デフォルトの名無しさん
2008/12/16(火) 20:04:19昨日も質問しましたが・・・
自分でこんなプログラムを作ってみました。
#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以降がなぜそうなるのかわかりません。
教えてください。
0148デフォルトの名無しさん
2008/12/16(火) 20:06:48メモリぶっ壊して暴走寸前
0149デフォルトの名無しさん
2008/12/16(火) 20:15:08むちゃくちゃしてるのはわかるか?
その上で内部がどうなってるのか説明を求めてるのか?
0150デフォルトの名無しさん
2008/12/16(火) 20:19:25s1、s2のどちらよりも短くないとだめだよ。
0151デフォルトの名無しさん
2008/12/16(火) 20:24:14s1を突き抜けて表示しただけでは?
0152デフォルトの名無しさん
2008/12/16(火) 20:30:560153デフォルトの名無しさん
2008/12/16(火) 20:34:160154デフォルトの名無しさん
2008/12/16(火) 20:37:04頭冷やしてくる。
0155デフォルトの名無しさん
2008/12/16(火) 20:58:250156デフォルトの名無しさん
2008/12/16(火) 21:15:22それを言おうとしたが言い方を間違えたのが>>152だろ
0157デフォルトの名無しさん
2008/12/16(火) 21:18:23ごめんリロードしたつもりがしてなかったんです
0158デフォルトの名無しさん
2008/12/16(火) 22:26:260159デフォルトの名無しさん
2008/12/16(火) 22:30:02アドレス空間自体が32bitなので、オーバーフローして反対側から出てくる。
0160デフォルトの名無しさん
2008/12/16(火) 22:30:540161デフォルトの名無しさん
2008/12/16(火) 22:34:32pow(2,32)って32bitPCだと無理なの?
0162デフォルトの名無しさん
2008/12/16(火) 22:35:49なにをいまさらw
即レスでオーバーフローとか言われてただろ
0163デフォルトの名無しさん
2008/12/16(火) 22:38:140164デフォルトの名無しさん
2008/12/16(火) 22:38:45でも正常に動いてるんだけど内部でも絶対扱えてないの?
0165デフォルトの名無しさん
2008/12/16(火) 22:45:31すいませんこれ
(((*pv8)[(*pVec)[i*2+0]][si.nPos]) <= ((*pVec)[i*2+1]))
<=の左右式ごとにカッコでくくらないとまずいですか?
0166デフォルトの名無しさん
2008/12/16(火) 22:45:350167デフォルトの名無しさん
2008/12/16(火) 22:47:190168デフォルトの名無しさん
2008/12/16(火) 22:49:42そんだけ書けててわからないのがそこかよ・・・
0169デフォルトの名無しさん
2008/12/16(火) 22:54:420170デフォルトの名無しさん
2008/12/17(水) 00:00:340171デフォルトの名無しさん
2008/12/17(水) 00:16:43((*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]))
こうされたらどうしようとか
そう思うのは逆に珍しいので、どう悩んだのか教えてもらえると、今後他の人に
教える時に役に立つかもしれない。
0172デフォルトの名無しさん
2008/12/17(水) 01:56:35以下のプログラムを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;
}
0173デフォルトの名無しさん
2008/12/17(水) 02:13:46死ね
0174デフォルトの名無しさん
2008/12/17(水) 02:49:160175例外
2008/12/17(水) 04:37:19書いたら例外を投げてることが分かるという利点と、
例外の種類が多くなるとソースが長くなると言う欠点があると思うのですが、
関数定義にthrowは書いたほうがいいのでしょうか?
0176デフォルトの名無しさん
2008/12/17(水) 05:15:090177デフォルトの名無しさん
2008/12/17(水) 06:11:08std::codecvtの使い方、および説明された書籍、URLなどを教えてください。
特に、~codecvt()がvirtualな理由を知りたい。
std::localeからの利用を意図し、std::codecvt自体はインターフェースなのか?
環境はVC90及びgcc4を想定。
説明用サンプルソースなどもあればよろしく。
以上よろしくお願いします。
0178デフォルトの名無しさん
2008/12/17(水) 06:17:00~codecvt()がprotectedな理由を知りたい。
0179デフォルトの名無しさん
2008/12/17(水) 07:42:01デストラクタが protected な場合は
派生クラスだけ作れるようにしたい場合じゃね。
0180デフォルトの名無しさん
2008/12/17(水) 08:21:22例外仕様のことだね?
例外を投げないことを示す throw () 以外は付けないのが C++ での流儀として定着しつつある。
0181デフォルトの名無しさん
2008/12/17(水) 09:04:59それは流儀というより、実用上仕方なくでわ?
0182デフォルトの名無しさん
2008/12/17(水) 09:33:17しかしそうは書かないから流儀って言ってんじゃね?
0183デフォルトの名無しさん
2008/12/17(水) 09:37:56たとえば Java のチェック付き例外仕様が使えたとしても、使う使わないの
それぞれにどっちが良いとも言いきれないようなメリット・デメリットがある。
後発の言語で同様のチェック付き例外仕様を採用した言語が少ない(無い?)ことから
考えても、「仕方なく」という感じはしない。
0184デフォルトの名無しさん
2008/12/17(水) 10:15:02throw(投げる例外)を付けるとエラー吐くコンパイラがあるからだと思うけどね。
もちろんそのコンパイラが標準C++に準拠していなければ、その仕様で正しい。
というか、時代的に仕方なかった。
と、俺は思う。
一方、仕方なくではなく単なる流儀だとした場合、つけるデメリットって何?
そしてつけないメリットって何?
0185デフォルトの名無しさん
2008/12/17(水) 10:23:58マンドクセ
付けないメリット
マンドクサくない
0186デフォルトの名無しさん
2008/12/17(水) 10:24:08読んどけ。
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 年なんだな。いいかげんに対応する日本語の文書がほしいところだ。
0187デフォルトの名無しさん
2008/12/17(水) 10:25:15ベンダーがあるけどな。
C++自体終わってるんじゃないか?
0188デフォルトの名無しさん
2008/12/17(水) 10:32:46Javaの資料だけど、後発の言語が導入しない理由を知るにはちょうど良いかと。
0189デフォルトの名無しさん
2008/12/17(水) 10:35:02C# の話もわかりやすい。
0190デフォルトの名無しさん
2008/12/17(水) 10:39:41これは全く別の話だ。
0191デフォルトの名無しさん
2008/12/17(水) 15:43:420192デフォルトの名無しさん
2008/12/17(水) 15:44:080193デフォルトの名無しさん
2008/12/17(水) 15:52:13たとえば次のようなコードがあったとします
class ClassA{
public:
ClassB cB;
//他の記述
};
class ClassB{
public:
ClassA cA;
//他の記述
};
とした場合、ClassAではClassBより先に書いているのでcBは作ることが出来ないのということで、
もし、どちらもクラス内部で、inline関数として書きたい場合は、あきらめてヘッダーでクラスを書いてその後に
inline void ClassB::関数名...
としていくしかないのでしょうか?
0194デフォルトの名無しさん
2008/12/17(水) 16:02:200195デフォルトの名無しさん
2008/12/17(水) 16:11:37無限ループってこわくね?
0196デフォルトの名無しさん
2008/12/17(水) 16:27:57先に〜に関しては
class ClassB;
で解決するが、それでも>>195
の言っている状況になるのでポインタで持つしかない
(いやほかの手もあるけどさ)
0197デフォルトの名無しさん
2008/12/17(水) 17:27:580198デフォルトの名無しさん
2008/12/17(水) 18:10:36MK_CONTROL+ MK_LBUTTON
と書かないで
if(MK_CONTROLが含まれているか?)
{
}
これどう書けばいいんでしょうか?
0199デフォルトの名無しさん
2008/12/17(水) 18:11:37てかフラグを足し算するな
0200デフォルトの名無しさん
2008/12/17(水) 18:24:100201デフォルトの名無しさん
2008/12/17(水) 18:30:31{
}
こうですか?
0202デフォルトの名無しさん
2008/12/17(水) 19:03:13これ異常部分だけ初期化終了とかさせられないんですか?
立ち上げなおしてバグのところまでいくのも一苦労なんですが・・・
アザートが多すぎて泣きそうです
0203デフォルトの名無しさん
2008/12/17(水) 19:13:11本当にC/C++の質問ならコード片を貼るなどしてもっと分かるように言え
0204デフォルトの名無しさん
2008/12/17(水) 20:01:57そうですよ。
>>202
ASSERTをコメントアウトするか、ASSERTが
出ないようにプログラミングすればよいと思うよ。
エラーが発生して終了したら、別プロセスで監視しておいて
再起動をかけるのも有用な対策の一つだよ。
0205デフォルトの名無しさん
2008/12/17(水) 20:20:41returnだと全部抜けるし
breakとcontinueの違いがよくわかりません。
:
goto a;
:
:
gotoPoint a;
:
のようなことはC++では出来ないんでしょうか?
0206デフォルトの名無しさん
2008/12/17(水) 20:21:19ありがとうございます!
0207デフォルトの名無しさん
2008/12/17(水) 20:27:13コンパイラ:gcc
コンパイルすると
無効なプリプロセスディレクティヴ #!
ってでるんですがどうすればエラー消えるでしょう?
0208デフォルトの名無しさん
2008/12/17(水) 20:28:300209デフォルトの名無しさん
2008/12/17(水) 20:34:21俺はif文がネストする場合の2段目以降のif文だけかな。詰めて書くのは。
大抵そうしてる。
0210デフォルトの名無しさん
2008/12/17(水) 20:37:46gotoあるよ
continueはループの中で使うよ
0211デフォルトの名無しさん
2008/12/17(水) 20:39:21C++でもgoto文あるよ。
continueとbreakの違いと使い分けも考え付かない程度なら
絶対使わないぐらいの考えでプログラムしといたほうがいいと思うけど。
0212デフォルトの名無しさん
2008/12/17(水) 21:05:32確認する方法ってないでしょうか?
0213デフォルトの名無しさん
2008/12/17(水) 21:12:20const で宣言されていようがメンバをいじれないと困る。
だから確認する必要も無いし、確認する方法も用意されていない。
0214デフォルトの名無しさん
2008/12/17(水) 21:21:000215デフォルトの名無しさん
2008/12/17(水) 21:29:160216デフォルトの名無しさん
2008/12/17(水) 21:39:25多重ループ脱出くらいしか使い道ないな
0217175
2008/12/17(水) 21:40:15返信ありがとうございます。
throw(A)と書くとエラーを出すコンパイラもあるんですね。
例外を投げないことを明示したい場合以外は宣言にthrow(A)を書かないことにします。
0218デフォルトの名無しさん
2008/12/17(水) 21:46:430219デフォルトの名無しさん
2008/12/17(水) 23:26:03なんで足し算しちゃだめなの?どういう不具合がある?
0220デフォルトの名無しさん
2008/12/17(水) 23:42:43MK_CONTROLやMK_LBUTTONが実際には複数のビットの組み合わせで、
それに重複がある場合は、足し算すると繰り上がって予期せぬビットが立つ可能性がある
フラグはビット演算子で扱うのが基本
0221デフォルトの名無しさん
2008/12/17(水) 23:45:36というものを書いた場合、Shiftも押されてた場合はどうするのってなる
0222デフォルトの名無しさん
2008/12/18(木) 00:00:56MK_* が互いにビット位置の重複がないという保証があって、尚且つ最上位ビットをマスクして
比較できるという条件がなきゃ使えないから。
0223デフォルトの名無しさん
2008/12/18(木) 00:32:030224デフォルトの名無しさん
2008/12/18(木) 00:43:38それはありじゃないか。少なくとも少し前にパフォーマンス比較したら
exception 関係入れて測定できるほど実行速度落ちた経験ある。
0225デフォルトの名無しさん
2008/12/18(木) 09:06:36try catchを頻繁に通過するとか、例外が頻繁に発生してるとか
throw用の一時オブジェクトを例外が発生しなくても生成してたりとか…
0226デフォルトの名無しさん
2008/12/18(木) 15:55:43throwしたときだけ専用のフローに入ると思ってるんだけど。
0227デフォルトの名無しさん
2008/12/18(木) 16:15:14.h
クラス名 obj(引数1, 引数2);
こうしないで
.h
クラス名 obj;
.cpp
obj(引数1, 引数2);
こうしたいのですが
0228デフォルトの名無しさん
2008/12/18(木) 16:24:51今どき、グローバル変数を使ってると嫌われるよ。
0229デフォルトの名無しさん
2008/12/18(木) 16:27:29関数と同じでスタック積んでたと思う
じゃないと例外発生時にジャンプ先が分からない
0230229
2008/12/18(木) 16:57:16まず、関数内にtry catchがある場合、関数実行時にアセンブラで5命令位増える
tryやcatchの数を増やしてもそれ以上命令数は増えない
次にtry実行時、mov命令で整数値を何所かに書き込んでる
try毎に同じ場所に違う値を書きこんでいるため、これを元にthrow時に現在のブロック化を特定している
throwでは関数をコールしているので、try時にセットした値をもとにブロックを特定し、
catchを順次検索して型が当てはまる場所へジャンプしていると思われる
実装依存の可能性もあるけど大体はこんな感じかと
以上、参考になれば。
0231デフォルトの名無しさん
2008/12/18(木) 16:58:38多分、setjumpと同じ様な事をしていると思う。
0232デフォルトの名無しさん
2008/12/18(木) 17:01:450233デフォルトの名無しさん
2008/12/18(木) 17:13:53externをつけたんですが、ストレージクラスが正しくないと出てコンパイルできません
やりたいのはこれです。
.h
extern CPen pen;
.cppのコンストラクタ内
pen = pen(PS_SOLID, 1, RGB(0,0,0) );
0234デフォルトの名無しさん
2008/12/18(木) 17:19:19↓
pen = CPen(PS_SOLID, 1, RGB(0,0,0) );
0235デフォルトの名無しさん
2008/12/18(木) 17:20:260236デフォルトの名無しさん
2008/12/18(木) 17:20:310237デフォルトの名無しさん
2008/12/18(木) 17:21:390238デフォルトの名無しさん
2008/12/18(木) 17:22:170239デフォルトの名無しさん
2008/12/18(木) 23:04:43class A
{
void Func()
{
if(B::pC != NULL)
{
B::pC = CClassC();
}
}
};
class B
{
CClassC* pC;
B(){ pC=NULL; }
};
0240デフォルトの名無しさん
2008/12/18(木) 23:09:23>これifのpCにNULLもポイントも入ってないんですがなんでですか?
何を根拠にそう判断したのかね。
0241デフォルトの名無しさん
2008/12/18(木) 23:10:320242デフォルトの名無しさん
2008/12/18(木) 23:42:31コンパイルが通らないようなコードでは、何が言いたいのか分からないとしか言いようがない……。
0243デフォルトの名無しさん
2008/12/19(金) 00:23:08>241>242には私に見えない何かが見えているのだろうか。
0244デフォルトの名無しさん
2008/12/19(金) 00:33:32pCの値をチェックしたタイミングがいつなのか謎過ぎるがNULLも有効なアドレスも入ってない訳無いだろ。チェックの仕方がおかしいんじゃないか?
あとB::pCっていうのは、一回変数を作ってb.pCみたいにしないと駄目。
そしてさらにpCはポインタだから*(b.pC) = CClassC();ってしなくちゃ。
ポインタがどういう物なのか分かってる?
0245デフォルトの名無しさん
2008/12/19(金) 00:53:28class Aでclass Bを参照しているのに定義が後
friend classでもないのにBのprivate要素をAが参照
static memberじゃないpCをstaticのごとく使っている
これが間違い「だらけ」じゃなければ、いったいなんだというのだ?
そもそもオマエは他人のフリをした239じゃないのか?
0246デフォルトの名無しさん
2008/12/19(金) 00:58:470247デフォルトの名無しさん
2008/12/19(金) 01:08:08privateだのstaticだのは省略されてるだけでしょ
それくらい汲み取れるだろ
0248デフォルトの名無しさん
2008/12/19(金) 01:14:200249デフォルトの名無しさん
2008/12/19(金) 01:16:04最低限コンパイルが通る形にしてから質問しろ。
質問する側もそうやれば自分で問題点が見えてくるだろ。
0250デフォルトの名無しさん
2008/12/19(金) 01:34:000251デフォルトの名無しさん
2008/12/19(金) 01:55:450252デフォルトの名無しさん
2008/12/19(金) 01:57:28オマエが他人に問題点を伝えられてないだけ。
ちゃんとコンパイルが通る形で書いて来い。
0253デフォルトの名無しさん
2008/12/19(金) 02:06:270254デフォルトの名無しさん
2008/12/19(金) 02:15:040255デフォルトの名無しさん
2008/12/19(金) 02:15:200256デフォルトの名無しさん
2008/12/19(金) 02:23:43{
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という事に気づきました。
再帰というのは、引数の値を初めて呼び出された時と同じように
とっておくのでしょうか?
0257デフォルトの名無しさん
2008/12/19(金) 02:38:38再帰の場合、繰り返し使われるのは関数内の実行コードとstatic変数だけ。
自動変数の類(引き数も含む)は関数の呼び出し毎にスタックに積まれて、
上位の関数に戻るまではキープされるよ。
0258デフォルトの名無しさん
2008/12/19(金) 03:06:220259デフォルトの名無しさん
2008/12/19(金) 04:43:32それならループでまわしてある程度の近似を行えばいいかなあと
0260デフォルトの名無しさん
2008/12/19(金) 09:39:56もう知障のコピペに反応するのやめないか?
0261デフォルトの名無しさん
2008/12/19(金) 09:46:110262デフォルトの名無しさん
2008/12/19(金) 10:23:53inline D3DXVECTOR3 *InitPos() { return &m_initpos; }
同じクラスの中にこういう関数が2つあるのですが
両方InitPosという部分が同じなのですが例えば、
CModell::InitPos(m_lastpos);
とした場合上の関数だけが適用されるのですか?
説明不足ですいません;;
0263デフォルトの名無しさん
2008/12/19(金) 10:31:06>同じクラスの中にこういう関数が2つあるのですが
関数オーバーロードだね。
>上の関数だけが適用されるのですか?
おっしゃる通りです。
0264デフォルトの名無しさん
2008/12/19(金) 10:35:27ありがとうございます
0265デフォルトの名無しさん
2008/12/19(金) 17:17:37イテレータを値として保存した場合、元のstd::listの要素に変更があった時に
その保存したイテレータは同じ値を指すことは保障されるのでしょうか?
0266デフォルトの名無しさん
2008/12/19(金) 17:29:480267デフォルトの名無しさん
2008/12/19(金) 17:58:350268デフォルトの名無しさん
2008/12/19(金) 18:41:280269デフォルトの名無しさん
2008/12/19(金) 18:44:00多重ループ抜けるのに、あるひとはフラグを使い
ある人はgotoを使い、またある人は
その部分を別関数にして return で抜ける。
0270デフォルトの名無しさん
2008/12/19(金) 19:15:13けど多人数の人が一緒に開発とかやってるときは「ソースの読みやすさ」が最優先されるからまったく使わないな…
0271デフォルトの名無しさん
2008/12/19(金) 19:30:59それ以外の場合はよっぽどのことが無い限り使わない。
それ以外ではただの1度しか使った事無い。
0272デフォルトの名無しさん
2008/12/19(金) 19:47:43for{
if{
break;
これは2段目のforをキャンセルして、1段目のforを続行してくれるんですか?
breakじゃなくてcontinueにすれば2段目のforを実行してくれるんですよね?
0273デフォルトの名無しさん
2008/12/19(金) 19:49:340274デフォルトの名無しさん
2008/12/19(金) 19:49:540275デフォルトの名無しさん
2008/12/19(金) 19:50:28>>274
ムラサメ研究所乙
0276デフォルトの名無しさん
2008/12/19(金) 19:50:40gotoはまた今度にします
まだいけそうです
0277デフォルトの名無しさん
2008/12/19(金) 19:51:38そうですw
0278デフォルトの名無しさん
2008/12/19(金) 20:15:15start: ;
for{
for{
if{
goto start;
}else{
goto end;
}
}
}
end: ;
ですね。勉強になりました。
0279デフォルトの名無しさん
2008/12/19(金) 20:22:47静的なグローバル関数として別に作って、メンバ関数はそいつを呼ぶだけのほうが効率がいい?
0280デフォルトの名無しさん
2008/12/19(金) 20:25:160281デフォルトの名無しさん
2008/12/19(金) 20:39:07かえって効率悪くなる。
0282デフォルトの名無しさん
2008/12/19(金) 21:07:00start の方は普通使わないな。
0283デフォルトの名無しさん
2008/12/19(金) 21:49:25メンバ関数はthisが見えない引数で与えられてるだけで、普通の関数と一緒。
0284279
2008/12/19(金) 22:14:02素直にメンバに書きましゅ
0285デフォルトの名無しさん
2008/12/20(土) 00:34:23設計を見直すべき。お前には無理だろうけど。
0286デフォルトの名無しさん
2008/12/20(土) 00:39:01まず処理単位ごとに関数分割しろ
その上で、クラス自身の振る舞いはメンバ関数に、そのクラスを使って何かしたいという処理は
グローバル関数なりインスタンスを管理してるクラスのメンバ関数に書いたりするもんだ
0287デフォルトの名無しさん
2008/12/20(土) 00:48:20趣味プログラマに設計うんぬんいうな
0288デフォルトの名無しさん
2008/12/20(土) 00:58:560289デフォルトの名無しさん
2008/12/20(土) 01:03:55趣味だからこそ、納得いくまで設計練れるんだろ。
0290デフォルトの名無しさん
2008/12/20(土) 01:10:570291デフォルトの名無しさん
2008/12/20(土) 01:14:260292デフォルトの名無しさん
2008/12/20(土) 01:17:43ひどい品質のプログラム作ってんだよな・・・
0293デフォルトの名無しさん
2008/12/20(土) 01:19:22それどころか馬鹿を見るし
0294デフォルトの名無しさん
2008/12/20(土) 01:19:410295デフォルトの名無しさん
2008/12/20(土) 01:20:580296デフォルトの名無しさん
2008/12/20(土) 01:28:020297デフォルトの名無しさん
2008/12/20(土) 02:25:32リファクタリング工数なんて理解されないよ!
0298デフォルトの名無しさん
2008/12/20(土) 02:42:02class 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には参照戻しの効果がでていませんが。)
0299デフォルトの名無しさん
2008/12/20(土) 03:20:430300デフォルトの名無しさん
2008/12/20(土) 03:23:510301デフォルトの名無しさん
2008/12/20(土) 12:18:410302デフォルトの名無しさん
2008/12/20(土) 12:35:45○初期化
0303デフォルトの名無しさん
2008/12/20(土) 15:43:12デバッグ工数と言って工数とりゃいいんだよ。
0304デフォルトの名無しさん
2008/12/20(土) 15:45:280305デフォルトの名無しさん
2008/12/20(土) 17:27:02hoge.h
dir
hoge.cpp
hoge.h
みたいに、サブディレクトリに同名のソースがあるとうまくリンクできないんですが
C++はそういうものなんですか
0306デフォルトの名無しさん
2008/12/20(土) 17:36:17ユニークなオブジェクトとしてコンパイルしてリンクすれば解決できます。
コンパイラに文句を言うか、自分でMakefileを書きましょう。
それが嫌なら、ユニークなファイル名にするとよいことがあるかも知れません。
0307デフォルトの名無しさん
2008/12/20(土) 17:44:38フリーのコンパイラなのであきらめて違うファイル名にすることにしました。
0308デフォルトの名無しさん
2008/12/20(土) 17:46:19ファイル名変えるのが一番手っ取り早いが、
無理ならオブジェクトファイル名を両者で変更するよう設定いじれ。
0309デフォルトの名無しさん
2008/12/20(土) 18:55:57{
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;
}
としたほうがいいんでしょうか?
0310デフォルトの名無しさん
2008/12/20(土) 19:02:590311デフォルトの名無しさん
2008/12/20(土) 19:06:13すべてとことんまで実測しようと思います。
0312デフォルトの名無しさん
2008/12/20(土) 19:07:19>a = a+b
これさっぱりわからないんだけど
上のは
a = a+func();
の間違い?
0313デフォルトの名無しさん
2008/12/20(土) 19:09:04勝手に最適化されて変わんないとかいう可能性も考慮したほうがいい希ガス
0314デフォルトの名無しさん
2008/12/20(土) 19:11:47そうでした。すいません。関数は遅いから一回にするということでした。
0315デフォルトの名無しさん
2008/12/20(土) 19:16:59なんか最近こればっか表示されるようになった
顔見るだけでムカついてきたんだけど
0316デフォルトの名無しさん
2008/12/20(土) 19:18:50f と e->count のメモリの位置の差によって
キャッシュヒット率が変わるかもしれない、
ということまで考えると、
やっぱ実測しかない気もする。
0317デフォルトの名無しさん
2008/12/20(土) 19:19:19キャッシュを表示させればいいんだぜ
0318デフォルトの名無しさん
2008/12/20(土) 19:27:30詳しく!
0319デフォルトの名無しさん
2008/12/20(土) 19:32:42キャッシュ - 関連ページ
↑
これをクリック!
0320デフォルトの名無しさん
2008/12/20(土) 19:41:530321デフォルトの名無しさん
2008/12/20(土) 20:50:19関数は絶対呼び出しちゃダメだとわかった
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 );
0322デフォルトの名無しさん
2008/12/20(土) 20:52:29>関数は絶対呼び出しちゃダメだとわかった
コンパイラの最適化チェックは?ON?OFF?
0323デフォルトの名無しさん
2008/12/20(土) 20:59:33もし実測できない程速い処理なら、
そもそもそんな関数呼ぶか呼ばないかの違いなんて関係ない。
0324デフォルトの名無しさん
2008/12/20(土) 21:07:47関数中 経過時間 : 0 msec
関数外 経過時間 : 0 msec
ポインタ中 経過時間 : 0 msec
ポインタ外 経過時間 : 0 msec
テンション下がりまくり・・・
0325デフォルトの名無しさん
2008/12/20(土) 21:14:33深淵なるベンチマークの世界にようこそ。
0326デフォルトの名無しさん
2008/12/20(土) 21:21:250327デフォルトの名無しさん
2008/12/20(土) 21:30:520328デフォルトの名無しさん
2008/12/20(土) 21:39:020329デフォルトの名無しさん
2008/12/20(土) 22:44:540330デフォルトの名無しさん
2008/12/20(土) 22:55:550331デフォルトの名無しさん
2008/12/21(日) 01:40:570332デフォルトの名無しさん
2008/12/21(日) 04:30:08突っ込まずにはいられなかったのだと思う
0333デフォルトの名無しさん
2008/12/21(日) 05:24:36char 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;
}
0334333
2008/12/21(日) 05:26:13文字列を入力するとSegmentation faultとなるということです。
0335デフォルトの名無しさん
2008/12/21(日) 05:41:160336デフォルトの名無しさん
2008/12/21(日) 06:03:33ポインタだけ作ってそのポインタが指す先の入れ物を作ってないから。
「ほら、そこに入れて」とポインタは言っているのですが、その指さす場所
に箱がない。もっと正確に言うとポインタ変数に入っているデタラメな
アドレス値先に入れようとしてSegmentation faultを起こす。
0337デフォルトの名無しさん
2008/12/21(日) 06:04:32str2 = str;
とやってからstr2に入れようとすればうまく行く。それはstr2の指す先を
strという入れ物に合わせてやったから。
0338333
2008/12/21(日) 07:44:42よく考えてみると確かにアドレスstr2に文字列を入れろと言われても、
なにも指定されてないですよね・・・
>>337
その場合、strに入力した文字列は消えてしまうと解釈でいいですよね?
0339デフォルトの名無しさん
2008/12/21(日) 08:11:20その通り。strに入力した文字列はstr2を通じて入力した
文字列で上書きされてしまう。
0340デフォルトの名無しさん
2008/12/21(日) 10:14:130341デフォルトの名無しさん
2008/12/21(日) 12:18:42stringを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; // "おえういあ"にならない
}
0342デフォルトの名無しさん
2008/12/21(日) 12:20:270343デフォルトの名無しさん
2008/12/21(日) 12:23:24半角ならうまくいく。
0344デフォルトの名無しさん
2008/12/21(日) 12:30:080345デフォルトの名無しさん
2008/12/21(日) 12:51:570346デフォルトの名無しさん
2008/12/21(日) 13:18:320347デフォルトの名無しさん
2008/12/21(日) 13:26:360348デフォルトの名無しさん
2008/12/21(日) 14:23:05何度も同じこと書かなくていいから。
0349デフォルトの名無しさん
2008/12/21(日) 14:24:04ホントクズだなお前は!
0350デフォルトの名無しさん
2008/12/21(日) 14:24:390351デフォルトの名無しさん
2008/12/21(日) 14:29:370352デフォルトの名無しさん
2008/12/21(日) 14:30:080353341
2008/12/21(日) 14:37:26wstringでやるとうまく行ったんですが、色々分からないことが…
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); // 改行もされない
0354デフォルトの名無しさん
2008/12/21(日) 14:40:130355デフォルトの名無しさん
2008/12/21(日) 14:58:49>wstringでやるとうまく行ったんですが
「なぜかうまくいった」状態だな。
>char b[3] = {'a', 'あ', '\0'};
1バイトしか入らない char に 'あ' とか排卵。
>printf("%s\n", a); // aしか表示されない
printfじゃねえ。wprintf。
0356デフォルトの名無しさん
2008/12/21(日) 14:59:380357デフォルトの名無しさん
2008/12/21(日) 15:10:390358341
2008/12/21(日) 15:30:12書くのを忘れていましたが、setlocaleは先頭で宣言してありました。
> printfじゃねえ。wprintf。
wprintfを使うということはUnicode文字列を使わないといけない?
と言うことはwchar_t*にはマルチバイト文字列を入れてはいけない??
wprintfの使うときにマルチバイト文字列を引数に取れるのでしょうか???
0359デフォルトの名無しさん
2008/12/21(日) 15:57:22今ならもっと簡単に書けるよね?ね?
0360デフォルトの名無しさん
2008/12/21(日) 19:25:07規格だと、wchar_tは、ひとつ一文字だからreverseとか問題なく実行できなければ
ならないはずだけど。(そうなってないな)
0361デフォルトの名無しさん
2008/12/21(日) 19:33:33文字コードも今は普通 UCS2 じゃなくて UTF-16 だから
サロゲートペアがあるんだよな。
0362デフォルトの名無しさん
2008/12/21(日) 20:46:06よろしくお願いします。
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の要素の数が求められなくて困っています。
両方の要素数をもとめる方法を教えてください。
0363デフォルトの名無しさん
2008/12/21(日) 20:47:34引数にはbeginとendをとる。
0364デフォルトの名無しさん
2008/12/21(日) 21:03:29全くオススメしないが
0365デフォルトの名無しさん
2008/12/21(日) 21:05:560366デフォルトの名無しさん
2008/12/21(日) 21:08:59まさにboost::sizeの出番。
0367デフォルトの名無しさん
2008/12/21(日) 21:10:220368デフォルトの名無しさん
2008/12/21(日) 21:18:07結合文字やbidiもあるでよ……。
結合文字はともかく、bidiのreverseってどういう結果になるのが正しいんだろう。
0369デフォルトの名無しさん
2008/12/21(日) 21:36:38真面目に書いたプログラムを作ってみたが、
宿題のようなのでうpはやめといた。
とりあえず T が整数型の時、
戻り値の型が double なのに 2 で割っていいのかなーとか言っとく。
0370デフォルトの名無しさん
2008/12/21(日) 21:36:40int 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];
}
こんなんでもだめでした。
目が痛くなってきました
0371デフォルトの名無しさん
2008/12/21(日) 21:38:08キャストしておきます。
0372デフォルトの名無しさん
2008/12/21(日) 21:47:57サイズは std::distance 関数(<iterator> ヘッダにある)を使って得る。
0373デフォルトの名無しさん
2008/12/21(日) 21:59:59int 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()を渡してるんですが
引数がまちがってますか?
0374デフォルトの名無しさん
2008/12/21(日) 22:02:42[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] その他の制限:特になし
お願いします
0375デフォルトの名無しさん
2008/12/21(日) 22:02:51イテレータはポインタではない。
0376デフォルトの名無しさん
2008/12/21(日) 22:03:40死ね
0377デフォルトの名無しさん
2008/12/21(日) 22:04:14宿題は宿題スレで。
0378デフォルトの名無しさん
2008/12/21(日) 22:08:03size = std::distance(begin, end);
0379デフォルトの名無しさん
2008/12/21(日) 22:08:14その場合templateはどのように定義すべきなのでしょうか?
0380デフォルトの名無しさん
2008/12/21(日) 22:08:590381デフォルトの名無しさん
2008/12/21(日) 22:09:480382デフォルトの名無しさん
2008/12/21(日) 22:10:370383デフォルトの名無しさん
2008/12/21(日) 22:12:020384デフォルトの名無しさん
2008/12/21(日) 22:13:540385デフォルトの名無しさん
2008/12/21(日) 22:14:420386デフォルトの名無しさん
2008/12/21(日) 22:15:15そもそも、これで配列のサイズが取れるって言ってるが、
どんな引数をわたしてるんだ?
0387デフォルトの名無しさん
2008/12/21(日) 22:15:56配列そのまま渡せば T が配列型になってサイズとれるっしょ。
0388デフォルトの名無しさん
2008/12/21(日) 22:17:14charのポインタにキャストして、アクセスすれば?
0389デフォルトの名無しさん
2008/12/21(日) 22:17:29いやいやいやいや。
T はポインタになるから無理だ。
0390373
2008/12/21(日) 22:18:13見事に通りました
がセグりました。 原因がsortくらいしか思いつかないのですが。
sortがSTLなだけに遺憾ともしがたい感じです。
0391デフォルトの名無しさん
2008/12/21(日) 22:18:35>>378
0392373
2008/12/21(日) 22:23:10double型の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
こんな感じになってました。
0393デフォルトの名無しさん
2008/12/21(日) 22:23:16まず自分を疑え。
プログラミングの鉄則だな。
0395デフォルトの名無しさん
2008/12/21(日) 22:25:46いや、配列は?
0396373
2008/12/21(日) 22:28:05vectorと同様配列もdouble型の配列で先頭と後尾のポインタを渡そうと考えています。
0397373
2008/12/21(日) 22:38:26medianをその回数分まわした結果sizeの中に代入されたものが392です
0398デフォルトの名無しさん
2008/12/21(日) 22:52:58書くなら RandomAccessIterator begin だろ
0399デフォルトの名無しさん
2008/12/21(日) 23:00:520400デフォルトの名無しさん
2008/12/21(日) 23:02:58一時中断して自前のアルゴリズムを自由自在に書けるようにしろ
そうすれば自然と目的は達せられる
0401デフォルトの名無しさん
2008/12/21(日) 23:22:270402デフォルトの名無しさん
2008/12/21(日) 23:23:350403デフォルトの名無しさん
2008/12/21(日) 23:38:50template <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;
}
0404デフォルトの名無しさん
2008/12/21(日) 23:49:23あー面倒臭い
InputIteratorを使うからoperator[]が使えなくなるから
std::advance()を使うしかないな
0405デフォルトの名無しさん
2008/12/22(月) 00:07:14思い切り手抜き
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;
}
0406デフォルトの名無しさん
2008/12/22(月) 00:18:51template <class T>
typename std::iterator_traits<T>::value_type median(T begin, T end){}
//--
median(a,a+sizeof(a)/sizeof(*a));
0407デフォルトの名無しさん
2008/12/22(月) 01:16:15int 配列渡しても double で返して欲しいだろ・・・
0408デフォルトの名無しさん
2008/12/22(月) 02:55:260409デフォルトの名無しさん
2008/12/22(月) 07:16:090410デフォルトの名無しさん
2008/12/22(月) 09:16:550411デフォルトの名無しさん
2008/12/22(月) 09:34:29return *s;
ということですか。
0412デフォルトの名無しさん
2008/12/22(月) 10:15:100413デフォルトの名無しさん
2008/12/22(月) 10:37:54CString a = _T("ね");
CString b = _T("うし");
CString c = _T("とら");
enum eto {a, b, c};
Switch(eto)
{
case a:
case b:
case c:
}
ぜんぜんわかりません。すごい適当です
0414デフォルトの名無しさん
2008/12/22(月) 10:46:37富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・)
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
死ぬとき このレスの事思い出してから地獄へ行けよ
ニヤ(・∀・)ニヤ(・∀・)
0415デフォルトの名無しさん
2008/12/22(月) 10:53:29char型です。
0416デフォルトの名無しさん
2008/12/22(月) 11:00:22return &value;
でアドレスが返る
リテラルを返すなら問題ないが一時変数を返しちゃだめよ
0417デフォルトの名無しさん
2008/12/22(月) 11:02:11char *test()
{
return "test";
}
0418411
2008/12/22(月) 11:09:22(省略)
return s;
これは間違いですか。
0419デフォルトの名無しさん
2008/12/22(月) 11:10:38場合による
0420デフォルトの名無しさん
2008/12/22(月) 11:30:29省略すんなwww
0421デフォルトの名無しさん
2008/12/22(月) 11:41:490422デフォルトの名無しさん
2008/12/22(月) 11:52:100423デフォルトの名無しさん
2008/12/22(月) 11:56:280424デフォルトの名無しさん
2008/12/22(月) 11:59:02使ったことないから意識したことなかった・・・
0425デフォルトの名無しさん
2008/12/22(月) 12:02:08スタックに4バイト確保してそこに"abc"をコピーする。
たまたま作業領域を文字列で初期化するような用途でもなければ使えないね。
0426デフォルトの名無しさん
2008/12/22(月) 12:06:53される。
0427デフォルトの名無しさん
2008/12/22(月) 12:48:11関数ローカルな静的オブジェクトの初期化位置に、複数のスレッドが同時に到達した場合、
複数のスレッドで初期化される可能性はあるのですか?
もし、可能性があるなら、どういった手法で回避するのが定石なのでしょうか。
どなたかお教えください。
0428デフォルトの名無しさん
2008/12/22(月) 12:56:09現規格ではスレッドの概念が無いので、どうなるかは実装依存。
回避法も環境依存。
次期規格でどうなるかはシラネ
0429デフォルトの名無しさん
2008/12/22(月) 13:06:57タイムアウト付きのmutexでシングルトンとか
0430デフォルトの名無しさん
2008/12/22(月) 13:18:43で、そのmutexの初期化を保護する何かが必要になるわけか。
0431デフォルトの名無しさん
2008/12/22(月) 13:24:290432デフォルトの名無しさん
2008/12/22(月) 13:53:56何か別に必要か?クリティカルセクション内でフラグを立てる
だけのような気がするんだが
0433デフォルトの名無しさん
2008/12/22(月) 14:28:370434デフォルトの名無しさん
2008/12/22(月) 15:05:54どうだったかな…
0435デフォルトの名無しさん
2008/12/22(月) 15:13:26Win なら static な Mutex 作っといて WaitForSingleObject するだけ。
0436デフォルトの名無しさん
2008/12/22(月) 15:25:04↓以下無限ループ
0437デフォルトの名無しさん
2008/12/22(月) 15:42:04char* aaa
の、aaaで
if(aaa=="")
という判定があったのですが
aaaに""が代入されることはありえるのでしょうか?
0438デフォルトの名無しさん
2008/12/22(月) 15:44:570439デフォルトの名無しさん
2008/12/22(月) 15:48:330440デフォルトの名無しさん
2008/12/22(月) 15:50:03if(aaa=="")
なんて比較できない
0442デフォルトの名無しさん
2008/12/22(月) 16:49:17a = "" が意味するのはどこかに確保した "" という (つまり長さゼロの) 文字列のアドレスを a に入れるということ。
その後に a == "" と比較したときの "" は前の "" と別の場所に確保されるかもしれない。
コンパイラが充分に賢ければ同じ場所を指すこともあるが、規格では未定義。
つまり、 aaa=="" なんて比較がどうなるかは処理系による。
普通はやるべきではない比較とだけは言っておく。
0443デフォルトの名無しさん
2008/12/22(月) 16:53:02と
if(aaa == "")
の""が同じアドレスという保証はあるのかな
0444デフォルトの名無しさん
2008/12/22(月) 17:20:36そのInterlockedで使うintとかを0なりで初期化しなければならないんだが
その初期化が同時に走ったら…
0445デフォルトの名無しさん
2008/12/22(月) 17:27:19ないよ。
でも最適化によっては、あると言われればあるかもしれない。
初心者向けには、「文字列の比較は strcmp 使いなさい」でおわり。
0446デフォルトの名無しさん
2008/12/22(月) 17:37:54JIS X 3014 3.6.2 「非局所オブジェクトの初期化」あたりを読む限りでは、
静的初期化=(ゼロ初期化/定数式初期化)は、mainの実行前に行われることが
保障されているようだが
0447デフォルトの名無しさん
2008/12/22(月) 17:55:390448デフォルトの名無しさん
2008/12/22(月) 18:02:24enum CString {a, b, c};
0449デフォルトの名無しさん
2008/12/22(月) 18:50:04CString eto;
int num;
switch( eto )
{
case T("ね"):
num = 1;
break;
case _T("うし"):
num = 2;
break;
case _T("とら"):
num = 3;
break;
}
コンパイル通る気配すらないです
0450デフォルトの名無しさん
2008/12/22(月) 19:04:33ネタにマジレスw
0451デフォルトの名無しさん
2008/12/22(月) 19:05:15非局所オブジェクトはそうだけど。
ということで、非局所オブジェクト無しでは無理。>427
だったら目的の静的オブジェクト自体を非局所にするのが素直。
0452デフォルトの名無しさん
2008/12/22(月) 19:23:52enum CString {ね, うし, とら };
CString eto = ね;
int num;
switch( eto )
{
case ね:
num = 1;
break;
case うし:
num = 2;
break;
case とら:
num = 3;
break;
}
0453デフォルトの名無しさん
2008/12/22(月) 19:45:350454デフォルトの名無しさん
2008/12/22(月) 19:51:10mainが始まる前に(グローバルオブジェクトの初期化処理の中からとか)アクセスしたらどうなるんだろう
0455デフォルトの名無しさん
2008/12/22(月) 20:09:22通りました。ありがとうございました。
0456デフォルトの名無しさん
2008/12/22(月) 20:15:500457デフォルトの名無しさん
2008/12/22(月) 21:05:48異なる翻訳単位におけるグローバルオブジェクトの初期化順序は不定です。
ということで未初期化のオブジェクトにアクセスしてしまう可能性があります。
ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12
以降も参考になると思います。
0458デフォルトの名無しさん
2008/12/23(火) 12:57:28でもフレンドクラスが書いてない元クラスのプライベートにアクセスする方法はないんですか?
0459デフォルトの名無しさん
2008/12/23(火) 13:54:470460デフォルトの名無しさん
2008/12/23(火) 14:15:380461デフォルトの名無しさん
2008/12/23(火) 14:52:320462デフォルトの名無しさん
2008/12/23(火) 15:24:56#include<window.h>
ここから進まない……
0463デフォルトの名無しさん
2008/12/23(火) 15:25:55適当に講座サイトでも見ろよ
0464デフォルトの名無しさん
2008/12/23(火) 15:29:18天才すぎてびっくりした
そうか猫でも分かる辺りを見てこよう
0465デフォルトの名無しさん
2008/12/23(火) 15:55:33出直してこい!
0466デフォルトの名無しさん
2008/12/23(火) 16:45:26WinMainとWndProcを書け
0467デフォルトの名無しさん
2008/12/23(火) 16:48:16Point *m_pPoint;
void hogepoint(Point);
}
void hogepoint(Point point){
m_pPoint = new Point;
*m_pPoint = point;
}
ってやったら、しばらくしたらpointが消えてしまっているんですがどうしたらいいんでしょう?
0468デフォルトの名無しさん
2008/12/23(火) 16:49:110469デフォルトの名無しさん
2008/12/23(火) 17:22:05↓
void CHoge::hogepoint(Point point){
じゃねーの?
しらねーけど
0470デフォルトの名無しさん
2008/12/23(火) 17:41:39まさか、本当にCHogeってやってるわけじゃなし例としてこんなことをってかいたからないだけだろ
0471デフォルトの名無しさん
2008/12/23(火) 19:41:10すべての型に別名をつける規則にしようと思うんですが、問題ありますか?
0472デフォルトの名無しさん
2008/12/23(火) 19:45:26対費用効果がぜんぜんよくないと思う。
0473デフォルトの名無しさん
2008/12/23(火) 19:45:47なんでそういうことをしようとするのか意味分からない
引数チェックのため?
0474デフォルトの名無しさん
2008/12/23(火) 19:45:56一人なら何も問題ない
0475デフォルトの名無しさん
2008/12/23(火) 19:48:08例外もあるけど、最悪だと思う
0476デフォルトの名無しさん
2008/12/23(火) 19:59:07std::domain__error にUnicode文字を渡すことは出来ないのでしょうか?
0477デフォルトの名無しさん
2008/12/23(火) 20:02:100478デフォルトの名無しさん
2008/12/23(火) 20:14:48例外ってワイド文字版がないんだっけ。
マルチバイト文字に変換して渡せば?
0479デフォルトの名無しさん
2008/12/23(火) 20:29:190480デフォルトの名無しさん
2008/12/24(水) 02:05:000481デフォルトの名無しさん
2008/12/24(水) 02:50:08↓に文字列関連のことが書かれていますが、
http://www.ruche-home.net/?%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%2F%BE%AE%A5%CD%A5%BF%BD%B8%2FUnicode%C2%D0%B1%FE%A5%B3%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0
下のほうのDLLに関する記述で、C++での対処法としてインライン関数を用いている項(SomeFunction)
これは正しい対処法なのでしょうか?
0482デフォルトの名無しさん
2008/12/24(水) 03:08:340483デフォルトの名無しさん
2008/12/24(水) 03:10:02でも面倒だから、OLE関係みたいに常にW版だけ用意というのもありだな。
0484デフォルトの名無しさん
2008/12/24(水) 07:38:380485デフォルトの名無しさん
2008/12/24(水) 07:41:140486デフォルトの名無しさん
2008/12/24(水) 08:03:460487デフォルトの名無しさん
2008/12/24(水) 08:17:010488デフォルトの名無しさん
2008/12/24(水) 09:08:52これを解決するにはどうすればいいんですか?
UINTの方は表現が失われるのでintにできないし
intの方はマイナスも比較したいのでUINTにできないんです
0489デフォルトの名無しさん
2008/12/24(水) 09:15:500490デフォルトの名無しさん
2008/12/24(水) 09:19:23比較したい瞬間のみどっちかに合わせるか>489ということになる。
2^31以上を検出できなくていいなら、int foo; UINT bar;としてbool foz = foo == int(bar);などとなる。
0491デフォルトの名無しさん
2008/12/24(水) 09:24:340492デフォルトの名無しさん
2008/12/24(水) 09:46:42size()と勘違いしてるだろ
それかmultisetとか
0493デフォルトの名無しさん
2008/12/24(水) 10:22:05ないよ
>>486
わかってて尋ねんなよ
CreateFile を使用してシリアルポートの通信を行おうとしています。
ただ、ポート番号が二桁の場合だと単純に"COM10" など渡してもうまくいきません。
一桁なら問題ありません。
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q115/8/31.asp&NoWebContent=1
こちらを参考にして、
CreateFile( "\\\\.\\COM10",・・・);
と書けばOKですが、
char portname[] = "\\\\.\\COM10";
CreateFile( (LPCSTR)portname,・・・);
だとうまくいきません。
例えば、一桁のポート番号
char portname[] = "COM1";
CreateFile( (LPCSTR)portname,・・・);
ならば大丈夫です。
エスケープの方法に問題があると思っているのですが
回避方法がわかりません。
どなたか分かります?
0495デフォルトの名無しさん
2008/12/24(水) 12:15:10char *portname = "\\\\.\\COM10";
にしたらどうなるよ
0496デフォルトの名無しさん
2008/12/24(水) 12:21:370497デフォルトの名無しさん
2008/12/24(水) 12:28:52できました。。
どういうことなんでしょう。。
配列に格納した場合は問題あるのでしょうか。。。
>>496
一応確認してみましたが怪しいところはみつかりません。
二人とも早い返信ありがとうございます。
0498デフォルトの名無しさん
2008/12/24(水) 12:29:150500デフォルトの名無しさん
2008/12/24(水) 12:37:250501デフォルトの名無しさん
2008/12/24(水) 19:12:33_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
}
0502デフォルトの名無しさん
2008/12/24(水) 19:19:03何て事をしてくれたんですか!
常にメモリリークしているという事実を明らかにしてくれましたね!
0503デフォルトの名無しさん
2008/12/24(水) 19:19:050504501
2008/12/24(水) 19:29:57メモリリークがなくなりました。ありがとうございます!
_CRTDBG_CHECK_CRT_DFはこれから使わないようにします。
0505501
2008/12/24(水) 19:37:47_CRTDBG_CHECK_CRT_DFを指定するとメモリリークを検出するということは、>502の通り
ランタイムライブラリでメモリリークが発生しているということでしょうか?
それとも本当にデタラメを吐き出しているのでしょうか?
0506デフォルトの名無しさん
2008/12/24(水) 20:00:220507デフォルトの名無しさん
2008/12/24(水) 20:46:40へー、そんなことがあるんだ。
Tcl/Tkでwindowsのcomポートが9までしか使えない仕様なのは
そこらへんの回避ができなかったからなのかな。
0508デフォルトの名無しさん
2008/12/24(水) 22:00:400509デフォルトの名無しさん
2008/12/24(水) 22:15:28一例だが。
BOOL eq(int lhs, UINT rhs) {
if (lhs < 0) {
return FALSE;
} else if (rhs > INT_MAX) {
return FALSE;
} else {
return (UINT)lhs == rhs;
}
}
eq 以外の時も同じ発想で出来る。
0510デフォルトの名無しさん
2008/12/24(水) 22:51:22!((lhs | rhs) & INT_MIN) & (lhs == (int)rhs)
とかでもいいんかね
0511デフォルトの名無しさん
2008/12/24(水) 22:57:58long long みたいのを使える処理系なら、それにキャストすれば。
0512デフォルトの名無しさん
2008/12/24(水) 22:59:40MSの場合はlong longは無いし__INT64とかになると思うが
doubleという手もあるけど、いかにも遅そうだ
0513デフォルトの名無しさん
2008/12/24(水) 23:02:3364ビット機でもなければ
>>509 より効率悪いしなあ。
0514デフォルトの名無しさん
2008/12/24(水) 23:03:43VC++も最近はlong longが使える。
0515デフォルトの名無しさん
2008/12/24(水) 23:05:10ソースが簡単になるでしょ。
0516デフォルトの名無しさん
2008/12/24(水) 23:10:24おお、それは知らんかった、トン
そんな化石をサポートするぐらいならstdintぐらい使えたほうが
なんぼか嬉しいが……
0517デフォルトの名無しさん
2008/12/24(水) 23:11:44なにlong longって、普通に型として使えるの?まさか25*12とか特殊な書き方が必要なの?
0518デフォルトの名無しさん
2008/12/24(水) 23:13:06509は分岐してるし今のCPUだと遅そうに見えるわな
誰かベンチマークよろ
0519デフォルトの名無しさん
2008/12/24(水) 23:20:32bool eq2(int a, unsigned b)
{
return (long long)a == (long long)b;
}
と比べたら、計算に10秒かかるくらいまわしても、差がでなかった。
最適化はしてない。
0520デフォルトの名無しさん
2008/12/24(水) 23:31:46それは、long longでキャストしてもしなくてもってこと?
環境は32bit?
0521デフォルトの名無しさん
2008/12/24(水) 23:32:46全然高いのでは
inlineにするか、中身をループしないと意味ないんじゃないの
0522デフォルトの名無しさん
2008/12/24(水) 23:35:30最適化しろよ・・・。
0523デフォルトの名無しさん
2008/12/24(水) 23:37:15>>488からの流れで、>>509と比較してってことだから、キャストしないとだめじゃん。
0524デフォルトの名無しさん
2008/12/24(水) 23:38:52ああ、>>509との比較で差がでないってことか
じゃあ理由は間違いなく>>521だと思う
0525507
2008/12/24(水) 23:40:13そんなん俺に言われても。
Tcl/Tkのwindows版は仕様としてcom9までしか使えない。
だけだろ、とか言うならTcl/Tkの作者に言ってくれよ。
0526デフォルトの名無しさん
2008/12/24(水) 23:42:10最適化して、INT_MAX回まわしても、あまり差がなかった。
計測は秒単位で、最適化で呼び出し消えるのを防ぐために、余計な処理を入れたり
したけど。
何回か実行するると、>>509のほうが早いときがあって誤差かとおもったけど、
>>519が早いときは一回もないから、微妙に>>509のほうがはやいっぽい。
0527デフォルトの名無しさん
2008/12/24(水) 23:45:01関数呼び出しのコストが、中身の数十倍とかだったら、まあそうだけど、
そんなに差がなかったら、処理が秒単位でかかるくらいやれば差がでるのでは?
0528デフォルトの名無しさん
2008/12/24(水) 23:47:28double 使う方法ではどうだ?
0529デフォルトの名無しさん
2008/12/24(水) 23:48:150530526, 527
2008/12/24(水) 23:49:51ほとんど同じコードになってたよ。
呼び出しを工夫して、最適化の邪魔をしないと比較できねーな。
0531デフォルトの名無しさん
2008/12/24(水) 23:52:16CPUはCeleron1.7G
Conditional: 0.906[s]
Double: 1.609[s]
LongLong: 2.328[s]
StaticCast: 0.765[s]
NoOp: 0.14[s]
0532デフォルトの名無しさん
2008/12/24(水) 23:54:25Conditionalな奴は、intが負/unsignedのMSBが立っているかどうかで
速度が変わりそうだけど、その辺の条件はどうなってる?
0533デフォルトの名無しさん
2008/12/24(水) 23:57:48doubleにキャストするほうが速いみたいだな
俺のとこでもそうなった
0534デフォルトの名無しさん
2008/12/25(木) 00:00:28inline int eq(int lhs, unsigned rhs) {
return ((unsigned)lhs == rhs) & ((~(unsigned)lhs & ~rhs) >> (sizeof (int) * CHAR_BIT - 1));
}
0535デフォルトの名無しさん
2008/12/25(木) 00:05:35int xxx = 1000; として、
eq(i, xxx);
みたいに呼び出したら、xxxを定数の1000に置き換えてたよ。
xxxが、どこからも変更されないって把握してんだな。
(ソースが複数あるプロジェクトなのに)
最近のコンパイラは頭いいな。
0536デフォルトの名無しさん
2008/12/25(木) 00:10:03xmat = xmat * xmat;
xmat = xmat * xmat;
xmat = xmat * xmat;
xmat = xmat * xmat;
みたいな計算結果を使用してさらに計算する・・・みたいな処理
かいて最後は出力しないとコンパイラに消されたり
最適化されちまったりして安定しない
0537デフォルトの名無しさん
2008/12/25(木) 00:10:590538デフォルトの名無しさん
2008/12/25(木) 00:11:10std::rand使ってたので負値は入ってなかった。
boost::random使って負値も入るようにしたらこうなった。
Conditional: 2.125[s]
Double: 2.328[s]
LongLong: 2.297[s]
StaticCast: 0.75[s]
NoOp: 0.14[s]
ソース
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8473.cpp
0539デフォルトの名無しさん
2008/12/25(木) 00:21:25でも、intとunsigned intの比較のためにわざわざdoubleにキャストしてる
ソースみたらすげー悩みそうだ……
0540デフォルトの名無しさん
2008/12/25(木) 00:22:15>>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
0541デフォルトの名無しさん
2008/12/25(木) 00:24:26分岐してない。
比較結果をストアする命令に最適化されるだけだから。
0542デフォルトの名無しさん
2008/12/25(木) 00:26:05long longとかint64みたいのでいいんじゃね?
0543デフォルトの名無しさん
2008/12/25(木) 00:26:540544デフォルトの名無しさん
2008/12/25(木) 00:27:36そうだったんか、サンクス
つーかアセンブラの出力見れよなって感じだな>俺
0545デフォルトの名無しさん
2008/12/25(木) 00:28:520546デフォルトの名無しさん
2008/12/25(木) 00:31:440547デフォルトの名無しさん
2008/12/25(木) 00:33:12ベンチで実行して欲しいコードまで省かれたらベンチにならんだろが
0548デフォルトの名無しさん
2008/12/25(木) 00:33:540549デフォルトの名無しさん
2008/12/25(木) 00:36:28省かれないようなコードを書くのが普通だろ・・・。
0550デフォルトの名無しさん
2008/12/25(木) 00:38:25volatile だと実際に実行されるコードと全くの別物になっちゃうだろ・・・。
0551デフォルトの名無しさん
2008/12/25(木) 00:38:47いやだから、省かれないようにするヒントがvolatileなんだろ?
俺は>>545じゃないけどさ
お前さん、一体何がいいたいの
0552デフォルトの名無しさん
2008/12/25(木) 00:44:50お前は volatile 言いたいだけなんじゃないかと。
目的の範囲内で最適化された結果で速度を比較したいのに、
最適化を阻害するって正気の沙汰じゃないぜ。
0553デフォルトの名無しさん
2008/12/25(木) 00:54:470554デフォルトの名無しさん
2008/12/25(木) 00:57:11目的の範囲外のところで volatile を使えばいい。
0555デフォルトの名無しさん
2008/12/25(木) 01:06:300556デフォルトの名無しさん
2008/12/25(木) 01:17:00単にお前がSTLとboost全く知らないだけだろw
0557デフォルトの名無しさん
2008/12/25(木) 01:17:20boost入門レベルってところじゃね?
0558デフォルトの名無しさん
2008/12/25(木) 01:20:15inline int func(){/*測定したい処理*/}
volatile int dum;
for(volatile int i = 0; i < 1000000; ++i){
dum = func();
}
これってキチガイだったの?
0559デフォルトの名無しさん
2008/12/25(木) 01:51:230560デフォルトの名無しさん
2008/12/25(木) 02:00:560561デフォルトの名無しさん
2008/12/25(木) 02:03:500562デフォルトの名無しさん
2008/12/25(木) 02:04:100563デフォルトの名無しさん
2008/12/25(木) 02:06:330564デフォルトの名無しさん
2008/12/25(木) 12:04:40}
int main(){
short a,b;
hoge(a+b);
return 0;
}
これをコンパイルすると変換によって有効桁が失われると出るんですが、どうすれば解決できるんでしょうか?
コンパイラはBorland5.5.1です。
0565デフォルトの名無しさん
2008/12/25(木) 12:07:11short じゃなくて int を使う。
0566デフォルトの名無しさん
2008/12/25(木) 12:07:200567デフォルトの名無しさん
2008/12/25(木) 12:18:260568デフォルトの名無しさん
2008/12/25(木) 12:22:54それ、intに格上げされて足し算されてるんじゃねえの
汎整数拡張とかいう奴
それをshortに書き戻してるから警告出てるんだと思うぞ
0569デフォルトの名無しさん
2008/12/25(木) 12:23:550570デフォルトの名無しさん
2008/12/25(木) 12:30:11ローカル変数や引数に short なんて、 int との変換が頻発して無駄すぎる。
http://www.kouno.jp/home/c_faq/c1.html#1
0571デフォルトの名無しさん
2008/12/25(木) 17:21:46typedef 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;
としてみてもダメでした。
0572デフォルトの名無しさん
2008/12/25(木) 17:25:01だからexport予約語をサポートしない処理系を怨め
0573デフォルトの名無しさん
2008/12/25(木) 17:31:540574デフォルトの名無しさん
2008/12/25(木) 17:35:44exportについて調べてきました。
テンプレートの各種関数の宣言などを、別の場所で書けるようにするためのキーワードだそうで。
非常に欲しいですね。
ということは、認識としては「テンプレートを使うと、翻訳単位(.cppファイル)毎にその実体を作ってしまう」という認識でよいのでしょうか?
shared_ptrとか使うのをちょっとためらってしまいますが・・・
0575デフォルトの名無しさん
2008/12/25(木) 20:43:44実体化は普通のテンプレートと同じようにやっぱり翻訳単位の中でやる
諦めろ
0576デフォルトの名無しさん
2008/12/25(木) 20:53:23コンパイラの段階では各翻訳単位でインスタンス化するけどリンク時に一つにまとめる環境もありそう。
C++0x で入る extern template で今やってることと同じようなことをもうちょい簡潔に書けるようになるはず。
0577デフォルトの名無しさん
2008/12/26(金) 00:41:35デバッグ情報が増えてるだけじゃないかなぁ?
関数の実体については、たとえばアドレスを取って比較すれば
同じにならないといけないんで、さすがにそこを違反してるコンパイラは
無いと思うよ。
0578デフォルトの名無しさん
2008/12/26(金) 02:08:30機能ごとにDLLにして使うときだけ呼び出すようにすればアプリ起動が早くなったりするんでしょうか?
リソースとかも埋め込まないでフォルダから参照するようにしたほうがいいんでしょうか
まだ始めたばっかなんですが、未来のことが気になってしょうがありません。
0579デフォルトの名無しさん
2008/12/26(金) 06:58:02残念だなあ。
君は何か勘違いしている様だけど、聞いて揚げ足取りをしたいんじゃなくて、
単純に君の意見が面白そうだから聞いてみたかっただけなんだよ。
もっとまともなレスを期待してたんだけど。ごめんね。
ちなみに君は揚げ足を取られる事を恐れているようだけど、それは違うと思う。
揚げ足を取られるのは、君に隙があるから。
隙だらけの人間ってのはそうやって余計な所でつまらない恥をかく事になるもんだよ。
他人につっこまれる事は、自身の知識をより客観的で多角的なものとする為に
有益な指針となるものだと思うな。
0580デフォルトの名無しさん
2008/12/26(金) 07:08:58はダメなんですよね?
0/aもダメですか?
0581デフォルトの名無しさん
2008/12/26(金) 07:10:05はい。
いいえ。
0582デフォルトの名無しさん
2008/12/26(金) 08:31:41いきなりどうしたんだお前w
0583デフォルトの名無しさん
2008/12/26(金) 10:53:28個々にインライン展開されていた処理が 1 箇所だけになったという点も影響あるかもしれないね。
0584デフォルトの名無しさん
2008/12/26(金) 11:44:23なるほど!と思い、リリースコンパイルを行ってみました。
でもやはり、容量は天地の差といった感じで…。
コンシューマ実機系のコンパイラだから・・・とかかなぁ。
ちょっと他の件でも
class Test
{
public:
static Test &getInstance()
{
static Test s;
return s;
}
};
こうやってシングルトンを作ってみたんです。
で、このヘッダをプリコンパイルヘッダに登録したところ、すべての(プリコンパイルヘッダを使っている)cppファイルで、40KB以上の増加を確認。
自分の意識だと当然唯一の実体が作られると思っていたのですが…。
この実機ですと、プログラム翻訳単位での「プログラムのロード」もサポートされているのが原因かもしれません。
(その機能使っていないのですが)
そのために、テンプレートやstatic変数も翻訳単位毎に作るのかも…?
なんだか翻訳単位毎に、勝手に無名ネームスペース内に取り込まれてしまっているような印象ですね。
そのわりに、きちんとシングルトンとして動作するから気味が悪い
一応、環境依存での動作ということでクローズということで。
後でVC2008あたりでも実験してみます。
0585デフォルトの名無しさん
2008/12/26(金) 12:08:41ただのコピペ
0586デフォルトの名無しさん
2008/12/26(金) 14:02:40シングルトンとかは実行時のことで、コンパイル時のこととは別の話だというのは大丈夫?
(大丈夫ならいいんだけど)
各.cppにそのclass Testの定義が書いてある(実際はincludeだけど、includeは書いてあるのと同じ)
んだから、各.objにTestのオブジェクトコードがあるのは当然でしょう。
コンパイルは翻訳単位毎に独立ですよ。だから翻訳「単位」という。
0587デフォルトの名無しさん
2008/12/26(金) 14:44:350588デフォルトの名無しさん
2008/12/26(金) 15:35:25つってんだから、
…あれ?どゆこと?
コンパイルしたオブジェクトファイルのサイズが
増えたと言いたいんだろうな。
でも、コードが増えたこととインスタンスがひとつしかないのは
別の話だから。
0589デフォルトの名無しさん
2008/12/26(金) 20:39:13stringstream 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
上のように配列のインデックスが定数の場合と演算がある場合で、
処理順序が逆になるのですが、なぜなのでしょうか?
0590デフォルトの名無しさん
2008/12/26(金) 20:43:30int cnt = 0;
f(cnt++, cnt++); // f(0, 1) が渡るか f(1, 0) が渡るかわからない
演算子オーバーロードは単なる関数呼び出しなので、
同じことが起こっているだけ。
0591デフォルトの名無しさん
2008/12/26(金) 20:53:50結果にあるとおり最後のsrc[cnt++]が最初に評価されたってことだろ
順番は保証されてないからそのようなコードを書いてはいけないってことだ
ss2 << src[cnt++];
を3回書くかループで回せ
0592デフォルトの名無しさん
2008/12/26(金) 21:59:07シーケンスポイント間で cnt に複数回変更を加えているので、未定義動作。
0593デフォルトの名無しさん
2008/12/26(金) 22:11:440594デフォルトの名無しさん
2008/12/26(金) 22:16:200595デフォルトの名無しさん
2008/12/26(金) 22:20:360596デフォルトの名無しさん
2008/12/26(金) 22:33:56おいおい、偉そうに嘘を言うんじゃない。
未定義 (undefined) じゃなくて不定 (unspecified; 未規定ともいう) だぞ。
ちゃんと引数は評価されるが、評価の順番は処理系が適当に決めてよい。
0597596
2008/12/26(金) 22:37:180598デフォルトの名無しさん
2008/12/26(金) 22:39:33同じ変数を不定順に操作したら未定義
f(cnt1++, cnt2++);なら確かに評価順が不定なだけだけど
590はf(0,0)やf(1,1)やf(825699101,-600359841)やabort()やsystem("rm -rf /")が呼ばれるかもしれないし
何も呼ばれないかもしれないし、関数呼び出しではない恐ろしいものが呼ばれるかもしれない
0599デフォルトの名無しさん
2008/12/26(金) 22:40:020600デフォルトの名無しさん
2008/12/26(金) 23:13:44x = cnt++ - (cnt++);
上の2例のように、ネストした関数や、括弧で演算順序を
指定した場合でも、未定義or不定なんでしょうか?
0601デフォルトの名無しさん
2008/12/26(金) 23:19:14同じく未定義。
「シーケンスポイント」(副作用完了点)で区切られてないとダメ。
0602デフォルトの名無しさん
2008/12/26(金) 23:20:37http://www.kouno.jp/home/c_faq/c3.html#8
0603デフォルトの名無しさん
2008/12/26(金) 23:32:39>>600の1例目、f2の呼び出しはそれには当てはまらないのでしょうか?
また、
void inc(T &v) {
++v;
}
x = inc(cnt) - inc(cnt);
のように関数に置き換えた場合は、式の左から処理されると考えて良いですか?
0604デフォルトの名無しさん
2008/12/26(金) 23:35:58関数の呼び出しには副作用完了点があるが、最初の式内の引数の評価タイミングは
関数呼び出しの前ならいつでもいいので関係ない。
減算演算子の二項の評価順もコンパイラの勝手。
0605デフォルトの名無しさん
2008/12/26(金) 23:37:310606デフォルトの名無しさん
2008/12/26(金) 23:38:15それにしてもなぜそんなことに興味あるの?そんなコーディングしたいの?
それとも単に純粋な学術的な興味?
0607デフォルトの名無しさん
2008/12/26(金) 23:45:54x = inc(cnt) - inc(cnt);
だな。
0608デフォルトの名無しさん
2008/12/26(金) 23:58:59今まさにそんなコーディング(>>589)してしまって軽く嵌ってたので、
良い機会だからもうちょっと突っ込んで知りたいなと思いまして。
知らずにまた似たようなことをやらかさないように。
>>607
そうそう、戻り値必須でしたね。
0609デフォルトの名無しさん
2008/12/26(金) 23:59:54限らない
左のinc(cnt)と右のinc(cnt)が呼び出される順序は不定だから
xが1になるか-1になるかも不定
未定義ではないけど
0610デフォルトの名無しさん
2008/12/27(土) 00:04:38なるほど、ありがとうございました。
0611デフォルトの名無しさん
2008/12/27(土) 16:14:50if()
;
これって
if(){
if()
;
}
と同じですか?
0612デフォルトの名無しさん
2008/12/27(土) 16:26:590613デフォルトの名無しさん
2008/12/27(土) 17:28:16違います。
前者はif文が二つとも成り立った時には単文しか書けませんが
後者は複文が書けます。
0614デフォルトの名無しさん
2008/12/27(土) 17:29:20一つめのif文が成り立った時の複文を実行します。
前者は一度元に戻ります。
0615デフォルトの名無しさん
2008/12/27(土) 18:25:15日本語が苦手なら、わざわざ回答しなくても大丈夫ですよ。
>>611
if (...)
if (...)
a;
b;
c;
と
if (...) {
if (...)
a;
b;
}
c;
では、前者はbもcも常に実行されるが後者は常に実行されるのはcだけ。
逆に言えば、(一番目のifが成立し)二番目のifが成立しない場合には、
bを実行するかしないかで前者と後者の差が出る。
まぁ、自分で書く場合は迷うくらいなら{}で括っておけということ。
0616デフォルトの名無しさん
2008/12/27(土) 19:15:530617デフォルトの名無しさん
2008/12/28(日) 05:38:24「こんにちは」など簡単な音声をPCアプリケーションから出力したい
のですがやり方が全くわかりません。
どなたかどのようにプログラムを組めば良いのか具体的に教えて
いただけますか?
よろしくお願いします
0618デフォルトの名無しさん
2008/12/28(日) 06:01:200619デフォルトの名無しさん
2008/12/28(日) 06:16:530620デフォルトの名無しさん
2008/12/28(日) 06:39:58SAPI
0621デフォルトの名無しさん
2008/12/28(日) 11:20:340622デフォルトの名無しさん
2008/12/28(日) 11:28:43// http://www.a-quest.com/aquestalk/
#include"AquesTalkDa.h"
int main(void){
AquesTalkDa_PlaySync("こんにちは");
return 0;
}
0623デフォルトの名無しさん
2008/12/28(日) 11:29:33"こんにちわ" に訂正
0624デフォルトの名無しさん
2008/12/28(日) 11:41:26----
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; };
を加えてそれを使ったら一応できました。
他にやり方があったら教えていただけませんか。
0625デフォルトの名無しさん
2008/12/28(日) 11:48:320626デフォルトの名無しさん
2008/12/28(日) 11:53:19ありがとうございます!できました!
なんで*をつけるとできるか調べてきます。
0627デフォルトの名無しさん
2008/12/28(日) 11:58:00ポインタを返してもらったら、自前でデリファレンスしないといけないというだけの話。
調べ直さないといけないくらいなら、ちゃんとポインタについて勉強してこい。
0628デフォルトの名無しさん
2008/12/28(日) 11:58:15調べるまでもないしwwwwwww
0629デフォルトの名無しさん
2008/12/28(日) 11:59:01なんで訂正した?
0630デフォルトの名無しさん
2008/12/28(日) 12:00:30わ と発音したいから
0631デフォルトの名無しさん
2008/12/28(日) 12:05:10・・・・(笑
0632デフォルトの名無しさん
2008/12/28(日) 12:11:30そのままだと
こんにち「ハ」って言ってくれるのかw
0633デフォルトの名無しさん
2008/12/28(日) 12:17:35は言ってくれてる気がするけどな
0634デフォルトの名無しさん
2008/12/28(日) 12:21:54SofTalk は発音記号に変換してから DLL に渡してるんじゃないかな?
AqueTalk の素のままだと余計なことはしない
ただ、受け取った発音記号を喋るだけ
0635デフォルトの名無しさん
2008/12/28(日) 12:26:00でも声がhttp://www.nicovideo.jp/watch/sm4895582
0636デフォルトの名無しさん
2008/12/28(日) 12:31:590637デフォルトの名無しさん
2008/12/28(日) 13:01:32現在、研究室の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だけでいいのか、
もしこれ以外にも手続きが必要な場合は何が必要か、教えて頂けますよう、お願いします。
0638デフォルトの名無しさん
2008/12/28(日) 14:31:14適当でいいなら PlaySound で
0639デフォルトの名無しさん
2008/12/28(日) 14:56:02書き込んで下さって、ありがとうございました。
環境をアップグレードしてから試してみます。
0640デフォルトの名無しさん
2008/12/28(日) 15:08:47そもそも何のためにSetCommState()しているのか判っているの?
その概念はどんなハードウェアプロトコルに依存するか判っているの?
# 判っているならこんなすっとこどっこいな質問はしないか。
0641デフォルトの名無しさん
2008/12/28(日) 15:14:19いや、よく分かってないです…
調べたところ、COMでのボーレート等を設定する為の関数らしい、という程度の確認をしたところで
これはCOM限定なんじゃないか?と考えてLPTの手続きの検索に入ってしまったので…
あまりに知識が不足していると思うので、XPでLPTを扱うための情報を探しているのですが
オススメのサイト、もしくは書籍などでもあればご紹介いただけると嬉しいです。
COMについてのサイトは結構あるのですが、探し方が悪いのかLPTは意外と少なくて…
0642デフォルトの名無しさん
2008/12/28(日) 15:44:35リンカエラー吐いちゃいました。どこが間違ってますか?
//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 が未解決です。
0643デフォルトの名無しさん
2008/12/28(日) 15:55:52line_search.hはsearch_linear.hで、
line_search.cppはsearch_linear.cppです。
0644デフォルトの名無しさん
2008/12/28(日) 15:57:06テンプレートの定義を.cppではなく.hに書く。
0645デフォルトの名無しさん
2008/12/28(日) 15:58:030646デフォルトの名無しさん
2008/12/28(日) 16:06:44.cppの中身をそのままそっくり.hに持ってくればいいって事ですよね、確かにできました。ありがとうございます。
exportでググってみましたけど、今一つリンクってのが何をやってることなのか分かってないので理解できなさそうです。
もうちょっと知識を身につけたらまた調べてみることにします。
0647デフォルトの名無しさん
2008/12/28(日) 16:48:020648デフォルトの名無しさん
2008/12/28(日) 16:53:06ありません。
コンストラクタ本体でおこなうか、std::vectorなどを使ってください。
0649デフォルトの名無しさん
2008/12/28(日) 17:12:54ボーレートの設定などは、シリアル転送にのみ使われる。
パラレルポートの場合も本来なら時間設定が色々あってもいいところだが、
一般的にはBUSYチェック程度しかしていないと思う。
いずれにしても相手機器との相性の問題があるから単純に置き換えるわけにはいかないかもしれないが、
パラレルの場合は相手機器に対して規定の文字列を出力するだけで済む場合が多いと思う。
# 逆に、微調整しようがないので現地でダメだったらお手上げになるけどw
よく判っていないのなら相手機器側の資料をよく読んで、必要なら代理店に問い合わせるとかするこったね。
# 弊社にご依頼いただければ稼動実費+αでお請けしますがw
0650641
2008/12/28(日) 23:00:28ありがとうございます。
パラレルで出力する際にはパラメータ設定系の処理は必要無いということらしいですね。
出力対象がLPTであればCommState関連の処理を飛ばすように直してみる事にします。
BUSYチェックも、LPTに繋いでるのはラインプリンタだけで
出力も作業者が行うのでそう問題は無いかなと…
ラインプリンタの資料があるかちょっと分かりませんが、探して確認してみることにします。
今までCOMやLPTなんてレガシーだもう使わないなんて思ってましたけど、
実際に関わるとLPTのBIOS設定の意味すら知らない自分の知識の乏しさを痛感させられてます…
//…うちの研究室、カネが無いんですよ…
//だから少しだけC++知ってる自分に改修が頼まれた…
0651デフォルトの名無しさん
2008/12/28(日) 23:11:16どうすればいいでしょうか
0652デフォルトの名無しさん
2008/12/28(日) 23:12:160653デフォルトの名無しさん
2008/12/29(月) 06:46:010654デフォルトの名無しさん
2008/12/29(月) 06:50:270655デフォルトの名無しさん
2008/12/29(月) 10:53:32本物のハンガリアン記法ではない。
ハンガリアン記法の論文の文意が誤解され、
間違った形で解釈されたもの。
あんなもの役に立つわけが無い。
0656デフォルトの名無しさん
2008/12/29(月) 20:57:36sprintf(m_str, "%d FPS", m_fps);
でコンパイルするとTCHAR[260]からCHAR*に変換できませんと出るのですが
解決方法教えていただけませんか
0657デフォルトの名無しさん
2008/12/29(月) 21:00:090658デフォルトの名無しさん
2008/12/29(月) 21:01:080659デフォルトの名無しさん
2008/12/29(月) 21:02:10ハンガリアンの論文?
0660デフォルトの名無しさん
2008/12/29(月) 21:02:300661デフォルトの名無しさん
2008/12/29(月) 21:05:47min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
は1.0がなぜ必要なのでしょうか?
なくてもよい気がするのですが何か理由はあるのでしょうか?
0662デフォルトの名無しさん
2008/12/29(月) 21:25:490663デフォルトの名無しさん
2008/12/29(月) 21:32:100664デフォルトの名無しさん
2008/12/29(月) 21:36:30例えば、RAND_MAX が 0x7fff だとすると 0〜0x7fff までの乱数が出るから
値域の幅は RAND_MAX + 1 になる
最大 - 最小の方も同様
0665デフォルトの名無しさん
2008/12/29(月) 21:42:59順番を変えて考えるべし。
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 より少し小さくて、
上記のような問題は発生しない。
0666デフォルトの名無しさん
2008/12/29(月) 21:45:39シモニイの論文
ttp://msdn.microsoft.com/en-us/library/aa260976.aspx
本当のハンガリアン記法について知りたければ
ttp://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
0667661
2008/12/29(月) 21:51:54min=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)も必要がないのではないかということです。
説明不足申し訳ありませんでした。
0668デフォルトの名無しさん
2008/12/29(月) 21:57:320〜5の値をランダムで返す関数があるとしてとりうる値の数は何個でしょう
0669デフォルトの名無しさん
2008/12/29(月) 22:01:22ちょっとは考えようぜ。
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 が極端に出にくくなってしまうことになる。
0671デフォルトの名無しさん
2008/12/29(月) 22:21:12だからな、仮にサンプルの通り1-6の変数が出て欲しいものとすると、出てくる値の数は6個だろ?
で、お前の言うとおり1を抜くと、6-1で5個になってしまう。おかしいだろ?
0672661
2008/12/29(月) 22:52:39.,r'"_`''i、
l i´ .゙i |
!-' 丿丿
/,/
l |
二
| |
゙‐'
)フ
ウ--,, ノ フ
フ  ̄ ̄ヽ...--.../ フ
フ ......ヽOノ.............フ___
フ /::::::::::::::::::::::::::::::::::ヽ/ っ
<>/==─::::::::人::::─==ヽ つ っ
>ノ:::::::::::::::::::::ノ ヽ:::::::::::::::::ヽ
クノ_ノノ_ノ/_ノ, \ヽ:::_ヽ_ヽ
__ノ::::::::::r ( ヒ_] ヒ_ン人::::::)
∠:::::::::::::::::|// ,___, //|::::::/
ノノ >:::::::人. ,'::::ヽ
/:::::::::::::::::>,、 ______, .イ::::::::::(
0673デフォルトの名無しさん
2008/12/29(月) 23:05:33まあそうなる。
防ぐためというか、まあ、全部の値が均一に出るようにするため、だな。
0674デフォルトの名無しさん
2008/12/29(月) 23:18:29いや均一にするためというより1抜いたら最大値が絶対に出なくなるだろ
0675デフォルトの名無しさん
2008/12/29(月) 23:19:51RAND_MAX の時に出るだろ?
0676デフォルトの名無しさん
2008/12/29(月) 23:26:52つまり+1.0したらmax+1が出ることもあるってことか?
というかここまでしなくてもサイコロ程度なら普通にrand()%6+1で良いと思うんだ。
0677デフォルトの名無しさん
2008/12/29(月) 23:28:01その対策
0678デフォルトの名無しさん
2008/12/30(火) 00:00:38もしくはboost::random使おう。
疑似乱数2
ttp://pc11.2ch.net/test/read.cgi/tech/1192628099/
0679661
2008/12/30(火) 02:49:33「知らないならレスしないで下さい」というあれが
ちっとも煽りではない場面ですね、ここはw
0680デフォルトの名無しさん
2008/12/30(火) 03:27:45それをお前が言うかぁ・・・
0682デフォルトの名無しさん
2008/12/30(火) 09:32:37randですむような用途なら%で十分って気もするけどね。今どきの処理系なら下位ビットの周期が極端に短いなんてないし
0683デフォルトの名無しさん
2008/12/30(火) 09:41:472の累乗で割った場合は周期が短くなる事に変わりはない。
0684デフォルトの名無しさん
2008/12/30(火) 09:52:320685デフォルトの名無しさん
2008/12/30(火) 09:54:080686デフォルトの名無しさん
2008/12/30(火) 10:57:40それが気にならないなら%でいいんじゃね
0687デフォルトの名無しさん
2008/12/30(火) 11:12:11だから下位ビットの周期がそんなに短い処理系なんて今どき無いって言ってるじゃん。
0688デフォルトの名無しさん
2008/12/30(火) 11:30:12rand() / (1.0+RAND_MAX) * で十分だけど、
rand() % だと困るという状況はなくはないかもしれない。
0689デフォルトの名無しさん
2008/12/30(火) 11:35:17線形合同法なら数行だしその時点で下位ビットを捨てておけば悲惨なことにはならないし
0690デフォルトの名無しさん
2008/12/30(火) 11:35:540691デフォルトの名無しさん
2008/12/30(火) 11:40:03だな。俺も random で済む用途は random 使うし、ちょと心配な場合は boost。
変に小細工して悩むよりずっと簡単で確実。
0692デフォルトの名無しさん
2008/12/30(火) 12:04:37struct 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); とかではうまくいきません。
構造体のメンバを指定して値を入れるにはどうしたらいいんでしょうか。
0693デフォルトの名無しさん
2008/12/30(火) 12:11:07tmp.x = 10;
tmp.y = 10;
P1.push_back( tmp );
0694デフォルトの名無しさん
2008/12/30(火) 12:13:52その要素が S_P1 構造体のデータで、S_P1 構造体が x とか y を持つ。
0695デフォルトの名無しさん
2008/12/30(火) 12:23:41とてもよく分かりました。
いろいろ謎が解けました。ありがとうございます。
0696デフォルトの名無しさん
2008/12/30(火) 17:47:55CTestA a;
CTestB b;って宣言したとして
aとbでひとつの変数を共有するってできますか?
0697デフォルトの名無しさん
2008/12/30(火) 17:52:200698デフォルトの名無しさん
2008/12/30(火) 17:56:24static変数なら、クラス全部で共有できるけど、そういうのじゃなくて?
0699デフォルトの名無しさん
2008/12/30(火) 17:58:40出来ると思う。 CTest が static なメンバ変数を持っておいて、
CTestA と CTestBでそれへの参照を持てば実質的に共有することになる.
0700デフォルトの名無しさん
2008/12/30(火) 17:59:240701デフォルトの名無しさん
2008/12/30(火) 18:14:52共有させたいオブジェクトをaとbから参照させればいいのだ。
boost::shared_ptrを使おう。
0702デフォルトの名無しさん
2008/12/30(火) 20:33:21配列数がコンパイル時不明なのですが、こうすると定数式が必要だというエラーが出てしまいます。
メモリの大きいサイズを確保して、あとからint区切りで添え字でアクセスできるようにするにはどう書けばいいんでしょうか?
0703デフォルトの名無しさん
2008/12/30(火) 20:35:21mallocつかえmalloc
0704デフォルトの名無しさん
2008/12/30(火) 21:09:380705デフォルトの名無しさん
2008/12/30(火) 21:13:440706デフォルトの名無しさん
2008/12/30(火) 21:15:370707デフォルトの名無しさん
2008/12/30(火) 21:25:26BCCだか使うとできる
0708デフォルトの名無しさん
2008/12/30(火) 21:27:04ごめん、gccだった
0709デフォルトの名無しさん
2008/12/30(火) 21:49:26-std=c99で堂々と今やgcc拡張ではないと胸を張って言えますよ。
0710デフォルトの名無しさん
2008/12/30(火) 22:34:270711デフォルトの名無しさん
2008/12/30(火) 22:36:070712デフォルトの名無しさん
2008/12/30(火) 22:57:330713デフォルトの名無しさん
2008/12/30(火) 23:06:56>710は、gccの場合c99準拠にするためにオプションが要るけど、iccではそれが要らないと言うこと。
0714デフォルトの名無しさん
2008/12/30(火) 23:09:51gccは独自拡張でも可変長配列をサポートしていてc99とかなにもつけないとそれが有効になるということ
0715デフォルトの名無しさん
2008/12/31(水) 14:57:55class 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クラスのところ)
これを壊れずにやる方法ってないんでしょうか?
0716デフォルトの名無しさん
2008/12/31(水) 15:02:16めっちゃ基本的だな。 あまりにありがちすぎてフいた。
personListは単なるポインタ。
単に宣言しただけではそれが指す先は不定。
メモリを確保してその場所を入れろ。
0717デフォルトの名無しさん
2008/12/31(水) 15:03:36なんか語読してるぞ。
0718デフォルトの名無しさん
2008/12/31(水) 15:04:34壊れるってどゆこと?
0719デフォルトの名無しさん
2008/12/31(水) 15:08:16いや、>>716の言う通りかもしれん。
とりあえず >>715 はコンパイル可能な形のソースコードを貼るべき。
下手に省略すんな。
0720デフォルトの名無しさん
2008/12/31(水) 15:16:42class 定義の最後にはセミコロンが要るぞ。
それは単なる書き間違いなのか?
と、いうわけで>>719に同意。
0721デフォルトの名無しさん
2008/12/31(水) 15:54:03プライベートとプロテクテッドは何が違うんですか?
0722デフォルトの名無しさん
2008/12/31(水) 15:56:010723デフォルトの名無しさん
2008/12/31(水) 15:56:210724デフォルトの名無しさん
2008/12/31(水) 15:56:53protected は継承したクラスからは見える。
private は friend 指定したクラス (あるいは関数) 以外からはまったく見えない。
0725デフォルトの名無しさん
2008/12/31(水) 16:36:25ようするに、
Privateは「そのクラス内のみ」で「継承したクラス」で実装した関数では操作できないが、継承していれば
クラス内変数自体は存在しているってことですかね?
Protectedは継承したクラスからも見れるって事でおkですか?
0726715
2008/12/31(水) 16:38:38{
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の中身をデバッガで見ると、もともとの値が化けています。
0727デフォルトの名無しさん
2008/12/31(水) 16:42:20初っ端から realloc 使うなら NULL で初期化するべし
person の値は書き換えられて当然
index はどこからきた?
0728デフォルトの名無しさん
2008/12/31(水) 16:53:33ついでに sizeof の中身が違う
0729デフォルトの名無しさん
2008/12/31(水) 16:54:07お前らはどうだい?
0730デフォルトの名無しさん
2008/12/31(水) 16:55:29class Name のメンバが指す領域が確保されていない
std::string でも使えば?
0731デフォルトの名無しさん
2008/12/31(水) 17:03:56コンパイルできなくない?
すごいデバッガ使ってる?
0732デフォルトの名無しさん
2008/12/31(水) 17:17:18俺も使うよ。
どうせそんなに汎用的なクラスは作らんし。
それなら依存関係が明確な方がいい。
0733デフォルトの名無しさん
2008/12/31(水) 17:31:31使う機会がないな
0734デフォルトの名無しさん
2008/12/31(水) 17:55:46俺はむしろライブラリ作ってると、ライブラリ内だけで行き交わせたいデータがあるとfriend指定使ってしまう。
なんかいい方法あるのかな・・・。まぁライブラリはDLLとかにしちゃえば、あとは使わせる部分だけヘッダで公開すればいいだけなんだろうけど
0735デフォルトの名無しさん
2008/12/31(水) 18:43:42特定のクラスだけ変更できるデータとかに使うな
0736デフォルトの名無しさん
2008/12/31(水) 19:01:36immutable である事をインタフェース的に保証したいクラスと
そのファクトリに使う事があるかも。
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;
}
0737デフォルトの名無しさん
2008/12/31(水) 19:12:09ttp://www.codegear.com/jp/downloads/free/cppbuilder
これのどれをDLすればいいのでしょうか?
初歩的な質問ですみません。
0738デフォルトの名無しさん
2008/12/31(水) 19:19:050739デフォルトの名無しさん
2008/12/31(水) 19:19:44C++ Compiler 5.5/Turbo Debugger
ってやつ
フリーの統合開発環境ならこれがオススメ
なんといっても書籍も含めて関連情報が多い
ttp://www.microsoft.com/japan/msdn/vstudio/express/beginners/2008/visualc.aspx#top
ttp://www.microsoft.com/japan/msdn/vstudio/express/
0740デフォルトの名無しさん
2009/01/01(木) 01:34:07#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にしているのですがこれは、なにかまずかったりするのでしょうか
なんとなく不安なので、質問しに来るました
0741デフォルトの名無しさん
2009/01/01(木) 02:08:060742デフォルトの名無しさん
2009/01/01(木) 02:11:56infがあるのに最小はDBL_MAXになっちゃう気がするんですが
0743デフォルトの名無しさん
2009/01/01(木) 02:12:58const int p[4];
〜略〜
};
ひょっとしてこういう感じのことはできないのでしょうか、初期化子では配列に入れられないですし
0744デフォルトの名無しさん
2009/01/01(木) 02:15:210745デフォルトの名無しさん
2009/01/01(木) 02:19:41すいません
何をいっているのでしょうか?
配列から最小値を探すために、
結果を入れる変数に初期値としてその型の最大値を入れておきたいのですけど
0746デフォルトの名無しさん
2009/01/01(木) 02:43:44x[0]を初期値にすれば?
0747デフォルトの名無しさん
2009/01/01(木) 03:10:11比較の前にinfチェックして使っとけば?
0749デフォルトの名無しさん
2009/01/01(木) 08:13:440750デフォルトの名無しさん
2009/01/01(木) 09:20:15Windowsなら異常終了のダイアログが出ないこともなかったような
0751デフォルトの名無しさん
2009/01/01(木) 10:21:40固有名詞で「出力ウィンドウ」ってーとそのぐらいしか思いつかん
0752デフォルトの名無しさん
2009/01/01(木) 12:04:24size_t words_size = sizeof(words)/sizeof(char *);
これのsizeof(chara *)の*はなんで必要なんですか?
sizeof(char)ではだめなんですか?
0753デフォルトの名無しさん
2009/01/01(木) 12:13:52charaだけだと、chara型の配列じゃなくって一文字になっちゃう
0754デフォルトの名無しさん
2009/01/01(木) 12:21:49そしてcharを指すポインタの4つの配列は、それぞれどこかの文字データの入ったアドレスを指していることになる。
words[0] ---------------------------------------->"stately" (0x234fee)
words[1] ------------>"plump" (0xdd4540)
words[2] ----------------------------------------------------->"buck" (0x001101)
words[3] --------------------------->"mulligan" (0x0d7100)
まぁ普通は連続的になるだろうが、オプション次第ではこういうのも作れるよね…?
これであってる?
0755デフォルトの名無しさん
2009/01/01(木) 12:22:57そもそもそのコードが何を計算してるのか理解してるか?
0756デフォルトの名無しさん
2009/01/01(木) 13:14:550757デフォルトの名無しさん
2009/01/01(木) 13:35:17Class内でStatic付なのはPublic以外ではできないのでしょうか?
0758デフォルトの名無しさん
2009/01/01(木) 13:39:260759デフォルトの名無しさん
2009/01/01(木) 14:37:32cppに
type classname::membername=initialvalue;と書いてみれ
0760デフォルトの名無しさん
2009/01/01(木) 15:25:32実体がない
class Foo {
static int Bar;
};
なら何処かのcppに
int Foo::Bar = 100;
とか書く必要がある
0761デフォルトの名無しさん
2009/01/01(木) 18:53:18複数の処理スレッドが入力を受け付け(accept)、処理を実行し、1つの管理スレッドが
スレッド数の管理や処理に関する統計処理等を行っています。
(処理数が処理スレッド数を上回った場合は、管理スレッドが処理スレッドを増やすなどを行う)
ここで質問なのですが、管理スレッドを定期的に実行させるにはどのような方法がよいでしょうか?
スレッドのpriorityも関係しそうですが、管理スレッドのpriorityをあげるのは、
なんかおかしいかなと思ってます。(実際にpriorityが高いのは処理スレッド)
環境は、linux(centos)上でpthreadを使っています。
0762デフォルトの名無しさん
2009/01/01(木) 19:21:44単純な方法はsleepじゃないかな。
あとaccepetしたときやsocketをクローズさせたときに管理スレッドにイベントを送るようにしたら効率がいいと思うよ
0763デフォルトの名無しさん
2009/01/01(木) 19:25:020764デフォルトの名無しさん
2009/01/02(金) 22:33:44int 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
どうすればいいでしょうか?
0765デフォルトの名無しさん
2009/01/02(金) 22:39:490766デフォルトの名無しさん
2009/01/02(金) 23:47:36どうすればって、stdio.hがひらけねぇっていわれてるんだからあるのおかどうか確認せーよ
0767デフォルトの名無しさん
2009/01/02(金) 23:52:16主に標準インクルードパス
0768デフォルトの名無しさん
2009/01/02(金) 23:53:330769デフォルトの名無しさん
2009/01/03(土) 00:39:410770デフォルトの名無しさん
2009/01/03(土) 00:45:510771デフォルトの名無しさん
2009/01/03(土) 01:02:21環境は書いて欲しいが。
0772デフォルトの名無しさん
2009/01/03(土) 01:18:17VisualC++2008のでそういうことってできます?
0773デフォルトの名無しさん
2009/01/03(土) 01:19:02purify とかいうソフトがある。
試用期間があったはず。
0774デフォルトの名無しさん
2009/01/03(土) 01:37:59_CrtSetDbgFlag
0775デフォルトの名無しさん
2009/01/03(土) 08:32:37何そのウンコ機能
newをオーバーライドしたほうがいい
0776デフォルトの名無しさん
2009/01/03(土) 08:34:24int b[50];
a = &b[10];
aの先頭にbの先頭にしたいアドレスを入れたらbのa配列分がaからアクセスできるようにしたいんですがこれ無理ですか?
0777デフォルトの名無しさん
2009/01/03(土) 08:46:26int *a;
a = &b[10];
じゃだめなのか?
0778デフォルトの名無しさん
2009/01/03(土) 08:57:040779デフォルトの名無しさん
2009/01/03(土) 09:53:22leakcheckerだけなら色々あると思うが。
0780デフォルトの名無しさん
2009/01/03(土) 10:18:54文字列を直接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;
}
0781デフォルトの名無しさん
2009/01/03(土) 10:21:320782デフォルトの名無しさん
2009/01/03(土) 10:45:16すみません、std::lessをどう使えばいいのでしょうか…。
0783デフォルトの名無しさん
2009/01/03(土) 10:50:250784デフォルトの名無しさん
2009/01/03(土) 11:08:56通常は 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 の順。
0785デフォルトの名無しさん
2009/01/03(土) 11:52:09なるほど、そういう事だったのですね。
stringよりはポインタの方が早いようなので、
1か2の方を使ってみようと思います。
ありがとうございました。
0786デフォルトの名無しさん
2009/01/03(土) 12:21:37思い込み乙。
0787デフォルトの名無しさん
2009/01/03(土) 12:29:50文字列の動的コピーが必要になった際に
strlen しなくて済む分速いよね。
0788デフォルトの名無しさん
2009/01/03(土) 13:18:32だからノロイ部分はある。
0789デフォルトの名無しさん
2009/01/03(土) 13:19:46妄想しすぎだろう・・・。
メモリは文字列のサイズ丁度に確保するとは限らない。
それに、自分でメモリ確保する場合も同じだろう。
0790デフォルトの名無しさん
2009/01/03(土) 13:23:160791デフォルトの名無しさん
2009/01/03(土) 13:25:48ノードの追加は明らかに std::string の方が遅くなるが、
文字列のサイズを取得する処理は std::string の方が速い、など。
0792デフォルトの名無しさん
2009/01/03(土) 13:28:55特化した文字列クラスを作る。
0793デフォルトの名無しさん
2009/01/03(土) 13:30:06速度の話題が出たときには毎回誰かが言ってんのにまたこの流れか。
0794デフォルトの名無しさん
2009/01/03(土) 13:30:270795デフォルトの名無しさん
2009/01/03(土) 13:49:01実測してみるのが良いとは思うけど、大抵極端な差は出ないか、char*の方がコードが長くなるから
人間のミスによりchar*の遅いかも知れない。
0796デフォルトの名無しさん
2009/01/03(土) 15:24:162倍を超えるところで遅くなってその時点からまた2倍になるまで速くなる。
0797デフォルトの名無しさん
2009/01/03(土) 15:28:12てことわ、char*版もアセンブラで書き直さないと比較にならないのか?
0798デフォルトの名無しさん
2009/01/03(土) 15:33:300799デフォルトの名無しさん
2009/01/03(土) 15:34:44暗黙的にコピーが発生する可能性が高い分、気をつけないと std::string の方が char* より速度が遅くなる可能性は高いが、
質問のレベルからしてメモリ関連のバグを抱え込むか、メモリを確保しっぱなしのような行儀の悪いプログラムを書くかする
危険性も高いと思うんだ。
char* と string の速度差が意味を持つようなプログラムを書くつもりなのか、考えてみた方がいいと思う。
0800デフォルトの名無しさん
2009/01/03(土) 15:37:440801デフォルトの名無しさん
2009/01/03(土) 16:38:14一方POD型の分も発生するが、同じデータ量を持った未定義の内容のメモリが確保されるだけに過ぎないので
コンストラクタとデストラクタのコストが著しく高い場合はPOD型に置き換えた方が良い。
0802デフォルトの名無しさん
2009/01/03(土) 16:46:120803デフォルトの名無しさん
2009/01/03(土) 17:09:57int num = 12;
str.Format(_T("%d"), num);
numが何桁だろうと012と3桁表示にフォーマットする書き方はありますか?
0804デフォルトの名無しさん
2009/01/03(土) 17:12:02仕様に書いて歩けど
%03dってかけばおk
0=空いてる桁は0梅、3=3桁
0805デフォルトの名無しさん
2009/01/03(土) 17:12:390806デフォルトの名無しさん
2009/01/03(土) 17:13:460807デフォルトの名無しさん
2009/01/03(土) 17:14:580808デフォルトの名無しさん
2009/01/03(土) 18:06:02ml.exe(アセンブラ)が存在しないっぽい。以前入れた時にはあったような
気がしたんだけど、どうすれば手に入るか教えてくだせえ。
0809デフォルトの名無しさん
2009/01/03(土) 18:15:470810デフォルトの名無しさん
2009/01/03(土) 21:59:05ちなみに今まで読んだ本は
新版 明解C言語 入門編
柴田望洋 著
Cプログラミング専門課程
藤原 博文 著
です
もしすれ違いだったら誘導お願いします。
0811デフォルトの名無しさん
2009/01/03(土) 22:03:39・ 独習C++
・ Accelerated C++
・ やさしいC++(高橋麻奈)
・ 詳説C++
好きなの選べ。
0812デフォルトの名無しさん
2009/01/03(土) 22:19:47規格が現行のものでないものが多いから
0813デフォルトの名無しさん
2009/01/03(土) 22:26:220814デフォルトの名無しさん
2009/01/03(土) 22:29:07それより先に C++ の入門書を読まないとな。
0815デフォルトの名無しさん
2009/01/03(土) 22:30:19発行が新しいという意味ではこの2つが新しいな。
・ やさしいC++(高橋麻奈)
・ ロベールのC++入門講座
0816デフォルトの名無しさん
2009/01/03(土) 22:40:02名前空間の概念がないから
using・・・ せずに vector・・・・とかやってたり
strstreamを普通につかってたり
そんなの
0817デフォルトの名無しさん
2009/01/03(土) 22:41:340818デフォルトの名無しさん
2009/01/03(土) 23:31:41C++が規格化されたのは1998年だから
最新版は2003年だけど、大筋は変わらないから2003年以前でも問題はない
1998以前が悪いとも限らないけど
0819デフォルトの名無しさん
2009/01/04(日) 01:04:16C言語における「文字列の配列」とはどういうものですか。
0820デフォルトの名無しさん
2009/01/04(日) 01:07:52char (の配列をさす)ポインタの配列。
とか。
0821デフォルトの名無しさん
2009/01/04(日) 01:08:03"foo", /* 実際には 10 バイトの領域が割り当てられる */
"bar", /* 実際には 10 バイトの領域が割り当てられる */
};
/* table は文字列へのポインタを保持する配列となる */
const char *const table[2] = {
"foo",
"bar",
};
普通は後者を使うが、
文字数が決まっていて文字数が全部揃っている場合は
前者を使う事もなくはない。
0822810
2009/01/04(日) 01:59:15ありがとうございます
ロベール買うことにしました
0823819
2009/01/04(日) 02:18:500824デフォルトの名無しさん
2009/01/04(日) 14:39:02i = ++i;
が、1を足してから代入されるのはわかるんですが、
int a[x];
for(i=0; i<x; ++i)
{
a[i] = i;
}
は、どうなるんでしょうか
一発目から1ではじまるんでしょうか?
2週目はiが2でいいんでしょうか?
0825デフォルトの名無しさん
2009/01/04(日) 14:42:29この結果は未定義じゃね?
まあ、変になることはない気はするが・・・。
>は、どうなるんでしょうか
i を表示してみれば分かるだろ・・・。
0826デフォルトの名無しさん
2009/01/04(日) 15:00:430827デフォルトの名無しさん
2009/01/04(日) 15:01:11i = ++i; は未定義。書いてはいけない。
1を足して代入するのは、++i; か i++; か i=i+1; か i+=1;
for(i=0; i<x; ++i) はi=0からi=x-1まで、x回のループ。
0828デフォルトの名無しさん
2009/01/04(日) 15:13:54i = 0;
while(i < x)
{
a[i] = i;
++i;
}
と同義
0829デフォルトの名無しさん
2009/01/04(日) 15:14:450830デフォルトの名無しさん
2009/01/04(日) 15:33:180831デフォルトの名無しさん
2009/01/04(日) 15:36:11それでも目安くらい出せるとは思うけど、コンピュータの性能で本当に違う。
Core 2だと十数分とかからない。
0832デフォルトの名無しさん
2009/01/04(日) 15:41:150833デフォルトの名無しさん
2009/01/04(日) 15:57:12int 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;
0834デフォルトの名無しさん
2009/01/04(日) 16:02:19まじで?
俺3Ghz*2なのに2時間かかったぞ
PenDとcore2じゃ3Gでも違うのか?
0835デフォルトの名無しさん
2009/01/04(日) 16:10:430836デフォルトの名無しさん
2009/01/04(日) 17:02:000837831
2009/01/04(日) 17:35:02俺も自分のPCはPrescottで、フルビルドなんて時間がかかってしょうがないから、
最近は使うものだけ個別にビルドするようにしている。
0838デフォルトの名無しさん
2009/01/04(日) 19:10:17vector< int[2] > みたいな事は可能なのでしょうか。
出来る場合はどういう風に宣言すれば良いのでしょうか。
0839デフォルトの名無しさん
2009/01/04(日) 19:20:46それはできない
boost::array 使うとか
struct array {
int item[10];
};
みたいなのを作るとか
0840デフォルトの名無しさん
2009/01/04(日) 21:06:24恐しき哉
0841デフォルトの名無しさん
2009/01/04(日) 22:01:00#include <stdio.h>
int main(void)
{
double pi;
printf("あなたは何歳ですか?\n");
scanf("%lf",&pi);
printf("あなたは%f歳です。\n",pi);
return 0;
}
コンパイラ後に少数を入力しても小数点以降がカットされてしまうのですが
どこが間違っているのでしょうか
0842デフォルトの名無しさん
2009/01/04(日) 22:04:22まともに動くが?
BCC6.1.0
0843デフォルトの名無しさん
2009/01/04(日) 22:26:28Vista VS2005
0844デフォルトの名無しさん
2009/01/04(日) 22:30:150845デフォルトの名無しさん
2009/01/04(日) 22:32:44-lmオプションなんだとおもってんだよwww
0846841
2009/01/04(日) 22:33:43申し訳ないです
0847デフォルトの名無しさん
2009/01/04(日) 22:40:43確かmath.hの関数ライブラリのリンクの指示だよな
0848デフォルトの名無しさん
2009/01/04(日) 22:47:13何人だよ
0849デフォルトの名無しさん
2009/01/04(日) 22:58:250850デフォルトの名無しさん
2009/01/04(日) 23:04:060851デフォルトの名無しさん
2009/01/04(日) 23:10:10英米日韓中は同じだね。世界は2分されてるな
あとは帝国主義時代にどこの植民地になったかで決まってるかんじ
0852デフォルトの名無しさん
2009/01/04(日) 23:21:29まあ開発者がスウェーデン人だったからという事もあるが
0853デフォルトの名無しさん
2009/01/04(日) 23:29:34数値を列挙しているのか小数点なのか
分からなくなりそうだ。
0854デフォルトの名無しさん
2009/01/05(月) 00:15:20そこで列挙の区切り文字にはピリオドですよ。
いや、まじで日付を2008.1.6って区切る国もあるらしいね
0855デフォルトの名無しさん
2009/01/05(月) 02:19:42文章内でもピリオドで区切るんか?
そうなると列挙と文章の終端の区別が・・・。
0856デフォルトの名無しさん
2009/01/05(月) 08:12:39なんでデリートもしてないのに勝手に解放されるんですか?
すごい一生懸命メモリ意識して作ったのに納得できません
どうなってるんですか?
0857デフォルトの名無しさん
2009/01/05(月) 08:29:220858デフォルトの名無しさん
2009/01/05(月) 11:04:39ハードディスクの可動部分の負担をなくすために普通は限界までメモリで回す設定じゃないんですか?
最小化してメモリが減るアプリ初めて見たんですけどひどくないですか?自分で作ったんですけど・・・
0859デフォルトの名無しさん
2009/01/05(月) 11:09:16メモリの使用量は同じだけど、実メモリの使用量が下がるだけでは?
画面で見えていない部分を実メモリに置いておくよりは、見えている方をメモリにのせた方が効率良いので。
スワップさせないように出来るとは思うけど知らない。
0860デフォルトの名無しさん
2009/01/05(月) 11:26:15メモリ管理はOSの重要な機能の1つ
スワップさせない方法は探せばあるのかもしれんが
>最小化してメモリが減るアプリ初めて見たんですけどひどくないですか?
限りあるリソースの中で動かす工夫だよ
0861デフォルトの名無しさん
2009/01/05(月) 11:32:06# 本当に何が起こってるか知りたいならOSのメモリ管理をよーく勉強しろ
あとWindowsのタスクマネージャを見てるんなら
ちゃんと数字の意味を調べて知っておいた方がいい
(Windows XPのタスクマネージャで出てくるメモリ消費量の数字は
いわゆる「ワーキングセット」の数字で、直感的なメモリ消費量とはやや異なる意味を持つ)
0862デフォルトの名無しさん
2009/01/05(月) 11:32:11Windows XPなら、それがOSの仕様
ウィンドウ最小化 ワーキングセット
あたりのキーワードでぐぐれ
0863デフォルトの名無しさん
2009/01/05(月) 12:04:280864デフォルトの名無しさん
2009/01/05(月) 12:16:51うん。そもそもわかりやすいメモリリーク以外見つからないと思うが
メモリリークの対処はリーク検知ツール(LinuxではValgrindとか)を使うか、
自前でallocateとdeallocateのログをとって突き合わせるとかの手法を使うべき
C++なら動的に確保したオブジェクトはすべてスマートポインタに突っ込むといった
そもそもリークしないコードを書くように心がけるのがよろしい
0865デフォルトの名無しさん
2009/01/05(月) 12:30:500866デフォルトの名無しさん
2009/01/05(月) 12:40:090867デフォルトの名無しさん
2009/01/05(月) 12:45:46ある確率で回収されそこねる危険がある
とか最後に書いてあったんだけど
0868デフォルトの名無しさん
2009/01/05(月) 12:55:01C++だとかえって苦労が増えるだけのような
MSはGCベースの.NETとの共存のためにわざわざC++/CLIとか作ったわけじゃない
0869デフォルトの名無しさん
2009/01/05(月) 12:58:010870デフォルトの名無しさん
2009/01/05(月) 12:59:02否定じゃないよ
「作ったわけでしょう」
といいたかった
0871デフォルトの名無しさん
2009/01/05(月) 13:00:50けどmosh等C++プロジェクトでもべーむ使ってるのはあるよ
0872デフォルトの名無しさん
2009/01/05(月) 13:08:59あと、vectorは宣言してあるクラスに: public gc付ければswapしなくていいようになるかな
0873デフォルトの名無しさん
2009/01/05(月) 13:52:45getchar()で文字列を10文字以内の2件入力(11文字以降は読み捨て)、
char型に格納。
というプログラムを作りたいのですが、どうすればいいでしょうか?
0874デフォルトの名無しさん
2009/01/05(月) 13:54:33宿題なら宿題スレへ。そうでないならfgets()を使って工夫しましょう。
0875デフォルトの名無しさん
2009/01/05(月) 13:55:370876デフォルトの名無しさん
2009/01/05(月) 14:09:58わかりました。
ありがとうございます。
0877デフォルトの名無しさん
2009/01/05(月) 14:42:55保守的GCはそういうもの。
他のGCだって循環参照だと回収出来なかったりとか、
回収が特定のタイミングに集中するとかいった問題はある。
GC有りならメモリを気にしなくていいなんてことは無い。
メモリ開放を個別に指定しなくていいってのは大きいけど、それだけだな。
BoehmGCってマシンスタックを直接走査したりする。
環境依存しまくりで#ifdefの嵐だでよ。
主要な環境ではだいたい問題なく使えるけど…
0878デフォルトの名無しさん
2009/01/05(月) 15:36:23typedef 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
な感じですか?
0879デフォルトの名無しさん
2009/01/05(月) 15:38:190880デフォルトの名無しさん
2009/01/05(月) 15:44:57ついでに言えば、ポインタのサイズはintと同じとは限らない。
0881デフォルトの名無しさん
2009/01/05(月) 15:59:19アドバイス有り難うございます。
そしたらこんな感じでしょうか?
http://upload.fam.cx/cgi-bin/img-box/z8590105155749.png
0882デフォルトの名無しさん
2009/01/05(月) 16:06:080883デフォルトの名無しさん
2009/01/05(月) 16:16:150884デフォルトの名無しさん
2009/01/05(月) 17:06:03まずはその小汚い絵を何とかしろ。draw系のツールを使うかせめてスプレッドシートで描いてキャプチャしてくれ。
0885デフォルトの名無しさん
2009/01/05(月) 17:38:570886デフォルトの名無しさん
2009/01/05(月) 17:42:500887デフォルトの名無しさん
2009/01/05(月) 18:06:12こんな感じになるはず
ttp://pastie.org/352730
0888デフォルトの名無しさん
2009/01/05(月) 23:28:050889デフォルトの名無しさん
2009/01/06(火) 01:17:06無料じゃネェよ。
0890デフォルトの名無しさん
2009/01/06(火) 01:53:21struct tagA {
tagB m_array[N];
};
となっている時、必ず sizeof tagA == sizeof tagB * N になりますか?
0891デフォルトの名無しさん
2009/01/06(火) 03:17:00効率よく実装しようと思ったらおおかたそうなるんだろうけど、
規格は m_array の後ろにパディングを入れることを禁止してないから
「必ず」とは言えないね。
0892デフォルトの名無しさん
2009/01/06(火) 19:56:35の例が出ていて、
struct my_error_mgr {
struct jpeg_error_mgr pub; /* "public" fields */
jmp_buf setjmp_buffer; /* for return to caller */
};
ライブラリへの設定には pub のアドレスを渡して、エ
ラーハンドラで与えられた(というか返ってきた)ポイ
ンタを my_error_mgr にキャストしてるんだけど、これ
を C++ でやるにはどうしたらいいでしょうか?
0893デフォルトの名無しさん
2009/01/06(火) 20:14:36C++らしくするなら、継承でいいと思う。
struct my_error_mgr : jpeg_error_mgr
{
jmp_buf setjmp_buffer; /* for return to caller */
};
0894デフォルトの名無しさん
2009/01/06(火) 23:08:46staticで定義されたvectorの1要素のアドレス(例えば &container[5] 等) を取得した後、
そのvectorに対してpush_backなどの要素の追加削除を行わなかった場合、
そのアドレスが生きている事は保障されているのでしょうか?
あと、vector::reserve未満の範囲でpush_back等を行った場合はどうなのでしょうか
0895デフォルトの名無しさん
2009/01/06(火) 23:27:45たとえ尻に追加するだけだとしても、何かやったら無効
0896デフォルトの名無しさん
2009/01/06(火) 23:58:29vector <MyClass*> mMy;
STLはこうやってポインタ配列しか作らなくなった
これならモリモリ増やしても大丈夫、多分
0898デフォルトの名無しさん
2009/01/07(水) 00:25:0723.2.4.3
capacity超えない限り再確保は起きず、その場合
挿入位置より前の要素の参照とイテレータが有効なままなのは保証されている。
0899デフォルトの名無しさん
2009/01/07(水) 00:29:49あんたにゃSTLは無駄だ。つーか、何を使ってもメモリリークさせそうだ。
0900デフォルトの名無しさん
2009/01/07(水) 02:02:450901デフォルトの名無しさん
2009/01/07(水) 03:02:020902デフォルトの名無しさん
2009/01/07(水) 03:10:480903デフォルトの名無しさん
2009/01/07(水) 09:13:430904デフォルトの名無しさん
2009/01/07(水) 09:44:40> C++らしくするなら、継承でいいと思う。
そっか、struct と class は同義なんだっけ。とりあえずコンパイル可能な形
にはなりました。
エラーハンドラで例外投げて上位で catch したいんだけど、素通りしてしまう。
スタックフレームが違うのかなぁ…と思ったら↓見つけた。
http://d.hatena.ne.jp/espresso3389/20070921
むぅ…。
0905デフォルトの名無しさん
2009/01/07(水) 12:50:37struct X {
int a; // public
};
class Y {
int a; // private
};
0906デフォルトの名無しさん
2009/01/07(水) 14:50:410907デフォルトの名無しさん
2009/01/07(水) 15:22:170908デフォルトの名無しさん
2009/01/07(水) 15:34:46""はソースと同じディレクトリかな?
0909デフォルトの名無しさん
2009/01/07(水) 15:35:42protected:
void func();
};
class ClassB : public ClassA {
〜〜〜
};
上のような継承時にprotectedなメンバを
publicに引きずり出す指定子があったような気がしたんですが、
なんて名前でしたっけ?
或いは継承元のメンバ関数を明示的に使わせる指定子だったかも?
0910デフォルトの名無しさん
2009/01/07(水) 16:02:53かな
0911デフォルトの名無しさん
2009/01/07(水) 16:03:500912デフォルトの名無しさん
2009/01/07(水) 16:06:410913デフォルトの名無しさん
2009/01/07(水) 16:43:54thx
usingは盲点でした
0914デフォルトの名無しさん
2009/01/07(水) 17:03:570915デフォルトの名無しさん
2009/01/07(水) 17:20:180916892
2009/01/07(水) 17:20:24public な jmp_buf 持たせて、利用する側で setjmp し
てエラーハンドラで longjmp させたらうまくいったっ
ぽい(setjmp でエラー検出して例外投げる形)。
jmp_buf を隠してエラーマネージャで setjmp させると
うまくいかないんだけど、ここは凝っても仕方ないので
とりあえずこれでいいや。
0917デフォルトの名無しさん
2009/01/07(水) 17:37:25君が""で統一するのであれば、僕は君のヘッダファイル置き場に
秘密のコードを記したstdio.hを配置するとしよう
0918デフォルトの名無しさん
2009/01/07(水) 19:03:20何で型はBYTE,short,int,doubleしかないんですか?
24ビットとか、40ビットで数を表現したい場合はどうすればいいんですか?
0919デフォルトの名無しさん
2009/01/07(水) 19:04:41あるいはビットフィールド。
0920デフォルトの名無しさん
2009/01/07(水) 19:07:060921デフォルトの名無しさん
2009/01/07(水) 19:19:20他に有名なライブラリって何があるんですか?
0922デフォルトの名無しさん
2009/01/07(水) 19:22:100923デフォルトの名無しさん
2009/01/07(水) 19:28:430924デフォルトの名無しさん
2009/01/07(水) 19:29:480925デフォルトの名無しさん
2009/01/07(水) 19:30:160926デフォルトの名無しさん
2009/01/07(水) 19:33:020927デフォルトの名無しさん
2009/01/07(水) 19:37:09構造体なら。
0928デフォルトの名無しさん
2009/01/07(水) 19:39:160929デフォルトの名無しさん
2009/01/07(水) 19:42:03次期C++にも一部採用され、準標準とも言われるboost。
0930デフォルトの名無しさん
2009/01/07(水) 20:37:010931デフォルトの名無しさん
2009/01/07(水) 20:39:060932デフォルトの名無しさん
2009/01/07(水) 20:39:120933デフォルトの名無しさん
2009/01/07(水) 20:42:47a = 123.456;
a は 123 に丸められるってことですか?
不動小数点を指示しないといけないんですよね?
0934デフォルトの名無しさん
2009/01/07(水) 20:44:340935デフォルトの名無しさん
2009/01/07(水) 20:57:340936デフォルトの名無しさん
2009/01/07(水) 20:57:5132bitのintとfloatも同じ32bitじゃないですか
でもintに123.456入れると123になりますよね?
64ビット型に入れたら123になるのは__int64ってことですか?
0937デフォルトの名無しさん
2009/01/07(水) 21:01:31int a = 123.456;でも__int64 a = 123.456f;でも両方とも123になる。
0938デフォルトの名無しさん
2009/01/07(水) 21:32:05だと123.456
ですよね
浮動小数点型ってなんなんですか?
もしかして型って、中ですごい複雑になってるんですか?
0939デフォルトの名無しさん
2009/01/07(水) 21:33:290940デフォルトの名無しさん
2009/01/07(水) 21:36:04intや__int64は整数型に分類されるので、実数を格納することができない。
>>939
C: typedef short float16_t;して、各種演算はCの演算子を使わず自前で行うこと。
C++: クラス作れ。あとはCと大体同じ。
0941デフォルトの名無しさん
2009/01/07(水) 21:53:59演算子とかオペレータとかできれば避けたかった部分ですが、これはもうやるしかないですね・・・
じっくり勉強します。ありがとうございました。
あともうひとつだけ教えてください。64ビットパソコンで32ビットパソコンで作ったintのあるプログラムを動かすと64ビットになっちゃいますよね。
それを避けるためには__int32を使っておけば大丈夫という理解であってますか?
0942デフォルトの名無しさん
2009/01/07(水) 21:58:49でも、必ずそうというわけでもない。詳しくは IPL64 でググれ。
というわけで、stdint.h の int32_t を使うのが良い。
0943デフォルトの名無しさん
2009/01/07(水) 22:08:410944デフォルトの名無しさん
2009/01/07(水) 22:14:53main() から抜ける時にセグメンテーション違反が出て困っています
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
0945デフォルトの名無しさん
2009/01/07(水) 22:23:09あんまりコードは信用せずにデバッグしよう。
0946デフォルトの名無しさん
2009/01/07(水) 22:25:46#define MACRO 777
#endif
を
#define_ifndef MACRO 777
みたいに一行で書く方法ってありますか。
0947デフォルトの名無しさん
2009/01/07(水) 22:46:360948デフォルトの名無しさん
2009/01/07(水) 23:08:400949デフォルトの名無しさん
2009/01/08(木) 04:58:25<> と "" の違いは実装依存だよ。
ただし "" に対する検索が失敗したときには同じ名前に対して <> に対する検索をすることと
だけ決まっている。
0950デフォルトの名無しさん
2009/01/08(木) 17:48:50表現範囲は10の38乗となってるので38桁ではないんでしょうか?
内部で38桁まで計算できて最終的に7桁にされるってことなんでしょうか?
だとするとこの7桁は小数部分のことですよね?でないと整数部分も32ビットもあるから表現しきれないですよね
0951デフォルトの名無しさん
2009/01/08(木) 17:56:3538桁の上位7桁にしか意味が無いということだろ
1.234567E38
0952デフォルトの名無しさん
2009/01/08(木) 18:10:440953デフォルトの名無しさん
2009/01/08(木) 18:38:041234567.89012345
だと
1234567
になるってことですよね
つまり、数値の小さい順に並べると
char
short
float
long int
double
long long
ですね新発見です
0954デフォルトの名無しさん
2009/01/08(木) 18:41:05みたいな数字も表現できるってことだよ
まあ詳しく知りたければIEEE754の浮動小数点数フォーマットを調べてみれ
0955デフォルトの名無しさん
2009/01/08(木) 18:41:070956デフォルトの名無しさん
2009/01/08(木) 18:55:49char
short
long int
long long
float
double
でした。
ありがとうございます!
0957デフォルトの名無しさん
2009/01/08(木) 20:24:150958デフォルトの名無しさん
2009/01/08(木) 20:29:070959デフォルトの名無しさん
2009/01/08(木) 20:33:01関数が必要なら自分で作れ。ただし、C++なら<functional>にnegateがある。
0960デフォルトの名無しさん
2009/01/08(木) 20:36:28a = -b;
ってことですか?
なんか頭の出来の問題なきがしてこなくもないですが、ありがとうです。
0961デフォルトの名無しさん
2009/01/08(木) 22:35:38なんか全然理解できてない気がするよ……。
とりあえず「浮動小数点数」でぐぐっとけ。な。
0962デフォルトの名無しさん
2009/01/08(木) 23:05:420963デフォルトの名無しさん
2009/01/08(木) 23:09:00VisualStudio2008
0964デフォルトの名無しさん
2009/01/08(木) 23:17:48やはりそうですか・・・
あれってc++の解説サイトのソースをそのまま乗せるとcoutが定義されてないって出ますよね・・・
std::を先につけるとできるんですがこれってなんとか省けませんか?
0965デフォルトの名無しさん
2009/01/08(木) 23:18:40どうせ std:: ってやったときに候補が出るし。
0966デフォルトの名無しさん
2009/01/08(木) 23:19:03それはさておき、using namespace std;。
0967デフォルトの名無しさん
2009/01/08(木) 23:21:00ヘッダファイルにだけは絶対書くなよ!
お兄さんとの約束だ!
0968デフォルトの名無しさん
2009/01/08(木) 23:22:360969デフォルトの名無しさん
2009/01/09(金) 00:12:27今は妙な名前衝突させないためにむしろ書かないと安心できない
0970デフォルトの名無しさん
2009/01/09(金) 00:29:05eclipse の CDTプラグイン の エディタ
細かい設定ができますよ。
一括ダウンロードできるサイト、
http://mergedoc.sourceforge.jp/index.html#/pleiades.html
jarありのC++っての
0971デフォルトの名無しさん
2009/01/09(金) 01:08:36それVisual C++特有の問題ではなく、現代のC++はそういうものと決まっているからだぞ。
0972デフォルトの名無しさん
2009/01/09(金) 01:35:39規格票ぐらい買え
0973デフォルトの名無しさん
2009/01/09(金) 07:46:26まぁ{}でくくれってことなんだろうけど。
あと untypedef とか
0974デフォルトの名無しさん
2009/01/09(金) 08:10:130975デフォルトの名無しさん
2009/01/09(金) 11:13:090976デフォルトの名無しさん
2009/01/09(金) 11:14:18関数へのポインタを static const で持つんだ!
0977デフォルトの名無しさん
2009/01/09(金) 11:14:58そもそも inline 使いすぎなんじゃねーの。
0978デフォルトの名無しさん
2009/01/09(金) 11:37:25外部にインターフェースを公開するわけでもないのに
わざわざメンバ関数の宣言と実装を別々に書くのがわずらわしいんだよ。
公開しない=固定する必要は無いわけで
パラメータの変更とか内部使用の関数追加とかしょっちゅうだし。
0979デフォルトの名無しさん
2009/01/09(金) 11:50:33???じゃぁ別々に書かずにいっしょに書けばいいじゃん。
0980デフォルトの名無しさん
2009/01/09(金) 11:53:490981デフォルトの名無しさん
2009/01/09(金) 11:59:32だからclass内に関数を書くと
強制的にinline指定したのと同じになるのが嫌だと言ってるんだろ?
もしかして日本語苦手?
0982デフォルトの名無しさん
2009/01/09(金) 12:04:130983デフォルトの名無しさん
2009/01/09(金) 12:45:58それは知ってるが、 .cpp 内でしか使わない関数が inline になって何かデメリットあんの?
0984デフォルトの名無しさん
2009/01/09(金) 12:52:13class hoge {
:
private:
#include "hoge_privates.c" // お悩み解決!!
:
};
0985デフォルトの名無しさん
2009/01/09(金) 12:53:24実装が複数のコンパイル単位に渡る
超巨大クラスたったんだよ!
0986デフォルトの名無しさん
2009/01/09(金) 13:15:41まさかとは思うけど、
実装が.cpp内にあるものは1箇所からしか呼ばれない、なんて思ってはいないよね
0987デフォルトの名無しさん
2009/01/09(金) 13:25:34デストラクタやら例外処理コードやらが何回も詰め込まれたら
もうメロメロですよ。
0988デフォルトの名無しさん
2009/01/09(金) 18:12:460989デフォルトの名無しさん
2009/01/09(金) 18:18:010990デフォルトの名無しさん
2009/01/09(金) 18:23:220991デフォルトの名無しさん
2009/01/09(金) 18:24:410992デフォルトの名無しさん
2009/01/09(金) 18:48:41なんでVS2005スレの次にここを選んだんだか
ここでいいと思うよ
http://pc11.2ch.net/test/read.cgi/tech/1230008197/
0993デフォルトの名無しさん
2009/01/09(金) 19:03:53たらい回しでもう3回質問しました;;
半分諦め気味なのですがそちらでも聞いてみます。
ありがとうございます。
0994デフォルトの名無しさん
2009/01/09(金) 19:17:07virtualを付けると実体がどこかに確保される、というだけで
コンパイル時にはそれとは別にinline展開されたコードが埋め込まれると思うよ。
大抵のコンパイラでは。
C++の規格ではvirtualな関数をinline展開することを禁止していないし
両方指定すること(class内に書いた関数にvirtualをつけること)も当然出来るから。
0995デフォルトの名無しさん
2009/01/09(金) 19:22:12例えばpimplだったら、コンストラクタ内で呼び出しているものしか
実体の型は判別出来ないから、展開されないか。
0996デフォルトの名無しさん
2009/01/09(金) 19:40:59inline 展開を最適化するのも最適化の範疇だろ。
人間のアホな頭で考えるより、全部コンパイラ様に任せた方が良い。
0997デフォルトの名無しさん
2009/01/09(金) 19:53:52コンストラクタについての質問なのですが
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
};
※これはコンパイルエラーになります
0998デフォルトの名無しさん
2009/01/09(金) 19:57:55おまえはコンパイラが
「この部分は何百万回も呼び出されるから速度を優先」
「この部分は例外的な時にしか呼ばれないからサイズを優先」
といったことを判断できると思っているのか。
そりゃすげーや。
0999デフォルトの名無しさん
2009/01/09(金) 19:59:26どんな入門書にすら書いてある。
1000デフォルトの名無しさん
2009/01/09(金) 19:59:3210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。