【初心者歓迎】C/C++室 Ver.62【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
2デフォルトの名無しさん:2008/12/13(土) 01:27:01
>>1
3デフォルトの名無しさん: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 /:::::| |::::\| //::::::::::/    ノ  ,.. - ''"´  ヽ ______
4デフォルトの名無しさん: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:緑川光)
5デフォルトの名無しさん:2008/12/13(土) 05:40:52
。   ゚         | i    ゜     。i    。    ゚l  。    i    ┼┼``
     。  ゜i   ゚    i      !    |    ゜   i          /  ア ア ア ア ア ア ア ア ア ───‐─ ─
                  i     l       i     ! ゚            ゚          。    ゜
  i    ゜  i           |    ゜ i       |       ゜ i   l
             ゜   i         。   i          l        i   l
  |         l    ゚    ;゜   ゜   : ; ; i        l       l           !
:  ゜   i   ゚          i             、i;,| i, ゚,゜   ゜ i      l ゚;   l     。i
   |         。i     l   l   ゜;/ ̄u ̄;j\。´    i    ゚ |         !
゜  。       .|   i      i     :。/ :j :::::\:::/\;゚  !゜   ゜ i        l      | ゜
 l ゜  ゚           。゜    i / u  。<一>:::::<ー>。 !  | |
    i   ゜     |           |:j ° .:::。゚~(__人__)~゚j   教えてくれるまでここに居ます
  |。     !          i    !  \、 u ;゜.` ⌒´,;/゜   ゜ i     l    ゜ i     l
    !            l       。i      /゚:j⌒ヽ゚  '"'"´(;゚ 。     !   ゜    。i
       。  ゚:     ! ゚    l   / ,_ \ \/\ \゜      !        ゜ i  ゚
  、i;,  、|;      、i;, 。  ゜ ;゚ 、i;,と___)_ヽ_つ_;_ヾ_つ.;._ 。  l  。i ゜    ;゚ 、i;,   ゜ ;゚ 、i;,
6デフォルトの名無しさん:2008/12/13(土) 10:31:25
期限切れたら居ても意味なくね?
7デフォルトの名無しさん:2008/12/13(土) 11:46:31
>>5
      _/      ∠≠ニ二ニ≧=<´  ヘ.     ', ヘ\ヽ.      /
 _ -‐ ´/  ,   -‐´、_, '⌒`^  、 \::\ } l     ヽヘ ヽ}     /         _|_ \
   ̄ フ´,  /             丶\::V| |      Vl       ,'             |____
.  //./                   `Vヽl |      ヽ ' .     |         /|    ヽ
  / ,イ/                    Y/,       ヽ.\   |.   l       (_ノ  _ノ
  |/ /       |               ∨ヘ.      ト、 \_ |.   |
.  /     /  /  l:     /  l           ∨i    、   |  ̄   !  l       lヽ│/ /
  l│  /  イ  ,イ.    l  ト、ヽ     / | :l :|   |  l      |   ヽ_ノ   !ー┼‐ |‐┬
  | |   l_メ、」_,;./l     L  l V   ∧ /  :|/   ハ.  ト、   |          |./│ヽ l  |
  | ト.  |.____ ヽ    l´ヽ{ _⊥イ イ /   /    / l/⌒ヽ   .|  ー┼─ └── l  |
  | | ヽ | 、i┘::::i  \  | r┬┬‐┬ァ V  ,∧.   ,'  ´       |   ー┼−
  レ   ヽ!  ゝ- '   \l  i,.┘:::::iノ / ,/〉│ :| {         |    _⊥_     l   |
.      7/l/l/   、     `'ー‐ ' ∠≠r'ノ:jノ :| |         |   (__丿 ヽ    レ  |
     λ    `i`ァー-- 、  /l/l/l ∧‐'.:|:::|  ハ ',        |              l
      `、     レ'    ',     ,/| ::| :|:::| ./ ヽ_>      _|   __|_       _ノ
        ` = 、 '、    ノ  ,.イ∧'|:l.:/l:::|´            \    ._|
              `>-r  =ニi´、.,_`::: |:| { |:::l             |  .(_|
          _,.イ´ヽ.7   /  /:\;八:V:ノ                 |    ノ
       /7:::::!  ○O'´  /::::::::/ヽ.
       /  /:::::::レ'/ムヽ.  /::::::::/   ヽ.
8デフォルトの名無しさん:2008/12/13(土) 13:33:02
基底クラスBaseと、Baseの派生クラスDeriveがある時、
Baseでvirtualを付けて定義した関数は、Deriveでもvirtualを付けたほうがいいのですか?
9デフォルトの名無しさん:2008/12/13(土) 13:39:04
>>8
必要に応じてつけたらいいよ
ライブラリで公開するときなんかは全部につけておかないと
派生したときにオーバーライド不能の関数になるっしょ?

でも、みんなで共同で開発してるときに全部の関数につけまくったら
今度は派生先でオーバーライドされてんのかどうなのかわからないし
あんまり付けまくらないほうがいいかもね
10デフォルトの名無しさん:2008/12/13(土) 14:27:42
OfficeOutlook2003のemlファイルをテキストにしたいのですが便利なAPIないでしょうか?
11デフォルトの名無しさん:2008/12/13(土) 14:42:45
しつもんです。
JAVAで書かれたCコンパイラって無いのでしょうか?
12デフォルトの名無しさん:2008/12/13(土) 14:43:34
>>9
なにからなにまで間違ってる
13デフォルトの名無しさん:2008/12/13(土) 14:45:31
それ以上派生させないなら付けない
14デフォルトの名無しさん:2008/12/13(土) 14:46:43
>>8
どちらでもいいよ。普通は冗長だから書かない。
15デフォルトの名無しさん:2008/12/13(土) 14:54:29
>>11
(誰かが作っているかもしれないので)あるかもしれないが、多分ない。

>>10
そもそもemlファイルはテキストだと思うのだが。
16デフォルトの名無しさん:2008/12/13(土) 14:57:08
>>13
17デフォルトの名無しさん:2008/12/13(土) 15:10:04
>>16
Javaでいうfinal?
18デフォルトの名無しさん:2008/12/13(土) 15:10:54
>>17
virtualの仕様を理解した上でいってるか?
19デフォルトの名無しさん:2008/12/13(土) 15:25:51
>>11
なぜそういうものをほしがるのかを書くと他の道が開けるかもしれない
208:2008/12/13(土) 15:33:54
解答ありがとうございます
基底クラスの仮想関数を、派生クラスでオーバーライドした時、
派生クラスではvirtualを書いても書かなくても同じように動く、で合っているでしょうか?
21デフォルトの名無しさん:2008/12/13(土) 15:48:46
>>20
あってる。
なので13はそういう意図で付けなくても強制力はない。
自分は付ける。設計を見直すときに仮想関数か否かぱっとみて分かったほうが便利だから。
22デフォルトの名無しさん:2008/12/13(土) 16:36:48
C++にもfinal欲しいよなぁ
まぁ、どうやったとしても、結局はオーバーライドがらみって「正しく、詳しいドキュメントが存在する」必要があるんだけどさ。
23デフォルトの名無しさん:2008/12/13(土) 16:48:32
midiを直接出力するプログラムを書こうとしていて、
和音の出力でつまづいています。

MIDIフォーマット(SMF)は、♪の開始、♪の終了を指定して音を鳴らします。

例えばドの音は次のように鳴らします
 時間0 ドの開始
 時間10 ドの終了
(時間0とあるのは、前の音符からどれだけ経過してから音を鳴らすか)
ミも同様に
 時間0 ミの開始
 時間10 レの終了

しかし、これを和音にすると次のようになります
 時間0 ドの出力
 時間0 ミの出力
 時間10 ドの停止
 時間0 ミの停止

つまり、合成することによって、(同時に音がなるため)
ミの停止の前の時間が0になってしまいました。
このように、単音の場合を単純に合成したものが和音の出力にならないのですが
考えやすいやり方ってありますでしょうか

同じタイミングでなり始めたことを調べるため
♪の開始、♪の終了ではなく
♪の開始、♪の長さ、からなる中間データを考えてみましたが
中間データ→MIDIデータの箇所で結局つまづいてしまいました。
24デフォルトの名無しさん:2008/12/13(土) 16:56:58
♪を見ているうちにだんだんいらいらしてきた
25デフォルトの名無しさん:2008/12/13(土) 16:58:15
>>22
そんなあなたにC++0x
クラスやメンバ関数に[[final]]を付けるとオーバーライドを禁止できるぞ!
26デフォルトの名無しさん:2008/12/13(土) 17:02:34
クラス設計の時点で継承を考慮してないならつけるべきじゃない
27デフォルトの名無しさん:2008/12/13(土) 17:04:19
>>23
開始と終了を別々のイベントとして扱って、
イベントの時間は曲の先頭からの時間で表現すれば、
合成も簡単じゃね?
28デフォルトの名無しさん:2008/12/13(土) 17:08:01
>>23
出力直前に
map<int,event&> sequence; // <時刻, 命令>
に放り込むようにしてはどう?

で、全部放り込んだ後で出力する
for(iterator it=sequence.begin(),time_prev=0;it!=sequence.end();++it){
time_cur=it->first;
output(time_cur-time_prev, it->second);
time_prev=time_cur;
}
2923:2008/12/13(土) 17:16:12
>>27,28

出来そうな気がしてきました。
28さん具体的なコードまでくださって助かります。
3023:2008/12/13(土) 18:20:17
コードはほぼ28さんのものでうまく行きました、感謝。
同じイベント時間に複数和音も入ることがあるので
map→multimapでうまく行きました。
31デフォルトの名無しさん:2008/12/13(土) 23:21:38
template <typename T>
class Foo {
private:
typedef void (T::*func)();
};
というコードを見たのですが、これってどういう意味がありますか?
(コードとしてどういう使い道がありますか?)
32デフォルトの名無しさん:2008/12/13(土) 23:31:39
>>31
引数をとらず戻り値が void であるクラス T のメンバ関数へのポインタ型を
Foo<T>::func と書くことができる・・・かと思ったが、 private かよ。意味ねー。
33デフォルトの名無しさん:2008/12/14(日) 00:19:36
実際には Foo 内に別のメンバもあるんじゃね?
34デフォルトの名無しさん:2008/12/14(日) 00:58:24
Tが構造体やクラス以外だとエラーになりそうだね
35デフォルトの名無しさん:2008/12/14(日) 02:18:57
多分Fooの内部にTを抱えていて
それにアクセスする時に使ってるんだろう
36デフォルトの名無しさん:2008/12/14(日) 02:59:09
template <>
class Foo<void> {
private:
typedef void (*func)();
};
37デフォルトの名無しさん:2008/12/14(日) 08:35:08
>>36
それやるならintやdoubleなど他の組み込み型の特殊化もやらんと不十分な気が。
メタテンプレートで組み込み型かどうか判断すれば一発でできそうだな。
まあ特殊化が必要かどうか分からんが。
38デフォルトの名無しさん:2008/12/14(日) 14:36:05
32ビットの最大値を求めるにはどうすればいいですか?
39デフォルトの名無しさん:2008/12/14(日) 14:36:37
template <>
class Foo<int> {
private:
typedef void (*func)(int);
};

こういう意味け?
40デフォルトの名無しさん:2008/12/14(日) 14:39:26
pow(2,32);
41デフォルトの名無しさん:2008/12/14(日) 14:40:34
>>38
~0u とか INT_MAX, UINT_MAX とか
(std::numeric_limits<int>::max)() とか (std::numeric_limits<unsigned int>::max)() とか

>>40
1 引けよ
42デフォルトの名無しさん:2008/12/14(日) 14:42:42
pow(2,32)-1
thx!
43デフォルトの名無しさん:2008/12/14(日) 15:13:14
オーバーf・・・・・・・
44デフォルトの名無しさん:2008/12/14(日) 15:52:40
pow は小数だから大丈夫なのだが、
pow の引数は結構オーバーロードされてるので
pow(2,32) だと解決できなくてコンパイルに失敗するはず。
古いコンパイラでなければ。
45デフォルトの名無しさん:2008/12/14(日) 16:17:13
41が色々教えてくれてるのになんで最悪の方法を選んじゃうの?
46デフォルトの名無しさん:2008/12/14(日) 16:24:32
環境によってintのサイズが違うからダメだろう
47デフォルトの名無しさん:2008/12/14(日) 16:57:08
(std::numeric_limits<DWORD>::max)() みたいなことすればいいだろ。
48デフォルトの名無しさん:2008/12/14(日) 17:58:36
(1 << (sizeof(int) * 8)) - 1
但し1byteが8bitだという保障はない。
49デフォルトの名無しさん:2008/12/14(日) 18:01:44
わかってるならマクロ使ってやれよw
50デフォルトの名無しさん:2008/12/14(日) 18:21:45
>>48
32ビットの最大値って言ってるんだよ。
intの最大値じゃないし。
だいたい、intの最大値は (1 << (sizeof(int) * 8)) - 1 じゃ得られない。
51デフォルトの名無しさん:2008/12/14(日) 18:23:29
vector<int>の場合は動くのですが
vector<自作構造体>にすると
わけわからんエラーがでます。
何でか教えてください。

#include <vector>
#include <algorithm>
struct note{ int a;};
typedef std::vector<note> VN;
int main(){
VN v;
v.push_back(note());
VN::iterator q = find(v.begin(),v.end(),note());
}
52デフォルトの名無しさん:2008/12/14(日) 18:25:12
>>51
ベクターにつっんだあといろいろやるにはいくつかの演算子オーバーロードが必要
53デフォルトの名無しさん:2008/12/14(日) 18:29:09
>>51
エラーメッセージは?
54デフォルトの名無しさん:2008/12/14(日) 18:29:44
struct note { int a; int operator==(const x&) const { return a == x.a }};
55デフォルトの名無しさん:2008/12/14(日) 18:34:28
代入演算子もデフォルトがキチガイ設定になってなかったっけ?
56デフォルトの名無しさん:2008/12/14(日) 18:35:21
全部代入するだけだが
57デフォルトの名無しさん:2008/12/14(日) 18:35:27
54氏を参考に書き換えてみたら動いた・・
つまり、vectorは、自作構造体の比較の仕方なんて
シラネーヨってことか
10分で解決してしまったが、皆さんマジプロフェッショナルですねw
THY
struct note {
int a;
int operator==(const note& x) const { return a == x.a; }
};

58デフォルトの名無しさん:2008/12/14(日) 18:38:20
>>56
俺の昔のソースにはこんなのが残ってるけどこれってなんだっけ?
昔、入門書に書けって書いてあったからとりあえず入れておいたけど
いまみてもやっぱりワケワカランw
教えてエライ人!

BlockData(const BlockData &_BlockData);
const BlockData & operator=(const BlockData &_BlockData);

BlockDataは自作のクラスね
59デフォルトの名無しさん:2008/12/14(日) 18:42:36
>>58
コピーコンストラクタとコピー代入演算子の宣言。
privae に書いて代入を禁止するときにもよく使う。

あと、予約識別氏が入ってるから未定義動作とか。
60デフォルトの名無しさん:2008/12/14(日) 18:42:44
>>58
とりあえずprivateにおかれてるならコピー禁止
61デフォルトの名無しさん:2008/12/14(日) 18:46:48
>>59-60
ああ、つまり勝手にインスタンスを増やすようなコードを書くとエラーになるって奴ですね
なるほど・・・w
これは・・・たしかに書いておいたほうがいいかもしれないですね

ありがとうございました
勉強になりました
62デフォルトの名無しさん:2008/12/14(日) 18:56:01
そういうクラスをあらかじめ作っておいて
それを private 継承するようにしとくと楽だでよ
6337:2008/12/14(日) 19:29:59
39は37へのレスだよな?

いや、ちょっと違う。
36は34をうけて、組み込み型の場合は
typedef void (*func)(); に特殊化してコンパイルできるようにする意図と思った。
でも36はvoidしか特殊化していないので、不十分と思った。
で、組み込み型を全部特殊化するのは面倒なので、
メタテンプレートの組み込み型かどうか判断する方法を使えば
特殊化はひとつで済みそうだなと思った。
64デフォルトの名無しさん:2008/12/14(日) 19:33:01
for(int i=Pos-1; i<= Width+Pos; i++){
}
でiの初期化部分を分岐する方法はありませんか?
for(if(Pos == 0)int i=0; else i=Pos-1; i<= Width+Pos; i++){
}
こんな感じで書きたいです
65デフォルトの名無しさん:2008/12/14(日) 19:35:34
>>48
つーか、単に
0xffffffffUL
でよくね?
66デフォルトの名無しさん:2008/12/14(日) 19:36:27
i = (Pos == 0) ? 0 : Pos - 1
条件演算子
67デフォルトの名無しさん:2008/12/14(日) 19:36:44
if(Pos == 0){
i=0;
}else{
i=Pos-1;
}
for(i; i<= Width+Pos; i++){
}
68デフォルトの名無しさん:2008/12/14(日) 19:37:07
>>64
見辛れ〜
センス悪〜
ウンコ臭〜
69デフォルトの名無しさん:2008/12/14(日) 19:39:24
ありやっす!
70デフォルトの名無しさん:2008/12/14(日) 20:01:52
while(1){

とすると警告レベル4だとwarning C4127: 条件式が定数です
が出ますが、pragmaを使わずに警告を消す事はできますか?
71デフォルトの名無しさん:2008/12/14(日) 20:11:44
>>70
コンパイラはなんや?
7237:2008/12/14(日) 20:19:25
こんな感じかな。boostにも:isFundamental相当があるだろうけどよく知らんのでLokiを使った。
#include <loki/TypeTraits.h>
template <typename T, bool b = Loki::TypeTraits<T>::isFundamental>class Foo{};

template <typename T>
class Foo<T, false>{
private:
typedef void (T::*func)();
};

template<typename T>
class Foo<T, true>{
private:
typedef void (*func)();
};
struct UserDefined{};
int main() {
Foo<UserDefined> fu;
Foo<int> fi;
Foo<double> fd;
// Foo<void> fv; // コンパイルエラー.:isFundamentalにvoidも含まれてそうなんだが
return 0;
}
73デフォルトの名無しさん:2008/12/14(日) 20:47:54
>>70
while (1)は推奨されていない。for (;;)を使え。
74デフォルトの名無しさん:2008/12/14(日) 20:53:40
for(;1;)と書くことにしてる俺には関係ない話だ

forで条件を省略するとなんで真扱いになるのか納得のいく説明を聞いたことがない
ifやwhileは条件省略するとコンパイルエラーだというのに
詳しい人教えて
75デフォルトの名無しさん:2008/12/14(日) 21:04:26
>>74
そう決められたから。なんせ、forはあっちこっち省略可能だ。
76デフォルトの名無しさん:2008/12/14(日) 21:16:50
仕様書には非0定数になるとしか書いてないし
B言語にfor文がないならC言語を作った人に
聞くしかないんじゃないかな。
77デフォルトの名無しさん:2008/12/14(日) 21:33:59
>>57
クラスの振る舞いはクラスが知ってわけで、クラス以外のものが勝手に決めたらダメだろ。
78デフォルトの名無しさん:2008/12/14(日) 21:42:59
>>72
何でもかんでも入れられたら、
void と int じゃ何か動きが違うのか? とか誤解を招く可能性があるので
void だけにしておいた。
何でもかんでも入れられる事が常に正しいというわけではないと思う。
79デフォルトの名無しさん:2008/12/14(日) 21:43:33
>>57は宇宙人
80デフォルトの名無しさん:2008/12/14(日) 21:45:32
>>74
for で条件を省略すると真になると C/C++ の仕様で決められてるから。
これで納得できないわけが無いだろう。

for は3つの機能が複合されている文だが、
常にその全てが必要になるとは限らない。
そういうことで、それぞれ省略できるように作られているんだろう。多分。
81デフォルトの名無しさん:2008/12/15(月) 07:34:01
理論上の背景がどうなのかってことでは
82デフォルトの名無しさん:2008/12/15(月) 15:48:32
省略したら偽になるという選択肢もあったはずだということか?
83デフォルトの名無しさん:2008/12/15(月) 15:54:58
省略したら何もしないよりは、省略したら永久ループが作れるほうが使い勝手はいいわな。
84デフォルトの名無しさん:2008/12/15(月) 16:22:55
i<0<iの分岐を使わないで
iに絶対値?を足したり引いたりする関数ってありますか?
85デフォルトの名無しさん:2008/12/15(月) 16:26:46
絶対値はabsで求まるが内部で分岐してないかは知らん
アセンブラレベルで分岐しないでって事?
86デフォルトの名無しさん:2008/12/15(月) 16:35:08
一行で書ける関数があればきれいだから使いたいなと。
今のところ実現できる方法は

if(i < 0)
 i - 10;
else
 i + 10;

でこれを
i + 絶対値関数(10);
もしくは
i - 絶対値関数(10);

内部で一生懸命やってようが気にしないです。書いたときに綺麗なのがいいんですが、
i + abs(10);
とできるんでしょうか?
87デフォルトの名無しさん:2008/12/15(月) 16:35:30
i += (x ^ (i >> 31)) + ((i >> 31) & 1)
こんな感じか? いろいろ環境依存だけど
88デフォルトの名無しさん:2008/12/15(月) 16:37:59
>>86
単に1行で書きたいというだけなら
i + (i < 0 ? -10 : 10)
とか
89デフォルトの名無しさん:2008/12/15(月) 16:38:05
>>86
関数を自作すればいいじゃない
90デフォルトの名無しさん:2008/12/15(月) 16:46:03
自作します。87,88さん、参考にさせてもらいます。ありがとうです。
91デフォルトの名無しさん:2008/12/15(月) 17:05:22
自作関数ライブラリを作る時って
cppファイルなし、クラスなしで、hファイルに関数をインライン付けてどんどん追加していって
使う時にプロジェクトにインクルードする流れでいいんですよね?
92デフォルトの名無しさん:2008/12/15(月) 18:21:47
普通のパソコンでゲームの1フレームは体感的に約何行ぐらい書けますか?
5000行が限界とか、10万行までいけるとかでいいんで教えてください。だいたいですだいたい
93デフォルトの名無しさん:2008/12/15(月) 18:34:36
3Ghz100FPS
アセンブラで3000万行
C#のコードで1000行
安全をとって100行以内
94デフォルトの名無しさん:2008/12/15(月) 18:36:00
質問の意味がよく判りません。いずれにしても、C/C++言語に関係があるようには思えませんが。
1フレーム描画に間に合う処理量と言うことなら、描画内容次第でしょう。
因みに、私が書いたコラムスクローンは約1000行です。
知り合いが書いたテトリスクローンは約5000行だそうです。
95デフォルトの名無しさん:2008/12/15(月) 19:05:41
だいたいであっても、知ってどうすんだって思う。
何行でもいいから、フレームにおさまればそれでいいじゃない。
96デフォルトの名無しさん:2008/12/15(月) 19:12:58
1フレームに何行書けるか、と言われても
俺、タイピング遅いし。
97デフォルトの名無しさん:2008/12/15(月) 19:22:18
>>92
それって、使ってるCのライブラリ関数やOSのAPIの中の行数もカウントしなければならないと思うんだが、
どうやって数える気だ?
98デフォルトの名無しさん:2008/12/15(月) 19:45:31
フレーム落ち経験者に対して、毎フレーム行う処理の行数がどれくらいであったかを問うているだけだと思うよ。
俺はゲームとか作ったことないから分からんが、APIの中の行数がどうとかいうのはあまりに的はずれであることは分かる。
99デフォルトの名無しさん:2008/12/15(月) 19:49:47
だってねぇ、線描画で10000行あっても高が知れているけど
レンダリングが100行もあったら大事じゃないか。
100デフォルトの名無しさん:2008/12/15(月) 19:54:47
そうだね。だから知ってどうすんの?って話になるわけで。
アセンブラで3000万行というのもおかしな話だなあとおもう。
101デフォルトの名無しさん:2008/12/15(月) 19:59:20
>>98
一行で時間のかかる処理もあるし
ループなんかもあるし
行数が意味のないことであることも分かってほしい
102デフォルトの名無しさん:2008/12/15(月) 20:20:53
>>91
時と場合による。
しかし、サボらないでcppとhファイルを1対で扱った方がいいとは思う。
103デフォルトの名無しさん:2008/12/15(月) 20:23:31
書ける書けないの話だったらHDDの許す限り書けるだろう。
それで処理落ちがするかどうかは知ったことじゃないが。

これでおk
104デフォルトの名無しさん:2008/12/15(月) 20:32:28
>>86
絶対値と符号とに分けて扱えばいい。
105デフォルトの名無しさん:2008/12/15(月) 21:20:20
1Hzでアセンブラ1命令処理してんの?
106デフォルトの名無しさん:2008/12/15(月) 21:35:20
>>105
どんだけ遅いんだよw
107デフォルトの名無しさん:2008/12/15(月) 21:36:01
1クロックと言いたかったのか?
108デフォルトの名無しさん:2008/12/16(火) 00:54:24
質問です。
関数strncpy(s1, s2, n)についてなのですが、
引数nはs1の長さですか、それともs1の長さとは関係のない値ですか。
109デフォルトの名無しさん:2008/12/16(火) 00:58:19
自分で好きな値にしてください
110デフォルトの名無しさん:2008/12/16(火) 00:59:44
>>108
s1の指す領域のサイズにあわせる必要があればそうして下さい。
そうでなければ必要な値にすることも出来ます。
111デフォルトの名無しさん:2008/12/16(火) 01:03:20
>>109 >>110
ありがとうございました。
112デフォルトの名無しさん:2008/12/16(火) 12:52:56
void disp(int p[][5]);
int main(void){
int a[3][5] = {・・・
disp(&a);
・・・
}
void disp(int p[][5]){
・・・
}
これをVC++2008でコンパイルすると「'int [5]' から 'int [][1]' に変換できません。(新しい機能 ; ヘルプを参照)」
とエラーが出ます
ヘルプを見てもそれらしい事は載ってなかったのですが、これはどういう問題ですか?
113デフォルトの名無しさん:2008/12/16(火) 12:57:36
型が違うというエラー
×disp(&a);
○disp(a);
114デフォルトの名無しさん:2008/12/16(火) 13:03:44
それは試してみました
115デフォルトの名無しさん:2008/12/16(火) 13:05:08
>>112
断片でなく、エラーを再現できる最小限のソースを張ってくれたまえ。
116112:2008/12/16(火) 13:09:39
非常に申し訳ない!こっちのケアレスミスでした!自己解決しました
117デフォルトの名無しさん:2008/12/16(火) 13:26:09
ほほぉ、他人に聞いて、レスまで貰って、それでも「自己」解決かね。
118デフォルトの名無しさん:2008/12/16(火) 13:29:08
自己解決でしょ。他人を巻き込んではいるが。
まあ、もう少し落ち着いて質問しなよって思うけどねー
119デフォルトの名無しさん:2008/12/16(火) 13:32:48
まあ怒るなよ
120デフォルトの名無しさん:2008/12/16(火) 14:20:04
法則発動はまれにある
121デフォルトの名無しさん:2008/12/16(火) 14:25:48
if分岐いくつからSwitchがいいですか?
122デフォルトの名無しさん:2008/12/16(火) 14:30:01
俺は4つ以上だな
123デフォルトの名無しさん:2008/12/16(火) 14:30:22
3つから
124デフォルトの名無しさん:2008/12/16(火) 14:41:19
内容による
125デフォルトの名無しさん:2008/12/16(火) 14:58:18
なるべくIFは使わないようにした方が良いと、どっかで読んだんだけど
分岐一つからSwitchはどう?おなじこと?
126デフォルトの名無しさん:2008/12/16(火) 15:02:46
そのなるべく使わない方が良いとかいう理由によるんじゃないか
分岐予測ミスがパフォーマンスに響くからとかいう理由ならswitchでも同じことだし
127デフォルトの名無しさん:2008/12/16(火) 15:09:38
比較が定数だからって言うのと片方の値が不変だからって言うので
switchは若干パフォーマンス良くなかったか?

同じ値を比較するのにelseif使ってるならswitchの方が良かった気がする。
最適かかかると同じかもしれん。違っても体感できないほどの差だろうけど
128デフォルトの名無しさん:2008/12/16(火) 15:11:57
すいません質問です。
Aというクラスに、private変数aaaを定義し、
Aクラスから、test1、test2というスレッドを作った場合
test1で変数aaaを操作したら
test2のスレッドでもaaaの内容は変更されるのでしょうか?
129デフォルトの名無しさん:2008/12/16(火) 15:13:11
test1とtest2がクラスAの同じインスタンスを参照してたら変わる
130128:2008/12/16(火) 15:27:31
ありがとうございます
変わってしまうのですね。。
その場合同じアドレスを指しますよね
131デフォルトの名無しさん:2008/12/16(火) 15:48:38
>>127
今時のコンパイラなら、あんたがうだうだ考えるよりももっと適切に最適化してくれる。

結論:
ifを使うかswitchを使うかは保守性を考慮しつつ、見易さ重視でよい。
132デフォルトの名無しさん:2008/12/16(火) 15:56:08
>>127 が最適化かかると同じかもと言ってるのに念を押してまた言うか
133デフォルトの名無しさん:2008/12/16(火) 15:58:58
すみません質問です。
ヘッダーファイルで

class A
{
class B
{
void test();
}
}

と書いた場合、ソースファイル側でclass Bのtestを定義するにはどうしたら良いのでしょうか?
134デフォルトの名無しさん:2008/12/16(火) 16:02:23
void A::B::test()
{
.......
}
135デフォルトの名無しさん:2008/12/16(火) 16:04:25
ああ、なるほどそう言うことか!
何で気がつかなかったんだろうw
ありがとうございます!
136デフォルトの名無しさん:2008/12/16(火) 16:14:23
>>127
例えば分岐先が合計4つで分岐確率が等分だった場合はテーブルになるswitchの方がいい。
これがもし60%、25%、10%、5%なんて並びだったら分岐予測の分ifの方がいい。
特定の一つが80%で、20%を残りが等分とか偏りがあるならifの後にswitch。
ジャンプテーブルだと常に予測ミス状態だからCPUの分岐ミスと相談して決めるしかないけど、
これらが致命的にかかってくる処理ってそう多くはないんだよな。
137デフォルトの名無しさん:2008/12/16(火) 16:38:54
138デフォルトの名無しさん:2008/12/16(火) 16:40:00
80%と20%だとswitchで最初に80%を持って来た方がいい、の間違いでは?
139デフォルトの名無しさん:2008/12/16(火) 17:24:00
いや、そういうのはもういいから
140デフォルトの名無しさん:2008/12/16(火) 18:50:26
Whileとforどっちでもかける場合はどっちで書いたほうがいいのでしょうか
141デフォルトの名無しさん:2008/12/16(火) 18:58:41
読みやすい方で書いてください
142デフォルトの名無しさん:2008/12/16(火) 19:24:33
書き個数少ないほうだろ
143デフォルトの名無しさん:2008/12/16(火) 19:31:42
>>140
意味的に分かりやすいほう
144デフォルトの名無しさん:2008/12/16(火) 19:33:25
forの条件部分は、forに入る前に定数化した方がいいんでしょうか?
デカイ式が入っていても最適化されるんですか?
145デフォルトの名無しさん:2008/12/16(火) 19:51:19
式の結果がループによって、またはスレッドによって変更されないであろうことが予測される場合には最適化されると思う。
146デフォルトの名無しさん:2008/12/16(火) 19:53:36
どっちみちforの前じゃなくて一つ目の初期化部分でやればいいのでは?
147デフォルトの名無しさん:2008/12/16(火) 20:04:19
関数strncpyについて質問です。
昨日も質問しましたが・・・
自分でこんなプログラムを作ってみました。

#include<stdio.h>
#include<string.h>

int main(){
char *s1="abcd";
char *s2="ABCDEF";
int n;

for(n=3; n<=10; n++){
strncpy(s1, s2, n);
printf("s1 = %s\n", s1);
}
return 0;
}

この実行結果は
s1 = ABCd
s1 = ABCD
s1 = ABCDEABCDEF
s1 = ABCDEFBCDEF
s1 = FBCDEF
s1 = F
s1 =
s1 =
となります。
実行結果の3つ目のs1以降がなぜそうなるのかわかりません。
教えてください。
148デフォルトの名無しさん:2008/12/16(火) 20:06:48
>>147
メモリぶっ壊して暴走寸前
149デフォルトの名無しさん:2008/12/16(火) 20:15:08
>>147
むちゃくちゃしてるのはわかるか?
その上で内部がどうなってるのか説明を求めてるのか?
150デフォルトの名無しさん:2008/12/16(火) 20:19:25
strncpyの第3引数は好きな数字を入れていいという解答を得たからそうやったんだよねー
s1、s2のどちらよりも短くないとだめだよ。
151デフォルトの名無しさん:2008/12/16(火) 20:24:14
たまたまs1とs2がアドレス連番値に格納されてるから
s1を突き抜けて表示しただけでは?
152デフォルトの名無しさん:2008/12/16(火) 20:30:56
配列じゃなくてポインタを第1引数に入れてる時点で罵倒したくなってくる。
153デフォルトの名無しさん:2008/12/16(火) 20:34:16
指してる先が問題であって、ポインタは別に問題ないだろ
154デフォルトの名無しさん:2008/12/16(火) 20:37:04
確かにそうだった。
頭冷やしてくる。
155デフォルトの名無しさん:2008/12/16(火) 20:58:25
それ以前にstrcpy使っていい対象ですらないな
156デフォルトの名無しさん:2008/12/16(火) 21:15:22
以前に?
それを言おうとしたが言い方を間違えたのが>>152だろ
157デフォルトの名無しさん:2008/12/16(火) 21:18:23
>>156
ごめんリロードしたつもりがしてなかったんです
158デフォルトの名無しさん:2008/12/16(火) 22:26:26
配列って32ビットマシンで32ビット最大値の添え字を超えて扱えるんですか?
159デフォルトの名無しさん:2008/12/16(火) 22:30:02
>>158
アドレス空間自体が32bitなので、オーバーフローして反対側から出てくる。
160デフォルトの名無しさん:2008/12/16(火) 22:30:54
32ビットのアドレス空間を自由にさわれるわけではないのでアクセス違反で落ちる
161デフォルトの名無しさん:2008/12/16(火) 22:34:32
今思ったんだけどもしかして、
pow(2,32)って32bitPCだと無理なの?
162デフォルトの名無しさん:2008/12/16(火) 22:35:49
>>161
なにをいまさらw
即レスでオーバーフローとか言われてただろ
163デフォルトの名無しさん:2008/12/16(火) 22:38:14
そのあと即効でdoubleじゃね?とも言われたな
164デフォルトの名無しさん:2008/12/16(火) 22:38:45
そういうことだったのか!
でも正常に動いてるんだけど内部でも絶対扱えてないの?
165デフォルトの名無しさん:2008/12/16(火) 22:45:31
((*pv8)[(*pVec)[i*2+0]][si.nPos] <= (*pVec)[i*2+1])

すいませんこれ

(((*pv8)[(*pVec)[i*2+0]][si.nPos]) <= ((*pVec)[i*2+1]))

<=の左右式ごとにカッコでくくらないとまずいですか?
166デフォルトの名無しさん:2008/12/16(火) 22:45:35
配列の添え字の範囲とdoubleが扱える範囲は全く関係ない。
167デフォルトの名無しさん:2008/12/16(火) 22:47:19
doubleってすげー
168デフォルトの名無しさん:2008/12/16(火) 22:49:42
>>165
そんだけ書けててわからないのがそこかよ・・・
169デフォルトの名無しさん:2008/12/16(火) 22:54:42
何を心配してくくらないといけないと思ったのかを知りたいわ
170デフォルトの名無しさん:2008/12/17(水) 00:00:34
心配で悩む位ならカッコでくくれば良い。
171デフォルトの名無しさん:2008/12/17(水) 00:16:43
A && B || C とかそういうたぐいではなく、
((*pv8)[(*pVec)[i*2+0]][si.nPos] <= (*pVec)[i*2+1])

((*pv8)[(*pVec)[i*2 ( +0]][si.nPos] <= (*pVec)[i ) *2+1])
こうされたらどうしようとか
((*pv8)[(*pVec)[i*2+0]] ([si.nPos] <= (*pVec)[i*2+1]))
こうされたらどうしようとか

そう思うのは逆に珍しいので、どう悩んだのか教えてもらえると、今後他の人に
教える時に役に立つかもしれない。
172デフォルトの名無しさん:2008/12/17(水) 01:56:35
環境はMacです。

以下のプログラムをstdio.h型ではなくiostream型に書き換えるとどうなるんでしょうか?
printfとかscanfとかはcinやcoutに書き換えられるってのは自分で調べて分かったのですがどうもコンパイルするとエラーになってしまうんです。

printfとかscanf以外にも書き換えられる部分があればお願いします。

あと、それぞれの行がどういった命令を出してるのか解説もお願いします…。

for(i=0;i<8;i++){//最初i=0でi<8まで増えていく

と言った感じで…。

#include <stdio.h>
int p,t,a,d,c,v,i,m[90]={0},s,r[]={-10,-9,-8,-1,1,8,9,10};
void k(){if(m[p]==0)
for(i=0;i<8;i++){
for(c=0,v=p+r[i];m[v]==3-t;v+=r[i])c++;
if(c&&m[v]==t){a+=c;v=p;
if(d)do m[v]=t,v+=r[i];
while(m[v]!=t);
}}}
char*h="・○●\n";
int main(){for(i=1,m[41]=m[49]=2;i<10;m[i++*9]=3)m[40]=m[50]=t=s=1;for(;;a=d=0){for(p=9;p<82;++p)k(),printf("%.2s",&h[m[p]*2]);
if(a)for(d=a=s=p=8;a==8;k())t-2?(scanf("%d %d",&p,&i),p+=i*9):++p;
else if(s)s=0,printf("pass");
else break;t=3-t;
}
return 0;
}
173デフォルトの名無しさん:2008/12/17(水) 02:13:46
>>172
死ね
174デフォルトの名無しさん:2008/12/17(水) 02:49:16
どうせマルチするなら七行スレに書けよ。
175例外:2008/12/17(水) 04:37:19
C++で例外を投げたい場合、
書いたら例外を投げてることが分かるという利点と、
例外の種類が多くなるとソースが長くなると言う欠点があると思うのですが、
関数定義にthrowは書いたほうがいいのでしょうか?
176デフォルトの名無しさん:2008/12/17(水) 05:15:09
エラー処理をシンプルに記述できるという多大な利点
177デフォルトの名無しさん:2008/12/17(水) 06:11:08
質問。
std::codecvtの使い方、および説明された書籍、URLなどを教えてください。
特に、~codecvt()がvirtualな理由を知りたい。
std::localeからの利用を意図し、std::codecvt自体はインターフェースなのか?

環境はVC90及びgcc4を想定。
説明用サンプルソースなどもあればよろしく。
以上よろしくお願いします。
178デフォルトの名無しさん:2008/12/17(水) 06:17:00
間違えた。
~codecvt()がprotectedな理由を知りたい。
179デフォルトの名無しさん:2008/12/17(水) 07:42:01
codecvt のことはよく分からんが
デストラクタが protected な場合は
派生クラスだけ作れるようにしたい場合じゃね。
180デフォルトの名無しさん:2008/12/17(水) 08:21:22
>>175
例外仕様のことだね?
例外を投げないことを示す throw () 以外は付けないのが C++ での流儀として定着しつつある。
181デフォルトの名無しさん:2008/12/17(水) 09:04:59
>>180
それは流儀というより、実用上仕方なくでわ?
182デフォルトの名無しさん:2008/12/17(水) 09:33:17
例外投げる場合も throw(投げる例外)とかけるだろ
しかしそうは書かないから流儀って言ってんじゃね?
183デフォルトの名無しさん:2008/12/17(水) 09:37:56
>>181
たとえば Java のチェック付き例外仕様が使えたとしても、使う使わないの
それぞれにどっちが良いとも言いきれないようなメリット・デメリットがある。

後発の言語で同様のチェック付き例外仕様を採用した言語が少ない(無い?)ことから
考えても、「仕方なく」という感じはしない。
184デフォルトの名無しさん:2008/12/17(水) 10:15:02
>>182-183
throw(投げる例外)を付けるとエラー吐くコンパイラがあるからだと思うけどね。
もちろんそのコンパイラが標準C++に準拠していなければ、その仕様で正しい。
というか、時代的に仕方なかった。
と、俺は思う。

一方、仕方なくではなく単なる流儀だとした場合、つけるデメリットって何?
そしてつけないメリットって何?
185デフォルトの名無しさん:2008/12/17(水) 10:23:58
付けるデメリット
マンドクセ

付けないメリット
マンドクサくない
186デフォルトの名無しさん:2008/12/17(水) 10:24:08
>>184
読んどけ。
http://www.gotw.ca/publications/mill22.htm
> So here’s what seems to be the best advice we as a community have learned as of today:
> Moral #1: Never write an exception specification.
> Moral #2: Except possibly an empty one, but if I were you I’d avoid even that.

today つっても 2002 年なんだな。いいかげんに対応する日本語の文書がほしいところだ。
187デフォルトの名無しさん:2008/12/17(水) 10:25:15
規格策定後5年が過ぎてもエラー吐くコンパイラを新製品として発売した
ベンダーがあるけどな。
C++自体終わってるんじゃないか?
188デフォルトの名無しさん:2008/12/17(水) 10:32:46
http://www.ibm.com/developerworks/jp/java/library/j-jtp05254/
Javaの資料だけど、後発の言語が導入しない理由を知るにはちょうど良いかと。
189デフォルトの名無しさん:2008/12/17(水) 10:35:02
http://msdn.microsoft.com/en-us/vcsharp/aa336812.aspx
C# の話もわかりやすい。
190デフォルトの名無しさん:2008/12/17(水) 10:39:41
>>188
これは全く別の話だ。
191デフォルトの名無しさん:2008/12/17(水) 15:43:42
使い捨てカイロを再生させる方法はありませんか?
192デフォルトの名無しさん:2008/12/17(水) 15:44:08
硫酸(r
193デフォルトの名無しさん:2008/12/17(水) 15:52:13
はじめたばかりで恐縮なのですが書き込ませていただきます
たとえば次のようなコードがあったとします
class ClassA{
public:
ClassB cB;
//他の記述
};
class ClassB{
public:
ClassA cA;
//他の記述
};

とした場合、ClassAではClassBより先に書いているのでcBは作ることが出来ないのということで、
もし、どちらもクラス内部で、inline関数として書きたい場合は、あきらめてヘッダーでクラスを書いてその後に
inline void ClassB::関数名...
としていくしかないのでしょうか?
194デフォルトの名無しさん:2008/12/17(水) 16:02:20
ない
195デフォルトの名無しさん:2008/12/17(水) 16:11:37
Aの中のBの中のAの中のBの中のAの中のBの中の・・・
無限ループってこわくね?
196デフォルトの名無しさん:2008/12/17(水) 16:27:57
>>193
先に〜に関しては
class ClassB;
で解決するが、それでも>>195
の言っている状況になるのでポインタで持つしかない
(いやほかの手もあるけどさ)
197デフォルトの名無しさん:2008/12/17(水) 17:27:58
株式の持ち合いみたいだな。
198デフォルトの名無しさん:2008/12/17(水) 18:10:36
マウスダウンのnFlagでMK_LBUTTONが押されているのは当たり前だとおもうのですが、

MK_CONTROL+ MK_LBUTTON

と書かないで

if(MK_CONTROLが含まれているか?)
{
}

これどう書けばいいんでしょうか?
199デフォルトの名無しさん:2008/12/17(水) 18:11:37
知らないけどきっとnFlag & MK_CONTROLじゃないの
てかフラグを足し算するな
200デフォルトの名無しさん:2008/12/17(水) 18:24:10
足し算で済んでしまうこともあるが、OR演算するようにしよう
201デフォルトの名無しさん:2008/12/17(水) 18:30:31
if(nFlag & MK_CONTROL)
{
}
こうですか?
202デフォルトの名無しさん:2008/12/17(水) 19:03:13
すこしでもエラーがあるとアプリがすぐ終了するんですが、
これ異常部分だけ初期化終了とかさせられないんですか?
立ち上げなおしてバグのところまでいくのも一苦労なんですが・・・
アザートが多すぎて泣きそうです
203デフォルトの名無しさん:2008/12/17(水) 19:13:11
言ってる意味がわからない
本当にC/C++の質問ならコード片を貼るなどしてもっと分かるように言え
204デフォルトの名無しさん:2008/12/17(水) 20:01:57
>>201
そうですよ。

>>202
ASSERTをコメントアウトするか、ASSERTが
出ないようにプログラミングすればよいと思うよ。
エラーが発生して終了したら、別プロセスで監視しておいて
再起動をかけるのも有用な対策の一つだよ。
205デフォルトの名無しさん:2008/12/17(水) 20:20:41
ifだけを抜けたい時はどうすればいいのでしょうか?
returnだと全部抜けるし
breakとcontinueの違いがよくわかりません。

:
goto a;
:
:
gotoPoint a;
:

のようなことはC++では出来ないんでしょうか?
206デフォルトの名無しさん:2008/12/17(水) 20:21:19
>>204
ありがとうございます!
207デフォルトの名無しさん:2008/12/17(水) 20:27:13
OS:Linux
コンパイラ:gcc

コンパイルすると
無効なプリプロセスディレクティヴ #!
ってでるんですがどうすればエラー消えるでしょう?
208デフォルトの名無しさん:2008/12/17(水) 20:28:30
制御文の前で必ず1行あける規則は細かすぎると思いますか?
209デフォルトの名無しさん:2008/12/17(水) 20:34:21
>>208
俺はif文がネストする場合の2段目以降のif文だけかな。詰めて書くのは。
大抵そうしてる。
210デフォルトの名無しさん:2008/12/17(水) 20:37:46
>>205
gotoあるよ
continueはループの中で使うよ
211デフォルトの名無しさん:2008/12/17(水) 20:39:21
>>205
C++でもgoto文あるよ。
continueとbreakの違いと使い分けも考え付かない程度なら
絶対使わないぐらいの考えでプログラムしといたほうがいいと思うけど。
212デフォルトの名無しさん:2008/12/17(水) 21:05:32
コンストラクタ内で自身がconst宣言されているか
確認する方法ってないでしょうか?
213デフォルトの名無しさん:2008/12/17(水) 21:12:20
コンストラクタはとにかくメンバを初期化しないといけないので
const で宣言されていようがメンバをいじれないと困る。
だから確認する必要も無いし、確認する方法も用意されていない。
214デフォルトの名無しさん:2008/12/17(水) 21:21:00
やっぱり無いですか。ありがとう。
215デフォルトの名無しさん:2008/12/17(水) 21:29:16
goto使ってるC++のサンプル見たことない
216デフォルトの名無しさん:2008/12/17(水) 21:39:25
エラー処理は例外に取られたから
多重ループ脱出くらいしか使い道ないな
217175:2008/12/17(水) 21:40:15
>180-189
返信ありがとうございます。
throw(A)と書くとエラーを出すコンパイラもあるんですね。
例外を投げないことを明示したい場合以外は宣言にthrow(A)を書かないことにします。
218デフォルトの名無しさん:2008/12/17(水) 21:46:43
例外を嫌う人は代わりに goto を使う。
219デフォルトの名無しさん:2008/12/17(水) 23:26:03
>>199
なんで足し算しちゃだめなの?どういう不具合がある?
220デフォルトの名無しさん:2008/12/17(水) 23:42:43
>>219
MK_CONTROLやMK_LBUTTONが実際には複数のビットの組み合わせで、
それに重複がある場合は、足し算すると繰り上がって予期せぬビットが立つ可能性がある
フラグはビット演算子で扱うのが基本
221デフォルトの名無しさん:2008/12/17(水) 23:45:36
nFlag == MK_CONTROL+ MK_LBUTTON
というものを書いた場合、Shiftも押されてた場合はどうするのってなる
222デフォルトの名無しさん:2008/12/18(木) 00:00:56
>>219
MK_* が互いにビット位置の重複がないという保証があって、尚且つ最上位ビットをマスクして
比較できるという条件がなきゃ使えないから。
223デフォルトの名無しさん:2008/12/18(木) 00:32:03
よくわかった。みんなありがとう!
224デフォルトの名無しさん:2008/12/18(木) 00:43:38
>>218
それはありじゃないか。少なくとも少し前にパフォーマンス比較したら
exception 関係入れて測定できるほど実行速度落ちた経験ある。
225デフォルトの名無しさん:2008/12/18(木) 09:06:36
それは使い方に問題があるんじゃないか?
try catchを頻繁に通過するとか、例外が頻繁に発生してるとか
throw用の一時オブジェクトを例外が発生しなくても生成してたりとか…
226デフォルトの名無しさん:2008/12/18(木) 15:55:43
横やりだけど、try自体はコスト0だよね?
throwしたときだけ専用のフローに入ると思ってるんだけど。
227デフォルトの名無しさん:2008/12/18(木) 16:15:14
オブジェクト宣言時に初期化をしなかった場合、コード中で初期化をするにはどうすればいいんですか?

.h
クラス名 obj(引数1, 引数2);

こうしないで

.h
クラス名 obj;
.cpp
obj(引数1, 引数2);

こうしたいのですが
228デフォルトの名無しさん:2008/12/18(木) 16:24:51
ヘッダファイルの方にexternをつけとけばいいんだけど、
今どき、グローバル変数を使ってると嫌われるよ。
229デフォルトの名無しさん:2008/12/18(木) 16:27:29
>>226
関数と同じでスタック積んでたと思う
じゃないと例外発生時にジャンプ先が分からない
230229:2008/12/18(木) 16:57:16
気になったから詳しく調べてみた。

まず、関数内にtry catchがある場合、関数実行時にアセンブラで5命令位増える
tryやcatchの数を増やしてもそれ以上命令数は増えない

次にtry実行時、mov命令で整数値を何所かに書き込んでる
try毎に同じ場所に違う値を書きこんでいるため、これを元にthrow時に現在のブロック化を特定している

throwでは関数をコールしているので、try時にセットした値をもとにブロックを特定し、
catchを順次検索して型が当てはまる場所へジャンプしていると思われる

実装依存の可能性もあるけど大体はこんな感じかと
以上、参考になれば。
231デフォルトの名無しさん:2008/12/18(木) 16:58:38
>>226
多分、setjumpと同じ様な事をしていると思う。
232デフォルトの名無しさん:2008/12/18(木) 17:01:45
try catch に直接関係ないところでも、例外発生時にデストラクタが呼び出されるような仕掛けをしている。
233デフォルトの名無しさん:2008/12/18(木) 17:13:53
>>228
externをつけたんですが、ストレージクラスが正しくないと出てコンパイルできません

やりたいのはこれです。
.h
extern CPen pen;
.cppのコンストラクタ内
pen = pen(PS_SOLID, 1, RGB(0,0,0) );
234デフォルトの名無しさん:2008/12/18(木) 17:19:19
pen = pen(PS_SOLID, 1, RGB(0,0,0) );

pen = CPen(PS_SOLID, 1, RGB(0,0,0) );
235デフォルトの名無しさん:2008/12/18(木) 17:20:26
すいません。ありがとうございました。
236デフォルトの名無しさん:2008/12/18(木) 17:20:31
あ、いやなんでもない
237デフォルトの名無しさん:2008/12/18(木) 17:21:39
あれ?それでよかったん?^^;
238デフォルトの名無しさん:2008/12/18(木) 17:22:17
ん?グローバル変数じゃないのか。クラスのメンバ変数なら extern は不要だ。
239デフォルトの名無しさん:2008/12/18(木) 23:04:43
これifのpCにNULLもポイントも入ってないんですがなんでですか?

class A
{
 void Func()
 {
  if(B::pC != NULL)
  {
   B::pC = CClassC();
  }
 }
};

class B
{
 CClassC* pC;
 B(){ pC=NULL; }
};
240デフォルトの名無しさん:2008/12/18(木) 23:09:23
>>239
>これifのpCにNULLもポイントも入ってないんですがなんでですか?
何を根拠にそう判断したのかね。
241デフォルトの名無しさん:2008/12/18(木) 23:10:32
それ以前に文法むちゃくちゃ
242デフォルトの名無しさん:2008/12/18(木) 23:42:31
さすがに少々どころでない間違いだらけだと、
コンパイルが通らないようなコードでは、何が言いたいのか分からないとしか言いようがない……。
243デフォルトの名無しさん:2008/12/19(金) 00:23:08
「だらけ」ってほどじゃないと思うがなぁ。
>241>242には私に見えない何かが見えているのだろうか。
244デフォルトの名無しさん:2008/12/19(金) 00:33:32
>>239
pCの値をチェックしたタイミングがいつなのか謎過ぎるがNULLも有効なアドレスも入ってない訳無いだろ。チェックの仕方がおかしいんじゃないか?
あとB::pCっていうのは、一回変数を作ってb.pCみたいにしないと駄目。
そしてさらにpCはポインタだから*(b.pC) = CClassC();ってしなくちゃ。

ポインタがどういう物なのか分かってる?
245デフォルトの名無しさん:2008/12/19(金) 00:53:28
>>243
class Aでclass Bを参照しているのに定義が後
friend classでもないのにBのprivate要素をAが参照
static memberじゃないpCをstaticのごとく使っている

これが間違い「だらけ」じゃなければ、いったいなんだというのだ?
そもそもオマエは他人のフリをした239じゃないのか?
246デフォルトの名無しさん:2008/12/19(金) 00:58:47
間違えだらけのことをえらそうに言えば教えてもらえるテクニックと思わせるレベル。
247デフォルトの名無しさん:2008/12/19(金) 01:08:08
答える気のない知ったかは黙ってて下さい
privateだのstaticだのは省略されてるだけでしょ
それくらい汲み取れるだろ
248デフォルトの名無しさん:2008/12/19(金) 01:14:20
いったい何が入ってたんだろう・・・・・・
249デフォルトの名無しさん:2008/12/19(金) 01:16:04
>>247
最低限コンパイルが通る形にしてから質問しろ。
質問する側もそうやれば自分で問題点が見えてくるだろ。
250デフォルトの名無しさん:2008/12/19(金) 01:34:00
private省略ならまだしもstatic省略はしない
251デフォルトの名無しさん:2008/12/19(金) 01:55:45
分からないならレスしないで下さい。ウザイだけです。
252デフォルトの名無しさん:2008/12/19(金) 01:57:28
>>251
オマエが他人に問題点を伝えられてないだけ。
ちゃんとコンパイルが通る形で書いて来い。
253デフォルトの名無しさん:2008/12/19(金) 02:06:27
低脳はレスしないでください。ウザイだけです。
254デフォルトの名無しさん:2008/12/19(金) 02:15:04
くされ脳みそはレスしないでください。ウザイだけです。
255デフォルトの名無しさん:2008/12/19(金) 02:15:20
賢くてごめんね。
256デフォルトの名無しさん:2008/12/19(金) 02:23:43
void print(int depth, struct node* p)
{
int i = 0;
if(p == NULL){ return; }
for(i = 0;i < depth; i++){
printf(" ");
}
printf("%d¥n",p->data);
print_tree(depth+1, p->left);
print_tree(depth+1, p->right);
}
print(0,root);
のような再帰についての質問です。
木構造をデバッガで追っていて不思議に思ったのですが、
a->b->c->d->b->e
のようにノードを移動していて、
dからbに移動した時、引数のdepthの値が
bが初めて呼び出されたときとかわらない1という事に気づきました。
再帰というのは、引数の値を初めて呼び出された時と同じように
とっておくのでしょうか?
257デフォルトの名無しさん:2008/12/19(金) 02:38:38
>>256
再帰の場合、繰り返し使われるのは関数内の実行コードとstatic変数だけ。
自動変数の類(引き数も含む)は関数の呼び出し毎にスタックに積まれて、
上位の関数に戻るまではキープされるよ。
258デフォルトの名無しさん:2008/12/19(金) 03:06:22
解の公式を加算減算だけで表したいんだがどういうプログラムになるのかわからない・・・
259デフォルトの名無しさん:2008/12/19(金) 04:43:32
ルートのあたりが大変ってことかな。
それならループでまわしてある程度の近似を行えばいいかなあと
260デフォルトの名無しさん:2008/12/19(金) 09:39:56
>>252
もう知障のコピペに反応するのやめないか?
261デフォルトの名無しさん:2008/12/19(金) 09:46:11
やめないよーん
262デフォルトの名無しさん:2008/12/19(金) 10:23:53
inline void InitPos(D3DXVECTOR3 &m_pos) { m_initpos = m_pos; }
inline D3DXVECTOR3 *InitPos() { return &m_initpos; }

同じクラスの中にこういう関数が2つあるのですが

両方InitPosという部分が同じなのですが例えば、

CModell::InitPos(m_lastpos);

とした場合上の関数だけが適用されるのですか?

説明不足ですいません;;
263デフォルトの名無しさん:2008/12/19(金) 10:31:06
>>262
>同じクラスの中にこういう関数が2つあるのですが
関数オーバーロードだね。

>上の関数だけが適用されるのですか?
おっしゃる通りです。
264デフォルトの名無しさん:2008/12/19(金) 10:35:27
>>263

ありがとうございます
265デフォルトの名無しさん:2008/12/19(金) 17:17:37
std::listで質問があります。

イテレータを値として保存した場合、元のstd::listの要素に変更があった時に
その保存したイテレータは同じ値を指すことは保障されるのでしょうか?
266デフォルトの名無しさん:2008/12/19(金) 17:29:48
sareteru
267デフォルトの名無しさん:2008/12/19(金) 17:58:35
ありがとうございます。安心しました。
268デフォルトの名無しさん:2008/12/19(金) 18:41:28
gotoって使うときは使いますか?限界まで避けますか?
269デフォルトの名無しさん:2008/12/19(金) 18:44:00
その「限界」が人によりけりだからな。
多重ループ抜けるのに、あるひとはフラグを使い
ある人はgotoを使い、またある人は
その部分を別関数にして return で抜ける。
270デフォルトの名無しさん:2008/12/19(金) 19:15:13
自分ひとりでプログラム組んでるなら余裕で使いまくる

けど多人数の人が一緒に開発とかやってるときは「ソースの読みやすさ」が最優先されるからまったく使わないな…
271デフォルトの名無しさん:2008/12/19(金) 19:30:59
エラー処理と多重ループ脱出には使ってもいいと思うが、
それ以外の場合はよっぽどのことが無い限り使わない。
それ以外ではただの1度しか使った事無い。
272デフォルトの名無しさん:2008/12/19(金) 19:47:43
for{
 for{
  if{
   break;

これは2段目のforをキャンセルして、1段目のforを続行してくれるんですか?
breakじゃなくてcontinueにすれば2段目のforを実行してくれるんですよね?
273デフォルトの名無しさん:2008/12/19(金) 19:49:34
うん
274デフォルトの名無しさん:2008/12/19(金) 19:49:54
4番目のfor
275デフォルトの名無しさん:2008/12/19(金) 19:50:28
>>205の人かな

>>274
ムラサメ研究所乙
276デフォルトの名無しさん:2008/12/19(金) 19:50:40
ありがとうございます!
gotoはまた今度にします
まだいけそうです
277デフォルトの名無しさん:2008/12/19(金) 19:51:38
>>275
そうですw
278デフォルトの名無しさん:2008/12/19(金) 20:15:15
2つとも抜けたいときは

start: ;
for{
 for{
  if{
   goto start;
  }else{
   goto end;
  }
 }
}
end: ;

ですね。勉強になりました。
279デフォルトの名無しさん:2008/12/19(金) 20:22:47
クラスのメンバ関数に馬鹿でかい処理を書く場合、直接メンバ関数に実装するより、
静的なグローバル関数として別に作って、メンバ関数はそいつを呼ぶだけのほうが効率がいい?
280デフォルトの名無しさん:2008/12/19(金) 20:25:16
static付けるほうがいい
281デフォルトの名無しさん:2008/12/19(金) 20:39:07
>>279
かえって効率悪くなる。
282デフォルトの名無しさん:2008/12/19(金) 21:07:00
>>278
start の方は普通使わないな。
283デフォルトの名無しさん:2008/12/19(金) 21:49:25
>>279
メンバ関数はthisが見えない引数で与えられてるだけで、普通の関数と一緒。
284279:2008/12/19(金) 22:14:02
みなさまありがとう。
素直にメンバに書きましゅ
285デフォルトの名無しさん:2008/12/20(土) 00:34:23
>>279
設計を見直すべき。お前には無理だろうけど。
286デフォルトの名無しさん:2008/12/20(土) 00:39:01
そもそも一つの関数に馬鹿でかい処理を書くという発想がおかしい
まず処理単位ごとに関数分割しろ
その上で、クラス自身の振る舞いはメンバ関数に、そのクラスを使って何かしたいという処理は
グローバル関数なりインスタンスを管理してるクラスのメンバ関数に書いたりするもんだ
287デフォルトの名無しさん:2008/12/20(土) 00:48:20
>>285
趣味プログラマに設計うんぬんいうな
288デフォルトの名無しさん:2008/12/20(土) 00:58:56
設計がどうのこうの言ってる奴らも実は大したこと無いんだけどね
289デフォルトの名無しさん:2008/12/20(土) 01:03:55
>>287
趣味だからこそ、納得いくまで設計練れるんだろ。
290デフォルトの名無しさん:2008/12/20(土) 01:10:57
職業プログラマに設計うんぬん耳にタコができるほど言いまくりたい
291デフォルトの名無しさん:2008/12/20(土) 01:14:26
金になるソフトウェアなんて妥協の産物だからな
292デフォルトの名無しさん:2008/12/20(土) 01:17:43
そうやって適当に作って
ひどい品質のプログラム作ってんだよな・・・
293デフォルトの名無しさん:2008/12/20(土) 01:19:22
まじめにやっても評価されないし
それどころか馬鹿を見るし
294デフォルトの名無しさん:2008/12/20(土) 01:19:41
そして潰れる会社
295デフォルトの名無しさん:2008/12/20(土) 01:20:58
マ板ネタやめれ
296デフォルトの名無しさん:2008/12/20(土) 01:28:02
な、設計を語りだすとこうなる。
297デフォルトの名無しさん:2008/12/20(土) 02:25:32
動作の品質は確保してるよ!
リファクタリング工数なんて理解されないよ!
298デフォルトの名無しさん:2008/12/20(土) 02:42:02
参照戻しについての質問です。

class Hoge{
private:
int x;
public:
Hoge(int val){
x = Val;
}
int &getX(){
return x;
}
};
において、
int main(){
int& a = Hoge(10);
int b = Hoge(20);
return 0;
}
は問題ありません。どうしてでしょうか?
int b = Hoge(20)はエラーだと思うのですが。
(その分変数bには参照戻しの効果がでていませんが。)
299デフォルトの名無しさん:2008/12/20(土) 03:20:43
いや、どっちもエラーだろ。
300デフォルトの名無しさん:2008/12/20(土) 03:23:51
ちなみに、参照から実体へのコピーができなければ参照なんてまるで使えたもんじゃないよね。
301デフォルトの名無しさん:2008/12/20(土) 12:18:41
どうしてintにHogeを代入できると思ったの?
302デフォルトの名無しさん:2008/12/20(土) 12:35:45
×代入
○初期化
303デフォルトの名無しさん:2008/12/20(土) 15:43:12
>>297
デバッグ工数と言って工数とりゃいいんだよ。
304デフォルトの名無しさん:2008/12/20(土) 15:45:28
getX 使ってねー
305デフォルトの名無しさん:2008/12/20(土) 17:27:02
hoge.cpp
hoge.h
dir
 hoge.cpp
 hoge.h

みたいに、サブディレクトリに同名のソースがあるとうまくリンクできないんですが
C++はそういうものなんですか
306デフォルトの名無しさん:2008/12/20(土) 17:36:17
 いいえ、それはC++のせいではありません。
ユニークなオブジェクトとしてコンパイルしてリンクすれば解決できます。
コンパイラに文句を言うか、自分でMakefileを書きましょう。
それが嫌なら、ユニークなファイル名にするとよいことがあるかも知れません。
307デフォルトの名無しさん:2008/12/20(土) 17:44:38
わかりました。ありがとうございます。
フリーのコンパイラなのであきらめて違うファイル名にすることにしました。
308デフォルトの名無しさん:2008/12/20(土) 17:46:19
どちらも同じディレクトリに hoge.o (hoge.obj かもしれんが)を作ろうとしてるんだろう。
ファイル名変えるのが一番手っ取り早いが、
無理ならオブジェクトファイル名を両者で変更するよう設定いじれ。
309デフォルトの名無しさん:2008/12/20(土) 18:55:57
while(a==c)
{
a = a + b;
}

とするより

b = func();
while(a==c)
{
a = a + b;
}

とした方が速度速いと思うんですが、

while(a==c)
{
a = a + e->count;
}

この場合は

f = e->count;
while(a==c)
{
a = a + f;
}

としたほうがいいんでしょうか?
310デフォルトの名無しさん:2008/12/20(土) 19:02:59
つ[実測しろ]
311デフォルトの名無しさん:2008/12/20(土) 19:06:13
なるほど
すべてとことんまで実測しようと思います。
312デフォルトの名無しさん:2008/12/20(土) 19:07:19
>>309
>a = a+b
これさっぱりわからないんだけど
上のは
a = a+func();
の間違い?
313デフォルトの名無しさん:2008/12/20(土) 19:09:04
コンパイラがfuncの内容をループに依存しない処理と判断したら
勝手に最適化されて変わんないとかいう可能性も考慮したほうがいい希ガス
314デフォルトの名無しさん:2008/12/20(土) 19:11:47
>>312
そうでした。すいません。関数は遅いから一回にするということでした。
315デフォルトの名無しさん:2008/12/20(土) 19:16:59
http://m--takahashi.com/bbs/
なんか最近こればっか表示されるようになった
顔見るだけでムカついてきたんだけど
316デフォルトの名無しさん:2008/12/20(土) 19:18:50
>>313
f と e->count のメモリの位置の差によって
キャッシュヒット率が変わるかもしれない、
ということまで考えると、
やっぱ実測しかない気もする。
317デフォルトの名無しさん:2008/12/20(土) 19:19:19
>>315
キャッシュを表示させればいいんだぜ
318デフォルトの名無しさん:2008/12/20(土) 19:27:30
>>317
詳しく!
319デフォルトの名無しさん:2008/12/20(土) 19:32:42
>>318
キャッシュ - 関連ページ

これをクリック!
320デフォルトの名無しさん:2008/12/20(土) 19:41:53
あーわかったthx!
321デフォルトの名無しさん: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 );
322デフォルトの名無しさん:2008/12/20(土) 20:52:29
>>321
>関数は絶対呼び出しちゃダメだとわかった
コンパイラの最適化チェックは?ON?OFF?
323デフォルトの名無しさん:2008/12/20(土) 20:59:33
実際にプログラム内で使う処理に対して直接実測しようぜ。
もし実測できない程速い処理なら、
そもそもそんな関数呼ぶか呼ばないかの違いなんて関係ない。
324デフォルトの名無しさん:2008/12/20(土) 21:07:47
最適化最大にしたら

関数中 経過時間 : 0 msec
関数外 経過時間 : 0 msec
ポインタ中 経過時間 : 0 msec
ポインタ外 経過時間 : 0 msec

テンション下がりまくり・・・
325デフォルトの名無しさん:2008/12/20(土) 21:14:33
>>324
深淵なるベンチマークの世界にようこそ。
326デフォルトの名無しさん:2008/12/20(土) 21:21:25
意味の無い処理だから最適化で処理が全部消えちゃったんだよ。
327デフォルトの名無しさん:2008/12/20(土) 21:30:52
だっせ
328デフォルトの名無しさん:2008/12/20(土) 21:39:02
>>324お前のバカさでテンション上がった
329デフォルトの名無しさん:2008/12/20(土) 22:44:54
そこはコンパイラのかしこさに感動する所じゃないのか
330デフォルトの名無しさん:2008/12/20(土) 22:55:55
そこに感動するのは半世紀前まで
331デフォルトの名無しさん:2008/12/21(日) 01:40:57
初心者歓迎で特にDQNって訳でもないのにフルボッコにしててワロタw
332デフォルトの名無しさん:2008/12/21(日) 04:30:08
王道を行くボケだったから
突っ込まずにはいられなかったのだと思う
333デフォルトの名無しさん:2008/12/21(日) 05:24:36
C言語についての質問です。コンパイラはgccなのですが、下のソースにおいて
   char str[100];
   char *str2;
はどういった違いがあるのでしょうか?(変数名やサイズは除いて・・・)
str2はscanfで文字列入力を渡せませんでした。
私の考えでは、後者はアドレスを指定しただけで、文字列を入れるだけのメモリ領域を
確保していないからだと思うのですが・・・、違うでしょうか?

#include<stdio.h>

int main(void)
{
   char str[100];
   char *str2;

   scanf("%s", str);
   printf("str = %s\n", str);

   scanf("%s", str2);
   printf("str2 = %s\n", str2);

   return 0;
}
334333:2008/12/21(日) 05:26:13
すいません、文字列入力を渡せないというのは、
文字列を入力するとSegmentation faultとなるということです。
335デフォルトの名無しさん:2008/12/21(日) 05:41:16
メモリが確保されていない
336デフォルトの名無しさん:2008/12/21(日) 06:03:33
>>333
ポインタだけ作ってそのポインタが指す先の入れ物を作ってないから。

「ほら、そこに入れて」とポインタは言っているのですが、その指さす場所
に箱がない。もっと正確に言うとポインタ変数に入っているデタラメな
アドレス値先に入れようとしてSegmentation faultを起こす。
337デフォルトの名無しさん:2008/12/21(日) 06:04:32
>>333
str2 = str;
とやってからstr2に入れようとすればうまく行く。それはstr2の指す先を
strという入れ物に合わせてやったから。
338333:2008/12/21(日) 07:44:42
速い回答ありがとうございます!ポインタ関連がやはりあやふやですね・・・

よく考えてみると確かにアドレスstr2に文字列を入れろと言われても、
なにも指定されてないですよね・・・

>>337
その場合、strに入力した文字列は消えてしまうと解釈でいいですよね?
339デフォルトの名無しさん:2008/12/21(日) 08:11:20
>>338
その通り。strに入力した文字列はstr2を通じて入力した
文字列で上書きされてしまう。
340デフォルトの名無しさん:2008/12/21(日) 10:14:13
%99sとかにしたほうがいいよ
341デフォルトの名無しさん:2008/12/21(日) 12:18:42
質問です。
stringをreverseで逆順にしようとすると文字が壊れるんですが、stringはreverseに入れるとまずいのでしょうか?



void reverse(std::string& buf)
{
std::reverse(buf.begin(), buf.end());
}

int main()
{
std::string buf("あいうえお");
reverse(buf);
std::cout << buf << std::endl; // "おえういあ"にならない
}
342デフォルトの名無しさん:2008/12/21(日) 12:20:27
マルチバイト文字って知ってる?
343デフォルトの名無しさん:2008/12/21(日) 12:23:24
>>341
半角ならうまくいく。
344デフォルトの名無しさん:2008/12/21(日) 12:30:08
むしろwstringならうまくいく
345デフォルトの名無しさん:2008/12/21(日) 12:51:57
合成文字やらサロゲートやら
346デフォルトの名無しさん:2008/12/21(日) 13:18:32
>>341 C++文字列の世界へようこそw
347デフォルトの名無しさん:2008/12/21(日) 13:26:36
ヒント:2byte文字
348デフォルトの名無しさん:2008/12/21(日) 14:23:05
>>347
何度も同じこと書かなくていいから。
349デフォルトの名無しさん:2008/12/21(日) 14:24:04
質問者わかったらわかったって書けや!
ホントクズだなお前は!
350デフォルトの名無しさん:2008/12/21(日) 14:24:39
クズの上にグズだなお前は!
351デフォルトの名無しさん:2008/12/21(日) 14:29:37
うまくない
352デフォルトの名無しさん:2008/12/21(日) 14:30:08
ヘイヘイ、回答者、ビビってる〜
353341:2008/12/21(日) 14:37:26
すいません。調べてて返信に時間がかかってしまいました。

wstringでやるとうまく行ったんですが、色々分からないことが…
printf("%X, %X\n", 'a', 'あ'); // シフトJIS

printf("%X, %X\n", L'a', L'あ'); // UTF16

ここまでは分かったのですが、英語と日本語を混合させたい場合にはどうすればいいのでしょうか?
wchar_t a[3] = {'a', 'あ', '\0'};
char b[3] = {'a', 'あ', '\0'};
printf("%s\n", a); // aしか表示されない
printf("%s\n", b); // 改行もされない
354デフォルトの名無しさん:2008/12/21(日) 14:40:13
setlocaleしたら何か変わるかもしれない
355デフォルトの名無しさん:2008/12/21(日) 14:58:49
>>353
>wstringでやるとうまく行ったんですが
「なぜかうまくいった」状態だな。
>char b[3] = {'a', 'あ', '\0'};
1バイトしか入らない char に 'あ' とか排卵。
>printf("%s\n", a); // aしか表示されない
printfじゃねえ。wprintf。
356デフォルトの名無しさん:2008/12/21(日) 14:59:38
お前ら楽しそうだなw
357デフォルトの名無しさん:2008/12/21(日) 15:10:39
分かる話題はテンションアゲアゲ
358341:2008/12/21(日) 15:30:12
>setlocaleしたら何か変わるかもしれない
書くのを忘れていましたが、setlocaleは先頭で宣言してありました。

> printfじゃねえ。wprintf。
wprintfを使うということはUnicode文字列を使わないといけない?
と言うことはwchar_t*にはマルチバイト文字列を入れてはいけない??
wprintfの使うときにマルチバイト文字列を引数に取れるのでしょうか???
359デフォルトの名無しさん:2008/12/21(日) 15:57:22
10年前の本でメモリマップトファイルを読んだんだけど
今ならもっと簡単に書けるよね?ね?
360デフォルトの名無しさん:2008/12/21(日) 19:25:07
>>345
規格だと、wchar_tは、ひとつ一文字だからreverseとか問題なく実行できなければ
ならないはずだけど。(そうなってないな)
361デフォルトの名無しさん:2008/12/21(日) 19:33:33
VC だと wchar_t は2バイトで
文字コードも今は普通 UCS2 じゃなくて UTF-16 だから
サロゲートペアがあるんだよな。
362デフォルトの名無しさん: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の要素の数が求められなくて困っています。
両方の要素数をもとめる方法を教えてください。
363デフォルトの名無しさん:2008/12/21(日) 20:47:34
普通vectorと配列の両方で動く関数テンプレートを作る場合、
引数にはbeginとendをとる。
364デフォルトの名無しさん:2008/12/21(日) 21:03:29
サイズでやりたいなら配列とvectorそれぞれで特殊化テンプレートを書くしかないな
全くオススメしないが
365デフォルトの名無しさん:2008/12/21(日) 21:05:56
関係ないがサイズにはintじゃなくてsize_tを使え
366デフォルトの名無しさん:2008/12/21(日) 21:08:59
>>362
まさにboost::sizeの出番。
367デフォルトの名無しさん:2008/12/21(日) 21:10:22
配列サイズ事に実体化とかやめてくれよ。
368デフォルトの名無しさん:2008/12/21(日) 21:18:07
>>361
結合文字やbidiもあるでよ……。
結合文字はともかく、bidiのreverseってどういう結果になるのが正しいんだろう。
369デフォルトの名無しさん:2008/12/21(日) 21:36:38
>>362
真面目に書いたプログラムを作ってみたが、
宿題のようなのでうpはやめといた。

とりあえず T が整数型の時、
戻り値の型が double なのに 2 で割っていいのかなーとか言っとく。
370デフォルトの名無しさん:2008/12/21(日) 21:36:40
template<class T> double median(T* begin,T* end){
int size=0;
while(!(begin+size==end)){
size++;
}
if(size==0){
throw domain_error("サイズ0");
}
sort(begin,end);
int mid = size/2;
return size%2==0 ? (begin[mid]+begin[mid-1])/2 : begin[mid];
}

こんなんでもだめでした。
目が痛くなってきました
371デフォルトの名無しさん:2008/12/21(日) 21:38:08
>>369 注意ありがとうございます
キャストしておきます。
372デフォルトの名無しさん:2008/12/21(日) 21:47:57
サイズが 0 かどうかは begin == end で確認する。
サイズは std::distance 関数(<iterator> ヘッダにある)を使って得る。
373デフォルトの名無しさん:2008/12/21(日) 21:59:59
template<class T> double median(T* begin,T* end){
int size;
distance(begin,end,&size);
if(begin==end){
throw domain_error("サイズ0");
}
sort(begin,end);
int mid = size/2;
return size%2==0 ? (double)(begin[mid]+begin[mid-1])/2 : (double)begin[mid];
}

こんな感じにしましたがコンパイルが通りません。
memory.cpp: In function `double median(T, T) [with T = __gnu_cxx::__normal_i
terator<double*, std::vector<double, std::allocator<double> > >]':
memory.cpp:132: instantiated from here
memory.cpp:87: error: no matching function for call to `distance(__gnu_cxx::
__normal_iterator<double*, std::vector<double, std::allocator<double> > >&, __g
nu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> >
>&, int*)'

引数にはvectorのbegin()とend()を渡してるんですが
引数がまちがってますか?
374デフォルトの名無しさん:2008/12/21(日) 22:02:42
[1] 授業単元: 乱数
[2] 問題文(含コード&リンク):半径1の4次元球の体積を求めよ。ただし疑似乱数の組数をK(独立した疑似乱数の組の数)から2Kに変化させたときの面積の計算値の相対変化が10^(-2)以下となった場合収束しているものとする。
得られた結果は解析的に計算した値とあっているか?
ちなみにn次元球の体積は、
nが偶数のとき:{(r^n)/n!!}*(2π)^(n/2)
nが奇数のとき:{(r^n)/n!!}*2*(2π)^((n-1)/2)
である。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:今年まで
[5] その他の制限:特になし

お願いします
375デフォルトの名無しさん:2008/12/21(日) 22:02:51
T* じゃない。
イテレータはポインタではない。
376デフォルトの名無しさん:2008/12/21(日) 22:03:40
>>374
死ね
377デフォルトの名無しさん:2008/12/21(日) 22:04:14
>>374
宿題は宿題スレで。
378デフォルトの名無しさん:2008/12/21(日) 22:08:03
>>373
size = std::distance(begin, end);
379デフォルトの名無しさん:2008/12/21(日) 22:08:14
配列の場合ポインタを vectorの場合イテレータを利用し関数をつくるんですよね?
その場合templateはどのように定義すべきなのでしょうか?
380デフォルトの名無しさん:2008/12/21(日) 22:08:59
* なくせばいいだけだろー
381デフォルトの名無しさん:2008/12/21(日) 22:09:48
memsetの逆をするには何を使いますか?
382デフォルトの名無しさん:2008/12/21(日) 22:10:37
逆ってなにしたいんだよ・・・・・
383デフォルトの名無しさん:2008/12/21(日) 22:12:02
エスパーの登場を待つ
384デフォルトの名無しさん:2008/12/21(日) 22:13:54
memcpy?
385デフォルトの名無しさん:2008/12/21(日) 22:14:42
データを1バイトずつ読み取りたいんですが
386デフォルトの名無しさん:2008/12/21(日) 22:15:15
>>362
そもそも、これで配列のサイズが取れるって言ってるが、
どんな引数をわたしてるんだ?
387デフォルトの名無しさん:2008/12/21(日) 22:15:56
>>386
配列そのまま渡せば T が配列型になってサイズとれるっしょ。
388デフォルトの名無しさん:2008/12/21(日) 22:17:14
>>385
charのポインタにキャストして、アクセスすれば?
389デフォルトの名無しさん:2008/12/21(日) 22:17:29
>>387
いやいやいやいや。
T はポインタになるから無理だ。
390373:2008/12/21(日) 22:18:13
>>380
見事に通りました
がセグりました。 原因がsortくらいしか思いつかないのですが。
sortがSTLなだけに遺憾ともしがたい感じです。
391デフォルトの名無しさん:2008/12/21(日) 22:18:35
392373:2008/12/21(日) 22:23:10
>>386
double型のvectorです。それのbegin()とend()を渡しています。

ちなみにsizeの中身が
5105
613
5-95
1123
4-16
3-53
4-16
359
715
613
424
613
4-16
02
4-16
359
2-22
31388
3-1438
5105
1-1
613
31444
13
こんな感じになってました。
393デフォルトの名無しさん:2008/12/21(日) 22:23:16
他の人のせいにする前に
まず自分を疑え。
プログラミングの鉄則だな。
394373:2008/12/21(日) 22:24:24
>>391
>>378さんのアドバイス通り修正しましたが。Segmentation Faultでした。
395デフォルトの名無しさん:2008/12/21(日) 22:25:46
>>392
いや、配列は?
396373:2008/12/21(日) 22:28:05
配列はvector成功時に試したいと思うのですが
vectorと同様配列もdouble型の配列で先頭と後尾のポインタを渡そうと考えています。
397373:2008/12/21(日) 22:38:26
あ、ちなみにこのvectorのデータもいくつかあって
medianをその回数分まわした結果sizeの中に代入されたものが392です
398デフォルトの名無しさん:2008/12/21(日) 22:52:58
T* begin って書き方が気に入らないなあ

書くなら RandomAccessIterator begin だろ
399デフォルトの名無しさん:2008/12/21(日) 23:00:52
sizeが5-95とかどういうことなの
400デフォルトの名無しさん:2008/12/21(日) 23:02:58
373はまず普通の配列とvectorの両方で動くという目標を
一時中断して自前のアルゴリズムを自由自在に書けるようにしろ

そうすれば自然と目的は達せられる
401デフォルトの名無しさん:2008/12/21(日) 23:22:27
どれちょっとやってみようか
402デフォルトの名無しさん:2008/12/21(日) 23:23:35
とりあえず最終的なコードをさらすべきだな。
403デフォルトの名無しさん:2008/12/21(日) 23:38:50
こういう書き方をしたいんだがこうすると配列のコンパイルが通らないしな

template <class RandomAccessIterator>
typename RandomAccessIterator::value_type median(RandomAccessIterator begin, RandomAccessIterator end)
{
int size = std::distance(begin, end);

if (!size)
throw std::domain_error("サイズ0");

std::sort(begin, end);

int mid = size / 2;

return (size % 2) ? (begin[mid] + begin[mid + 1]) / 2 : begin[mid];
}

int main()
{
double a[] = {1.0, 1.1, 1.2};
double b[] = {10.0, 11.1, 12.2, 13.3};
std::vector<double> vd(b, b + 3);

//std::cout << median(a, a + 2) << std::endl;
std::cout << median(vd.begin(), vd.end()) << std::endl;
}
404デフォルトの名無しさん:2008/12/21(日) 23:49:23
std::accumulate()みたいなインターフェースにするか
あー面倒臭い
InputIteratorを使うからoperator[]が使えなくなるから
std::advance()を使うしかないな
405デフォルトの名無しさん: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;
}
406デフォルトの名無しさん:2008/12/22(月) 00:18:51
こうだろ

template <class T>
typename std::iterator_traits<T>::value_type median(T begin, T end){}
//--
median(a,a+sizeof(a)/sizeof(*a));
407デフォルトの名無しさん:2008/12/22(月) 01:16:15
>>406
int 配列渡しても double で返して欲しいだろ・・・
408デフォルトの名無しさん:2008/12/22(月) 02:55:26
CStringをSwitchで使うのは無理?
409デフォルトの名無しさん:2008/12/22(月) 07:16:09
無理
410デフォルトの名無しさん:2008/12/22(月) 09:16:55
enum CStringとかなら出来るよ。
411デフォルトの名無しさん:2008/12/22(月) 09:34:29
return valueとしてポインタを返すということは
return *s;
ということですか。
412デフォルトの名無しさん:2008/12/22(月) 10:15:10
sの型は何ですか
413デフォルトの名無しさん:2008/12/22(月) 10:37:54
enumでどう書けばいいんですか

CString a = _T("ね");
CString b = _T("うし");
CString c = _T("とら");
enum eto {a, b, c};
Switch(eto)
{
case a:
case b:
case c:
}

ぜんぜんわかりません。すごい適当です
414デフォルトの名無しさん:2008/12/22(月) 10:46:37
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・)
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
死ぬとき このレスの事思い出してから地獄へ行けよ
ニヤ(・∀・)ニヤ(・∀・)
415デフォルトの名無しさん:2008/12/22(月) 10:53:29
>>412
char型です。
416デフォルトの名無しさん:2008/12/22(月) 11:00:22
>>411
return &value;
でアドレスが返る
リテラルを返すなら問題ないが一時変数を返しちゃだめよ
417デフォルトの名無しさん:2008/12/22(月) 11:02:11
char配列を返すなら&はいらないか
char *test()
{
return "test";
}
418411:2008/12/22(月) 11:09:22
char *s = "abc";
(省略)
return s;

これは間違いですか。
419デフォルトの名無しさん:2008/12/22(月) 11:10:38
>>418
場合による
420デフォルトの名無しさん:2008/12/22(月) 11:30:29
>>418
省略すんなwww
421デフォルトの名無しさん:2008/12/22(月) 11:41:49
省略部でsを触ってなければおk
422デフォルトの名無しさん:2008/12/22(月) 11:52:10
でもどうせ、実はchar s[] = "abc"でしたとか、ろくでもない落ちな希ガス。
423デフォルトの名無しさん:2008/12/22(月) 11:56:28
せめてconstをつけれ
424デフォルトの名無しさん:2008/12/22(月) 11:59:02
char s[] = "abc" って実態生成されるんだっけ?
使ったことないから意識したことなかった・・・
425デフォルトの名無しさん:2008/12/22(月) 12:02:08
>>424
スタックに4バイト確保してそこに"abc"をコピーする。
たまたま作業領域を文字列で初期化するような用途でもなければ使えないね。
426デフォルトの名無しさん:2008/12/22(月) 12:06:53
>>424
される。
427デフォルトの名無しさん:2008/12/22(月) 12:48:11
マルチスレッドプログラミングに関しての質問なんですが、
関数ローカルな静的オブジェクトの初期化位置に、複数のスレッドが同時に到達した場合、
複数のスレッドで初期化される可能性はあるのですか?

もし、可能性があるなら、どういった手法で回避するのが定石なのでしょうか。
どなたかお教えください。
428デフォルトの名無しさん:2008/12/22(月) 12:56:09
>>427
現規格ではスレッドの概念が無いので、どうなるかは実装依存。
回避法も環境依存。
次期規格でどうなるかはシラネ
429デフォルトの名無しさん:2008/12/22(月) 13:06:57
>>427
タイムアウト付きのmutexでシングルトンとか
430デフォルトの名無しさん:2008/12/22(月) 13:18:43
>>429
で、そのmutexの初期化を保護する何かが必要になるわけか。
431デフォルトの名無しさん:2008/12/22(月) 13:24:29
やっぱマルチスレッドに入る前に何かしらでインスタンス生成するしかないのかね?
432デフォルトの名無しさん:2008/12/22(月) 13:53:56
>>430
何か別に必要か?クリティカルセクション内でフラグを立てる
だけのような気がするんだが
433デフォルトの名無しさん:2008/12/22(月) 14:28:37
そのクリティカルセクションをどうやって作るんだい?
434デフォルトの名無しさん:2008/12/22(月) 15:05:54
boostのシングルトンもその辺保証できずに破棄された気がするんだが
どうだったかな…
435デフォルトの名無しさん:2008/12/22(月) 15:13:26
犬糞ならアトミック変数使えばいい話だし、
Win なら static な Mutex 作っといて WaitForSingleObject するだけ。
436デフォルトの名無しさん:2008/12/22(月) 15:25:04
だからそのstaticなMutexをどのタイミングで作るかって話してんだろうが
↓以下無限ループ
437デフォルトの名無しさん:2008/12/22(月) 15:42:04
すいません、質問です
char* aaa
の、aaaで
if(aaa=="")
という判定があったのですが
aaaに""が代入されることはありえるのでしょうか?
438デフォルトの名無しさん:2008/12/22(月) 15:44:57
aaa = "";
439デフォルトの名無しさん:2008/12/22(月) 15:48:33
WindowsならInterlocked系のAPIでいいんじゃねえの
440デフォルトの名無しさん:2008/12/22(月) 15:50:03
ありえないし
if(aaa=="")
なんて比較できない
441437:2008/12/22(月) 15:54:55
>>438
ヌルポインタ?になるのかと思ってましたが
そういう代入が出来るんですね
それなら比較文が必要ですね
ありがとうございます
442デフォルトの名無しさん:2008/12/22(月) 16:49:17
>>441
a = "" が意味するのはどこかに確保した "" という (つまり長さゼロの) 文字列のアドレスを a に入れるということ。
その後に a == "" と比較したときの "" は前の "" と別の場所に確保されるかもしれない。
コンパイラが充分に賢ければ同じ場所を指すこともあるが、規格では未定義。
つまり、 aaa=="" なんて比較がどうなるかは処理系による。
普通はやるべきではない比較とだけは言っておく。
443デフォルトの名無しさん:2008/12/22(月) 16:53:02
char* aaa = "";

if(aaa == "")
の""が同じアドレスという保証はあるのかな
444デフォルトの名無しさん:2008/12/22(月) 17:20:36
>>439
そのInterlockedで使うintとかを0なりで初期化しなければならないんだが
その初期化が同時に走ったら…
445デフォルトの名無しさん:2008/12/22(月) 17:27:19
>>443
ないよ。
でも最適化によっては、あると言われればあるかもしれない。

初心者向けには、「文字列の比較は strcmp 使いなさい」でおわり。
446デフォルトの名無しさん:2008/12/22(月) 17:37:54
>>444
JIS X 3014 3.6.2 「非局所オブジェクトの初期化」あたりを読む限りでは、
静的初期化=(ゼロ初期化/定数式初期化)は、mainの実行前に行われることが
保障されているようだが
447デフォルトの名無しさん:2008/12/22(月) 17:55:39
おーいenameでCString教えてくれーコンパイルできないよー
448デフォルトの名無しさん:2008/12/22(月) 18:02:24
>>410がいってるのはこういうことだろたぶん
enum CString {a, b, c};
449デフォルトの名無しさん:2008/12/22(月) 18:50:04
enum CString {_T("ね"), _T("うし"), _T("とら") };
CString eto;
int num;
switch( eto )
{
 case T("ね"):
  num = 1;
  break;
 case _T("うし"):
  num = 2;
  break;
 case _T("とら"):
  num = 3;
  break;
}

コンパイル通る気配すらないです
450デフォルトの名無しさん:2008/12/22(月) 19:04:33
>>449
ネタにマジレスw
451デフォルトの名無しさん:2008/12/22(月) 19:05:15
>>446
非局所オブジェクトはそうだけど。

ということで、非局所オブジェクト無しでは無理。>427
だったら目的の静的オブジェクト自体を非局所にするのが素直。
452デフォルトの名無しさん:2008/12/22(月) 19:23:52
これならVCで通るだろw

enum CString {ね, うし, とら };
CString eto = ね;
int num;
switch( eto )
{
 case ね:
  num = 1;
  break;
 case うし:
  num = 2;
  break;
 case とら:
  num = 3;
  break;
}
453デフォルトの名無しさん:2008/12/22(月) 19:45:35
default
454デフォルトの名無しさん:2008/12/22(月) 19:51:10
>>446
mainが始まる前に(グローバルオブジェクトの初期化処理の中からとか)アクセスしたらどうなるんだろう
455デフォルトの名無しさん:2008/12/22(月) 20:09:22
>>452
通りました。ありがとうございました。
456デフォルトの名無しさん:2008/12/22(月) 20:15:50
むきーーーg−あs−g−sgs
457デフォルトの名無しさん:2008/12/22(月) 21:05:48
>454
異なる翻訳単位におけるグローバルオブジェクトの初期化順序は不定です。
ということで未初期化のオブジェクトにアクセスしてしまう可能性があります。

ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12
以降も参考になると思います。
458デフォルトの名無しさん:2008/12/23(火) 12:57:28
フレンドクラスは公開したいクラス名を公開元に書いておけばいいんですよね?
でもフレンドクラスが書いてない元クラスのプライベートにアクセスする方法はないんですか?
459デフォルトの名無しさん:2008/12/23(火) 13:54:47
何の為のprivate
460デフォルトの名無しさん:2008/12/23(火) 14:15:38
#define private public
461デフォルトの名無しさん:2008/12/23(火) 14:52:32
The Pickpocket乙
462デフォルトの名無しさん:2008/12/23(火) 15:24:56
win32APIやりたいけど何からやればいいのか分かんない

#include<window.h>

ここから進まない……
463デフォルトの名無しさん:2008/12/23(火) 15:25:55
>>462
適当に講座サイトでも見ろよ
464デフォルトの名無しさん:2008/12/23(火) 15:29:18
>>463
天才すぎてびっくりした
そうか猫でも分かる辺りを見てこよう
465デフォルトの名無しさん:2008/12/23(火) 15:55:33
おまいらヌルポも知らねーのか
出直してこい!
466デフォルトの名無しさん:2008/12/23(火) 16:45:26
>>462
WinMainとWndProcを書け
467デフォルトの名無しさん:2008/12/23(火) 16:48:16
class CHoge{
Point *m_pPoint;
void hogepoint(Point);
}

void hogepoint(Point point){
m_pPoint = new Point;
*m_pPoint = point;
}
ってやったら、しばらくしたらpointが消えてしまっているんですがどうしたらいいんでしょう?


468デフォルトの名無しさん:2008/12/23(火) 16:49:11
しらねぇよwwwwww
469デフォルトの名無しさん:2008/12/23(火) 17:22:05
void hogepoint(Point point){

void CHoge::hogepoint(Point point){

じゃねーの?

しらねーけど
470デフォルトの名無しさん:2008/12/23(火) 17:41:39
>>469
まさか、本当にCHogeってやってるわけじゃなし例としてこんなことをってかいたからないだけだろ
471デフォルトの名無しさん:2008/12/23(火) 19:41:10
intとかだと意味わからないしコメントを減らすためにも
すべての型に別名をつける規則にしようと思うんですが、問題ありますか?
472デフォルトの名無しさん:2008/12/23(火) 19:45:26
>>471
対費用効果がぜんぜんよくないと思う。
473デフォルトの名無しさん:2008/12/23(火) 19:45:47
>>471
なんでそういうことをしようとするのか意味分からない
引数チェックのため?
474デフォルトの名無しさん:2008/12/23(火) 19:45:56
他人とやってるならその人に聞く
一人なら何も問題ない
475デフォルトの名無しさん:2008/12/23(火) 19:48:08
>>471
例外もあるけど、最悪だと思う

476デフォルトの名無しさん:2008/12/23(火) 19:59:07
例外を投げるときに std::domain__error に TCHAR* を渡しているんですが、VCのプロパティでUnicode文字を指定するとコンパイルが通りません。
std::domain__error にUnicode文字を渡すことは出来ないのでしょうか?
477デフォルトの名無しさん:2008/12/23(火) 20:02:10
what()はconst* charだけだっけ
478デフォルトの名無しさん:2008/12/23(火) 20:14:48
>>476
例外ってワイド文字版がないんだっけ。
マルチバイト文字に変換して渡せば?
479デフォルトの名無しさん:2008/12/23(火) 20:29:19
そして変換の最中に例外が発生するんですね
480デフォルトの名無しさん:2008/12/24(水) 02:05:00
まぁその場合は文字列変換失敗の例外が飛べばそれでもいいかなと思う。
481デフォルトの名無しさん: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)
これは正しい対処法なのでしょうか?
482デフォルトの名無しさん:2008/12/24(水) 03:08:34
正しい対処法
483デフォルトの名無しさん:2008/12/24(水) 03:10:02
まあ問題ないと思う
でも面倒だから、OLE関係みたいに常にW版だけ用意というのもありだな。
484デフォルトの名無しさん:2008/12/24(水) 07:38:38
std::set<int>のcount()が、2を返すことってありますか?
485デフォルトの名無しさん:2008/12/24(水) 07:41:14
うん
486デフォルトの名無しさん:2008/12/24(水) 08:03:46
setには同じものは1つしか入らないので、count()の戻り値は0か1ではないのですか?
487デフォルトの名無しさん:2008/12/24(水) 08:17:01
異なるものなら2つ入るよ
488デフォルトの名無しさん:2008/12/24(水) 09:08:52
int と UINT を比較すると警告がでるんですが、
これを解決するにはどうすればいいんですか?

UINTの方は表現が失われるのでintにできないし
intの方はマイナスも比較したいのでUINTにできないんです
489デフォルトの名無しさん:2008/12/24(水) 09:15:50
符号有り64bit整数を使え
490デフォルトの名無しさん:2008/12/24(水) 09:19:23
>>488
比較したい瞬間のみどっちかに合わせるか>489ということになる。
2^31以上を検出できなくていいなら、int foo; UINT bar;としてbool foz = foo == int(bar);などとなる。
491デフォルトの名無しさん:2008/12/24(水) 09:24:34
あそうか64があったのかthx
492デフォルトの名無しさん:2008/12/24(水) 09:46:42
>>487
size()と勘違いしてるだろ
それかmultisetとか
493デフォルトの名無しさん:2008/12/24(水) 10:22:05
>>484
ないよ
>>486
わかってて尋ねんなよ
494PPPf2026.tokyo-ip.dti.ne.jp :2008/12/24(水) 12:08:01
VC++ で
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,・・・);

ならば大丈夫です。
エスケープの方法に問題があると思っているのですが
回避方法がわかりません。

どなたか分かります?
495デフォルトの名無しさん:2008/12/24(水) 12:15:10
ええっww

char *portname = "\\\\.\\COM10";
にしたらどうなるよ
496デフォルトの名無しさん:2008/12/24(水) 12:21:37
スタックを微妙な具合に壊してんじゃないか?
497デフォルトの名無しさん:2008/12/24(水) 12:28:52
>>495
できました。。
どういうことなんでしょう。。
配列に格納した場合は問題あるのでしょうか。。。

>>496
一応確認してみましたが怪しいところはみつかりません。

二人とも早い返信ありがとうございます。
498デフォルトの名無しさん:2008/12/24(水) 12:29:15
それで出来るって事はどこか壊してると思われ
499494:2008/12/24(水) 12:34:46
>>498
了解しました。
調べてみます。
ありがとうございます!
500デフォルトの名無しさん:2008/12/24(水) 12:37:25
なんでわざわざLPCSTRにキャストしてるんだろう
501デフォルトの名無しさん:2008/12/24(水) 19:12:33
メモリリークを検出しようと思い_CrtSetDbgFlagを使ったんですが、何もしていないのにメモリリークを検出してしまいます。
_CrtSetDbgFlagの使い方が間違っていたりするのでしょうか?

#include <iostream>
int main()
{
#ifdef _DEBUG
// メモリリークを検出する
::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_CRT_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF);
#endif
}
502デフォルトの名無しさん:2008/12/24(水) 19:19:03
>>501
何て事をしてくれたんですか!
常にメモリリークしているという事実を明らかにしてくれましたね!
503デフォルトの名無しさん:2008/12/24(水) 19:19:05
_CRTDBG_CHECK_CRT_DFはデタラメ吐き散らかすからやめた方がいい
504501:2008/12/24(水) 19:29:57
>503
メモリリークがなくなりました。ありがとうございます!
_CRTDBG_CHECK_CRT_DFはこれから使わないようにします。
505501:2008/12/24(水) 19:37:47
新しい疑問が出てきたんですが、
_CRTDBG_CHECK_CRT_DFを指定するとメモリリークを検出するということは、>502の通り
ランタイムライブラリでメモリリークが発生しているということでしょうか?
それとも本当にデタラメを吐き出しているのでしょうか?
506デフォルトの名無しさん:2008/12/24(水) 20:00:22
CRTが持ってるグローバル変数が解放される前に検出処理が走ってんじゃねーの?
507デフォルトの名無しさん:2008/12/24(水) 20:46:40
>>494
へー、そんなことがあるんだ。
Tcl/Tkでwindowsのcomポートが9までしか使えない仕様なのは
そこらへんの回避ができなかったからなのかな。
508デフォルトの名無しさん:2008/12/24(水) 22:00:40
回避って、\\.\を頭に付けるだけだろ。
509デフォルトの名無しさん:2008/12/24(水) 22:15:28
>>488
一例だが。

BOOL eq(int lhs, UINT rhs) {
 if (lhs < 0) {
  return FALSE;
 } else if (rhs > INT_MAX) {
  return FALSE;
 } else {
  return (UINT)lhs == rhs;
 }
}

eq 以外の時も同じ発想で出来る。
510デフォルトの名無しさん:2008/12/24(水) 22:51:22
2の補数だと
!((lhs | rhs) & INT_MIN) & (lhs == (int)rhs)
とかでもいいんかね
511デフォルトの名無しさん:2008/12/24(水) 22:57:58
>>488
long long みたいのを使える処理系なら、それにキャストすれば。
512デフォルトの名無しさん:2008/12/24(水) 22:59:40
C99ならint64_tでいいだろう
MSの場合はlong longは無いし__INT64とかになると思うが
doubleという手もあるけど、いかにも遅そうだ
513デフォルトの名無しさん:2008/12/24(水) 23:02:33
64ビットキャストしても
64ビット機でもなければ
>>509 より効率悪いしなあ。
514デフォルトの名無しさん:2008/12/24(水) 23:03:43
>>512
VC++も最近はlong longが使える。
515デフォルトの名無しさん:2008/12/24(水) 23:05:10
>>513
ソースが簡単になるでしょ。
516デフォルトの名無しさん:2008/12/24(水) 23:10:24
>>514
おお、それは知らんかった、トン
そんな化石をサポートするぐらいならstdintぐらい使えたほうが
なんぼか嬉しいが……
517デフォルトの名無しさん:2008/12/24(水) 23:11:44
え?double使うより>>509書いた方が速いってマジ?

なにlong longって、普通に型として使えるの?まさか25*12とか特殊な書き方が必要なの?
518デフォルトの名無しさん:2008/12/24(水) 23:13:06
>>517
509は分岐してるし今のCPUだと遅そうに見えるわな
誰かベンチマークよろ
519デフォルトの名無しさん:2008/12/24(水) 23:20:32
VCで
bool eq2(int a, unsigned b)
{
return (long long)a == (long long)b;
}
と比べたら、計算に10秒かかるくらいまわしても、差がでなかった。

最適化はしてない。
520デフォルトの名無しさん:2008/12/24(水) 23:31:46
>>519
それは、long longでキャストしてもしなくてもってこと?
環境は32bit?
521デフォルトの名無しさん:2008/12/24(水) 23:32:46
つーか、関数にしてそれをループしてるんなら、関数呼び出しのコストのが
全然高いのでは
inlineにするか、中身をループしないと意味ないんじゃないの
522デフォルトの名無しさん:2008/12/24(水) 23:35:30
>>519
最適化しろよ・・・。
523デフォルトの名無しさん:2008/12/24(水) 23:37:15
>>520
>>488からの流れで、>>509と比較してってことだから、キャストしないとだめじゃん。
524デフォルトの名無しさん:2008/12/24(水) 23:38:52
>>523
ああ、>>509との比較で差がでないってことか
じゃあ理由は間違いなく>>521だと思う
525507:2008/12/24(水) 23:40:13
>>508
そんなん俺に言われても。
Tcl/Tkのwindows版は仕様としてcom9までしか使えない。
だけだろ、とか言うならTcl/Tkの作者に言ってくれよ。
526デフォルトの名無しさん:2008/12/24(水) 23:42:10
>>522
最適化して、INT_MAX回まわしても、あまり差がなかった。
計測は秒単位で、最適化で呼び出し消えるのを防ぐために、余計な処理を入れたり
したけど。
何回か実行するると、>>509のほうが早いときがあって誤差かとおもったけど、
>>519が早いときは一回もないから、微妙に>>509のほうがはやいっぽい。
527デフォルトの名無しさん:2008/12/24(水) 23:45:01
>>524
関数呼び出しのコストが、中身の数十倍とかだったら、まあそうだけど、
そんなに差がなかったら、処理が秒単位でかかるくらいやれば差がでるのでは?
528デフォルトの名無しさん:2008/12/24(水) 23:47:28
>>526
double 使う方法ではどうだ?
529デフォルトの名無しさん:2008/12/24(水) 23:48:15
この程度の処理だったら関数呼び出しの方が十倍くらいコストあっても不思議じゃないと思うけどな
530526, 527:2008/12/24(水) 23:49:51
と思ったけど、アセンブラのコードを見てみたら、どっちもインライン展開されてて、
ほとんど同じコードになってたよ。
呼び出しを工夫して、最適化の邪魔をしないと比較できねーな。
531デフォルトの名無しさん:2008/12/24(水) 23:52:16
100万*100回比較でこんな感じだった
CPUはCeleron1.7G

Conditional: 0.906[s]
Double: 1.609[s]
LongLong: 2.328[s]
StaticCast: 0.765[s]
NoOp: 0.14[s]
532デフォルトの名無しさん:2008/12/24(水) 23:54:25
>>531
Conditionalな奴は、intが負/unsignedのMSBが立っているかどうかで
速度が変わりそうだけど、その辺の条件はどうなってる?
533デフォルトの名無しさん:2008/12/24(水) 23:57:48
ともあれ、少なくとも32bit環境だとint64_tにキャストするよりは
doubleにキャストするほうが速いみたいだな
俺のとこでもそうなった
534デフォルトの名無しさん:2008/12/25(木) 00:00:28
これでどうだ?

inline int eq(int lhs, unsigned rhs) {
return ((unsigned)lhs == rhs) & ((~(unsigned)lhs & ~rhs) >> (sizeof (int) * CHAR_BIT - 1));
}
535デフォルトの名無しさん:2008/12/25(木) 00:05:35
最適化をかけられないように、グローバル変数で、

int xxx = 1000; として、

eq(i, xxx);

みたいに呼び出したら、xxxを定数の1000に置き換えてたよ。

xxxが、どこからも変更されないって把握してんだな。
(ソースが複数あるプロジェクトなのに)
最近のコンパイラは頭いいな。

536デフォルトの名無しさん:2008/12/25(木) 00:10:03
xmat = xmat * xmat;
xmat = xmat * xmat;
xmat = xmat * xmat;
xmat = xmat * xmat;
xmat = xmat * xmat;
みたいな計算結果を使用してさらに計算する・・・みたいな処理
かいて最後は出力しないとコンパイラに消されたり
最適化されちまったりして安定しない
537デフォルトの名無しさん:2008/12/25(木) 00:10:59
x'mas = x'mas * x'mas;
538デフォルトの名無しさん:2008/12/25(木) 00:11:10
>>532
std::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
539デフォルトの名無しさん:2008/12/25(木) 00:21:25
結局速度面では大差ないから、可読性と移植性考慮でdoubleがいいのか?
でも、intとunsigned intの比較のためにわざわざdoubleにキャストしてる
ソースみたらすげー悩みそうだ……
540デフォルトの名無しさん: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
541デフォルトの名無しさん:2008/12/25(木) 00:24:26
>>518
分岐してない。
比較結果をストアする命令に最適化されるだけだから。
542デフォルトの名無しさん:2008/12/25(木) 00:26:05
>>539
long longとかint64みたいのでいいんじゃね?
543デフォルトの名無しさん:2008/12/25(木) 00:26:54
お前らこだわるなーw
544デフォルトの名無しさん:2008/12/25(木) 00:27:36
>>541
そうだったんか、サンクス
つーかアセンブラの出力見れよなって感じだな>俺
545デフォルトの名無しさん:2008/12/25(木) 00:28:52
最適化止めたいならvolatile付けろって誰か教えてやれよ
546デフォルトの名無しさん:2008/12/25(木) 00:31:44
最適化はされないと困るだろう・・・。
547デフォルトの名無しさん:2008/12/25(木) 00:33:12
>>546
ベンチで実行して欲しいコードまで省かれたらベンチにならんだろが
548デフォルトの名無しさん:2008/12/25(木) 00:33:54
doubleって遅せーーー
549デフォルトの名無しさん:2008/12/25(木) 00:36:28
>>547
省かれないようなコードを書くのが普通だろ・・・。
550デフォルトの名無しさん:2008/12/25(木) 00:38:25
>>547
volatile だと実際に実行されるコードと全くの別物になっちゃうだろ・・・。
551デフォルトの名無しさん:2008/12/25(木) 00:38:47
>>549
いやだから、省かれないようにするヒントがvolatileなんだろ?
俺は>>545じゃないけどさ

お前さん、一体何がいいたいの
552デフォルトの名無しさん:2008/12/25(木) 00:44:50
>>551
お前は volatile 言いたいだけなんじゃないかと。
目的の範囲内で最適化された結果で速度を比較したいのに、
最適化を阻害するって正気の沙汰じゃないぜ。
553デフォルトの名無しさん:2008/12/25(木) 00:54:47
>>538が解読できないんですが、この人のC++レベルはどの程度なんでしょうか?
554デフォルトの名無しさん:2008/12/25(木) 00:57:11
>>552
目的の範囲外のところで volatile を使えばいい。
555デフォルトの名無しさん:2008/12/25(木) 01:06:30
確実にループさせるためにループ変数にvolatile付けたりとかしない?
556デフォルトの名無しさん:2008/12/25(木) 01:17:00
>>553
単にお前がSTLとboost全く知らないだけだろw
557デフォルトの名無しさん:2008/12/25(木) 01:17:20
>>553
boost入門レベルってところじゃね?
558デフォルトの名無しさん:2008/12/25(木) 01:20:15
>>552

inline int func(){/*測定したい処理*/}

volatile int dum;
for(volatile int i = 0; i < 1000000; ++i){
 dum = func();
}

これってキチガイだったの?
559デフォルトの名無しさん:2008/12/25(木) 01:51:23
そりゃぁ、そう言われても仕方ない。
560デフォルトの名無しさん:2008/12/25(木) 02:00:56
今時のコンパイラはvolatileなんて無視するから何の意味もない
561デフォルトの名無しさん:2008/12/25(木) 02:03:50
んなこたーない。
562デフォルトの名無しさん:2008/12/25(木) 02:04:10
ねーよwwwww
563デフォルトの名無しさん:2008/12/25(木) 02:06:33
おまえら釣られすぎ
564デフォルトの名無しさん:2008/12/25(木) 12:04:40
void hoge(short s){
}
int main(){
short a,b;
hoge(a+b);
return 0;
}
これをコンパイルすると変換によって有効桁が失われると出るんですが、どうすれば解決できるんでしょうか?
コンパイラはBorland5.5.1です。
565デフォルトの名無しさん:2008/12/25(木) 12:07:11
>>564
short じゃなくて int を使う。
566デフォルトの名無しさん:2008/12/25(木) 12:07:20
同じ型の変数同士を+で組み合わせても有効桁は失われない。
567デフォルトの名無しさん:2008/12/25(木) 12:18:26
つまりBCCが糞
568デフォルトの名無しさん:2008/12/25(木) 12:22:54
>>564
それ、intに格上げされて足し算されてるんじゃねえの
汎整数拡張とかいう奴
それをshortに書き戻してるから警告出てるんだと思うぞ
569デフォルトの名無しさん:2008/12/25(木) 12:23:55
そうなのかー!!
570デフォルトの名無しさん:2008/12/25(木) 12:30:11
>>564
ローカル変数や引数に short なんて、 int との変換が頻発して無駄すぎる。
http://www.kouno.jp/home/c_faq/c1.html#1
571デフォルトの名無しさん:2008/12/25(木) 17:21:46
テンプレートについて質問です。

typedef vector< vector< shared_ptr<MyClass> > > DoubleList;

このDoubleListはあちこちで使っていたところ、プログラムサイズが馬鹿でかくなってしまいました。
ちょっと思いついたことがあり

class DoubleList
{
public:
vector< vector< shared_ptr<MyClass> > > m_list;

void push_back(MyClass &s);
//その他、vectorに存在する色々な関数を宣言。
};

として、関数群の実体をcppファイル側に書いてみました。
そうしたところ、プログラムサイズは劇的に小さくなりました。

「まさか前者のやりかただと、各.cpp毎でテンプレートを展開しDoubleListクラスを作ってしまうのか?」
と思っているのですが、この認識は正しいでしょうか?

それまでの自分の認識ですと、<>内が同じテンプレートがあちこちで使われていたとしても、コンパイラが1つだけ実体を作ってくれる。
という認識だったのですが…。

3重テンプレートが悪いのかと思い、
typedef vector< shared_ptr<MyClass> > SingleList;
typedef vector< SingleList > DoubleList;
としてみてもダメでした。
572デフォルトの名無しさん:2008/12/25(木) 17:25:01
>>571
だからexport予約語をサポートしない処理系を怨め
573デフォルトの名無しさん:2008/12/25(木) 17:31:54
答えになってない
574デフォルトの名無しさん:2008/12/25(木) 17:35:44
>>572
exportについて調べてきました。
テンプレートの各種関数の宣言などを、別の場所で書けるようにするためのキーワードだそうで。
非常に欲しいですね。

ということは、認識としては「テンプレートを使うと、翻訳単位(.cppファイル)毎にその実体を作ってしまう」という認識でよいのでしょうか?
shared_ptrとか使うのをちょっとためらってしまいますが・・・
575デフォルトの名無しさん:2008/12/25(木) 20:43:44
exportは単に宣言を別の場所に書けるだけ
実体化は普通のテンプレートと同じようにやっぱり翻訳単位の中でやる
諦めろ
576デフォルトの名無しさん:2008/12/25(木) 20:53:23
環境による、が答えじゃないの?
コンパイラの段階では各翻訳単位でインスタンス化するけどリンク時に一つにまとめる環境もありそう。

C++0x で入る extern template で今やってることと同じようなことをもうちょい簡潔に書けるようになるはず。
577デフォルトの名無しさん:2008/12/26(金) 00:41:35
>>571
デバッグ情報が増えてるだけじゃないかなぁ?

関数の実体については、たとえばアドレスを取って比較すれば
同じにならないといけないんで、さすがにそこを違反してるコンパイラは
無いと思うよ。
578デフォルトの名無しさん:2008/12/26(金) 02:08:30
アプリファイルがどんどんデカくなっていくんですが、
機能ごとにDLLにして使うときだけ呼び出すようにすればアプリ起動が早くなったりするんでしょうか?
リソースとかも埋め込まないでフォルダから参照するようにしたほうがいいんでしょうか
まだ始めたばっかなんですが、未来のことが気になってしょうがありません。
579デフォルトの名無しさん:2008/12/26(金) 06:58:02
>>576
残念だなあ。
君は何か勘違いしている様だけど、聞いて揚げ足取りをしたいんじゃなくて、
単純に君の意見が面白そうだから聞いてみたかっただけなんだよ。
もっとまともなレスを期待してたんだけど。ごめんね。
ちなみに君は揚げ足を取られる事を恐れているようだけど、それは違うと思う。
揚げ足を取られるのは、君に隙があるから。
隙だらけの人間ってのはそうやって余計な所でつまらない恥をかく事になるもんだよ。
他人につっこまれる事は、自身の知識をより客観的で多角的なものとする為に
有益な指針となるものだと思うな。
580デフォルトの名無しさん:2008/12/26(金) 07:08:58
a/0
はダメなんですよね?
0/aもダメですか?
581デフォルトの名無しさん:2008/12/26(金) 07:10:05
>>580
はい。
いいえ。
582デフォルトの名無しさん:2008/12/26(金) 08:31:41
>>579
いきなりどうしたんだお前w
583デフォルトの名無しさん:2008/12/26(金) 10:53:28
>571
個々にインライン展開されていた処理が 1 箇所だけになったという点も影響あるかもしれないね。
584デフォルトの名無しさん:2008/12/26(金) 11:44:23
>>577
なるほど!と思い、リリースコンパイルを行ってみました。
でもやはり、容量は天地の差といった感じで…。

コンシューマ実機系のコンパイラだから・・・とかかなぁ。
ちょっと他の件でも

class Test
{
public:
static Test &getInstance()
{
 static Test s;
 return s;
}
};

こうやってシングルトンを作ってみたんです。
で、このヘッダをプリコンパイルヘッダに登録したところ、すべての(プリコンパイルヘッダを使っている)cppファイルで、40KB以上の増加を確認。

自分の意識だと当然唯一の実体が作られると思っていたのですが…。
この実機ですと、プログラム翻訳単位での「プログラムのロード」もサポートされているのが原因かもしれません。
(その機能使っていないのですが)
そのために、テンプレートやstatic変数も翻訳単位毎に作るのかも…?

なんだか翻訳単位毎に、勝手に無名ネームスペース内に取り込まれてしまっているような印象ですね。
そのわりに、きちんとシングルトンとして動作するから気味が悪い

一応、環境依存での動作ということでクローズということで。
後でVC2008あたりでも実験してみます。
585デフォルトの名無しさん:2008/12/26(金) 12:08:41
>>582
ただのコピペ
586デフォルトの名無しさん:2008/12/26(金) 14:02:40
>>584
シングルトンとかは実行時のことで、コンパイル時のこととは別の話だというのは大丈夫?
(大丈夫ならいいんだけど)

各.cppにそのclass Testの定義が書いてある(実際はincludeだけど、includeは書いてあるのと同じ)
んだから、各.objにTestのオブジェクトコードがあるのは当然でしょう。
コンパイルは翻訳単位毎に独立ですよ。だから翻訳「単位」という。
587デフォルトの名無しさん:2008/12/26(金) 14:44:35
シングルトンとして動作する=実体は一つのはずなのに、実行ファイル容量が増えているから不思議がっているんだろう
588デフォルトの名無しさん:2008/12/26(金) 15:35:25
「すべてのcppファイルで増えた!」
つってんだから、
…あれ?どゆこと?

コンパイルしたオブジェクトファイルのサイズが
増えたと言いたいんだろうな。
でも、コードが増えたこととインスタンスがひとつしかないのは
別の話だから。
589デフォルトの名無しさん:2008/12/26(金) 20:39:13
iostream系の<<演算子についての疑問なんですが、

stringstream ss1, ss2;
int src[] = {1,2,3};
ss1 << src[0] << src[1] << src[2];
int cnt = 0;
ss2 << src[cnt++] << src[cnt++] << src[cnt++];

結果
ss1 : 123
ss2 : 321

上のように配列のインデックスが定数の場合と演算がある場合で、
処理順序が逆になるのですが、なぜなのでしょうか?
590デフォルトの名無しさん:2008/12/26(金) 20:43:30
関数の引数に副作用のある式を入れたときの評価順序は決まってない。
  int cnt = 0;
  f(cnt++, cnt++); // f(0, 1) が渡るか f(1, 0) が渡るかわからない

演算子オーバーロードは単なる関数呼び出しなので、
同じことが起こっているだけ。
591デフォルトの名無しさん:2008/12/26(金) 20:53:50
>>589
結果にあるとおり最後のsrc[cnt++]が最初に評価されたってことだろ
順番は保証されてないからそのようなコードを書いてはいけないってことだ
ss2 << src[cnt++];
を3回書くかループで回せ
592デフォルトの名無しさん:2008/12/26(金) 21:59:07
>>589
シーケンスポイント間で cnt に複数回変更を加えているので、未定義動作。
593デフォルトの名無しさん:2008/12/26(金) 22:11:44
副作用完了点について勉強すべきだな
594デフォルトの名無しさん:2008/12/26(金) 22:16:20
なるほど、ありがとうございました。
595デフォルトの名無しさん:2008/12/26(金) 22:20:36
>>590 も未定義動作ね。
596デフォルトの名無しさん:2008/12/26(金) 22:33:56
>>592 >>595
おいおい、偉そうに嘘を言うんじゃない。
未定義 (undefined) じゃなくて不定 (unspecified; 未規定ともいう) だぞ。
ちゃんと引数は評価されるが、評価の順番は処理系が適当に決めてよい。
597596:2008/12/26(金) 22:37:18
ああ、読み間違ってた。589,590は確かに未定義動作だな
598デフォルトの名無しさん:2008/12/26(金) 22:39:33
いいえ、未定義です
同じ変数を不定順に操作したら未定義
f(cnt1++, cnt2++);なら確かに評価順が不定なだけだけど

590はf(0,0)やf(1,1)やf(825699101,-600359841)やabort()やsystem("rm -rf /")が呼ばれるかもしれないし
何も呼ばれないかもしれないし、関数呼び出しではない恐ろしいものが呼ばれるかもしれない
599デフォルトの名無しさん:2008/12/26(金) 22:40:02
リロードしろよ俺
600デフォルトの名無しさん:2008/12/26(金) 23:13:44
f1(f2(cnt++), cnt++);
x = cnt++ - (cnt++);

上の2例のように、ネストした関数や、括弧で演算順序を
指定した場合でも、未定義or不定なんでしょうか?
601デフォルトの名無しさん:2008/12/26(金) 23:19:14
>>600
同じく未定義。
「シーケンスポイント」(副作用完了点)で区切られてないとダメ。
602デフォルトの名無しさん:2008/12/26(金) 23:20:37
603デフォルトの名無しさん:2008/12/26(金) 23:32:39
602を読むと関数の呼び出しの直前も副作用完了点になってるのですが、
>>600の1例目、f2の呼び出しはそれには当てはまらないのでしょうか?

また、

void inc(T &v) {
++v;
}

x = inc(cnt) - inc(cnt);

のように関数に置き換えた場合は、式の左から処理されると考えて良いですか?
604デフォルトの名無しさん:2008/12/26(金) 23:35:58
>>603
関数の呼び出しには副作用完了点があるが、最初の式内の引数の評価タイミングは
関数呼び出しの前ならいつでもいいので関係ない。

減算演算子の二項の評価順もコンパイラの勝手。
605デフォルトの名無しさん:2008/12/26(金) 23:37:31
void で引き算はできねぇな。
606デフォルトの名無しさん:2008/12/26(金) 23:38:15
>>603
それにしてもなぜそんなことに興味あるの?そんなコーディングしたいの?
それとも単に純粋な学術的な興味?
607デフォルトの名無しさん:2008/12/26(金) 23:45:54
int inc(int& v) { return ++v; }
x = inc(cnt) - inc(cnt);

だな。
608デフォルトの名無しさん:2008/12/26(金) 23:58:59
>>606
今まさにそんなコーディング(>>589)してしまって軽く嵌ってたので、
良い機会だからもうちょっと突っ込んで知りたいなと思いまして。
知らずにまた似たようなことをやらかさないように。

>>607
そうそう、戻り値必須でしたね。
609デフォルトの名無しさん:2008/12/26(金) 23:59:54
>>603
限らない
左のinc(cnt)と右のinc(cnt)が呼び出される順序は不定だから
xが1になるか-1になるかも不定

未定義ではないけど
610デフォルトの名無しさん:2008/12/27(土) 00:04:38
>>604,609
なるほど、ありがとうございました。
611デフォルトの名無しさん:2008/12/27(土) 16:14:50
if()
 if()
  ;

これって

if(){
 if()
  ;
}

と同じですか?
612デフォルトの名無しさん:2008/12/27(土) 16:26:59
試せ
613デフォルトの名無しさん:2008/12/27(土) 17:28:16
>>611
違います。
前者はif文が二つとも成り立った時には単文しか書けませんが
後者は複文が書けます。
614デフォルトの名無しさん:2008/12/27(土) 17:29:20
じゃなかった、後者は直後の単文を一つ実行した後
一つめのif文が成り立った時の複文を実行します。

前者は一度元に戻ります。
615デフォルトの名無しさん:2008/12/27(土) 18:25:15
>>613>>614
日本語が苦手なら、わざわざ回答しなくても大丈夫ですよ。

>>611
if (...)
if (...)
a;
b;
c;

if (...) {
if (...)
a;
b;
}
c;
では、前者はbもcも常に実行されるが後者は常に実行されるのはcだけ。
逆に言えば、(一番目のifが成立し)二番目のifが成立しない場合には、
bを実行するかしないかで前者と後者の差が出る。
まぁ、自分で書く場合は迷うくらいなら{}で括っておけということ。
616デフォルトの名無しさん:2008/12/27(土) 19:15:53
ふくふく
617デフォルトの名無しさん:2008/12/28(日) 05:38:24
VC+ 6.0を使っているC/C++初心者です。
「こんにちは」など簡単な音声をPCアプリケーションから出力したい
のですがやり方が全くわかりません。
どなたかどのようにプログラムを組めば良いのか具体的に教えて
いただけますか?
よろしくお願いします
618デフォルトの名無しさん:2008/12/28(日) 06:01:20
まず VC++ をアップグレードします。
619デフォルトの名無しさん:2008/12/28(日) 06:16:53
mci使うといい
620デフォルトの名無しさん:2008/12/28(日) 06:39:58
>>617
SAPI
621デフォルトの名無しさん:2008/12/28(日) 11:20:34
SofTalkすればいい
622デフォルトの名無しさん:2008/12/28(日) 11:28:43
>>617
// http://www.a-quest.com/aquestalk/
#include"AquesTalkDa.h"

int main(void){
AquesTalkDa_PlaySync("こんにちは");
return 0;
}
623デフォルトの名無しさん:2008/12/28(日) 11:29:33
>>622
"こんにちわ" に訂正
624デフォルトの名無しさん:2008/12/28(日) 11:41:26
m_modelクラス
----
inline void InitPos(D3DXVECTOR3 &pos) { m_initpos = pos; };
inline D3DXVECTOR3 *InitPos() { return &m_initpos; };
---

他のクラスで
D3DXVECTOR3 position;

position += m_model->InitPos();
二項演算子 '+=' : 型 'D3DXVECTOR3 *' の右オペランドを扱う演算子が見つかりません (または変換できません)。
と出てコンパイルできませんでした。
ちなみにm_modelクラスに
inline D3DXVECTOR3 InitPos2() { return m_initpos; };
を加えてそれを使ったら一応できました。

他にやり方があったら教えていただけませんか。
625デフォルトの名無しさん:2008/12/28(日) 11:48:32
position += *(m_model->InitPos());
626デフォルトの名無しさん:2008/12/28(日) 11:53:19
>>625

ありがとうございます!できました!

なんで*をつけるとできるか調べてきます。
627デフォルトの名無しさん:2008/12/28(日) 11:58:00
>>626
ポインタを返してもらったら、自前でデリファレンスしないといけないというだけの話。
調べ直さないといけないくらいなら、ちゃんとポインタについて勉強してこい。
628デフォルトの名無しさん:2008/12/28(日) 11:58:15
単体だとアドレスを示しているだけだから*をつけて値にしただけだろw
調べるまでもないしwwwwwww
629デフォルトの名無しさん:2008/12/28(日) 11:59:01
>>623
なんで訂正した?
630デフォルトの名無しさん:2008/12/28(日) 12:00:30
>>629
わ と発音したいから
631デフォルトの名無しさん:2008/12/28(日) 12:05:10
>>628
・・・・(笑
632デフォルトの名無しさん:2008/12/28(日) 12:11:30
>>630
そのままだと
こんにち「ハ」って言ってくれるのかw
633デフォルトの名無しさん:2008/12/28(日) 12:17:35
「これは、うんこです」
は言ってくれてる気がするけどな
634デフォルトの名無しさん:2008/12/28(日) 12:21:54
>>633
SofTalk は発音記号に変換してから DLL に渡してるんじゃないかな?
AqueTalk の素のままだと余計なことはしない
ただ、受け取った発音記号を喋るだけ
635デフォルトの名無しさん:2008/12/28(日) 12:26:00
卑猥な言葉言わせ隊
でも声がhttp://www.nicovideo.jp/watch/sm4895582
636デフォルトの名無しさん:2008/12/28(日) 12:31:59
::ImmGetConversionListとのコラボが結構いいな
637デフォルトの名無しさん:2008/12/28(日) 13:01:32
C++でのポート出力について質問です。

現在、研究室のWindows95で使っていたシリアル出力プログラムを改修中です。
これをWindowsXP上でパラレルから出力するプログラムに修正したいです。

元のソースを見ると、以下のような動きをしています。

CreateFileでCOM1またはLPT1(INIで設定)のハンドルを取得

GetCommStateでポートの状態を取得
(COMかLPTかの判定はせず、必ずGetCommStateにいく)

SetCommStateでポートの状態を設定

WriteFileでポートに出力

ただ、XP上でLPTに出力しようと動かすとGetCommStateのところで必ず落ちています。
GetLastErrorでエラーを取ってみましたが、「ハンドルが無効です」という内容でした。
(ただし、CreateFileでのLPT1のハンドル取得は成功しているみたいです)

調べた結果、そもそもLPTではGettCommStateとSetCommStateは不要なのではないかと思い
CreateFile後にLPTであればこの処理を飛ばすようにすればいいのではないかと思うのですが
LPTの場合はGetComm/SetCommの代わりに別の関数を実行する必要とかはあるのでしょうか?

実機は稼動中かつ遠隔地にあるため、デバッグしながら作業をすることが出来ず
事前にある程度、改修の方針を確実にしておきたいのですが
Win2000/XPでのLPT出力に関するまとまった情報が少なく、決断できないでいます。

Windows2000/XPからLPT1で出力する手順はCreateFileとWriteFileだけでいいのか、
もしこれ以外にも手続きが必要な場合は何が必要か、教えて頂けますよう、お願いします。
638デフォルトの名無しさん:2008/12/28(日) 14:31:14
>>617
適当でいいなら PlaySound で
639デフォルトの名無しさん:2008/12/28(日) 14:56:02
617です。
書き込んで下さって、ありがとうございました。

環境をアップグレードしてから試してみます。
640デフォルトの名無しさん:2008/12/28(日) 15:08:47
>>637
そもそも何のためにSetCommState()しているのか判っているの?
その概念はどんなハードウェアプロトコルに依存するか判っているの?
# 判っているならこんなすっとこどっこいな質問はしないか。
641デフォルトの名無しさん:2008/12/28(日) 15:14:19
>>640
いや、よく分かってないです…
調べたところ、COMでのボーレート等を設定する為の関数らしい、という程度の確認をしたところで
これはCOM限定なんじゃないか?と考えてLPTの手続きの検索に入ってしまったので…

あまりに知識が不足していると思うので、XPでLPTを扱うための情報を探しているのですが
オススメのサイト、もしくは書籍などでもあればご紹介いただけると嬉しいです。

COMについてのサイトは結構あるのですが、探し方が悪いのかLPTは意外と少なくて…
642デフォルトの名無しさん: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 が未解決です。
643デフォルトの名無しさん:2008/12/28(日) 15:55:52
あ、書き間違えてました。
line_search.hはsearch_linear.hで、
line_search.cppはsearch_linear.cppです。
644デフォルトの名無しさん:2008/12/28(日) 15:57:06
>>642
テンプレートの定義を.cppではなく.hに書く。
645デフォルトの名無しさん:2008/12/28(日) 15:58:03
templete< >の実装は、ヘッダに書くか、exportでググってみる。
646デフォルトの名無しさん:2008/12/28(日) 16:06:44
>>644-645
.cppの中身をそのままそっくり.hに持ってくればいいって事ですよね、確かにできました。ありがとうございます。
exportでググってみましたけど、今一つリンクってのが何をやってることなのか分かってないので理解できなさそうです。
もうちょっと知識を身につけたらまた調べてみることにします。
647デフォルトの名無しさん:2008/12/28(日) 16:48:02
コンストラクタ初期化子で配列を0クリアする方法はありますか?
648デフォルトの名無しさん:2008/12/28(日) 16:53:06
>>647
ありません。
コンストラクタ本体でおこなうか、std::vectorなどを使ってください。
649デフォルトの名無しさん:2008/12/28(日) 17:12:54
>>641
ボーレートの設定などは、シリアル転送にのみ使われる。
パラレルポートの場合も本来なら時間設定が色々あってもいいところだが、
一般的にはBUSYチェック程度しかしていないと思う。
いずれにしても相手機器との相性の問題があるから単純に置き換えるわけにはいかないかもしれないが、
パラレルの場合は相手機器に対して規定の文字列を出力するだけで済む場合が多いと思う。
# 逆に、微調整しようがないので現地でダメだったらお手上げになるけどw

よく判っていないのなら相手機器側の資料をよく読んで、必要なら代理店に問い合わせるとかするこったね。
# 弊社にご依頼いただければ稼動実費+αでお請けしますがw
650641:2008/12/28(日) 23:00:28
>>649
ありがとうございます。

パラレルで出力する際にはパラメータ設定系の処理は必要無いということらしいですね。
出力対象がLPTであればCommState関連の処理を飛ばすように直してみる事にします。

BUSYチェックも、LPTに繋いでるのはラインプリンタだけで
出力も作業者が行うのでそう問題は無いかなと…

ラインプリンタの資料があるかちょっと分かりませんが、探して確認してみることにします。
今までCOMやLPTなんてレガシーだもう使わないなんて思ってましたけど、
実際に関わるとLPTのBIOS設定の意味すら知らない自分の知識の乏しさを痛感させられてます…


//…うちの研究室、カネが無いんですよ…
//だから少しだけC++知ってる自分に改修が頼まれた…
651デフォルトの名無しさん:2008/12/28(日) 23:11:16
スレ違いは承知なのですが、KAT-TUNをカッツンと読んでしまいます
どうすればいいでしょうか
652デフォルトの名無しさん:2008/12/28(日) 23:12:16
なんだ、繋がっているのは単にプリンタか。
653デフォルトの名無しさん:2008/12/29(月) 06:46:01
マイクロソフトが、.NETでハンガリアン記法を禁止したのはどうしてなんですか?
654デフォルトの名無しさん:2008/12/29(月) 06:50:27
wikipediaでもみたらおk
655デフォルトの名無しさん:2008/12/29(月) 10:53:32
そもそもマイクロソフトの使っていたハンガリアン記法は、
本物のハンガリアン記法ではない。
ハンガリアン記法の論文の文意が誤解され、
間違った形で解釈されたもの。
あんなもの役に立つわけが無い。
656デフォルトの名無しさん:2008/12/29(月) 20:57:36
TCHAR m_str[MAX_PATH];

sprintf(m_str, "%d FPS", m_fps);

でコンパイルするとTCHAR[260]からCHAR*に変換できませんと出るのですが
解決方法教えていただけませんか
657デフォルトの名無しさん:2008/12/29(月) 21:00:09
wsprintf
658デフォルトの名無しさん:2008/12/29(月) 21:01:08
_stprintfでもいける。
659デフォルトの名無しさん:2008/12/29(月) 21:02:10
>>655
ハンガリアンの論文?
660デフォルトの名無しさん:2008/12/29(月) 21:02:30
ありがとうございます できました
661デフォルトの名無しさん:2008/12/29(月) 21:05:47
http://homepage3.nifty.com/mmgames/c_guide/21-02.html#Sの

min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));

は1.0がなぜ必要なのでしょうか?
なくてもよい気がするのですが何か理由はあるのでしょうか?
662デフォルトの名無しさん:2008/12/29(月) 21:25:49
それは気のせい。よく考えて見れ。
663デフォルトの名無しさん:2008/12/29(月) 21:32:10
両方に1.0つけちゃだめじゃね?
664デフォルトの名無しさん:2008/12/29(月) 21:36:30
>>661
例えば、RAND_MAX が 0x7fff だとすると 0〜0x7fff までの乱数が出るから
値域の幅は RAND_MAX + 1 になる

最大 - 最小の方も同様
665デフォルトの名無しさん:2008/12/29(月) 21:42:59
>>661
順番を変えて考えるべし。

rand() / (double)RAND_MAX とした場合、
rand() が 0 〜 RAND_MAX の値を返すのだから、
rand() / (double)RAND_MAX は 0 〜 1 の値になる。
このまま (max-min+1.0) をかけると 0 〜 max-min+1 の値になり、
min を足すと 0 〜 max+1 の値になる。
rand() が RAND_MAX を返した時だけ、max+1 が現れてしまうことになるわけだ。

これに対し、rand() / (1.0+RAND_MAX) とした場合は
0 〜 RAND_MAX/(1+RAND_MAX) の値になる。
RAND_MAX/(1+RAND_MAX) は 1 より少し小さくて、
上記のような問題は発生しない。
666デフォルトの名無しさん:2008/12/29(月) 21:45:39
667661:2008/12/29(月) 21:51:54
仮に
min=0
max=1;
RAND_MAX=1
1.0を外して

rand()の戻り値が0だったら

min + (int)(rand()*(max-min)/(RAND_MAX))

= 0 + 0*(1-0)/1
= 0

rand()の戻り値が1だったら

= 0 + 1*(1-0)/1
= 1

となっておかしいところはないと思うのですが例えばどのような場合に辻褄が合わなくなるか具体例を教えていただけないでしょうか。

>>664
すいません。
値域の幅がなぜRAND_MAX + 1になるのかがわかりません。

>>665
>このまま (max-min+1.0) をかけると 0 〜 max-min+1 の値になり、

(max-min+1.0)も必要がないのではないかということです。
説明不足申し訳ありませんでした。
668デフォルトの名無しさん:2008/12/29(月) 21:57:32
>>667
0〜5の値をランダムで返す関数があるとしてとりうる値の数は何個でしょう
669デフォルトの名無しさん:2008/12/29(月) 22:01:22
>>667
ちょっとは考えようぜ。

rand() / (double)RAND_MAX とした場合、
rand() が 0 〜 RAND_MAX の値を返すのだから、
rand() / (double)RAND_MAX は 0 〜 1 の値になる。
このまま (max-min) をかけると 0 〜 max-min の値になり、
min を足すと min 〜 max の値になる。
しかし、max になるのは rand() / (double)RAND_MAX が
「正確に RAND_MAX になった時だけ」で、max が極端に出にくくなってしまうことになる。
670661:2008/12/29(月) 22:10:34
>>668
0を含めるのを忘れていましたorz

>>669
要するにmaxが出にくくなるのをふせぐための1.0ということでしょうか。
671デフォルトの名無しさん:2008/12/29(月) 22:21:12
>>670
だからな、仮にサンプルの通り1-6の変数が出て欲しいものとすると、出てくる値の数は6個だろ?
で、お前の言うとおり1を抜くと、6-1で5個になってしまう。おかしいだろ?
672661:2008/12/29(月) 22:52:39
         _
        .,r'"_`''i、
       l i´ .゙i |
       !-'   丿丿
         /,/
         l |
         二
           | |
         ゙‐'
               )フ
  ウ--,,          ノ フ
  フ   ̄ ̄ヽ...--.../  フ
    フ    ......ヽOノ.............フ___
   フ  /::::::::::::::::::::::::::::::::::ヽ/   っ
  <>/==─::::::::人::::─==ヽ つ っ
   >ノ:::::::::::::::::::::ノ  ヽ:::::::::::::::::ヽ
   クノ_ノノ_ノ/_ノ,   \ヽ:::_ヽ_ヽ
   __ノ::::::::::r ( ヒ_]    ヒ_ン人::::::)
 ∠:::::::::::::::::|//   ,___,  //|::::::/
  ノノ >:::::::人.         ,'::::ヽ
  /:::::::::::::::::>,、 ______, .イ::::::::::(
673デフォルトの名無しさん:2008/12/29(月) 23:05:33
>>670
まあそうなる。
防ぐためというか、まあ、全部の値が均一に出るようにするため、だな。
674デフォルトの名無しさん:2008/12/29(月) 23:18:29
>>673
いや均一にするためというより1抜いたら最大値が絶対に出なくなるだろ
675デフォルトの名無しさん:2008/12/29(月) 23:19:51
>>674
RAND_MAX の時に出るだろ?
676デフォルトの名無しさん:2008/12/29(月) 23:26:52
>>675
つまり+1.0したらmax+1が出ることもあるってことか?

というかここまでしなくてもサイコロ程度なら普通にrand()%6+1で良いと思うんだ。
677デフォルトの名無しさん:2008/12/29(月) 23:28:01
しょぼい乱数生成だと下位ビットの精度がやばかったりするんだよ
その対策
678デフォルトの名無しさん:2008/12/30(火) 00:00:38
循環が気になるなら下のトコにxor-shift乱数のコード書いてるからパクってこい。
もしくはboost::random使おう。

疑似乱数2
ttp://pc11.2ch.net/test/read.cgi/tech/1192628099/
679661:2008/12/30(火) 02:49:33
回答者同士で意見がバラバラって・・・。

「知らないならレスしないで下さい」というあれが
ちっとも煽りではない場面ですね、ここはw
680デフォルトの名無しさん:2008/12/30(火) 03:27:45
>>679
それをお前が言うかぁ・・・
681661:2008/12/30(火) 08:08:31
>>679は私ではありません。

なんとなくは納得できました。
皆様ご回答ありがとうございました。
682デフォルトの名無しさん:2008/12/30(火) 09:32:37
>>677
randですむような用途なら%で十分って気もするけどね。今どきの処理系なら下位ビットの周期が極端に短いなんてないし
683デフォルトの名無しさん:2008/12/30(火) 09:41:47
下位ビットを捨てる対策はあるけど、単にマシになるだけで、
2の累乗で割った場合は周期が短くなる事に変わりはない。
684デフォルトの名無しさん:2008/12/30(火) 09:52:32
短いと言っても数万くらいはあるし、randで間に合う用途なら、まあ、だいたい%でokだと思う。
685デフォルトの名無しさん:2008/12/30(火) 09:54:08
tr1/random で頑張ろう。
686デフォルトの名無しさん:2008/12/30(火) 10:57:40
少なくともrand()が線形合同法である以上、必ず偶数と奇数が交互に出てくる
それが気にならないなら%でいいんじゃね
687デフォルトの名無しさん:2008/12/30(火) 11:12:11
>>686
だから下位ビットの周期がそんなに短い処理系なんて今どき無いって言ってるじゃん。
688デフォルトの名無しさん:2008/12/30(火) 11:30:12
短いって基準は目的によって変わるからな。
rand() / (1.0+RAND_MAX) * で十分だけど、
rand() % だと困るという状況はなくはないかもしれない。
689デフォルトの名無しさん:2008/12/30(火) 11:35:17
randは自分で一つクラス(or関数)を作って使い回すと便利
線形合同法なら数行だしその時点で下位ビットを捨てておけば悲惨なことにはならないし
690デフォルトの名無しさん:2008/12/30(火) 11:35:54
boost::random使うし
691デフォルトの名無しさん:2008/12/30(火) 11:40:03
>>690
だな。俺も random で済む用途は random 使うし、ちょと心配な場合は boost。
変に小細工して悩むよりずっと簡単で確実。
692デフォルトの名無しさん:2008/12/30(火) 12:04:37
質問。

struct S_P1{
int x,y;
};

void Function(){
std::list<S_P1> P1;
}

という感じで構造体をリストにしたいと思ってます。
P1. と入力した時点で出てくるメンバ一覧にもxやyは含まれず、listのメンバしか出てきてないように思えます。
P1.x.push_back(10); とか P1.push_back(10); とかではうまくいきません。
構造体のメンバを指定して値を入れるにはどうしたらいいんでしょうか。
693デフォルトの名無しさん:2008/12/30(火) 12:11:07
S_P1 tmp;
tmp.x = 10;
tmp.y = 10;
P1.push_back( tmp );
694デフォルトの名無しさん:2008/12/30(火) 12:13:52
P1はリスト全体でしょ
その要素が S_P1 構造体のデータで、S_P1 構造体が x とか y を持つ。
695デフォルトの名無しさん:2008/12/30(火) 12:23:41
>>693->>694

とてもよく分かりました。
いろいろ謎が解けました。ありがとうございます。
696デフォルトの名無しさん:2008/12/30(火) 17:47:55
CTestというクラスがあったとしてそれを継承したCTestAとCTestB。
CTestA a;
CTestB b;って宣言したとして
aとbでひとつの変数を共有するってできますか?
697デフォルトの名無しさん:2008/12/30(火) 17:52:20
その宣言でやろうと思うとかなりアレな感じになるかとw
698デフォルトの名無しさん:2008/12/30(火) 17:56:24
>>696
static変数なら、クラス全部で共有できるけど、そういうのじゃなくて?
699デフォルトの名無しさん:2008/12/30(火) 17:58:40
>>696
出来ると思う。 CTest が static なメンバ変数を持っておいて、
CTestA と CTestBでそれへの参照を持てば実質的に共有することになる.
700デフォルトの名無しさん:2008/12/30(火) 17:59:24
a と b だけで共有じゃないのかな・・・どっちなんだろ
701デフォルトの名無しさん:2008/12/30(火) 18:14:52
>>696
共有させたいオブジェクトをaとbから参照させればいいのだ。
boost::shared_ptrを使おう。
702デフォルトの名無しさん:2008/12/30(火) 20:33:21
int a[b*c];
配列数がコンパイル時不明なのですが、こうすると定数式が必要だというエラーが出てしまいます。
メモリの大きいサイズを確保して、あとからint区切りで添え字でアクセスできるようにするにはどう書けばいいんでしょうか?
703デフォルトの名無しさん:2008/12/30(火) 20:35:21
>>702
mallocつかえmalloc
704デフォルトの名無しさん:2008/12/30(火) 21:09:38
int* a = new int[b*c];
705デフォルトの名無しさん:2008/12/30(火) 21:13:44
std::vector<int> a(b*c);
706デフォルトの名無しさん:2008/12/30(火) 21:15:37
C99
707デフォルトの名無しさん:2008/12/30(火) 21:25:26
>>702
BCCだか使うとできる
708デフォルトの名無しさん:2008/12/30(火) 21:27:04
709デフォルトの名無しさん:2008/12/30(火) 21:49:26
>>708
-std=c99で堂々と今やgcc拡張ではないと胸を張って言えますよ。
710デフォルトの名無しさん:2008/12/30(火) 22:34:27
iccならオプション指定さえ必要ない。
711デフォルトの名無しさん:2008/12/30(火) 22:36:07
gccもいらないよw むしろ抑制するのに必要になる
712デフォルトの名無しさん:2008/12/30(火) 22:57:33
iccのlambdaってどう?
713デフォルトの名無しさん:2008/12/30(火) 23:06:56
>>711
>710は、gccの場合c99準拠にするためにオプションが要るけど、iccではそれが要らないと言うこと。
714デフォルトの名無しさん:2008/12/30(火) 23:09:51
>>713
gccは独自拡張でも可変長配列をサポートしていてc99とかなにもつけないとそれが有効になるということ
715デフォルトの名無しさん:2008/12/31(水) 14:57:55
JavaからC++に来たものですが基本的なところでつまづいています。
class Person
{
Name* name;
}
class Name
{
char* family_name;
char* first_name;
}
Person** personList;
Person* person = new Person("山田");
//realloc
personList[0] = person;
person = new Person("鈴木");
//realloc
personList[1] = person;
ここでperson = personList[0];
とやるとpersonの中身が壊れてしまいます。(Nameクラスのところ)
これを壊れずにやる方法ってないんでしょうか?
716デフォルトの名無しさん:2008/12/31(水) 15:02:16
>>715
めっちゃ基本的だな。 あまりにありがちすぎてフいた。
personListは単なるポインタ。
単に宣言しただけではそれが指す先は不定。
メモリを確保してその場所を入れろ。
717デフォルトの名無しさん:2008/12/31(水) 15:03:36
>>716
なんか語読してるぞ。
718デフォルトの名無しさん:2008/12/31(水) 15:04:34
>>715
壊れるってどゆこと?
719デフォルトの名無しさん:2008/12/31(水) 15:08:16
>>717
いや、>>716の言う通りかもしれん。
とりあえず >>715 はコンパイル可能な形のソースコードを貼るべき。
下手に省略すんな。
720デフォルトの名無しさん:2008/12/31(水) 15:16:42
>>715
class 定義の最後にはセミコロンが要るぞ。
それは単なる書き間違いなのか?
と、いうわけで>>719に同意。
721デフォルトの名無しさん:2008/12/31(水) 15:54:03
privateとpublicとprotectedの違いがよくわからないんですが、publicは公開って事でおkなんですが
プライベートとプロテクテッドは何が違うんですか?
722デフォルトの名無しさん:2008/12/31(水) 15:56:01
継承するとき
723デフォルトの名無しさん:2008/12/31(水) 15:56:21
派生クラスから見えるか見えないか
724デフォルトの名無しさん:2008/12/31(水) 15:56:53
>>721
protected は継承したクラスからは見える。
private は friend 指定したクラス (あるいは関数) 以外からはまったく見えない。
725デフォルトの名無しさん:2008/12/31(水) 16:36:25
>>724
ようするに、
Privateは「そのクラス内のみ」で「継承したクラス」で実装した関数では操作できないが、継承していれば
クラス内変数自体は存在しているってことですかね?
Protectedは継承したクラスからも見れるって事でおkですか?
726715:2008/12/31(水) 16:38:38
class Person
{
Name* name;
};
class Name
{
char* family_name;
char* first_name;
};
Person** personList;
Person* person = new Person("山田");
personList = realloc(personList,sizeof(Person)*(index+1));
personList[0] = person;
index++;
person = new Person("鈴木");
personList = realloc(personList,sizeof(Person)*(index+1));
personList[1] = person;
index++;
person = personList[0];
ここでpersonの中身をデバッガで見ると、もともとの値が化けています。
727デフォルトの名無しさん:2008/12/31(水) 16:42:20
>>726
初っ端から realloc 使うなら NULL で初期化するべし
person の値は書き換えられて当然
index はどこからきた?
728デフォルトの名無しさん:2008/12/31(水) 16:53:33
>>726
ついでに sizeof の中身が違う
729デフォルトの名無しさん:2008/12/31(水) 16:54:07
friend使いまくりなんだが・・・
お前らはどうだい?
730デフォルトの名無しさん:2008/12/31(水) 16:55:29
>>726
class Name のメンバが指す領域が確保されていない
std::string でも使えば?
731デフォルトの名無しさん:2008/12/31(水) 17:03:56
>>726
コンパイルできなくない?
すごいデバッガ使ってる?
732デフォルトの名無しさん:2008/12/31(水) 17:17:18
>>729
俺も使うよ。
どうせそんなに汎用的なクラスは作らんし。
それなら依存関係が明確な方がいい。
733デフォルトの名無しさん:2008/12/31(水) 17:31:31
>>729
使う機会がないな
734デフォルトの名無しさん:2008/12/31(水) 17:55:46
>>732
俺はむしろライブラリ作ってると、ライブラリ内だけで行き交わせたいデータがあるとfriend指定使ってしまう。
なんかいい方法あるのかな・・・。まぁライブラリはDLLとかにしちゃえば、あとは使わせる部分だけヘッダで公開すればいいだけなんだろうけど
735デフォルトの名無しさん:2008/12/31(水) 18:43:42
>>729
特定のクラスだけ変更できるデータとかに使うな
736デフォルトの名無しさん:2008/12/31(水) 19:01:36
>>729
immutable である事をインタフェース的に保証したいクラスと
そのファクトリに使う事があるかも。

class immutable { // 普通の奴らにはgetしかして欲しくない
  friend shared_ptr<immutable> create_immutable();
  int data_;
public:
  int get_data() const { return data_; }
};

shared_ptr<immutable> create_immutable() {
  shared_ptr<immutable> r(new immutable);
  r->data = 10;
  return r;
}
737デフォルトの名無しさん:2008/12/31(水) 19:12:09
今からC言語始めたいんですが、
ttp://www.codegear.com/jp/downloads/free/cppbuilder
これのどれをDLすればいいのでしょうか?
初歩的な質問ですみません。
738デフォルトの名無しさん:2008/12/31(水) 19:19:05
聞く前に試してみよう。
739デフォルトの名無しさん:2008/12/31(水) 19:19:44
>>737
C++ 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/
740デフォルトの名無しさん:2009/01/01(木) 01:34:07
#include <limits.h>
#include <stdio.h>
int main()
{
int x[] = {0, 53, 22, -10};
int min = INT_MAX;
for (int i = 0; i < sizeof(x) / sizeof(x[0]); ++i) {
if (x[i] < min ) min = x[i];
}
printf("min = %d\n", min);
return 0;
}

的な最小値探索をdoubleやるために、
最大値がほしいので
double min = 1 / 0.0;
でinfにしているのですがこれは、なにかまずかったりするのでしょうか
なんとなく不安なので、質問しに来るました
741デフォルトの名無しさん:2009/01/01(木) 02:08:06
DBL_MAX
742デフォルトの名無しさん:2009/01/01(木) 02:11:56
それだと、探索対象にinfがあったときにおかしくなりません?
infがあるのに最小はDBL_MAXになっちゃう気がするんですが
743デフォルトの名無しさん:2009/01/01(木) 02:12:58
class X {
const int p[4];
〜略〜
};

ひょっとしてこういう感じのことはできないのでしょうか、初期化子では配列に入れられないですし
744デフォルトの名無しさん:2009/01/01(木) 02:15:21
最大値が欲しいのにminにいれるとはなにごとか!
745デフォルトの名無しさん:2009/01/01(木) 02:19:41
>>744
すいません
何をいっているのでしょうか?
配列から最小値を探すために、
結果を入れる変数に初期値としてその型の最大値を入れておきたいのですけど
746デフォルトの名無しさん:2009/01/01(木) 02:43:44
>>740
x[0]を初期値にすれば?
747デフォルトの名無しさん:2009/01/01(木) 03:10:11
>>740
比較の前にinfチェックして使っとけば?
748 【大吉】 【1201円】 :2009/01/01(木) 08:05:03
そーすがすらすらかけますよーに
749デフォルトの名無しさん:2009/01/01(木) 08:13:44
ゼロ割りって出力ウィンドウにエラーでねぇ?
750デフォルトの名無しさん:2009/01/01(木) 09:20:15
「出力ウィンドウ」ってなんじゃらほい
Windowsなら異常終了のダイアログが出ないこともなかったような
751デフォルトの名無しさん:2009/01/01(木) 10:21:40
VCのデバッグ実行で表示されるアレじゃねの?
固有名詞で「出力ウィンドウ」ってーとそのぐらいしか思いつかん
752デフォルトの名無しさん:2009/01/01(木) 12:04:24
char *words[] = {"stately", "plump", "buck", "mulligan"};
size_t words_size = sizeof(words)/sizeof(char *);

これのsizeof(chara *)の*はなんで必要なんですか?
sizeof(char)ではだめなんですか?
753デフォルトの名無しさん:2009/01/01(木) 12:13:52
>>752
charaだけだと、chara型の配列じゃなくって一文字になっちゃう
754デフォルトの名無しさん:2009/01/01(木) 12:21:49
char *words[] -> char * words [4] に変換される。
そしてcharを指すポインタの4つの配列は、それぞれどこかの文字データの入ったアドレスを指していることになる。

words[0] ---------------------------------------->"stately" (0x234fee)
words[1] ------------>"plump" (0xdd4540)
words[2] ----------------------------------------------------->"buck" (0x001101)
words[3] --------------------------->"mulligan" (0x0d7100)

まぁ普通は連続的になるだろうが、オプション次第ではこういうのも作れるよね…?
これであってる?
755デフォルトの名無しさん:2009/01/01(木) 12:22:57
>>752
そもそもそのコードが何を計算してるのか理解してるか?
756デフォルトの名無しさん:2009/01/01(木) 13:14:55
ゼロ割りは英語でゼロディバイトなんたらなんたらってでてくるよ
757デフォルトの名無しさん:2009/01/01(木) 13:35:17
Class内にProtectedでstatic付の変数を作ると未解決のエラーが出てしまうんですが
Class内でStatic付なのはPublic以外ではできないのでしょうか?
758デフォルトの名無しさん:2009/01/01(木) 13:39:26
ごめんなさい、static付はpublicでも未解決って言われました
759デフォルトの名無しさん:2009/01/01(木) 14:37:32
>>757
cppに

type classname::membername=initialvalue;と書いてみれ
760デフォルトの名無しさん:2009/01/01(木) 15:25:32
グローバル変数のexternだけ書いたのと似たようなもんだ
実体がない

class Foo {
 static int Bar;
};
なら何処かのcppに
int Foo::Bar = 100;

とか書く必要がある
761デフォルトの名無しさん:2009/01/01(木) 18:53:18
マルチスレッドのサーバを作っています。
複数の処理スレッドが入力を受け付け(accept)、処理を実行し、1つの管理スレッドが
スレッド数の管理や処理に関する統計処理等を行っています。
(処理数が処理スレッド数を上回った場合は、管理スレッドが処理スレッドを増やすなどを行う)
ここで質問なのですが、管理スレッドを定期的に実行させるにはどのような方法がよいでしょうか?

スレッドのpriorityも関係しそうですが、管理スレッドのpriorityをあげるのは、
なんかおかしいかなと思ってます。(実際にpriorityが高いのは処理スレッド)

環境は、linux(centos)上でpthreadを使っています。
762デフォルトの名無しさん:2009/01/01(木) 19:21:44
>>761
単純な方法はsleepじゃないかな。
あとaccepetしたときやsocketをクローズさせたときに管理スレッドにイベントを送るようにしたら効率がいいと思うよ
763デフォルトの名無しさん:2009/01/01(木) 19:25:02
マルチにレスしてしまった。はずかすいorz
764デフォルトの名無しさん:2009/01/02(金) 22:33:44
#include <stdio.h>

int main(void)
{
printf("hello, world\n");

return 0;
}

このプログラムで以下のエラーが出ました。

Unable to open include file 'stdio.h'
Call to function 'printf' with no prototype in function main

どうすればいいでしょうか?
765デフォルトの名無しさん:2009/01/02(金) 22:39:49
borland の BCC ?
766デフォルトの名無しさん:2009/01/02(金) 23:47:36
>>764
どうすればって、stdio.hがひらけねぇっていわれてるんだからあるのおかどうか確認せーよ
767デフォルトの名無しさん:2009/01/02(金) 23:52:16
コンパイラの設定ミスってんじゃない?
主に標準インクルードパス
768デフォルトの名無しさん:2009/01/02(金) 23:53:33
コンパイラにstdio.hのある場所を教えてやらなかったからじゃないの
769デフォルトの名無しさん:2009/01/03(土) 00:39:41
これでもかというぐらい環境依存だなw
770デフォルトの名無しさん:2009/01/03(土) 00:45:51
実は組み込み用だったとか
771デフォルトの名無しさん:2009/01/03(土) 01:02:21
まあ環境依存OKスレだし。
環境は書いて欲しいが。
772デフォルトの名無しさん:2009/01/03(土) 01:18:17
いままでlinux環境でvalgridをつかってメモリリークとかみてたんですが、
VisualC++2008のでそういうことってできます?
773デフォルトの名無しさん:2009/01/03(土) 01:19:02
VC++ を使うわけじゃないが、
purify とかいうソフトがある。
試用期間があったはず。
774デフォルトの名無しさん:2009/01/03(土) 01:37:59
VC++デバッグ版ランタイムにもメモリリーク検出の機能があるな。
_CrtSetDbgFlag
775デフォルトの名無しさん:2009/01/03(土) 08:32:37
>>774
何そのウンコ機能
newをオーバーライドしたほうがいい
776デフォルトの名無しさん:2009/01/03(土) 08:34:24
int a[5];
int b[50];

a = &b[10];

aの先頭にbの先頭にしたいアドレスを入れたらbのa配列分がaからアクセスできるようにしたいんですがこれ無理ですか?
777デフォルトの名無しさん:2009/01/03(土) 08:46:26
それは無理

int *a;
a = &b[10];
じゃだめなのか?
778デフォルトの名無しさん:2009/01/03(土) 08:57:04
なるほど、それでいけそうです。ありがとうです。
779デフォルトの名無しさん:2009/01/03(土) 09:53:22
malloc,freeの書き換えだけじゃvalgrindの代用にはならんだろ。
leakcheckerだけなら色々あると思うが。
780デフォルトの名無しさん:2009/01/03(土) 10:18:54
g++3.4.4を使いmapのconst char*で下記の様に定義しようとしています。
文字列を直接char*に代入した時は成功するのですが、
strcpyでコピーした時は失敗するのは何が原因なのでしょうか。

void read(map<const char*, int> &index){
char *l = (char*)malloc(256*sizeof(char));
strcpy(l,"*abcd");
index.insert(make_pair(l, 1));
l="*efgh";
index.insert(make_pair(l, 2));
}
int main(void){
map<const char*, int> index;
read(index);
cout<<index["*abcd"]<<endl;//失敗
cout<<index["*efgh"]<<endl;//成功
return 0;
}
781デフォルトの名無しさん:2009/01/03(土) 10:21:32
ヒント : std::less
782デフォルトの名無しさん:2009/01/03(土) 10:45:16
>>781
すみません、std::lessをどう使えばいいのでしょうか…。
783デフォルトの名無しさん:2009/01/03(土) 10:50:25
std::strcmpをラップする
784デフォルトの名無しさん:2009/01/03(土) 11:08:56
コンテナ map は比較演算によって key を区別している。
通常は opreator < 相当の std::less が使われる。
const char* の比較ではポインタ値の大小によって判定され、文字列の中身を見ない。
使ってる環境では同じ内容のリテラル文字列は共有される(同じ領域が使われる)ようなので、
たまたま同じポインタ値が使われてうまくいっているように見える。

解決方法としては、

1. std::less を const char* で特殊化する。
  namespace std {
  template <> struct less<const char*> : binary_function<const char*,const char*,bool> {
    bool operator()(const char* x, const char* y) const { return strcmp(x, y) < 0; }
  };
  }
2. 比較関数オブジェクトを指定した map を使う。
  struct MyLess : binary_function<const char*,const char*,bool> {
    bool operator()(const char* x, const char* y) const { return strcmp(x, y) < 0; }
  };
  std::map<const char*, int, MyLess> index;
3. const char* の代わりに std::string を使う。
  std::map<std::string, int> index;

お勧めは 3 > 2 > 1 の順。
785デフォルトの名無しさん:2009/01/03(土) 11:52:09
>>784
なるほど、そういう事だったのですね。
stringよりはポインタの方が早いようなので、
1か2の方を使ってみようと思います。
ありがとうございました。
786デフォルトの名無しさん:2009/01/03(土) 12:21:37
>stringよりはポインタの方が早いようなので、
思い込み乙。
787デフォルトの名無しさん:2009/01/03(土) 12:29:50
string の方がサイズを保持しているので
文字列の動的コピーが必要になった際に
strlen しなくて済む分速いよね。
788デフォルトの名無しさん:2009/01/03(土) 13:18:32
stringはデータの追加が出来ないよ。 新たな領域を確保してそこにコピーするんだ。
だからノロイ部分はある。
789デフォルトの名無しさん:2009/01/03(土) 13:19:46
>>788
妄想しすぎだろう・・・。
メモリは文字列のサイズ丁度に確保するとは限らない。
それに、自分でメモリ確保する場合も同じだろう。
790デフォルトの名無しさん:2009/01/03(土) 13:23:16
あるデータ処理に特化するんだったらchar*のほうが速いだろ。
791デフォルトの名無しさん:2009/01/03(土) 13:25:48
場合による。
ノードの追加は明らかに std::string の方が遅くなるが、
文字列のサイズを取得する処理は std::string の方が速い、など。
792デフォルトの名無しさん:2009/01/03(土) 13:28:55
>>790
特化した文字列クラスを作る。
793デフォルトの名無しさん:2009/01/03(土) 13:30:06
つまり、実測しろ、ということだよな。
速度の話題が出たときには毎回誰かが言ってんのにまたこの流れか。
794デフォルトの名無しさん:2009/01/03(土) 13:30:27
文字数は、char*でもint型に入れておけばいいだろ。
795デフォルトの名無しさん:2009/01/03(土) 13:49:01
汎用性のある処理している分、どうやってもchar*には敵わないんだよ。
実測してみるのが良いとは思うけど、大抵極端な差は出ないか、char*の方がコードが長くなるから
人間のミスによりchar*の遅いかも知れない。
796デフォルトの名無しさん:2009/01/03(土) 15:24:16
実測してみたけどlength()が2倍になるまではstringのほうが速いみたいだな。
2倍を超えるところで遅くなってその時点からまた2倍になるまで速くなる。
797デフォルトの名無しさん:2009/01/03(土) 15:28:12
stringのソース見たらアセンブラになってたわ。
てことわ、char*版もアセンブラで書き直さないと比較にならないのか?
798デフォルトの名無しさん:2009/01/03(土) 15:33:30
比較ってなんの比較だよ?
799デフォルトの名無しさん:2009/01/03(土) 15:34:44
ある意味予想通りの展開だな。

暗黙的にコピーが発生する可能性が高い分、気をつけないと std::string の方が char* より速度が遅くなる可能性は高いが、
質問のレベルからしてメモリ関連のバグを抱え込むか、メモリを確保しっぱなしのような行儀の悪いプログラムを書くかする
危険性も高いと思うんだ。
char* と string の速度差が意味を持つようなプログラムを書くつもりなのか、考えてみた方がいいと思う。
800デフォルトの名無しさん:2009/01/03(土) 15:37:44
map だからノードを追加するときくらいしかコピーは発生しないはず。
801デフォルトの名無しさん:2009/01/03(土) 16:38:14
一応言っとくとダミーノードnilが発生するからstd::stringのデフォルトコンストラクタとそれに対応したデストラクタも走る。
一方POD型の分も発生するが、同じデータ量を持った未定義の内容のメモリが確保されるだけに過ぎないので
コンストラクタとデストラクタのコストが著しく高い場合はPOD型に置き換えた方が良い。
802デフォルトの名無しさん:2009/01/03(土) 16:46:12
ただし、著しく高いコストも許容範囲ということが意外とある。
803デフォルトの名無しさん:2009/01/03(土) 17:09:57
CString str;
int num = 12;
str.Format(_T("%d"), num);

numが何桁だろうと012と3桁表示にフォーマットする書き方はありますか?
804デフォルトの名無しさん:2009/01/03(土) 17:12:02
>>803
仕様に書いて歩けど
%03dってかけばおk
0=空いてる桁は0梅、3=3桁
805デフォルトの名無しさん:2009/01/03(土) 17:12:39
%03d
806デフォルトの名無しさん:2009/01/03(土) 17:13:46
どうもです
807デフォルトの名無しさん:2009/01/03(土) 17:14:58
「numが何桁だろうと」と書いてあるけど、4桁のときは4桁でいいのかな?
808デフォルトの名無しさん:2009/01/03(土) 18:06:02
MS Platform SDK(x64)をインストールしてみたんだけど、cl.exeは動くが
ml.exe(アセンブラ)が存在しないっぽい。以前入れた時にはあったような
気がしたんだけど、どうすれば手に入るか教えてくだせえ。
809デフォルトの名無しさん:2009/01/03(土) 18:15:47
自己解決。ml.exeではなくml64.exeでした。いやすまんかった。
810デフォルトの名無しさん:2009/01/03(土) 21:59:05
c++の入門書なんか教えてください
ちなみに今まで読んだ本は
新版 明解C言語 入門編
柴田望洋 著

Cプログラミング専門課程
藤原 博文 著

です

もしすれ違いだったら誘導お願いします。
811デフォルトの名無しさん:2009/01/03(土) 22:03:39
・ ロベールのC++入門講座
・ 独習C++
・ Accelerated C++
・ やさしいC++(高橋麻奈)
・ 詳説C++

好きなの選べ。
812デフォルトの名無しさん:2009/01/03(土) 22:19:47
どれでもいいとおもうけど注意すべきは、古いものは避けたほうがいい
規格が現行のものでないものが多いから
813デフォルトの名無しさん:2009/01/03(土) 22:26:22
文法の本はともかく、EffectiveC++だけは絶対読んどけ。
814デフォルトの名無しさん:2009/01/03(土) 22:29:07
Effective C++ が必読なのは同意だが、
それより先に C++ の入門書を読まないとな。
815デフォルトの名無しさん:2009/01/03(土) 22:30:19
>>812
発行が新しいという意味ではこの2つが新しいな。

・ やさしいC++(高橋麻奈)
・ ロベールのC++入門講座
816デフォルトの名無しさん:2009/01/03(土) 22:40:02
ごめんそこまで新しさを追い求めるひつようはない
名前空間の概念がないから
using・・・ せずに vector・・・・とかやってたり
strstreamを普通につかってたり

そんなの
817デフォルトの名無しさん:2009/01/03(土) 22:41:34
Webのロベール読んどけば
818デフォルトの名無しさん:2009/01/03(土) 23:31:41
1998年以降の発行が目安かな
C++が規格化されたのは1998年だから
最新版は2003年だけど、大筋は変わらないから2003年以前でも問題はない

1998以前が悪いとも限らないけど
819デフォルトの名無しさん:2009/01/04(日) 01:04:16
質問です。
C言語における「文字列の配列」とはどういうものですか。
820デフォルトの名無しさん:2009/01/04(日) 01:07:52
char 型の配列の配列。
char (の配列をさす)ポインタの配列。

とか。
821デフォルトの名無しさん:2009/01/04(日) 01:08:03
const char table[2][10] = {
 "foo", /* 実際には 10 バイトの領域が割り当てられる */
 "bar", /* 実際には 10 バイトの領域が割り当てられる */
};

/* table は文字列へのポインタを保持する配列となる */
const char *const table[2] = {
 "foo",
 "bar",
};

普通は後者を使うが、
文字数が決まっていて文字数が全部揃っている場合は
前者を使う事もなくはない。
822810:2009/01/04(日) 01:59:15


ありがとうございます

ロベール買うことにしました
823819:2009/01/04(日) 02:18:50
ありがとうございました。
824デフォルトの名無しさん:2009/01/04(日) 14:39:02
i = 0;
i = ++i;
が、1を足してから代入されるのはわかるんですが、

int a[x];
for(i=0; i<x; ++i)
{
 a[i] = i;
}
は、どうなるんでしょうか
一発目から1ではじまるんでしょうか?
2週目はiが2でいいんでしょうか?
825デフォルトの名無しさん:2009/01/04(日) 14:42:29
> i = ++i;
この結果は未定義じゃね?
まあ、変になることはない気はするが・・・。

>は、どうなるんでしょうか
i を表示してみれば分かるだろ・・・。
826デフォルトの名無しさん:2009/01/04(日) 15:00:43
boostライブラリのコンパイル、お茶でも飲みながら待ってましょうとかいって2時間もかかったどんぐらいかかるかぐらい最初から教えろ!!

827デフォルトの名無しさん:2009/01/04(日) 15:01:11
>>824
i = ++i; は未定義。書いてはいけない。
1を足して代入するのは、++i; か i++; か i=i+1; か i+=1;

for(i=0; i<x; ++i) はi=0からi=x-1まで、x回のループ。
828デフォルトの名無しさん:2009/01/04(日) 15:13:54
>>824
i = 0;
while(i < x)
{
 a[i] = i;
 ++i;
}

と同義
829デフォルトの名無しさん:2009/01/04(日) 15:14:45
continue がなければ、な。
830デフォルトの名無しさん:2009/01/04(日) 15:33:18
ないじゃん
831デフォルトの名無しさん:2009/01/04(日) 15:36:11
>>826
それでも目安くらい出せるとは思うけど、コンピュータの性能で本当に違う。
Core 2だと十数分とかからない。
832デフォルトの名無しさん:2009/01/04(日) 15:41:15
OOoのコンパイルも一時間かからないんだろうなぁ…恐しい話だ
833デフォルトの名無しさん:2009/01/04(日) 15:57:12
実際にプログラムを書いて試してみたんですが違いがでません

int a;
start:
cin >> a;
int b = a;
cout << "i++\n";
for(int i=0; i<10; i++){
 cout << a << '\n';
 a++;
}

cout << "++i\n";
a = b;
for(int i=0; i<10; ++i){
 cout << a << '\n';
 a++;
}
goto start;
834デフォルトの名無しさん:2009/01/04(日) 16:02:19
>>831
まじで?
俺3Ghz*2なのに2時間かかったぞ
PenDとcore2じゃ3Gでも違うのか?
835デフォルトの名無しさん:2009/01/04(日) 16:10:43
NetBurstの3Gとかもはやローエンドでは
836デフォルトの名無しさん:2009/01/04(日) 17:02:00
つかNetBurstアーキテクチャとコンパイラみたいな処理は相性悪いと思う
837831:2009/01/04(日) 17:35:02
>>834
俺も自分のPCはPrescottで、フルビルドなんて時間がかかってしょうがないから、
最近は使うものだけ個別にビルドするようにしている。
838デフォルトの名無しさん:2009/01/04(日) 19:10:17
数値の二次配列でvector< vector<int> >ではなく、
vector< int[2] > みたいな事は可能なのでしょうか。
出来る場合はどういう風に宣言すれば良いのでしょうか。
839デフォルトの名無しさん:2009/01/04(日) 19:20:46
>>838
それはできない

boost::array 使うとか
struct array {
int item[10];
};
みたいなのを作るとか
840デフォルトの名無しさん:2009/01/04(日) 21:06:24
C2Qだとboostのビルドに10分もかからないらしい…
恐しき哉
841デフォルトの名無しさん:2009/01/04(日) 22:01:00
vista c++

#include <stdio.h>

int main(void)
{
double pi;

printf("あなたは何歳ですか?\n");

scanf("%lf",&pi);

printf("あなたは%f歳です。\n",pi);

return 0;
}

コンパイラ後に少数を入力しても小数点以降がカットされてしまうのですが
どこが間違っているのでしょうか
842デフォルトの名無しさん:2009/01/04(日) 22:04:22
>>841
まともに動くが?
BCC6.1.0
843デフォルトの名無しさん:2009/01/04(日) 22:26:28
同じく。
Vista VS2005
844デフォルトの名無しさん:2009/01/04(日) 22:30:15
gccの -lm オプションってscanf()とかにも効いてきたっけか?
845デフォルトの名無しさん:2009/01/04(日) 22:32:44
>>844
-lmオプションなんだとおもってんだよwww
846841:2009/01/04(日) 22:33:43
3.14を3,14と入力していました
申し訳ないです
847デフォルトの名無しさん:2009/01/04(日) 22:40:43
>>845
確かmath.hの関数ライブラリのリンクの指示だよな
848デフォルトの名無しさん:2009/01/04(日) 22:47:13
>>846
何人だよ
849デフォルトの名無しさん:2009/01/04(日) 22:58:25
フランスだっけ<小数点がカンマ
850デフォルトの名無しさん:2009/01/04(日) 23:04:06
いや確かドイツ人もだろ
851デフォルトの名無しさん:2009/01/04(日) 23:10:10
ほかにドイツ、スペイン、イタリア、オランダ、北欧とか。
英米日韓中は同じだね。世界は2分されてるな
あとは帝国主義時代にどこの植民地になったかで決まってるかんじ
852デフォルトの名無しさん:2009/01/04(日) 23:21:29
C++にlocaleが導入されたのも無理ないな
まあ開発者がスウェーデン人だったからという事もあるが
853デフォルトの名無しさん:2009/01/04(日) 23:29:34
カンマだと書きなぐった時に
数値を列挙しているのか小数点なのか
分からなくなりそうだ。
854デフォルトの名無しさん:2009/01/05(月) 00:15:20
>>853
そこで列挙の区切り文字にはピリオドですよ。
いや、まじで日付を2008.1.6って区切る国もあるらしいね
855デフォルトの名無しさん:2009/01/05(月) 02:19:42
日付はいいけど、
文章内でもピリオドで区切るんか?
そうなると列挙と文章の終端の区別が・・・。
856デフォルトの名無しさん:2009/01/05(月) 08:12:39
アプリケーションを起動後最初化するとメモリ使用量がぐんと下がるんですが
なんでデリートもしてないのに勝手に解放されるんですか?
すごい一生懸命メモリ意識して作ったのに納得できません
どうなってるんですか?
857デフォルトの名無しさん:2009/01/05(月) 08:29:22
HDDに移されるんだろ
858デフォルトの名無しさん:2009/01/05(月) 11:04:39
HDDに行かないようにするにはどうすればいいんですか?
ハードディスクの可動部分の負担をなくすために普通は限界までメモリで回す設定じゃないんですか?
最小化してメモリが減るアプリ初めて見たんですけどひどくないですか?自分で作ったんですけど・・・
859デフォルトの名無しさん:2009/01/05(月) 11:09:16
アクティブで無くなると、HDDにスワップされるソフトは多いよ。 
メモリの使用量は同じだけど、実メモリの使用量が下がるだけでは?
画面で見えていない部分を実メモリに置いておくよりは、見えている方をメモリにのせた方が効率良いので。
スワップさせないように出来るとは思うけど知らない。
860デフォルトの名無しさん:2009/01/05(月) 11:26:15
スワップはソフトじゃなくてOSがやってるだろ
メモリ管理はOSの重要な機能の1つ
スワップさせない方法は探せばあるのかもしれんが
>最小化してメモリが減るアプリ初めて見たんですけどひどくないですか?
限りあるリソースの中で動かす工夫だよ
861デフォルトの名無しさん:2009/01/05(月) 11:32:06
OSが勝手にやってるんだからOSに文句を言え
# 本当に何が起こってるか知りたいならOSのメモリ管理をよーく勉強しろ

あとWindowsのタスクマネージャを見てるんなら
ちゃんと数字の意味を調べて知っておいた方がいい
(Windows XPのタスクマネージャで出てくるメモリ消費量の数字は
 いわゆる「ワーキングセット」の数字で、直感的なメモリ消費量とはやや異なる意味を持つ)
862デフォルトの名無しさん:2009/01/05(月) 11:32:11
>>856
Windows XPなら、それがOSの仕様
ウィンドウ最小化 ワーキングセット
あたりのキーワードでぐぐれ
863デフォルトの名無しさん:2009/01/05(月) 12:04:28
もしかして、タスクマネージャ見ながらメモリリーク潰してた俺って、めちゃくちゃ恥ずかしいやつ?
864デフォルトの名無しさん:2009/01/05(月) 12:16:51
>>863
うん。そもそもわかりやすいメモリリーク以外見つからないと思うが

メモリリークの対処はリーク検知ツール(LinuxではValgrindとか)を使うか、
自前でallocateとdeallocateのログをとって突き合わせるとかの手法を使うべき

C++なら動的に確保したオブジェクトはすべてスマートポインタに突っ込むといった
そもそもリークしないコードを書くように心がけるのがよろしい
865デフォルトの名無しさん:2009/01/05(月) 12:30:50
べーむGC使おうぜ
866デフォルトの名無しさん:2009/01/05(月) 12:40:09
べーむってクラスに対応してんの?
867デフォルトの名無しさん:2009/01/05(月) 12:45:46
調べておーすごいと思ったんだけど
ある確率で回収されそこねる危険がある
とか最後に書いてあったんだけど
868デフォルトの名無しさん:2009/01/05(月) 12:55:01
CならBoehm使えば確実に楽になるだろう
C++だとかえって苦労が増えるだけのような

MSはGCベースの.NETとの共存のためにわざわざC++/CLIとか作ったわけじゃない
869デフォルトの名無しさん:2009/01/05(月) 12:58:01
↑否定系なのか疑問形なのか分からんがな・・・
870デフォルトの名無しさん:2009/01/05(月) 12:59:02
ごめん
否定じゃないよ
「作ったわけでしょう」
といいたかった
871デフォルトの名無しさん:2009/01/05(月) 13:00:50
shared_ptrとかの参照カウント式のものと併用しようとなると面倒らしい(kiryouの中の人の日記参照)
けどmosh等C++プロジェクトでもべーむ使ってるのはあるよ
872デフォルトの名無しさん:2009/01/05(月) 13:08:59
すごい適当に言うけどMFCのCObjectに: public gc 付けたら一発でガベージコレクション対応になる?
あと、vectorは宣言してあるクラスに: public gc付ければswapしなくていいようになるかな
873デフォルトの名無しさん:2009/01/05(月) 13:52:45
C言語なんですけど

getchar()で文字列を10文字以内の2件入力(11文字以降は読み捨て)、
char型に格納。

というプログラムを作りたいのですが、どうすればいいでしょうか?
874デフォルトの名無しさん:2009/01/05(月) 13:54:33
>>873
宿題なら宿題スレへ。そうでないならfgets()を使って工夫しましょう。
875デフォルトの名無しさん:2009/01/05(月) 13:55:37
カウンタまわす
876デフォルトの名無しさん:2009/01/05(月) 14:09:58
>>874
わかりました。
ありがとうございます。
877デフォルトの名無しさん:2009/01/05(月) 14:42:55
>>867
保守的GCはそういうもの。
他のGCだって循環参照だと回収出来なかったりとか、
回収が特定のタイミングに集中するとかいった問題はある。
GC有りならメモリを気にしなくていいなんてことは無い。
メモリ開放を個別に指定しなくていいってのは大きいけど、それだけだな。

BoehmGCってマシンスタックを直接走査したりする。
環境依存しまくりで#ifdefの嵐だでよ。
主要な環境ではだいたい問題なく使えるけど…
878デフォルトの名無しさん:2009/01/05(月) 15:36:23
構造体についての質問です。
typedef enum {
OP_CHAR,
OP_CONCAT,
OP_ALTER,
OP_CLOSURE,
OP_NULL
} Op_t;
ypedef struct Tree {
Op_t Op;
union {
char c;
struct {
struct Tree *_left;
struct Tree *_right;
}X;
}U;
}Tree_t;
という構造体があった時、
メモリの中は
http://upload.fam.cx/cgi-bin/img-box/wpq90105153437.png
な感じですか?
879デフォルトの名無しさん:2009/01/05(月) 15:38:19
leftとrightは構造体内にあるから共用されない
880デフォルトの名無しさん:2009/01/05(月) 15:44:57
言い方変えれば、unionで括られているのはcharと無名structだけ。
ついでに言えば、ポインタのサイズはintと同じとは限らない。
881デフォルトの名無しさん:2009/01/05(月) 15:59:19
ポインタがintとか、アライメントとかパティングとかは置いといて、
アドバイス有り難うございます。
そしたらこんな感じでしょうか?
http://upload.fam.cx/cgi-bin/img-box/z8590105155749.png
882デフォルトの名無しさん:2009/01/05(月) 16:06:08
アドレスとって "%p" で出力してみるとか、 offsetof() を見るとかして自分で確かめるといいよ。
883デフォルトの名無しさん:2009/01/05(月) 16:16:15
offsetofなんて知らんかった!
884デフォルトの名無しさん:2009/01/05(月) 17:06:03
>>881
まずはその小汚い絵を何とかしろ。draw系のツールを使うかせめてスプレッドシートで描いてキャプチャしてくれ。
885デフォルトの名無しさん:2009/01/05(月) 17:38:57
別に見えないレベルじゃないだろ
886デフォルトの名無しさん:2009/01/05(月) 17:42:50
WindowsXPにすればペイントという無料ソフトがついてくるのにね。
887デフォルトの名無しさん:2009/01/05(月) 18:06:12
>>878
こんな感じになるはず
ttp://pastie.org/352730
888デフォルトの名無しさん:2009/01/05(月) 23:28:05
俺はあまりにも下手すぎて感動してしまった!
889デフォルトの名無しさん:2009/01/06(火) 01:17:06
>>886
無料じゃネェよ。
890デフォルトの名無しさん:2009/01/06(火) 01:53:21
struct tagB { 〜組み込み型のメンバ変数のみ〜 };

struct tagA {
 tagB m_array[N];
};

となっている時、必ず sizeof tagA == sizeof tagB * N になりますか?
891デフォルトの名無しさん:2009/01/06(火) 03:17:00
>>890
効率よく実装しようと思ったらおおかたそうなるんだろうけど、
規格は m_array の後ろにパディングを入れることを禁止してないから
「必ず」とは言えないね。
892デフォルトの名無しさん:2009/01/06(火) 19:56:35
jpeglib の example.c に以下のようなエラーマネージャ
の例が出ていて、

struct my_error_mgr {
  struct jpeg_error_mgr pub; /* "public" fields */
  jmp_buf setjmp_buffer; /* for return to caller */
};

ライブラリへの設定には pub のアドレスを渡して、エ
ラーハンドラで与えられた(というか返ってきた)ポイ
ンタを my_error_mgr にキャストしてるんだけど、これ
を C++ でやるにはどうしたらいいでしょうか?
893デフォルトの名無しさん:2009/01/06(火) 20:14:36
>>892
C++らしくするなら、継承でいいと思う。
struct my_error_mgr : jpeg_error_mgr
{
jmp_buf setjmp_buffer; /* for return to caller */
};
894デフォルトの名無しさん:2009/01/06(火) 23:08:46
STLのvectorで質問なのですが、
staticで定義されたvectorの1要素のアドレス(例えば &container[5] 等) を取得した後、
そのvectorに対してpush_backなどの要素の追加削除を行わなかった場合、
そのアドレスが生きている事は保障されているのでしょうか?

あと、vector::reserve未満の範囲でpush_back等を行った場合はどうなのでしょうか
895デフォルトの名無しさん:2009/01/06(火) 23:27:45
要素いじらない限りは保証される
たとえ尻に追加するだけだとしても、何かやったら無効
896デフォルトの名無しさん:2009/01/06(火) 23:58:29
俺、そういうの気にするといつもバグらせるから
vector <MyClass*> mMy;
STLはこうやってポインタ配列しか作らなくなった
これならモリモリ増やしても大丈夫、多分
897894:2009/01/07(水) 00:02:12
>>895
reserveの範囲内でpush_backしてもアドレスは無効になるのですね
参考になりました。
ありがとうございました。
898デフォルトの名無しさん:2009/01/07(水) 00:25:07
>>895
23.2.4.3
capacity超えない限り再確保は起きず、その場合
挿入位置より前の要素の参照とイテレータが有効なままなのは保証されている。
899デフォルトの名無しさん:2009/01/07(水) 00:29:49
>>896
あんたにゃSTLは無駄だ。つーか、何を使ってもメモリリークさせそうだ。
900デフォルトの名無しさん:2009/01/07(水) 02:02:45
せめてvector<shared_ptr<MyClass>>にしようよ……
901デフォルトの名無しさん:2009/01/07(水) 03:02:02
shared_ptrはデカイからだめです。
902デフォルトの名無しさん:2009/01/07(水) 03:10:48
ではptr_containerで
903デフォルトの名無しさん:2009/01/07(水) 09:13:43
intrusive_ptrは?
904デフォルトの名無しさん:2009/01/07(水) 09:44:40
>>893
> C++らしくするなら、継承でいいと思う。

そっか、struct と class は同義なんだっけ。とりあえずコンパイル可能な形
にはなりました。

エラーハンドラで例外投げて上位で catch したいんだけど、素通りしてしまう。
スタックフレームが違うのかなぁ…と思ったら↓見つけた。

http://d.hatena.ne.jp/espresso3389/20070921

むぅ…。
905デフォルトの名無しさん:2009/01/07(水) 12:50:37
>>904
struct X {
int a; // public
};

class Y {
int a; // private
};
906デフォルトの名無しさん:2009/01/07(水) 14:50:41
#include<>と#include""の違いってなんですか!
907デフォルトの名無しさん:2009/01/07(水) 15:22:17
<>は自身のディレクトリから参照してくれないんだっけかな
908デフォルトの名無しさん:2009/01/07(水) 15:34:46
<>はincludeディレクトリ
""はソースと同じディレクトリかな?
909デフォルトの名無しさん:2009/01/07(水) 15:35:42
class ClassA {
protected:
void func();
};

class ClassB : public ClassA {
〜〜〜
};

上のような継承時にprotectedなメンバを
publicに引きずり出す指定子があったような気がしたんですが、
なんて名前でしたっけ?
或いは継承元のメンバ関数を明示的に使わせる指定子だったかも?
910デフォルトの名無しさん:2009/01/07(水) 16:02:53
< >は標準ヘッダで " "はその他のヘッダ
かな
911デフォルトの名無しさん:2009/01/07(水) 16:03:50
using
912デフォルトの名無しさん:2009/01/07(水) 16:06:41
""でもincludeディレクトリから参照できるな
913デフォルトの名無しさん:2009/01/07(水) 16:43:54
>>911
thx
usingは盲点でした
914デフォルトの名無しさん:2009/01/07(水) 17:03:57
ありががとうございます。自作も標準も""で統一すれば解決ですね!
915デフォルトの名無しさん:2009/01/07(水) 17:20:18
いやそこは意識して分けようよww
916892:2009/01/07(水) 17:20:24
jpeg_error_mgr を継承したエラーマネージャクラスに
public な jmp_buf 持たせて、利用する側で setjmp し
てエラーハンドラで longjmp させたらうまくいったっ
ぽい(setjmp でエラー検出して例外投げる形)。

jmp_buf を隠してエラーマネージャで setjmp させると
うまくいかないんだけど、ここは凝っても仕方ないので
とりあえずこれでいいや。
917デフォルトの名無しさん:2009/01/07(水) 17:37:25
逆に言うと<>はincludeパスからしか探さない
君が""で統一するのであれば、僕は君のヘッダファイル置き場に
秘密のコードを記したstdio.hを配置するとしよう
918デフォルトの名無しさん:2009/01/07(水) 19:03:20
メモリを操作する最小単位はバイト。と書いてあるんですが、
何で型はBYTE,short,int,doubleしかないんですか?
24ビットとか、40ビットで数を表現したい場合はどうすればいいんですか?
919デフォルトの名無しさん:2009/01/07(水) 19:04:41
大は小を兼ねるということで大きいのを選んでください。
あるいはビットフィールド。
920デフォルトの名無しさん:2009/01/07(水) 19:07:06
24bitの場合だったら32bitの型を取り合えず使って、24bitまでマスクして3byteずつ保存。
921デフォルトの名無しさん:2009/01/07(水) 19:19:20
STLとかいってめちゃくちゃすごくないですか?
他に有名なライブラリって何があるんですか?
922デフォルトの名無しさん:2009/01/07(水) 19:22:10
ビットフィールド面白そうなので勉強してきます。ありがとうございます。
923デフォルトの名無しさん:2009/01/07(水) 19:28:43
移植性無いけどな・・・
924デフォルトの名無しさん:2009/01/07(水) 19:29:48
アドレス取れないしな・・・・
925デフォルトの名無しさん:2009/01/07(水) 19:30:16
移植性のあるコードにすればいい
926デフォルトの名無しさん:2009/01/07(水) 19:33:02
24ビットの型ってありそうでないよね
927デフォルトの名無しさん:2009/01/07(水) 19:37:09
あるよ。
構造体なら。
928デフォルトの名無しさん:2009/01/07(水) 19:39:16
そりゃそうだろww
929デフォルトの名無しさん:2009/01/07(水) 19:42:03
>>921
次期C++にも一部採用され、準標準とも言われるboost。
930デフォルトの名無しさん:2009/01/07(水) 20:37:01
__int64とdoubleって同じですか?
931デフォルトの名無しさん:2009/01/07(水) 20:39:06
ちがいます
932デフォルトの名無しさん:2009/01/07(水) 20:39:12
何を以って同じとするかによる
933デフォルトの名無しさん:2009/01/07(水) 20:42:47
__int64 a;
a = 123.456;

a は 123 に丸められるってことですか?
不動小数点を指示しないといけないんですよね?
934デフォルトの名無しさん:2009/01/07(水) 20:44:34
不動小数点ということは固定小数点か
935デフォルトの名無しさん:2009/01/07(水) 20:57:34
不動小数点てw
936デフォルトの名無しさん:2009/01/07(水) 20:57:51
間違えました、浮動です。
32bitのintとfloatも同じ32bitじゃないですか
でもintに123.456入れると123になりますよね?
64ビット型に入れたら123になるのは__int64ってことですか?
937デフォルトの名無しさん:2009/01/07(水) 21:01:31
暗黙型変換とサイズって関係ないと思うんだが。
int a = 123.456;でも__int64 a = 123.456f;でも両方とも123になる。
938デフォルトの名無しさん:2009/01/07(水) 21:32:05
double a = 123.456;
だと123.456
ですよね
浮動小数点型ってなんなんですか?
もしかして型って、中ですごい複雑になってるんですか?
939デフォルトの名無しさん:2009/01/07(水) 21:33:29
ずばり16ビットの不動小数点型の作り方を教えてください。
940デフォルトの名無しさん:2009/01/07(水) 21:36:04
浮動小数点は工夫して有限精度の実数を表す方法の1つ。
intや__int64は整数型に分類されるので、実数を格納することができない。

>>939
C: typedef short float16_t;して、各種演算はCの演算子を使わず自前で行うこと。
C++: クラス作れ。あとはCと大体同じ。
941デフォルトの名無しさん:2009/01/07(水) 21:53:59
そういう話になっちゃうんですね。
演算子とかオペレータとかできれば避けたかった部分ですが、これはもうやるしかないですね・・・
じっくり勉強します。ありがとうございました。
あともうひとつだけ教えてください。64ビットパソコンで32ビットパソコンで作ったintのあるプログラムを動かすと64ビットになっちゃいますよね。
それを避けるためには__int32を使っておけば大丈夫という理解であってますか?
942デフォルトの名無しさん:2009/01/07(水) 21:58:49
64ビットパソコンでも int は32ビットなのが普通。
でも、必ずそうというわけでもない。詳しくは IPL64 でググれ。
というわけで、stdint.h の int32_t を使うのが良い。
943デフォルトの名無しさん:2009/01/07(水) 22:08:41
どうもです!
944デフォルトの名無しさん:2009/01/07(水) 22:14:53
「Numerical Recipes in C」という本のコードを使って逆行列を求めたいのですが
main() から抜ける時にセグメンテーション違反が出て困っています

GDB で様子を見たところ main() を抜けるまでは,通常通り動くのですが,
return 文を実行してもプログラムが終了せずに

(gdb) cont
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x00000008 in ?? ()
(gdb) cont
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.

↑みたいになります.どうしたものでしょうか..OTL
945デフォルトの名無しさん:2009/01/07(水) 22:23:09
Numerical Recipes in C にはいくつもバグがある。
あんまりコードは信用せずにデバッグしよう。
946デフォルトの名無しさん:2009/01/07(水) 22:25:46
#ifndef MACRO
#define MACRO 777
#endif

#define_ifndef MACRO 777
みたいに一行で書く方法ってありますか。
947デフォルトの名無しさん:2009/01/07(水) 22:46:36
ない
948デフォルトの名無しさん:2009/01/07(水) 23:08:40
わかりました。ありがとうございます。
949デフォルトの名無しさん:2009/01/08(木) 04:58:25
>>917
<> と "" の違いは実装依存だよ。

ただし "" に対する検索が失敗したときには同じ名前に対して <> に対する検索をすることと
だけ決まっている。
950デフォルトの名無しさん:2009/01/08(木) 17:48:50
floatの有効7桁とはどういう意味なんでしょうか
表現範囲は10の38乗となってるので38桁ではないんでしょうか?
内部で38桁まで計算できて最終的に7桁にされるってことなんでしょうか?
だとするとこの7桁は小数部分のことですよね?でないと整数部分も32ビットもあるから表現しきれないですよね
951デフォルトの名無しさん:2009/01/08(木) 17:56:35
>>950
38桁の上位7桁にしか意味が無いということだろ
1.234567E38
952デフォルトの名無しさん:2009/01/08(木) 18:10:44
7桁というか、ひとくくりにするなら実質6桁だと思うんだけど
953デフォルトの名無しさん:2009/01/08(木) 18:38:04
ということは、
1234567.89012345
だと
1234567
になるってことですよね
つまり、数値の小さい順に並べると
char
short
float
long int
double
long long
ですね新発見です
954デフォルトの名無しさん:2009/01/08(木) 18:41:05
1.234567 * 10^35
みたいな数字も表現できるってことだよ

まあ詳しく知りたければIEEE754の浮動小数点数フォーマットを調べてみれ
955デフォルトの名無しさん:2009/01/08(木) 18:41:07
それが本当なら確かにびっくりな新発見だ
956デフォルトの名無しさん:2009/01/08(木) 18:55:49
理解できました。
char
short
long int
long long
float
double
でした。
ありがとうございます!
957デフォルトの名無しさん:2009/01/08(木) 20:24:15
整数の正負を反転させる関数はありませんか?
958デフォルトの名無しさん:2009/01/08(木) 20:29:07
* -1
959デフォルトの名無しさん:2009/01/08(木) 20:33:01
単項-演算子でいいじゃない。
関数が必要なら自分で作れ。ただし、C++なら<functional>にnegateがある。
960デフォルトの名無しさん:2009/01/08(木) 20:36:28
int a, b;
a = -b;
ってことですか?
なんか頭の出来の問題なきがしてこなくもないですが、ありがとうです。
961デフォルトの名無しさん:2009/01/08(木) 22:35:38
>>956
なんか全然理解できてない気がするよ……。
とりあえず「浮動小数点数」でぐぐっとけ。な。
962デフォルトの名無しさん:2009/01/08(木) 23:05:42
c++のエディターで一番使いやすいのは何ですか?
963デフォルトの名無しさん:2009/01/08(木) 23:09:00
>>962
VisualStudio2008
964デフォルトの名無しさん:2009/01/08(木) 23:17:48
>>963
やはりそうですか・・・
あれってc++の解説サイトのソースをそのまま乗せるとcoutが定義されてないって出ますよね・・・
std::を先につけるとできるんですがこれってなんとか省けませんか?
965デフォルトの名無しさん:2009/01/08(木) 23:18:40
省けるけど、省かない方で慣れた方が幸せになれる。
どうせ std:: ってやったときに候補が出るし。
966デフォルトの名無しさん:2009/01/08(木) 23:19:03
「C++のエディタ」って表現も凄いな。

それはさておき、using namespace std;。
967デフォルトの名無しさん:2009/01/08(木) 23:21:00
ああ、教えてしまった。禁断の呪文を。
ヘッダファイルにだけは絶対書くなよ!
お兄さんとの約束だ!
968デフォルトの名無しさん:2009/01/08(木) 23:22:36
初心者の私には何言ってるのか全くわかりません・・・
969デフォルトの名無しさん:2009/01/09(金) 00:12:27
俺も学びはじめのころはstd::うざいと思ってたけど
今は妙な名前衝突させないためにむしろ書かないと安心できない
970デフォルトの名無しさん:2009/01/09(金) 00:29:05
>>962
eclipse の CDTプラグイン の エディタ
細かい設定ができますよ。

一括ダウンロードできるサイト、
http://mergedoc.sourceforge.jp/index.html#/pleiades.html
jarありのC++っての
971デフォルトの名無しさん:2009/01/09(金) 01:08:36
>>964
それVisual C++特有の問題ではなく、現代のC++はそういうものと決まっているからだぞ。
972デフォルトの名無しさん:2009/01/09(金) 01:35:39
>>964
規格票ぐらい買え
973デフォルトの名無しさん:2009/01/09(金) 07:46:26
#undef みたいに unusing が欲しいなと何度か思った。
まぁ{}でくくれってことなんだろうけど。
あと untypedef とか
974デフォルトの名無しさん:2009/01/09(金) 08:10:13
uninlineは欲しいと何度も思ったが
975デフォルトの名無しさん:2009/01/09(金) 11:13:09
コンパイラが勝手にインライン化するかもしれないのに何故w
976デフォルトの名無しさん:2009/01/09(金) 11:14:18
>>974
関数へのポインタを static const で持つんだ!
977デフォルトの名無しさん:2009/01/09(金) 11:14:58
>>974
そもそも inline 使いすぎなんじゃねーの。
978デフォルトの名無しさん:2009/01/09(金) 11:37:25
例えばpimplの実装を.cpp内に書くとき
外部にインターフェースを公開するわけでもないのに
わざわざメンバ関数の宣言と実装を別々に書くのがわずらわしいんだよ。

公開しない=固定する必要は無いわけで
パラメータの変更とか内部使用の関数追加とかしょっちゅうだし。
979デフォルトの名無しさん:2009/01/09(金) 11:50:33
>>978
???じゃぁ別々に書かずにいっしょに書けばいいじゃん。
980デフォルトの名無しさん:2009/01/09(金) 11:53:49
MAX_PATHっていうのは、終端文字も含めた長さなのか、そうでないのかどちらですか?
981デフォルトの名無しさん:2009/01/09(金) 11:59:32
>>979
だからclass内に関数を書くと
強制的にinline指定したのと同じになるのが嫌だと言ってるんだろ?

もしかして日本語苦手?
982デフォルトの名無しさん:2009/01/09(金) 12:04:13
それを知らなかっただけだろ
983デフォルトの名無しさん:2009/01/09(金) 12:45:58
>>981
それは知ってるが、 .cpp 内でしか使わない関数が inline になって何かデメリットあんの?
984デフォルトの名無しさん:2009/01/09(金) 12:52:13
>>981
class hoge {
  :
private:
  #include "hoge_privates.c" // お悩み解決!!
  :
};
985デフォルトの名無しさん:2009/01/09(金) 12:53:24
>>983
実装が複数のコンパイル単位に渡る
超巨大クラスたったんだよ!
986デフォルトの名無しさん:2009/01/09(金) 13:15:41
速度なんか微塵も求められてない部分がinlineで肥大化する

まさかとは思うけど、
実装が.cpp内にあるものは1箇所からしか呼ばれない、なんて思ってはいないよね
987デフォルトの名無しさん:2009/01/09(金) 13:25:34
特にWin環境でスタック上にオブジェクトを確保して
デストラクタやら例外処理コードやらが何回も詰め込まれたら
もうメロメロですよ。
988デフォルトの名無しさん:2009/01/09(金) 18:12:46
class内関数をインラインにしたくなかったらvirtualを付ければいいよ
989デフォルトの名無しさん:2009/01/09(金) 18:18:01
VCならinlineのみインライン展開するってオプションがあるんだけどな
990デフォルトの名無しさん:2009/01/09(金) 18:23:22
VC8では、pdbを生成せずにイメージにデバッグ情報を付加することはできますか?
991デフォルトの名無しさん:2009/01/09(金) 18:24:41
VCのことはVCスレでやれよ
992デフォルトの名無しさん:2009/01/09(金) 18:48:41
>>990
なんでVS2005スレの次にここを選んだんだか
ここでいいと思うよ
http://pc11.2ch.net/test/read.cgi/tech/1230008197/
993デフォルトの名無しさん:2009/01/09(金) 19:03:53
>>992
たらい回しでもう3回質問しました;;
半分諦め気味なのですがそちらでも聞いてみます。
ありがとうございます。
994デフォルトの名無しさん:2009/01/09(金) 19:17:07
>>988
virtualを付けると実体がどこかに確保される、というだけで
コンパイル時にはそれとは別にinline展開されたコードが埋め込まれると思うよ。
大抵のコンパイラでは。

C++の規格ではvirtualな関数をinline展開することを禁止していないし
両方指定すること(class内に書いた関数にvirtualをつけること)も当然出来るから。
995デフォルトの名無しさん:2009/01/09(金) 19:22:12
あ、でも、実体の型が明確に判明している時しか実際には展開できないね。
例えばpimplだったら、コンストラクタ内で呼び出しているものしか
実体の型は判別出来ないから、展開されないか。
996デフォルトの名無しさん:2009/01/09(金) 19:40:59
>>981 は inline 関数が必ず inline 展開されるとでも思っているのだろうか・・・。
inline 展開を最適化するのも最適化の範疇だろ。
人間のアホな頭で考えるより、全部コンパイラ様に任せた方が良い。
997デフォルトの名無しさん: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
};
※これはコンパイルエラーになります
998デフォルトの名無しさん:2009/01/09(金) 19:57:55
>>996
おまえはコンパイラが
「この部分は何百万回も呼び出されるから速度を優先」
「この部分は例外的な時にしか呼ばれないからサイズを優先」
といったことを判断できると思っているのか。

そりゃすげーや。
999デフォルトの名無しさん:2009/01/09(金) 19:59:26
inline指定がヒントに過ぎないなんて誰でも知ってる。
どんな入門書にすら書いてある。
1000デフォルトの名無しさん:2009/01/09(金) 19:59:32
static宣言された関数と勘違いしてるのでは?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。