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

このエントリーをはてなブックマークに追加
1猫でもわかる
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.60【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1224057986/

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

>>2-1001 猫をよろしくです。
2猫でもわかる:2008/11/11(火) 05:04:58
.      /               ヘ        !   ヽ,   ヽ
.      ,′         .:       }      .: :}:..   i      .   '
      ′      .:;   ,;:   j   .:}  .:}.:;ハ::.   !      ',   ',
.    ,   ,′    .;  〃 .::. ′ .::ハ .:j厶 L:.__ 八|    '.   :.
    ′ .: i  .    i  .:ii.:..:{:..,′ .:::/ }「/ jノ_|:.:. / │ .  : ! | i
    ' .: .:: i  :   i .::jム从:゙ ..:j/   l/ . r=≠ミ 、| .:  .: ! | i
   i.:/   .:. ! .:    |/ |」.ニ { ..:八 丿 〈/i:::j/:ハヾV .::  .:.:リ: l i
    i:ハ .:..:{:..', ::.:.. {/|ハルf'i⌒ト、从 ヽ   ' {::.:゚。:.:::} l/ .::  .::/:.:.   !
   ii , ..::l.:. '. ::..:.. ', 〃{し'。(_V{      ヾ::::::::リ/ / .::八.:..:. ', | お会いできて嬉しいね
   ii. '. .::l::{::. 、::.:.. '.:{{ V:::゚:.:::}          ¨´/, イ .::イ.:i:.:.:..:.. '.|
.    i!   :、:l八::...\:. ヾ` ヾ::::::ノ       ///´ j/..:l:.:i::.:..:.. :、 ヽ、
       \. \::...` ー--  ¨´//  ′        j   .::ii:.:.:.:..:..ヽ   ` .._
             i ヽ∧ :i'.         -‐..'′      イ    .:ii:.:.:..:.. :.. :、    `丶、
              i .:,' ..:. ,ハ、            / .|   ..::i:!:.:.:.:..:.. :.. :、:.. .    \
          j.:/  .::} '.::i:::>  ..,_     . '゙   |  .:.:,'!:.:.:.:.:..:..:.. ', :.:..:..、     ヽ
          /  .::丿.:.:j/      `7ァ'    __,ノ|   :,:' .::ト . :.:.:..:..:..:..' :.:.:.. \:..   }
.        /  ..::/ .:.:/!     __\》 _ノ   / . ゙ ..::}   ` ー- ,」_:..:..:..:.. ヽ  ,′
.       〃 .: .:/  ..:.:/ ii      ト--=ミr(_ -‐/ ,.:゙  ..:.:,′    〃  `丶、:.: }:./
.       {{ .::≠/  ..:.:/  !!    {__彡イ」 ̄¨¨/ /  ..:://      /,′    ヽ:.:(
3猫でもわかる:2008/11/11(火) 05:07:03
_人人人人人人人人人人人人人人人_
>   ゆっくりしていってね!!!   <
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
       /~',   /~',
       /  '"゛'   ;,
      ミ  ´ ∀ `  ';.
      ミ,         ,;
      ミ  ,,.,)   (,,.,  ;,ハ,_,ハ.
      'ミ         ;,´∀` ':,
       ツ       ,;', u  u ,:
       "'U'""゛'U'  ' 、,_,,_,., '
4デフォルトの名無しさん:2008/11/11(火) 06:31:35
前スレ1000って誰?
5デフォルトの名無しさん:2008/11/11(火) 06:59:28
ザンギエフ
6デフォルトの名無しさん:2008/11/11(火) 07:09:47
なぜ乃木坂春香
7デフォルトの名無しさん:2008/11/11(火) 13:40:18
ドジっ娘アキちゃん
8デフォルトの名無しさん:2008/11/11(火) 17:50:46
>全角空白か に置換
半角スペースじゃ複数入れても1つ分になるから、 のことかと思ったが
ソース見ても半角スペースのままだな。
9デフォルトの名無しさん:2008/11/11(火) 18:29:08
exitとかabortだと終了コードしか情報が無くて、
その場その場にエラーメッセージ出力コードを書かないと駄目で
エラー処理コードで本筋がgdgdになっちゃう、しかし
例外ならとりあえずその場では投げるだけで済むために出力コードをまとめられる
といった理由で、エラーで落ちるようなところではけっこう気前良く例外を使っちゃってるけど
そういう理由でも濫用になるんでしょうか?

一応、エラーといっても初期化の失敗とか結構fatalなエラーに対して使ってるんだけど、
こういうのでも戻り値とかでなんとかするべき?
10デフォルトの名無しさん:2008/11/11(火) 18:39:46
とても普通の使い方にしか思えないぞ。
119:2008/11/11(火) 18:50:09
普通っすか
なら安心しますた
12デフォルトの名無しさん:2008/11/11(火) 20:09:39
すまぽ
13デフォルトの名無しさん:2008/11/12(水) 01:58:00
int wPara[1] = {1};

NMHDR lParam;
lParam.code = 4;
lParam.hwndFrom = (HWND)GetAncestor(GA_PARENT);
lParam.idFrom = 1;
NMHDR* lPara = &lParam;

GetAncestor(GA_PARENT)->SendMessage(WM_NOTIFY, (WPARAM)wPara, (LPARAM)lPara);

これの使い方はどこかおかしいですか?
14デフォルトの名無しさん:2008/11/12(水) 02:18:11
>>12 ガッ!!
15デフォルトの名無しさん:2008/11/12(水) 02:49:22
言い忘れましたが、聞きたいのはポインタの使い方です。なんか無駄があるようなきがして
16デフォルトの名無しさん:2008/11/12(水) 04:34:35
>>12
スッ!!
17デフォルトの名無しさん:2008/11/12(水) 06:24:06
最後の行でエラーがでます。どう書けばいいんでしょうか?

CString* buf;
CString a;
buf = &a;
CString str = str + *buf;
18デフォルトの名無しさん:2008/11/12(水) 08:10:49
それstrがまだ宣言されてないのに使おうとしてるだけ
CString str;
str = str + *buf;
なら通るかと
19デフォルトの名無しさん:2008/11/12(水) 08:32:23
そうか、まだこの行だとstrつかえないのか
ありがとう
20デフォルトの名無しさん:2008/11/12(水) 11:20:45
>>15
一旦中間変数 lPara に置く意味がないなら、第3引数は (LPARAM)&lParam でいーんじゃね?
くらいかな。
21デフォルトの名無しさん:2008/11/12(水) 11:42:25
むしろ NMHDR nmhdr;にして
(LPARAM)&nmhdrとか
22デフォルトの名無しさん:2008/11/12(水) 14:51:47
HeapAllocとmemcpyはメモリの解放は必要なんですか?freeでエラーがでるんです
23デフォルトの名無しさん:2008/11/12(水) 15:00:17
そこでmemcpyが出てくるのがわからんが、、、HeapFree じゃないのか
24デフォルトの名無しさん:2008/11/12(水) 18:59:44
class Hoge{
protected:
  Hoge(int);
public:
  Hoge(const Hoge& hoge);
  Hoge& operator =(const Hoge& hoge);
};
こういうコピーはできるけど、普通に作ろうとすると派生クラスしかできないクラスがあるとき
Hoge Moja::get(){

  struct Piyo:public Hoge{
    Piyo( int i ) : Hoge(i){}
  } piyo( this->id );

  return Hoge(piyo);
}
というふうにして、コンストラクタしかない派生クラスの参照を、既定クラスのコピーコンストラクタに
渡して実体を返す関数を使ってるんだが、こういうのってあり?
25デフォルトの名無しさん:2008/11/12(水) 19:00:41
スマポ
×派生クラスしかできない
○派生クラスからしか作れない
26デフォルトの名無しさん:2008/11/12(水) 19:59:06
>>24
スライシングと言って、Moja::getが返すのはPiyoではなくHogeになるが、
どうしてもそれが適切だというのなら。
27デフォルトの名無しさん:2008/11/12(水) 20:01:56
ステレオファイルをモノラルにするプログラムを作っています。


Waveという構造体があります。(チャンネル数、サンプリングレート、波形データなどを格納)
Free_wave()で領域開放できます。

void func(Wave *wavep){

Wave *wavepbuff //モノラルにしたファイルを置く領域へのポインタ


作った領域にモノラル化したデータを入れる


*wavep = *wavepbuff


}

int main(){

Wave *wavep

ステレオファイルをwavepの指す領域に格納

func(wavep); //wavepが指す場所にモノラルファイルを入れてくる

}
こんな感じで書いたんですが、 funcのwavepbuffで作った領域は開放したらだめですよね?元のステレオファイルを格納していた
場所は開放していいんでしょうか?

28デフォルトの名無しさん:2008/11/12(水) 20:09:42
void func(Wave *wavep){

Wave *wavepbuff //モノラルにしたファイルを置く領域へのポインタ


領域を作り、wavepbuffに指させる。wavepbuffが指す領域にモノラル化したデータを入れる という処理をする


//wavepにwavebuffを代入
*wavep = *wavepbuff


}

ここわかりにくいので書き加えました。
29デフォルトの名無しさん:2008/11/12(水) 20:41:16
つまりやりたい事は、wavepが指していた領域にあるステレオファイルを、

モノラル化し一時的に、wavepbuffが指す場所に置く。

その場所を指すようにポインタ(wavep)を指しなおす。

それまでwavepが指していた領域(ステレオファイルがあった)を解放する。



という作業です
30デフォルトの名無しさん:2008/11/12(水) 20:54:59
やめた方がいい設計だと思うが、やるとしたらこんな感じだろうか・・・

void Swap_wave(Wave *a, Wave *b) {
Wave tmp = *a;
*a = *b;
*b = tmp;
}
void func(Wave *wavep){
Wave *wavepbuff = Alloc_wave();
〜〜
Swap_wave(wavepbuff, wavep);
Free_wave(wavepbuff);
}
int main() {
Wave *wavep = Alloc_wave();
〜〜
func(wavep);
〜〜
Free_wave(wavep);
}
31デフォルトの名無しさん:2008/11/12(水) 20:56:26
>>30
どのあたりがやめるべきでしょうか?
32デフォルトの名無しさん:2008/11/12(水) 21:01:22
Wave構造体の中身が完全に判ってない限り、Swap_waveの実装に危険の香りがする
33デフォルトの名無しさん:2008/11/12(水) 21:03:16
一応動作しました。


Swap_waveはポインタを差し替えてるだけですよね?
だったらwaveの構造体自体は書き換えずに、freeでステレオファイルの領域だけ消せばOKかな?と考えました。

甘いですかね?・・・・
34デフォルトの名無しさん:2008/11/12(水) 21:09:17
ポインタは値渡しされてるから指し変えられない

ポインタだけ指し替えたいなら
void func(Wave **wavep){

}
int main() {
Wave *wavep;

func(&wavep);

}
こうしなきゃ
35デフォルトの名無しさん:2008/11/12(水) 21:14:09
>>26ありがとうございます。スライシングですか。返り値がHogeなのは正解なんですが、
このPiyoクラスはスライシングが起きてもC++の規約上何の問題も無いでしょうか?
デストラクタもメンバ変数もないし、virtualな関数もオーバーライドしてないんですが
36デフォルトの名無しさん:2008/11/12(水) 21:14:31
30の場合は

tmpにwavepbuffの実体をコピー。


*a = *b;
wavepbuffを元のwavepを指すようにして


*b = tmp;
wavepが指す領域に実体をコピー


ってやってるんですか?


37デフォルトの名無しさん:2008/11/12(水) 21:50:44
VC++でExcelのファイル(.xls)を扱いたいんだが、バイナリを読むしか方法がないのか?
38デフォルトの名無しさん:2008/11/12(水) 22:18:34
COMれ
39デフォルトの名無しさん:2008/11/12(水) 22:27:12
>>34
関数の引数はWave *wavepのままに
ポインタだけ指し替えることはできますか?
4039:2008/11/12(水) 22:28:03
ちなみにC++です
41デフォルトの名無しさん:2008/11/12(水) 22:39:25
>>34じゃないが、
Wave *wavepは構造体のアドレスを指す”変数”だ。
その変数をコピーして呼ばれてるのに
呼び出し元の変数に入ってるアドレス値を変えることは出来ないよ
42デフォルトの名無しさん:2008/11/12(水) 22:43:31
void func(Wave *wavep){

Wave *pp //wave構造体へのポインタが入ってる変数へのポインタ

 pp = wavep;


 



}

こうですか?
43デフォルトの名無しさん:2008/11/12(水) 23:00:55
>>36
違う
Wave tmp = *a; ... tmpにwavepbuffの実体をコピー
*a = *b; ... wavepbuffが指す領域にwavepの実体をコピー
*b = tmp; ... wavepが指す領域にtmpの実体をコピー
常に実体 (Wave構造体の中身) をコピーしている
ポインタだけを交換することはできない状況だから、中身を交換するしかない

>>39
できない
44デフォルトの名無しさん:2008/11/12(水) 23:04:35
>>43
なるほど。
ポインタへのポインタをしたい場合は、void func(Wave **wavep)とやるしかないんですね・・・


引数そのままで、関数内でWave **p =&wavepとしたら、pには何がはいるんですか?
45デフォルトの名無しさん:2008/11/12(水) 23:11:42
>>44
func の wavep を指すポインタが入る
main の wavep を指すポインタではない
func の wavep と main の wavep は (たまたま名前が同じだけの) 異なる変数で、
アドレスも当然異なるから、func の wavep をどういじっても main の wavep には影響しない
46デフォルトの名無しさん:2008/11/12(水) 23:14:19
わかりました。引数として**pをもってこないとmain側には影響させられないということですね
47デフォルトの名無しさん:2008/11/12(水) 23:22:43
void func(Wave **wavep){

Wave *tmp; //構造体へのポインタ変数 アドレスが入る

tmp=あろけーしょん

*wavep = tmp; アドレスの実体をコピー


}


main(){

Wave *p;
func(&p);
}

こうですか?
48デフォルトの名無しさん:2008/11/12(水) 23:22:47
Wave *&でもいい。
49デフォルトの名無しさん:2008/11/12(水) 23:24:22
>>35分かる人いますか?
50デフォルトの名無しさん:2008/11/12(水) 23:25:47
>>48
どこの部分ですか?
51デフォルトの名無しさん:2008/11/12(水) 23:26:31
>>50
funcの引数
52デフォルトの名無しさん:2008/11/12(水) 23:27:32
スライシングがいくら起きてもそれ自体は言語的には何の問題もない
デストラクタがあってもメンバ変数があってもvirtual関数があっても構いはしない
問題はその動作が自分の意図と一致しているかどうかだ
53デフォルトの名無しさん:2008/11/12(水) 23:29:10
>>51
わかりました。ポインタが全然わかってないので、勉強しないと・・・

func内で

Wave **p;  

p =wavep;

としたらどういう事してますか? 
54デフォルトの名無しさん:2008/11/12(水) 23:50:33
わかったかもしれません

Wave *tmp; //構造体へのポインタ変数 アドレスが入る

tmp = あろけーしょん //モノラルファイル作る

Wave *tmp_p;

tmp_p = *wavep; //ポインタのポインタの実体すなわち main関数で宣言したWaveへのアドレスを代入 (最初あったファイルの領域)


*wavep = tmp; //mainで宣言したWaveへのアドレス を モノラルファイルのwaveへのアドレスに書き換え


Free_Sound(tmp_p); //一番最初にあった領域を解放


どこか間違ってますかね?
55デフォルトの名無しさん:2008/11/13(木) 00:11:14
:=ってなんですか?演算子で調べられません
56デフォルトの名無しさん:2008/11/13(木) 00:12:06
Cじゃねぇ。
57デフォルトの名無しさん:2008/11/13(木) 00:19:12
>>23
memcpyは解放しなくていいんですか?
そもそも変数を作ればメモリ容量があればメモリに格納されますよね?
なんでHeapAllocとかが存在するんですか?普通に配列変数を確保すればFreeもスコープはずれを活用すれば必要ないですよね?
58デフォルトの名無しさん:2008/11/13(木) 00:24:55
スコープを超えてデータを保持したい場合に困るじゃん
59デフォルトの名無しさん:2008/11/13(木) 00:28:50
>>57
何を勘違いしているのか知らんが、memcpy()はコピーだからメモリアロケートするわけじゃないぞ。
メモリ確保周りの再履修をお勧めする。
60デフォルトの名無しさん:2008/11/13(木) 00:42:37
気になってねれないので54にどなたか答えていただけませんか?

本当に勝手ですいませんが
61デフォルトの名無しさん:2008/11/13(木) 00:45:15
>>55
パスカル系言語の代入演算子かもね
62デフォルトの名無しさん:2008/11/13(木) 00:45:46
>>60
寝ろ。
分かるまでだと今日明日くらいは徹夜になるぞwww
63デフォルトの名無しさん:2008/11/13(木) 00:47:03
>>62
そんなに間違ってますか?
ますます練れません・・・
64デフォルトの名無しさん:2008/11/13(木) 00:47:58
メモリリークの対応面白いですね。やっとこの壁までこれた感じですが、これだけ教えてください。
解放しないで再度HeapAllocした場合なぜポインタとハンドル名が同じなのにメモリリークしていくんですか?
もしかして、変数もスコープはずれてないと、確保した変数が番地行方不明なだけで再利用不可能ゴミ領域として残って
あ!それがnewしたらdeleteなのかわかっちゃったthx
65デフォルトの名無しさん:2008/11/13(木) 00:51:27
  ( ゚д゚ )
_(__つ/ ̄ ̄ ̄/_
  \/    /
66デフォルトの名無しさん:2008/11/13(木) 01:03:50
面白いと言ってるうちは幸せだ
そのうち辛く苦しいものになることうけあい
67デフォルトの名無しさん:2008/11/13(木) 10:43:39
>>64
借りた1万円なくして返さないまま追加で借りた1万円を同じ財布に入れたのに
なんで借金が増えてるんですか?みたいだなあ。
>ポインタとハンドル名が同じなのに
ポインタは別のものが与えられる。ハンドル名に至っては意味不明。
68デフォルトの名無しさん:2008/11/13(木) 11:06:09
もうデフォですまぽ使っちゃうぐらいにしchinaよ
69デフォルトの名無しさん:2008/11/13(木) 12:24:43
C勉強中の初心者ですがVS2005以降プロジェクトのプロパティで
「SSE/SSE2最適化」オプションが付いたとのことで、早速オンにして
コンパイルしましたが、さっぱり早くなりません。

printf ("%d回LOOP実行中\n",loop);
    for (int i = 0; i < loop; i++){
        for (int j=0; j<4; j++){
            s1[j] = double(rand()) / 32767;    /* 0〜1までの乱数*/
            s2[j] = double(rand()) / 32767;
        }
        for (int k=0; k<4; k++){
            result[k] = s1[k] * s2[k];
        }
    }

上のように、変数LOOPを1億として4個の配列に浮動小数点乗算を格納する処理を
行いましたが、SSE有り無しにかかわらず36秒かかりました。

SSEの効果が実感できるようなコードはどう書けばいいんでしょうか?
70デフォルトの名無しさん:2008/11/13(木) 13:58:19
>>69
rand呼んでる時点でSIMD化できないよ。
インテルにCPUの命令が載ったリファレンスあるからそれで仕様確認して素直に書けばSIMD化してくれる。
71デフォルトの名無しさん:2008/11/13(木) 17:02:51
IA32最適化リファレンスちらっと読みましたが
インラインアセンブリとかによるSSE活用ですね。

        for (int k=0; k<4; k++){
            result[k] = s1[k] * s2[k];
        }
この箇所はSIMDの得意分野のような気がするのですが、
なんでダメなんでしょう。doubleをfloatに変えてもみましたが同じでした
72デフォルトの名無しさん:2008/11/13(木) 18:18:12
SSE最適化のオプションってベクタ演算は使ってくれないよ。
http://msdn.microsoft.com/ja-jp/library/7t5yh4fd(VS.80).aspx
> SSE と SSE2 は、SSE/SSE2 命令およびレジスタを使用する方が
> x87 浮動小数点レジスタ スタックを使用するよりも高速であると判断された場合に、
> 一部のスカラ浮動小数点演算に使用されます。

128ビットフルに使いたければ、自分で組み込み関数を呼ぶかインラインアセンブラ。
73デフォルトの名無しさん:2008/11/13(木) 21:10:22
そうでしたか〜。残念。
浮動小数点演算をFPUからSSEに切り替えるだけみたいですね。

インラインアセンブラ調べてきます・・
74デフォルトの名無しさん:2008/11/14(金) 00:36:03
iccなら、黙っててもベクタ化してくれるよ。
75デフォルトの名無しさん:2008/11/14(金) 08:44:49
他のクラスの関数を操作する方法がわからなくて、メッセージ処理でやってたら数が半端ないことになってきた
メッセージ処理を多様するのはやばい?なにか問題が出て来りする?
76デフォルトの名無しさん:2008/11/14(金) 11:23:09
iccコンパイラって8万もするんだね。買ってる人はマルチコア最適化のためだけに
8万も払うのかな
77デフォルトの名無しさん:2008/11/14(金) 11:42:41
世の中にはRunAsDateというものがあってだな
78デフォルトの名無しさん:2008/11/14(金) 12:02:04
8万で窓版買うより8万出して新しいPC買って
それにlinuxとlinux版icc入れた方がよさそうだなw
79デフォルトの名無しさん:2008/11/14(金) 17:40:11
>>76
頭痛が痛い
80デフォルトの名無しさん:2008/11/14(金) 19:38:03
>>76
8万もするのにVSに寄生しなければいけないって信じられないよな。
81デフォルトの名無しさん:2008/11/15(土) 01:34:44
VC++コンパイラの最適化でもICCに遜色ないと思うけどなぁ
どんなコード書けば差が出るの?
82デフォルトの名無しさん:2008/11/15(土) 03:36:27
>>72,74のような場合じゃないの
83デフォルトの名無しさん:2008/11/15(土) 06:03:44
iccなら、SSSEにもSSE4にも対応しています。
オブジェクト間最適化も負けていません。
84デフォルトの名無しさん:2008/11/15(土) 13:18:03
>>83
すげえ!SSSEに対応してるのか!
85デフォルトの名無しさん:2008/11/15(土) 14:10:28
本を読んでると出てきたのですが

struct A
{
int x;
A()
{
x = 0;
}
};

struct B : public A
{
int y;
};

こんな感じのコードが出てきて、実際サンプルコードのコンパイルも通ったのですが
・構造体にコンストラクタを入れる
・構造体を継承した構造体を作る
こんなんアリでしたっけ?
それと、classにするのに比べてどんなメリットがあるんでしょうか
86デフォルトの名無しさん:2008/11/15(土) 14:11:23
icc11は対応しているって御大が言っていた。どこまで積極的に使うかは知らんけど。
87デフォルトの名無しさん:2008/11/15(土) 14:14:41
>>85
classとsutructの違いは、ディフォルトがpublicかprivateかだけ。
でも、そういう使い方をするならclassにして欲しいと思うけどね。

個人的なclassとstructの使い分け。
・データメンバを公開するならstruct
・只のアクセッサやコンストラクタではない能動的なメンバ関数を持つならclass
・継承されるならclass
88デフォルトの名無しさん:2008/11/15(土) 14:15:20
ついでに言えば、コンストラクタで代入するならくらいなら初期化リストでやれよと思う。
89デフォルトの名無しさん:2008/11/15(土) 14:27:02
C#だと値型と参照型っていう違いがあるのにC++はそれだけの違いなんだね
90デフォルトの名無しさん:2008/11/15(土) 17:03:04
void MsgBox( int a )
{
char s[256];
sprintf( s ,"%d" , a);
MessageBoxA( NULL, s,NULL,NULL);
}
void MsgBox( float a )
{
char s[256];
sprintf( s ,"%f" , a);
MessageBoxA( NULL, s, NULL,NULL);
}
void MsgBox( double a )
{
char s[256];
sprintf( s ,"%f" , a);
MessageBoxA( NULL, s, NULL,NULL);
}
void MsgBox( char *s )
{
MessageBoxA( NULL, s, NULL,NULL);
}
void MsgBox( wchar_t *s )
{
MessageBoxW( NULL, s, NULL,NULL);
}


まとめる方法を求む
91デフォルトの名無しさん:2008/11/15(土) 17:27:09
void MsgBox( tchar *s )
{
MessageBox( NULL, s,NULL,NULL);
}

int a;
tchar s[256];
stprintf( s ,_T("%d") , a);
MsgBox(s);
92デフォルトの名無しさん:2008/11/15(土) 18:21:10
>>91
その動作ならわざわざ作らないよ
数値を受け取れるようにね
93デフォルトの名無しさん:2008/11/15(土) 18:26:23
template <typname T>
void MsgBox( T s )
{
std::ostringstream os;
os << s;
MessageBoxW( NULL, os.str().c_str(), NULL,NULL);
}
94デフォルトの名無しさん:2008/11/15(土) 18:42:55
>>92
わざわざ作ってるのが間抜けだって思われたんじゃないかな
95デフォルトの名無しさん:2008/11/15(土) 18:57:06
>>93
thx

>>94
逆にこうしかできないのが残念だよね
96デフォルトの名無しさん:2008/11/15(土) 19:17:00
>>94 俺もそう思った
何でこんなの作るんだと思た
デバッグ用? てなことないよな
何に使うのか知いな>>95
97デフォルトの名無しさん:2008/11/16(日) 01:00:02
>90
void MsgPrintf(char *format, ...)
{
  va_list ap;
  char buf[1024];
  va_start(ap, format);
  wvsprintf(buf, format, ap);
  MessageBox(NULL, buf, NULL, MB_OK);
  va_end(ap);
}

MsgPrintf("%d %f", 1, 1.5);

デバッグ用に OutputDebugString に渡すやつなら使ってるが。
98デフォルトの名無しさん:2008/11/16(日) 01:01:26
ごめん。wvsprintf は %f に対応してなかったわ。
99デフォルトの名無しさん:2008/11/16(日) 12:30:19
100個のデータ配列を最初から1データ抜いて、最後に1データ入れてを繰り返して
いつデータ配列を参照しても最初のデータが配列番号0から始まる仕組みはSTLにありますか?どれを使えばいいんですか?
100デフォルトの名無しさん:2008/11/16(日) 12:36:13
>>99
deque
101デフォルトの名無しさん:2008/11/16(日) 12:41:10
thx!!
102デフォルトの名無しさん:2008/11/16(日) 17:17:48
>>98
vwprintf 使おうぜ
103デフォルトの名無しさん:2008/11/16(日) 18:59:32
VisualStudio2005pro使ってます。
バイナリをリソースに追加したいんですが、どうやってやりますか?
リソースビュー開いて 追加→リソース→ウィンドウが開く(リソースの追加)。
項目がAccelerator、Bitmap、Cursor、Dialog、HTML、Menu、StringTable、Toolbar、Version
しかないんですが、どうすればいいでしょうか?
104デフォルトの名無しさん:2008/11/16(日) 19:09:17
C++のライブラリとかで、年月を扱ってくれるのってないですか?
日のインスタンスを++したら翌日になったり、国名を与えれば、与えられた日が休日かどうかを
簡単に判定できたり。
105デフォルトの名無しさん:2008/11/16(日) 19:15:08
boost::date_time
106デフォルトの名無しさん:2008/11/16(日) 19:16:08
インクリデクリはともかく祝祭日は無理だろ
107デフォルトの名無しさん:2008/11/16(日) 20:42:47
>>103
C/C++でそれをやるんですよね。 
VSの操作をC/C++で書いたソフトでやりたいんですね。
108デフォルトの名無しさん:2008/11/16(日) 23:02:46
先行宣言で、

class X;
typedef boost::shared_ptr<X>  X::HandleType;

ってのが通るかどうかはやっぱ環境依存?
DS用のCodeWarriorは通してくれるんだけどVC++2008Expressだと

error C2027: 認識できない型 'X' が使われています。

って言われるんだよ。
109デフォルトの名無しさん:2008/11/16(日) 23:04:08
すまん、あげてしまった。
110デフォルトの名無しさん:2008/11/16(日) 23:19:52
class Xのポインタしか使わないならコンパイル通るんじゃね?
Xの具体的な情報が必要ならムリ
111デフォルトの名無しさん:2008/11/16(日) 23:42:21
>>108
typename
112108:2008/11/17(月) 00:11:49
>>110-111
レスありがとう。

typedef typename boost::shared_ptr<X> X::HandleType;

にしてみたら、

error C2899: 型名はテンプレート宣言の外側で使用できません。

が増えた。
X::HandleType を X_HandleType とかにすりゃあ行けるんだがなあ。
やはり、クラス内typedefを先行宣言できるCodeWarriorが変態的なだけなんだろうか…。
113デフォルトの名無しさん:2008/11/17(月) 00:12:13
char str[][5]={"OUT","CD","RING"};

この配列を関数の実引数として使うにはどのような形にすればよいでしょうか?
114デフォルトの名無しさん:2008/11/17(月) 00:20:30
void nanika(char (*x)[5])
115デフォルトの名無しさん:2008/11/17(月) 00:20:38
>>113
実引数?
hoge(str);
でいいんじゃ。
116デフォルトの名無しさん:2008/11/17(月) 00:25:03
>>113
f( {"OUT","CD","RING"} );
117デフォルトの名無しさん:2008/11/17(月) 00:26:57
>>114
char (*x)[5] って仮引数じゃね
118デフォルトの名無しさん:2008/11/17(月) 00:27:01
>>116
それいけんの?
119デフォルトの名無しさん:2008/11/17(月) 00:32:11
私は>>113 ではありません。でも、Qがあります。
char str[][5]={"OUT","CD","RING"}; を
参照渡しで、関数に渡す場合の
仮引数と実引数てどう書くんですか?
120デフォルトの名無しさん:2008/11/17(月) 00:39:55
>>116 じゃ
f( char str[][5]={"OUT","CD","RING"} );
121デフォルトの名無しさん:2008/11/17(月) 00:40:50
hoge(char str[][5])
{
}

hoge(str);

122デフォルトの名無しさん:2008/11/17(月) 00:41:33
参照渡しだからC++の話だと思うよ
123デフォルトの名無しさん:2008/11/17(月) 00:46:10
124103:2008/11/17(月) 06:05:54
>>103です。
すみませんできました。
良く調べないでカキコミしてすみません。
○○.rcファイルを右クリック→コードの表示
以下を○○.rc以下を最後に記述。
DATANAME DATATYPE DISCARDABLE "DATA_Path"
○○.cppで
HGLOBAL hResource = LoadResource( NULL, FindResource( NULL, TEXT("DATANAME"), TEXT("DATATYPE") ) );
LPBYTE lpResrouce = (LPBYTE)LockResource(hResource);

チラ裏&スレ汚しスマソ。

125デフォルトの名無しさん:2008/11/17(月) 11:36:36
スレッドを生成して、メイン、サブ各々のスレッドでメモリをマッピングする。
その共有メモリで各スレッド間のデータがやり取りされているのを
確認したんだけど教授が言うには共有メモリの確認にはならん!だそうです。

共有メモリを用いてのプロセス間通信の確認…どのようにすればいいですか?
なぜスレッドだと共有メモリの確認にならないかも良くわかってない状態ですが…
126デフォルトの名無しさん:2008/11/17(月) 11:42:42
プロセス間共有メモリ≠スレッド間共有メモリ ってことを言いたいんじゃないの?

スレッド間共有できたからといって、プロセス間共有できてないかもしんない手法使ってないか?という危惧やな
127デフォルトの名無しさん:2008/11/17(月) 11:46:44
>>125
プロセス間通信(Inter Process Communication)のための共有メモリを
同一のプロセス内で確認してどうするwww
山田家と佐藤家とのネット間通信(Inter Net Communication)が通じるかを
確認するのに、山田兄弟が家庭内LANだけで確認するようなものだぞ。
128デフォルトの名無しさん:2008/11/17(月) 12:06:11
>>118
C99なら。

>>121
const 付けれ。
129デフォルトの名無しさん:2008/11/17(月) 13:43:34
C++でchar*の文字列をstringに変換するときはどうすればよいですか?
単純に代入すると、deprecatedという警告がでます。
130デフォルトの名無しさん:2008/11/17(月) 13:47:49
>>129
どう書いたらどう警告が出たの詳しく。
131デフォルトの名無しさん:2008/11/17(月) 13:50:09
// test.cpp
1: #include <iostream>
2: int main() {
3: char *a = "aaggff";
4: std::string s = a;
5: return 0;
6: }

$ g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:3: warning: deprecated conversion from string constant to ‘char*’
132デフォルトの名無しさん:2008/11/17(月) 13:56:40
const char * a = "aaggff";
133デフォルトの名無しさん:2008/11/17(月) 13:57:19
つまり、>129は頓珍漢なところで悩んでいたのね。
134デフォルトの名無しさん:2008/11/17(月) 13:57:41
>test.cpp:3: warning
      ↑
3行目だっつってんだ。
135デフォルトの名無しさん:2008/11/17(月) 14:20:44
>>131
文字列定数を 'char*' に変換するのは推奨されません
136デフォルトの名無しさん:2008/11/17(月) 14:33:48
たとえ日本語でこの警告が出ても同じ質問したんじゃないかと思う
137デフォルトの名無しさん:2008/11/17(月) 14:48:38
>>126-127そゆことかー
どうもありがとう

じゃあ別プログラムをもう一本用意してやり取りが出来ているかを
確かめてみます。
138デフォルトの名無しさん:2008/11/17(月) 14:59:33
c言語で√の計算させたいんですが

<math.h>を利用
float a,b,c,A,B
A=pow(b,2)ー4*a*c
B=sqrt(A)

これだとAの平方根を計算してくれないみたいなんですがなぜでしょう?
途中や色々省いていますがよろしくおねがいします
139デフォルトの名無しさん:2008/11/17(月) 15:03:01
>>138
>138を見る限り、計算される筈だ。
自分の馬鹿さを棚に上げないで、ちゃんと省かずに貼れ。
ついでに言えば、二乗程度にpow()は使うな。
140デフォルトの名無しさん:2008/11/17(月) 15:03:34
>>138
#include <math.h>
int main() {
float a,b,c,A,B;
a = 2; b = 6; c = 3;
A=pow(b,2)-4*a*c;
B=sqrt(A);
printf("%f\n", B);
}
実行結果
3.464102

問題なさそうに見えるが
141デフォルトの名無しさん:2008/11/17(月) 15:03:42
もう一つ忘れていた。
必要がない限り、floatは使うな。doubleを使え。
142デフォルトの名無しさん:2008/11/17(月) 15:07:07
速度向上と省メモリにはなる。float
しかし、計算が誤差などにより間違った結果が出やすい
慎重に使うべきだな float
143デフォルトの名無しさん:2008/11/17(月) 15:07:18
全部見ないとなにがおかしいのかわからないな
144デフォルトの名無しさん:2008/11/17(月) 15:10:22
float で演算速度が速くなるかどうかは環境依存じゃね?
145デフォルトの名無しさん:2008/11/17(月) 15:15:23
わざわざ問題なさそうな部分を選んでるからな、しかも手打ち
146デフォルトの名無しさん:2008/11/17(月) 15:15:41
うちの環境ではfloatが速い あとこの人も。

intelコンパイラの場合
long double > double > float と計算時間が短くなる.(おそらくメモリの消費量が減るため)
80bit > 64bit > 32bit と計算時間が短くなる.(おそらくCPUの計算量が減るため)
という傾向が観測できた.

gcc の場合上記と同様の実験を gcc-4.1.1 (20060619) でも行った.
いずれにせよ,iccと同じようにgccでも,
精度を落とすと処理速度が向上する
型を落とすと処理速度が向上する ことはたしかな様だ.

http://d.hatena.ne.jp/pyopyopyo/20060918/p1
147デフォルトの名無しさん:2008/11/17(月) 15:16:25
>>138はできたのか?
148デフォルトの名無しさん:2008/11/17(月) 15:18:11
JAVAでも・・

乗算はfloatの方がdoubleより速い
java.lang.Mathによる平方根の計算はdoubleの方がfloatより速い
http://www.asahi-net.or.jp/~dp8t-asm/java/tips/OptUseFloat.html
149デフォルトの名無しさん:2008/11/17(月) 15:21:01
まあCPUの仕組みに依存するんだろうがな。 
150デフォルトの名無しさん:2008/11/17(月) 15:24:54
>>148
いくらなんでもPentiumProとかJDK1.1.4は古すぎる
151デフォルトの名無しさん:2008/11/17(月) 15:26:18
>>146
まぁ、ソースも提示しないんだったら何とでも結果を誘導できるからね。

仮に、c99でもC++でもない只のCで超越関数を使う場合、
double版の超越関数が用意されていないからdoubleの方が確実に速くなる。
また、floatだけで計算させるように(doubleへの暗黙の変換が起きないように)
コーディングするのはコツがいるからその点でも、一般向きじゃない。
152デフォルトの名無しさん:2008/11/17(月) 15:28:53
>>138です。レスありがとうございます。
今は携帯から書き込んだので後でPCから全部書いてみます。
153デフォルトの名無しさん:2008/11/17(月) 15:34:49
>146のこの辺もなんだかなぁ。
>long double > double > float と型を切り替えると,速度は1割程度づつ向上し,
2.232(double)が2.188(float)になるのは高々2%の短縮でしかないと思うのだけど。

それに、iccでベクタ化するような処理が対象だというところにも注意。
つまり、連続的に配列要素を演算するような処理だということなのだろう。
このような、頻繁にメモリをアクセスするような応用では確かにfloatは有利だろう。
しかし、そうでない応用ならdoubleとの差はますます縮むことになりそうだ。
154デフォルトの名無しさん:2008/11/17(月) 15:35:57
floatとdoubleの比較といったら、標準関数の速度は考えないもんだ。
速度は、キャスト <<< 標準関数の呼び出しと実行だ。
関数に費やされる時間がほとんど。 キャストが加わる分だけ少しだけ遅くなる。
実行せずに分かる
155デフォルトの名無しさん:2008/11/17(月) 15:49:31
fpuで演算できる超越関数については、キャストの方が時間が掛かる。
実行せずに判る。
156デフォルトの名無しさん:2008/11/17(月) 15:52:52
計算速度を知りたいのに、関数実行やキャストの時間は関係が無い。
157デフォルトの名無しさん:2008/11/17(月) 15:55:50
>>156
注意深くfloat同士の演算のみを行い、標準関数も使わずにメモリアクセスもしないという条件でよろし?
158デフォルトの名無しさん:2008/11/17(月) 15:59:15
そういうことだな
159デフォルトの名無しさん:2008/11/17(月) 15:59:17
いろいろ前提条件を整理しないと無駄な議論になりそうな予感
160デフォルトの名無しさん:2008/11/17(月) 16:00:54
161デフォルトの名無しさん:2008/11/17(月) 16:07:28
大昔のCPUでは、double型の演算子しか入って無くて、間違いなくfloatの方が遅かった。
しかし現在は、32bitとそれ以上の小数点演算がハードウェアとして計算できるようになっている。
単純考えて1ビットを扱えより2ビットの方が難しく、同様に32bitよりかは64bitのほうが難しい。
162デフォルトの名無しさん:2008/11/17(月) 16:17:18
>160の記事はアセンブリ出力にまで立ち入っているので判り易いね。
これでSSEにまで触れられていればほぼ完璧なのに。

まぁ、所要時間は大抵の応用では大差ないのだから、
わざわざ使い難いfloatを使うまでもないと思うのだけど。
# 実数リテラルを書くときに、一々1.0fなんて書きたい? 私は1.0で済ませたいね。
163デフォルトの名無しさん:2008/11/17(月) 17:31:28
>>162
SSEでのdoubleとfloatの差ならインテルのリファレンスに載ってるぞ。
double除算がfloatの倍かかる以外は同じ。
164デフォルトの名無しさん:2008/11/17(月) 18:50:26
お前ら、仕事つまらんからと会社でネットカフェ...するなよな。
今のx86系ならdoubleだろ、floatはCPUの演算部が貧弱だった時代に
小数点演算したかで作った型なんだろ
165デフォルトの名無しさん:2008/11/17(月) 19:15:37
>>164
いやもう、時代に取り残されているから。
# いろんな意味で。
166デフォルトの名無しさん:2008/11/17(月) 20:42:51
>>163
除算なんて普通使わんから関係ないな。
167デフォルトの名無しさん:2008/11/17(月) 22:13:11
>>164
>>160も見れないのか。そんな言い方ができるなら、見れなかったとしても
doubleがx86のFPUレジスタとは大きさが合わないのは知っているだろう。
168デフォルトの名無しさん:2008/11/17(月) 22:23:21
実際にfloat使っている?
おれ、全然使ってない、doubleだけだな。
169デフォルトの名無しさん:2008/11/17(月) 22:46:03
誘導先から誘導されて着ました
VC++6でwindows2000を使っています。
beep音を非同期で指定時間鳴らしたいです。
できれば、WAVじゃなくてマザーボードからなる様にしたくてスレッドは使わないで済ませたいです。
メインでbeepを開始してタイマー割り込みでbeepを指定時間後に止めるような仕組みがいいのですが・・・。
何か方法はありますでしょうか?
170デフォルトの名無しさん:2008/11/17(月) 22:48:00
全く自分では考えてないのか?
171169:2008/11/17(月) 23:03:00
>>170
正直、自分では全く考えてないです。
スレッド使って別スレッドでbeep鳴らすくらいしか思いつきません。
WAVファイルなら非同期でできるけど、beep音は自分で作らないといけないし、
サウンドカード載ってないといけないし。
172デフォルトの名無しさん:2008/11/17(月) 23:18:03
APIスレで聞いたら?
173デフォルトの名無しさん:2008/11/17(月) 23:19:42
Beep ON / OFF というペアのAPIじゃないからな
Beep 時間 というインターフェイスである以上
鳴っている間メッセージポンプしたけりゃスレッド起こす以外の方法は無いだろう

※ Beep ON / OFF というインターフェイスの API があれば別
174169:2008/11/17(月) 23:23:17
>>172
Win32APIスレから誘導されてきました。

>>173
まぁ〜、そうなりますよね。
そういうAPIがないか調べたかったわけです。
そして、ググっても見つからないので、多分ないんでしょうね・・・
175デフォルトの名無しさん:2008/11/17(月) 23:43:54
>>174
Beep API場合鳴らす周波数、鳴らす時間幅しか設定できない。
自分でBeepOnでなりっぱなし、BeepOffしたければ、I/Oポートドライバを作成し
それ経由でbeepを制御
176169:2008/11/17(月) 23:54:08
>>175
I/Oポートドライバはさすがに・・・。
platformSDKとかなんとかが必要そうですし。
とりあえず、CreateProccessでbeepをするプログラムを叩くようにしてみます。
177デフォルトの名無しさん:2008/11/18(火) 00:02:51
>>176
そんなの転がっているよ。参考、
http://crystaldew.info/category/openlibsys/

ただ、BeepOn、BeepOffするためだけにドライバーを用意ってのがアホらしいがな
178デフォルトの名無しさん:2008/11/18(火) 00:07:40
visual studio2008のコンパイル方法がどっかに載ってたと思うんですけど
どこか分かる方教えて下さいませ。
179デフォルトの名無しさん:2008/11/18(火) 00:08:29
>>178
visual studio2008のソースって流出してたっけ
180169:2008/11/18(火) 00:11:45
>>177
さすがにドライバを用意するまでしたい事でもないので、我慢します。
181デフォルトの名無しさん:2008/11/18(火) 00:26:00
sprintf(buf, "%s", buf);のように領域が重なっていると誤作動するようですが、

char *test(char *buf){
  static char tmp[100];
  snprintf(tmp, 100, "%s", buf);
  return tmp;
}
という関数があったとき、main関数でbuf = test(buf);と記述すると、同様の問題は起こるのでしょうか?
182デフォルトの名無しさん:2008/11/18(火) 00:37:30
>>181
main()のbufが配列でなければ大丈夫かもしれません。
少なくとも、引き数のbufが戻り値のbufに影響を及ぼすことはありません。
183デフォルトの名無しさん:2008/11/18(火) 00:38:10
むしろ、mainでのbufはどこ行っちゃうんだ。
184デフォルトの名無しさん:2008/11/18(火) 00:38:55
配列でなければ?
185184:2008/11/18(火) 00:39:40
ああ、配列だったら代入できないか。
186デフォルトの名無しさん:2008/11/18(火) 00:44:46
>>183
仮にbufがmalloc()の戻り値を格納してたりした場合、test()呼び出しによって失われてしまうので解放できなくなりますね。
187デフォルトの名無しさん:2008/11/18(火) 00:46:20
これだったら2行目は同様にまずいな。
buf = test("hoge");
buf = test(buf);
188181:2008/11/18(火) 01:00:05
>>182-187
ありがとうございました。
189デフォルトの名無しさん:2008/11/18(火) 13:57:09
double time;
timeに秒数が入るらしいんですが、timeの中を見ると6.35235・・・・・e、みたいな数値になってるんですが、
これどうやって秒にするんですか?たぶん180秒ぐらいだと思うんですが、変換方法を教えてください。
190デフォルトの名無しさん:2008/11/18(火) 14:05:59
static_cast<int>(time);
191デフォルトの名無しさん:2008/11/18(火) 14:07:07
>>189
そんな変なこと教えた奴に聞け。標準にはそんなもの存在しない。
192デフォルトの名無しさん:2008/11/18(火) 14:07:38
その6.3523みたいな数字が180秒なのか?w
193デフォルトの名無しさん:2008/11/18(火) 14:08:56
>>190
いや、馬鹿を晒さなくてもいいから。

>>189
difftime()なら、戻り値がそのまま秒数だ。
何をどう使ってtimeに秒数を入れたつもりになっているんだ?

# インクルード忘れで型化けしたかな?
194デフォルトの名無しさん:2008/11/18(火) 14:11:27
static_cast<int>(time * 0.03529083);
195デフォルトの名無しさん:2008/11/18(火) 14:14:51
膨大な時間量で指数部に100とか200とかついてましたーだったらどうすんだ。
196デフォルトの名無しさん:2008/11/18(火) 15:13:00
>>194
すごいできました。ありがとうです。
その0.35はいったいどこから出てくるんですか?
197デフォルトの名無しさん:2008/11/18(火) 15:14:51
>>194
いや、馬鹿を晒さなくてもいいから。
198デフォルトの名無しさん:2008/11/18(火) 15:17:01
>>196
所要時間に関わらず、常に一定の値がでないか?
199デフォルトの名無しさん:2008/11/18(火) 15:39:49
>>198
なります。電卓で計算したらあってたので。intじゃなくてdoubleですね?
200デフォルトの名無しさん:2008/11/18(火) 15:41:35
C言語の分かる小学生ですか?すごいですね。
201デフォルトの名無しさん:2008/11/18(火) 15:45:00
やばいですtimeが175.785875って数字がでてきました
これに0.03529083を掛けると全然違う秒数になってしまいます。
助けてください
202デフォルトの名無しさん:2008/11/18(火) 15:50:11
分かったからtimeにはいる値が導出される過程を教えてくれ。
203デフォルトの名無しさん:2008/11/18(火) 15:50:12
あ、これ秒数がもうすでに出てきました。
さっきはなんで6.35235・・・・・eが出てきたんだろう・・・
やばいです、なんかこれC関係ないような気がしてきました。電卓が桁溢れエラーのときどう表示するかの問題な気がしてきましたすいません
204デフォルトの名無しさん:2008/11/18(火) 15:51:28
DirectShowのIMediaPosition::get_Durationの引数値です。
205デフォルトの名無しさん:2008/11/18(火) 15:58:39
>>203
初期化されていない自動変数に何かを期待してはいけない
206デフォルトの名無しさん:2008/11/18(火) 16:13:41
C++で参照の参照はゆるされないのですか?
void hoge(vector<string> & arg) { boge(arg); }
void boge(vector<string> & arg) { }
int main() { vector<string> & list; hoge(list); }
参照の参照はだめだと先生がいうのですが、なんでだめなのかわからないです。
207デフォルトの名無しさん:2008/11/18(火) 16:17:40
vector<string> & list←初期化されてない
208デフォルトの名無しさん:2008/11/18(火) 16:18:12
名前空間で区切って変数をすべてグローバルにする規則はありですか?
209デフォルトの名無しさん:2008/11/18(火) 16:22:20
>>208
無名ネームスペースのこと?とりあえずわかるように頼む。
210デフォルトの名無しさん:2008/11/18(火) 16:35:07
いえ名前付きで、アクセスしやすいようにクラスの外に置いて統一したいということです
211デフォルトの名無しさん:2008/11/18(火) 16:41:07
>>206
だめ
参照の参照問題でぐぐってみ
これが原因でSTLでエラーが出る事がよく起きたため
boost::bindが作られた
212デフォルトの名無しさん:2008/11/18(火) 16:45:31
>>206
C++でだめなのはint& &のような参照への参照という型。
テンプレートを使っていると意図せず現れる可能性がある。
http://boost.cppll.jp/HEAD/libs/functional/binders.html
213デフォルトの名無しさん:2008/11/18(火) 16:58:33
>>210
グローバルに置きたい変数を纏めたクラスを作るのが無難じゃね?
214デフォルトの名無しさん:2008/11/18(火) 17:02:14
/////////////////funcAAA.h//////////////////
#pragma once
#include "funcBBB.h"

class funcAAA;
/////////////////funcBBB.h//////////////////
#pragma once
#include "funcAAA.h"

class funcBBB : public funcAAA



err:定義されていない基本クラスが宣言されています。;

無理ぽ?
215デフォルトの名無しさん:2008/11/18(火) 17:17:20
>>208
だがしかし待って欲しい
もっと構造を考えれば色々なクラスに分配できるんじゃないだろうかと
216デフォルトの名無しさん:2008/11/18(火) 17:20:39
>>214
Bが読み込まれたときにinclude A.hでinclude B.hされているので
class funcAAより先にclass funcBBB : public funcAAAがでてきてエラーになっている

個人的には何故A.hでBをincludeしているのかが理解しがたい
217デフォルトの名無しさん:2008/11/18(火) 17:23:36
グローバルじゃなくてネームスペーススコープに移すとかなんじゃねーの?
ヘッダに含めないんだったらグローバル(ファイル)スコープっていうのも十分ありだと思うけど
218デフォルトの名無しさん:2008/11/18(火) 20:40:03
フレンドクラスについて教えてください。
2通り見かけるのですが、宣言の仕方は、下のどちらでもいいのでしょうか?
friend class ClassA;
friend ClassA;
また、クラス内でfriend指定する場所ですが先頭に書くのが普通でしょうか?
public節に置くのとprivate節に置くのでは違いがありますか?
インデントせず書いてある例も見かけるのですが皆さんどうしておられますか?
219デフォルトの名無しさん:2008/11/18(火) 21:10:45
>friend class ClassA;
>friend ClassA;
外側がテンプレートなら上じゃなきゃダメ(下はClassAがクラス名かどうかわからない)
そうでなけりゃ一緒

>また、クラス内でfriend指定する場所ですが先頭に書くのが普通でしょうか?
どこに書いても意味は変わらん好きにしろ

>public節に置くのとprivate節に置くのでは違いがありますか?
全くない

>インデントせず書いてある例も見かけるのですが皆さんどうしておられますか?
メンバじゃないから区別したいんだろうな
個人の好みだ
俺は嫌い
220デフォルトの名無しさん:2008/11/18(火) 21:20:07
>>219
丁寧にありがとうございました!
221デフォルトの名無しさん:2008/11/18(火) 22:27:58
VC2008 Express Edition ver 9.0.30729.1 SP
Windows Vista BusinessSP1

上記環境で、下記コードをデバッグモードで動かしています。
(コードは某書籍より、ちょっと加工)

  string filename = "c:\\test.txt";
  const int N = 5;

  vector<int> v(N);

  fill(v.begin(), v.end(), 55);

  ofstream ofs(filename.c_str());
  if (ofs) {
    copy(v.begin(), v.end(), ostream_iterator<int>(ofs));
    ofs.close();
  }
  else cout << "output file open error." << endl;

管理者に昇格のダイアログも何も出ずにエラーとなるのですが、
何か設定はないのでしょうか?

もちろんEXEを管理者設定して動作させると大丈夫なのですが。

そもそも、VistaではCドライブ直下にファイルを作成しにいくこと自体が間違い?
222デフォルトの名無しさん:2008/11/18(火) 22:34:24
>>221
某書籍の名前を言わないと、誰も教えてくれませんよ
223デフォルトの名無しさん:2008/11/18(火) 22:40:56
知らないならレスしないで下さい。ウザイだけです。
224デフォルトの名無しさん:2008/11/18(火) 22:41:40
>>222
ええ?それが重要なの?
「標準C++:STLの基礎知識」ですが、問題は

>  string filename = "c:\\test.txt";
ここだと思うのですが
225デフォルトの名無しさん:2008/11/18(火) 22:45:02
>>224
じゃ"A:\\test.txt" にしたら
226デフォルトの名無しさん:2008/11/18(火) 22:48:15
227デフォルトの名無しさん:2008/11/18(火) 22:52:07
WriteFile()での書き込み先にSOCKETを使うにはどーすればいいんでしょうか。
具体的にはTCP/IP接続のプリンタにジョブを投げたいんですが。
228デフォルトの名無しさん:2008/11/18(火) 22:59:19
WinAPIスレで聞くといいと思います。
229デフォルトの名無しさん:2008/11/18(火) 22:59:29
>>226
ユーザー権限で実行で書き込み権限ないところにカキコしようとしていると妄想
230デフォルトの名無しさん:2008/11/18(火) 23:08:02
>>226
おお、ありがとうございます。
が、うまくいかなくて、調べていたら、下記ページが。

http://blog.chiztek.net/?p=66

まさにこれですね。
231デフォルトの名無しさん:2008/11/18(火) 23:09:14
あ、すみません、言葉足らずで。
230の方法で、デバッグモードでも管理者に昇格ダイアログが出るようになりました。
232デフォルトの名無しさん:2008/11/18(火) 23:17:02
>>228
すいまへん、移動します。
233デフォルトの名無しさん:2008/11/18(火) 23:24:47
>>227
ソケットをHANDLEにキャストして1番目の引数に渡す。
234デフォルトの名無しさん:2008/11/19(水) 07:58:32
Class::Function();
を実行したら静的でなからだめだと言われたので、
static void Function();
と書き直したんですが、エラーが出ます。
これは他のクラスでインスタンスを既に作っている場合問題があるんでしょうか?
235デフォルトの名無しさん:2008/11/19(水) 08:11:58
>>234
文章からは何を言ってるか推測できないから、もう少し前後のコードも書いてみて
236デフォルトの名無しさん:2008/11/19(水) 08:27:41
class ClassA
{
 ClassB m_classBincet;
}


class ClassB
{
 public:
  static void FunctionB();
}


include "ClassB.h"
class ClassC
{
}
ClassC::FunctionC()
{
 ClassB::FunctionB(); //これがエラーになるんです。
}
237デフォルトの名無しさん:2008/11/19(水) 08:33:13
未だによく理解できないんだよな、
なんでエラーメッセージの概念がまるっきり頭から飛んでる奴が多いのか。
この世の事象を「自分の願い」と「それ以外」より細かく分類する気がハナっから無いっつーか。
238デフォルトの名無しさん:2008/11/19(水) 08:34:41
だからお前は人を使うのが下手糞なんだよ
239デフォルトの名無しさん:2008/11/19(水) 08:38:01
あらやだ朝からチャカついてる子が来ちゃったわw
240デフォルトの名無しさん:2008/11/19(水) 08:40:03
>>238
大丈夫だよ、こんなのが下に付くレベルの職場には居ないから。

てか、君が就ける職場のレベルと一緒にされても・・・(^_^;
241デフォルトの名無しさん:2008/11/19(水) 08:51:01
つまり、自身が最底辺なんですね、判ります。
242デフォルトの名無しさん:2008/11/19(水) 08:53:26
自宅警備員なんですね
243デフォルトの名無しさん:2008/11/19(水) 08:55:59
ありがとうございます。
つまりこのコードの部分ではエラーがわからない(無い)ことがわかりました。
static文法がおかしいのかと思いました。どうもです
244デフォルトの名無しさん:2008/11/19(水) 09:16:04
誰もそんなこと言ってない。
245デフォルトの名無しさん:2008/11/19(水) 09:21:09
でもわかるんです。
246デフォルトの名無しさん:2008/11/19(水) 10:06:46
class ClassB
{
public:
static void FunctionB(){
}
};
class ClassA
{
ClassB m_classBincet;
};
class ClassC
{
void FunctionC();
};
void ClassC::FunctionC()
{
ClassB::FunctionB();//エラーになりませんよ?
}
int main() {
}
247デフォルトの名無しさん:2008/11/19(水) 10:12:28
なぜインデントしないでソース書き込む人が多いんだろう
全角空白に置換するのはそんなに面倒だろうか
248デフォルトの名無しさん:2008/11/19(水) 10:14:33
初心者スレだから
249デフォルトの名無しさん:2008/11/19(水) 10:16:11
JaneDoeStyleならCtrl + レス番でインデントされたものも見える。
250デフォルトの名無しさん:2008/11/19(水) 10:23:01
navi2chだとスペースでも正確に表示される

251デフォルトの名無しさん:2008/11/19(水) 10:34:07
datを直で端末に流し込むという方法もあるぞ
252デフォルトの名無しさん:2008/11/19(水) 11:05:00
>>247
読むのは回答者なのに、なぜ質問者がそんな気を遣わなくてはいけないんですか?
質問はこの書き方でも成立するわけですから、いちいちインデントのことなんか考える理由が
質問者には一切ありません。

自分が楽をするために、他人が苦労して当然と思うのは人間のクズのすることだと思いますが?
253デフォルトの名無しさん:2008/11/19(水) 11:11:16
> 自分が楽をするために、他人が苦労して当然と思うのは人間のクズのすることだと思いますが?

自分=質問者、他人=回答者?
254デフォルトの名無しさん:2008/11/19(水) 11:13:21
>>252
同意
聞いてる側が楽しようとするとかアホかと
255デフォルトの名無しさん:2008/11/19(水) 11:24:52
釣りだよね?これってでっかい釣り針だよね?
頼むから釣りだと言ってくれ・・・
256デフォルトの名無しさん:2008/11/19(水) 11:31:03
逆にコピペでエディタに持ってきて検証するときに全角空白は邪魔
&nbsp;でもいいが、これはこれでポップアップ時に全部出ちゃって見づらい。
普通にTABか半角スペースのが再利用時に面倒がなくていい。
257デフォルトの名無しさん:2008/11/19(水) 12:23:23
VC++に貼り付けてCtrl+AしてAlt+F8するので全角は邪魔
258デフォルトの名無しさん:2008/11/19(水) 13:50:49
あと、回答者はスペルミスするなってか?wwww
259低脳基地質問者:2008/11/19(水) 19:35:30
質問者は低脳でプログラム作れないのが99.9999%だが、回答者はプログラム
作れるんだろ。なら、全角スペースをTABや半角複数スペースに変換、
逆にTAB、半角複数スペースを全角スペースに変換するプログラムぐらい1-2秒で出来るだろ。
グダグダ言っているなら、低脳質問者のために素敵な変換プログラムぐらい作ってやれよ
260デフォルトの名無しさん:2008/11/19(水) 19:38:19
わざわざ作らんでもすでにあるテキストエディタの機能で変換すればいいじゃん
261低脳基地質問者:2008/11/19(水) 19:41:43
>>260
VSのえぢた、notepadにある?
で、そのテキストエディタてなによ?
262デフォルトの名無しさん:2008/11/19(水) 19:42:31
初心者様がそんな物使えるわけがないじゃん
あれだろイーマックスとかいう奴だろ
矢印キー使えないアホなエディタ
263デフォルトの名無しさん:2008/11/19(水) 19:43:59
置き換えすればよし
264デフォルトの名無しさん:2008/11/19(水) 19:44:54
gdgd文句言ってる奴らは質問に答えなければいいだけだろ
265デフォルトの名無しさん:2008/11/19(水) 19:46:44
CTRL+H を押して、変換元の文字と変換後の文字を入力して、すべて置換ボタンを押せば十分だろ
266デフォルトの名無しさん:2008/11/19(水) 19:50:35
俺は常連の質問者だけどメモリ解放されてなかろうがスペルミスがあろうが
気になんない。みなさんいつもありがとね。
267デフォルトの名無しさん:2008/11/19(水) 19:53:01
emacsでも矢印キーぐらい使えますが
268デフォルトの名無しさん:2008/11/19(水) 21:12:19
明らかに回答者でない人が釣り針垂らしてるよね
269デフォルトの名無しさん:2008/11/19(水) 21:13:13
間違えた。質問者でない人が釣り針垂らしてるよねだ
gdgd
270デフォルトの名無しさん:2008/11/19(水) 21:13:41
これと
int func() {
printf("hello.\n");
}

これ
int func() {
  printf("hello.\n");
}

初心者に優しいのは前者だよ。
>>270
271デフォルトの名無しさん:2008/11/19(水) 21:17:27
そうですかwwwwwwwww
272デフォルトの名無しさん:2008/11/19(水) 21:22:58
上はインデントを保ったままコピーできるが、
下はコピペ後、全角スペースを半角スペースに変換するという
超絶難解な作業が待っているからですよね、わかります。
273デフォルトの名無しさん:2008/11/19(水) 21:52:53
見た目より実用性だよね。
ITドカタは実力ないから見た目で勝負で、実用性、なにそれ?だからね
274デフォルトの名無しさん:2008/11/19(水) 22:19:42
荒れてるとこ質問。
1つだけnewしたものをdelete [] したら動作は未定義?
それとも無事1つ解放してくれます?
275デフォルトの名無しさん:2008/11/19(水) 22:24:41
>>274
鼻から悪魔
276デフォルトの名無しさん:2008/11/19(水) 22:38:26
>>275
マジっすか、困った
ありがとう
277デフォルトの名無しさん:2008/11/19(水) 22:58:16
>>275
では
int *i = new int[1];
delete [] i;
これは?だめっぽい雰囲気ですが
278デフォルトの名無しさん:2008/11/19(水) 23:02:05
>>277
OK
279デフォルトの名無しさん:2008/11/19(水) 23:29:20
>>278
ありがとう
int *i = new int;
int *i = new int[1];
上2つはdeleteでの解放以外はまったく同じ扱いでいい?
280デフォルトの名無しさん:2008/11/19(水) 23:48:23
>>279 同じようにも見えるし、違うかもしんない
※ 組み込み型だから結果的に同じの可能性は高いが

コンストラクタとデストラクタに printf 入れて
class を new [] 〜 delete と
new [] 〜 delete[] とを比較してみ。

delete[] では 暗に確保した要素数を知ってるから、
要素数を記憶する器のぶんの余計なヒ-プを確保している可能性は高い
281デフォルトの名無しさん:2008/11/19(水) 23:50:28
後者はint * j = i + 1してもいいけれど、前者はダメ。
282デフォルトの名無しさん:2008/11/19(水) 23:51:54
new int[1]の方がちょっとメモリ余分に取るかもしれない(配列の個数を保存するため)
それくらいかな
283デフォルトの名無しさん:2008/11/19(水) 23:54:47
>>280
なるほど
new intだとサイズ情報を確保しない→delete[]じゃまずい(サイズ情報を読み込むから)
new int[n]だとたとえn==1でもサイズ分を余分に確保→delete[]でも無問題
ということか(可能性が高い)
284デフォルトの名無しさん:2008/11/20(木) 00:10:35
char *txt;
int a = 1;

txt = "printf("a=%d",a");"

この状況で、txtの中身を命令として実行して
a=1
と出力するにはどうすればいいかねぇ
285デフォルトの名無しさん:2008/11/20(木) 00:14:26
>>284
何をしたいのか具体的に。
ソースコードをランタイムにコンパイルしたいと言うことなら、かなり無茶。
286デフォルトの名無しさん:2008/11/20(木) 00:17:40
>>284
一度txt の中身をファイル出力して、
gccのプロセスを起こしてコンパイルさせて
出来上がった実行ファイルを起動させて
そのまま表示させるなりそのプロセスとプロセス間通信して受け取るなりする
287デフォルトの名無しさん:2008/11/20(木) 00:25:10
どなたか教えてください。

int main(){
 int** x;
 int row(0),col(0);
 func(x,row,col);
 //xを使った処理がいろいろ
 for(int i=0;i<row;i++)
  delete [] x[i];
 delete [] x;
 return 0;
}
void func(int**& x, int& row, int& col){
 //ここでrowとcolは適当に決まる
 x = new int* [row];
 for(int i=0;i<row;i++)
  x[i] = new int [col];
 //適当な処理
 return;
}

以上のようなコードを実行すると、main関数内の最初のdeleteで、
「Windows によって sample.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。sample.exe または読み込まれた DLL にバグがあります。
あるいは、sample.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
プログラム '[5532] sample.exe: ネイティブ' はコード 0 (0x0) で終了しました。」
というエラーが発生して終了してしまいます。
確保されていない領域をdeleteしたときに発生するエラーのようですが、main関数で
xの中身を参照したときには値が入っていますし、確保されていない訳ではないと
思っているのでしょうが、何が原因として考えられますか?
288デフォルトの名無しさん:2008/11/20(木) 00:36:44
>>287
x[0]はなにですか?
x[1]はなにですか?
289デフォルトの名無しさん:2008/11/20(木) 00:43:19
>>281
そんなことないよ。
290デフォルトの名無しさん:2008/11/20(木) 00:44:39
>>289
kwsk
291デフォルトの名無しさん:2008/11/20(木) 00:45:22
もういいかげんに C++ の動的配列は new[] より先に std::vector を教えてあげて欲しい。
292287:2008/11/20(木) 00:50:56
>>288
すみません、おっしゃっていることの意味がよくわからないです。
x[0]やx[1]はint型の配列が割り当てられているのと思っていたのですが・・・

>>291
std::vectorを使いたいのは山々なのですが、vectorだとメモリ不足になったため
急遽new[]を使った形に書き直している最中です。
293デフォルトの名無しさん:2008/11/20(木) 00:51:16
>>290
5.7 加減演算子 p4
> これらの演算子においては,配列でないオブジェクトへのポインタは,配列要素の型として
> そのオブジェクトの型をもつ長さ 1 の配列の先頭要素へのポインタと同じ振る舞いをする。
294デフォルトの名無しさん:2008/11/20(木) 00:52:08
>>292
vector でメモリ不足になるんなら new[] 使っても解決しないでしょ。
そもそも何を見てメモリ不足になったと言ってるの?
295デフォルトの名無しさん:2008/11/20(木) 00:53:24
もう、malloc & free でいいんじゃね?
296デフォルトの名無しさん:2008/11/20(木) 00:54:00
>>293
なるほど。
297287:2008/11/20(木) 01:01:15
>>294
TSVファイルをint型の二次元配列に読み込もうとしているのですが、
vector<vector<int> >にvector<int>をpushしていったら、途中で
VC++のエラーが出てきて、メモリが足りないと怒られました。
ついでにリソースモニターを見ていたら、物理メモリを食いつぶされていました。

困って、ほかの部分を変えずにvectorで処理していた部分をnew[]に変えたら
メモリの方でエラーは吐かれなくなったけれど、今度は・・・という状態です。
298デフォルトの名無しさん:2008/11/20(木) 01:01:20
これでいいじゃん。
void func(int**& x, int& row, int& col){
  //ここでrowとcolは適当に決まる
  x = new int*[row];
  int *buf = new int[row * col];
  for(int i=0;i < row;i++) x[i] = &buf[i * row];
  //適当な処理
  return;
}

int main(){
  int** x;
  int row(0),col(0);
  func(x,row,col);
  //xを使った処理がいろいろ
  delete x[0];
  delete[] x;
  return 0;
}
299デフォルトの名無しさん:2008/11/20(木) 01:05:47
訂正
× for(int i=0;i < row;i++) x[i] = &buf[i * row];
○ for(int i=0;i < row;i++) x[i] = &buf[i * col];
300デフォルトの名無しさん :2008/11/20(木) 01:13:31
普通に以下のような処理をさしたけど問題なかったぞ
#include <iostream>
void func(int**& x, int& row, int& col);
int main(){
int** x;int k,j;int row = 10,col = 10;
func(x,row,col);
for(int i = 0; i < row;i++){
for(j = 0,k=1; j< col; j++,k++){
std::cout << x[i][j] << ' ';
if(!(k%10))
std::cout << '\n';
}
}
for(int i=0;i<row;i++)
delete [] x[i];
delete [] x;
return 0;
}
void func(int**& x, int& row, int& col){
int num = 1;
x = new int* [row];
for(int i=0;i<row;i++)
x[i] = new int [col];
for(int i = 0; i < row;i++){
for(int j = 0; j< col; j++){
x[i][j] = num++;
}
}
return;
}
301デフォルトの名無しさん:2008/11/20(木) 01:22:23
>>285
バグがないかチェックするのに、いちいちfprint・・fprint・・と打っていくのは面倒くさかったから、処理を関数の中にcharで入れたら、自動でfprintf文を書いてくれるプログラムを作りたかった。

>>286
ありがとう。プロセス間通信調べてみた。
しかしLinux(c++)での共有メモリの作り方、使い方がいくらググっても出てこない。
サンプルどっかにあるかなぁ。
302デフォルトの名無しさん:2008/11/20(木) 01:38:15
>>285
tcc あたりをリンクすればんなとか出来るかも。
っと思ったけど、>>301 では「面倒くさい」という動機が語られているので、
どちらがより面倒かと考えると…
303デフォルトの名無しさん:2008/11/20(木) 02:13:15
>>301
それなら普通に#define 等のプリプロセッサでいいんじゃね?
変数名の表示含めてできるよ

f(a); を fprinttf(stderr, "a = %d", a); にするみたいなのね
304デフォルトの名無しさん:2008/11/20(木) 02:54:14
VC++でプログラム内にグラフを描画したいんですが、
おすすめのライブラリってありますか?
gnuplotのように凡例やます目がついた二次元グラフが書けて、グラフの拡大縮小が簡単にできるものを探しています。
普段はパイプでgnuplotに描画しているんですが、
ウィンドウ内にグラフを埋め込む必要が出てきたので、それが可能なライブラリを探しています。
305デフォルトの名無しさん:2008/11/20(木) 02:58:13
>>297
要素数はどれだけあるの? reserve() できないの?
306デフォルトの名無しさん:2008/11/20(木) 02:59:44
enum TEST {
  A;
};

// Visual C++ 2008の場合
TEST test = TEST::A

// gccとかの場合
TEST = A


これ、仕様では後者が正しいんだよね?
VCがまた勝手なことしてるって認識でおk?

まぁ個人的には列挙型もスコープ持ってほしいけど。
307306:2008/11/20(木) 03:01:39
↑なんか色々ミスってるけど、気にしないでくだちぃ。m(__)m
308デフォルトの名無しさん:2008/11/20(木) 03:09:27
まあVC++で後者の書き方ができないなら大問題だが、
そうではないのだから大目に見てやれ。
309デフォルトの名無しさん:2008/11/20(木) 03:15:06
VCスタイルでコード書いたら、他でコンパイルできない。私許さないよ!><
310デフォルトの名無しさん:2008/11/20(木) 03:16:52
もう許してやれよ・・・・・・
311デフォルトの名無しさん :2008/11/20(木) 03:38:54
>>304
とりあえずfparserつかえば
312デフォルトの名無しさん:2008/11/20(木) 03:41:52
>>306
VCも警告レベル上げれば
「非標準の機能使ってんじゃねぇよ」
ってコンパイラが教えてくれるぞ
313デフォルトの名無しさん:2008/11/20(木) 03:47:19
なんで、こんな遅くまで起きてるの?
ははー、自分と同じで低脳で宿題できてないから寝れないんでしょ
駄目ですよ、低脳は背伸びして大学に進学しちゃ
314デフォルトの名無しさん:2008/11/20(木) 04:01:17
>>298 ついて
x = new int*[row];
int *buf = new int[row * col];
for(int i=0;i < row;i++) x[i] = &buf[i * row];
で2次元配列を作り
delete x[0];
delete[] x;
のデリートでbufのメモリ領域は開放されるんですか?
なんて言うか、凄い高等テク使ってる感じなんですけど
315デフォルトの名無しさん:2008/11/20(木) 04:03:48
delete[] x[0];
だな、buf も配列だ。
316デフォルトの名無しさん:2008/11/20(木) 04:10:16
x[i] = new int[col]; みたいに行ごとにメモリ確保せずに、
int *buf = new int[row * col]; で必要なだけメモリを一気に確保して、
行サイズ間隔のポインタを x[] に入れている。

結局 xと buf 用に 2回しか new していないから、delete も2回ですむ。
buf の先頭アドレスは、x[0] に入っているから、 delete[] x[0]; でいい。
317デフォルトの名無しさん:2008/11/20(木) 04:15:45
>>314
別に高等でも何でもない
C言語でもmalloc()でよく多用されてるテクニック
318デフォルトの名無しさん:2008/11/20(木) 04:23:48
>>302
ありがとう。tccを調べてみた。すごくおもしろいし使えそうだったんだけど、CPU:x86_64はサポートされていなかったようで、インストールしてもコンパイルがされない・・・残念。

>>303
配列の配列なども渡して自動的に表示形式まで計算してデバッグしたかったので、プリプロセッサだけではものたりないー
319デフォルトの名無しさん:2008/11/20(木) 04:25:40
Cなら、x と buf をまとめて一回で確保できるな。C++でも出来るけど型制約が若干邪魔になる。
テンプレート引数をうまく使えば new 一回でいけるかな?

template<int row, int col>
class Matrix{
public:
  int data[row * col];
  int *pdata[row];
  Matrix(){
    for(int i=0; i<row; i++) pdata[i] = &data[i * row];
  }
};
int main(){
  int row = 10, col=5;
  Matrix<10, 5> *m = new Matrix<10, 5>();

  int **x = m->pdata;
  // x使って 処理

  delete m;
  return 0;
}

場合によってコピーコンストラクタが必要になる。
320デフォルトの名無しさん:2008/11/20(木) 04:29:45
う、俺も間違えた。

for(int i=0; i<row; i++) pdata[i] = &data[i * row];
じゃ、なくて
for(int i=0; i<row; i++) pdata[i] = &data[i * col];
だ。

あと main の最初のrow, col 使ってないなので不要。
Matrix のメンバにrow, col 持たせたほうが扱いやすいだろうな。
321デフォルトの名無しさん:2008/11/20(木) 04:30:35
>>318
んじゃテンプレートとも併用すればいいんじゃね?
322デフォルトの名無しさん:2008/11/20(木) 04:34:55
>>309
gccスタイルでコード書いたら、他でコンパイルできない。俺は許すよ!><
独自拡張なんてそんなもんだ。
323デフォルトの名無しさん:2008/11/20(木) 04:40:29
>>298はnewしたのがintですが、たとえば、
newしたのがクラスのオブジェクトでそのオブジェクトが動的メモリを
持ってた場合でも、delete[] x[0];、delete[] x で各々の
オブジェクト、動的メモリは開放されるんですか?
324319:2008/11/20(木) 04:48:38
よく考えたら、これじゃ実行時に配列サイズ指定できないや。
325デフォルトの名無しさん:2008/11/20(木) 04:50:37
>>323
オブジェクトであろうと無かろうと、 newした回数delete するだけのこと。
326デフォルトの名無しさん:2008/11/20(木) 04:58:34
コンストラクタの引数にrowとcol指定すればいいじゃん
327デフォルトの名無しさん:2008/11/20(木) 05:00:08
>>323
クラスにデストラクタ持たせるのは当然
328デフォルトの名無しさん:2008/11/20(木) 05:06:27
だいたいこんな感じ。もちろんコピーコンストラクタも代入演算子も
書かなくてはいけないが面倒なので省略。

class Matrix {
public:
int* data;
int** pdata;
Matrix(int row, int col) : data(new int[row * col]), pdata(new int*[row]) {
for (int i = 0; i < row; i++)
pdata[i] = &data[i * col];
}
~Matrix() {
delete[] data;
delete[] pdata;
}
};
int main()
{
int row = 10, col = 5, num = 0;
Matrix* m = new Matrix(10, 5);
int** x = m->pdata;
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
x[i][j] = num++;
for (int i = 0; i < row; i++)
for (int j = 0, k = 1; j < col; j++, k++) {
std::cout << x[i][j] << ' ';
if (!(k % col))
std::cout << '\n';
}
delete m;
}
329デフォルトの名無しさん:2008/11/20(木) 05:11:42
しっかしvectorの入れ子じゃいやなんだろうか質問者は
330デフォルトの名無しさん:2008/11/20(木) 05:15:14
単に2Gほどメモリを食うプログラムを動かしてメモリオーバーフローが
起きたんじゃないだろうか?
331デフォルトの名無しさん:2008/11/20(木) 05:16:02
バグってるのをvectorのせいにしてるだけじゃね
332デフォルトの名無しさん:2008/11/20(木) 05:19:50
まあどうせそんな所だろ
自分のバグを棚に上げて「コンパイラのバグだ!」と言う奴は
腐るほどいる
333323:2008/11/20(木) 05:53:49
宿題より、こっちの方が気になってしょうがない,orz
delete[] x[0];の場合のx[0]には
x[0] = &buf[0];
が入っていて、配列全体を示すbufは入ってないと思うんですけど
&buf[0] == 配列全体を示すbufになるんですか?
第一要素のアドレスコピーで配列全体の情報(要素数など)もコピーされているんですか?
334デフォルトの名無しさん:2008/11/20(木) 06:28:32
実装依存だけど、通常はmalloc()やnewで得たアドレスの手前にサイズ情報が格納されている。
だからfree()やdeleteはポインタを与えるだけでメモリを開放することが出来るわけだ。
335デフォルトの名無しさん:2008/11/20(木) 09:44:58
new だろうが new[] だろうが 戻りはポインタ
 new で確保したものは delete で開放
 new[] で確保したものは delete[] で開放
という指針さえ守ってりゃ良いことになる

ポインタの指し示している中に管理情報が埋まっていることが予測される(実装依存)
 new の場合には次の空きヒープへのリストか、確保した容量?
 new[] の場合には上記+型情報(どのデストラクタを駆動するか)+要素数 or 1要素あたりの実サイズ?

ポインタ複写しだすと、
 どっちで確保したものか一見で区別がつかない
 複写元 及び 複写先 のそれぞれを開放操作しちゃった
なんて話がでてくるからやっかいではある (スマートポインタ等の概念が欲しい)
336デフォルトの名無しさん:2008/11/20(木) 10:02:16
名前空間は同じ名前ならブロックをいくつに分けても一つと同じですか?
337デフォルトの名無しさん:2008/11/20(木) 11:01:40
>>336 うん。
338デフォルトの名無しさん:2008/11/20(木) 12:07:07
>>337
ありがとう
339デフォルトの名無しさん:2008/11/20(木) 15:32:26
上の方でenumのスコープの話題あったけど、
自分もgccでスコープ修飾子つけて列挙子アクセスしたくて、
こんな感じで書いたんだけど、スコープ付きenumと等価にはならなかった。
なんとかならんもんかな?


struct HOGE {
 enum {
  A;
  B;
 };
};

void f(HOGE hoge) { ... }


int main() {
 HOGE hoge = HOGE::A; // OK

 f(HOGE::A); // エラー! f(HOGE::A::<anonymous>)がない
}
340デフォルトの名無しさん:2008/11/20(木) 15:36:42
つnamespace
341デフォルトの名無しさん:2008/11/20(木) 15:37:18
・・・ってgccってこたCだったか
342デフォルトの名無しさん:2008/11/20(木) 15:42:05
GCC 4.4にC++0xのStrongly-typed enumsが入るらしいから、それまで待て。
http://gcc.gnu.org/projects/cxx0x.html
343デフォルトの名無しさん:2008/11/20(木) 15:46:27
>>340
namespaceでも変わらんとです。

>>341
gcc -lstdc++ですたい。

>>342
待てませんぉ
344デフォルトの名無しさん:2008/11/20(木) 15:50:00
namespaceでもどうにもならんだろ。

俺はあきらめて疑似Enumクラステンプレートみたいなの作って
EnumとEndEnumをマクロで定義して

Enum MyEnum
{
  value1,
  value2,
  value3
}EndEnum;

みたいにやってる。使い勝手はC#とかのenumと同じ
345デフォルトの名無しさん:2008/11/20(木) 16:16:47
どういうマクロ定義だろう・・・?
346344:2008/11/20(木) 17:07:55
Enum( MyEnum )ってやらないとダメでした
実装はこんな感じ

#define Enum(T) \
struct T \
{ \
enum Enumeration; \
private: \
Enumeration value; \
public: \
T(){} \
T(const T& e){value=e.value;} \
const T &operator=(const T& e){value=e.value;return *this;} \
const bool operator==(const T &e) const{return value==e.value;} \
const bool operator!=(const T &e) const{return value!=e.value;} \
T(const Enumeration e){value=e;} \
const T &operator=(const Enumeration e){value=e;return *this;} \
const bool operator==(const Enumeration &e) const{return value==e;} \
const bool operator!=(const Enumeration &e) const{return value!=e;} \
friend const bool operator==(const Enumeration &e,const T &e2){return e==e2.value;} \
friend const bool operator!=(const Enumeration &e,const T &e2){return e!=e2.value;} \
operator int () const{return value;} \
friend T; \
enum Enumeration
#define EndEnum ;}
>>346 Jane用

おかしいところあったら指摘してくれ
347344:2008/11/20(木) 17:09:25
Janeでリンク見ても全然だめだこれwww
348デフォルトの名無しさん:2008/11/20(木) 18:05:58
>>346
これは面白いマクロ。
ぜひ使わせてもらいます。サンクス!


でも>>339みたいな場合だと

f(HOGE::A); // エラー! f(HOGE::A::Enumration)がない

ってなりそうな気も。。いや、まだ試してないんだけどね。
349デフォルトの名無しさん:2008/11/20(木) 19:14:51
>>333
bufと&buf[0]は同じポインタになる
350333:2008/11/20(木) 22:17:57
>>349
delete [] buf は delete [] &buf[0] と同じだから、
当然、delete buf は delete &buf[0]は同じ結果となり
配列の第一要素のみが開放されるんですよね
でも、delete [] &buf[1]では配列は開放されないんですよな(コンパイルエラーかな)

ポインタといった場合、それに含まれている管理情報はどんなものになるんですか?
少なくとも、オブジェクトのアドレスは有してるとは想像できるのですが。
&buf[0](== buf)、&buf[1]、のもつ管理情報の種類に違いはあるのですか?
int* a = &buf[0]; とした場合と、int* a = &buf[1]; とした場合の
aの管理情報の種類は違うんですか? =の後の情報しだいでaの持つ管理情報の種類が異なるとか
351デフォルトの名無しさん:2008/11/20(木) 22:35:19
?多すぎわろた
352デフォルトの名無しさん:2008/11/20(木) 22:43:40
もうこいつは駄目だな
せめて脳をリセットする機能があればねえ
353デフォルトの名無しさん:2008/11/20(木) 22:57:37
少しは自分で考えようね
354デフォルトの名無しさん:2008/11/20(木) 22:59:32
ポインタってのはメモリ上のただ一点を指す数値でしかない。
int* a = new int;
int* a = new int[2];
new intがメモリの500〜503番地に確保された場合aの中身は500
new int[2]がメモリの500〜507番地に確保された場合aの中身は500
つまりポインタは配列のサイズを持っていない。

じゃあどこに new int[]の配列サイズがあるかといえば一つ手前の496番地に配列のサイズがある。
つまり new int[2]はあらかじめ496〜507番地まで確保し、496〜499番地に配列のサイズ2を書き込み
500〜503と504〜507までの2オブジェクトのコンストラクタを呼び出す。
そして500番地を返す。

delete [] は aの中身500番地の一つ前の496番地にアクセスし配列のサイズ2を知る。
サイズが2要素だと分かったので500〜503番地と504〜507番地のオブジェクトに対しデストラクタを呼ぶ。
あとはメモリを解放する。

355デフォルトの名無しさん:2008/11/20(木) 23:17:49
>>350
いろいろめんどうだが、

> int* a = &buf[0]; とした場合と、int* a = &buf[1]; とした場合の
> aの管理情報の種類は違うんですか? =の後の情報しだいでaの持つ管理情報の種類が異なるとか

そう。
356デフォルトの名無しさん:2008/11/21(金) 00:17:18
>>354
断定してるが実装依存だろ
そんな仕様はどこにもない
357デフォルトの名無しさん:2008/11/21(金) 00:22:31
>>354
ISO/IEC 14882:2003のどこにそんな事が書いてあんだよ?え?
358354:2008/11/21(金) 00:31:15
すいません確かに必ずそうなってるかのように断定したのはよくないですねすいません
359デフォルトの名無しさん:2008/11/21(金) 00:36:22
int *buf = new int[100];
int *a[10];
a[0] = buf;
int *b = a[0];
delete[] b;
360デフォルトの名無しさん:2008/11/21(金) 00:39:34
dequeに17万くらいのstringを放り込んだらデストラクタで10秒以上時間がかかるんですが、
これは普通なんでしょうか。それとも、プログラムに問題ありと考えた方がいいんでしょうか?
361デフォルトの名無しさん:2008/11/21(金) 00:42:42
>>354-355
ありがとうございました。
つまり、&buf[0]; は配列要素数も管理情報に持ち
&buf[1]にはそれがない。ポインタがコピーされる時はそれもコピー
(たとえばそれが関数の実引数へのコピーでも)される考えると。
そして、delete []の場合は配列要素数情報あるからそれを参照して開放、
deleteの場合は要素数1(配列要素数情報ないから)で開放すると。 こんな理解で良いですか?
362デフォルトの名無しさん:2008/11/21(金) 00:45:22
>>360
そんなこと言われてもわからんが
7万個にしたら5秒で34万個にしたら20秒になるなら多分普通
34万個でも10秒のままだったり何分もかかるようになったりするなら多分何かがおかしい
あくまで全部たぶんの話
363デフォルトの名無しさん:2008/11/21(金) 00:48:35
1、配列は[]でアクセス可能なオブジェクト。
2、配列 a について、C/C++ では、a も &a[0] 配列先頭ポインタをあらわす。
3、delete[] は配列オブジェクトのポインタをとって、開放処理を行う。
364デフォルトの名無しさん:2008/11/21(金) 00:52:04
17万回delete呼ぶんだから10秒くらいかかってもおかしくはない。
365デフォルトの名無しさん:2008/11/21(金) 00:59:10
>>360
試したら30秒くらいかかった。
Core2 [email protected] / Vista SP1 / VC++2008EE / Debugビルドでデバッグ実行

デバッグ無し、またはReleaseビルドにしたら一瞬で終わったので、
恐らくメモリ解放時のオーバーランチェックとかが遅いんだろう。
366360:2008/11/21(金) 01:09:51
>>362
そういえばその通りですよね。試してみたら倍くらい時間がかかったので
そういうものだと思うことにします。

>>364
確かに、それだけdelete呼ばれたら時間もかかりそうです。

>>365
Q6700/Vista(not SP1)/VC++2008EEなのですが、Debugビルドで20秒くらいでした。
確かにデバッグなし実行なら一瞬です。メモリ解放のオーバーランチェックというのは初耳でした。
367デフォルトの名無しさん:2008/11/21(金) 01:11:36
10万オーダーの処理はマシンスペックによっては「重さ」が気になりだす分量。
368デフォルトの名無しさん:2008/11/21(金) 02:30:32
んーBCB2009に付属のBCC32でdequueに20万個のstringを
突っ込んで解放してみたがCodeGuardをONにしても一瞬だな
369デフォルトの名無しさん:2008/11/21(金) 02:56:54
debugビルドのdeleteって、該当メモリを全部チェックしてないか?
malloc()に対してcalloc()が遅いのと同様、メモリを全部舐めてりゃ遅くて当然。
370354 (358は他人だけどGJ):2008/11/21(金) 08:41:11
>>361
>ポインタがコピーされる時はそれもコピー
全然分かってねーな。コピーされるのはポインタ(ただの数値)だけだ。
int* a = new int[2]; // a == 500 だとすると
int* b = &a[0]; // b == 500
int* c = &a[1]; // c == 504
int* d = c; // d == 504
図入りの具体例を解説したサイトでも探すのが手っ取り早い。
371デフォルトの名無しさん:2008/11/21(金) 08:49:16
shallow copyとdeep copy
372デフォルトの名無しさん:2008/11/21(金) 09:43:07
ttp://video.google.com/videoplay?docid=2914803742593360351
これ見てもらうのが一番手っ取り早いんだがな
理解できるとは思わんが
理解できんようなら忘れた方がいい
373デフォルトの名無しさん:2008/11/21(金) 12:18:45
>>372
mallocとfreeのことしかやってねー
それ見てもdeleteとdelete[]の違いは理解できねー
内容は面白かったが回答としては不正解だな
374デフォルトの名無しさん:2008/11/21(金) 17:42:40
>>361

>>328にコピーコンストラクタと代入演算子を実装して実験してみろ
見事うまく動作したら何をやっているか理解できた証拠だ
375デフォルトの名無しさん:2008/11/21(金) 18:16:01
「まろっく」って読んでるのに違和感。自分が「えむあろっく」だったんで。
376デフォルトの名無しさん:2008/11/21(金) 18:23:50
俺はいちいち「めもりーあろけーと」と読んでいる
377デフォルトの名無しさん:2008/11/21(金) 18:40:12
「まろっく」と読む人って、callocは「かろっく」なんだろうか。
378デフォルトの名無しさん:2008/11/21(金) 18:48:44
脳内ではまろっく、こーろっく、りあろっく
379デフォルトの名無しさん:2008/11/21(金) 19:00:30
まろっくかろっくりあろっく
380デフォルトの名無しさん:2008/11/21(金) 19:21:53
「ぞでぃあっく」という単語が見えた気がしたが、気のせいだった。
381デフォルトの名無しさん:2008/11/21(金) 19:34:17
>>375
「えむあろっく」は経験長い人に多いな
382デフォルトの名無しさん:2008/11/21(金) 19:44:55
mallocはえむあろっくだけどallocaはあろっか
383デフォルトの名無しさん:2008/11/21(金) 20:15:30
>>370,>>372
俺、delete,delete[]をそんな風に使うんだで使っているが、
deleteとdelete[]がある理由、なにかあるんだろ。
(deleteはなぜnew xx[]を開放出来ないのか)
分かりやすく、その理由の解説頼むよ
384デフォルトの名無しさん:2008/11/21(金) 20:22:38
new/deleteは常に1個という前提でオブジェクトの個数を保持していない
new[]/delete[]はオブジェクトの個数を保持するために余分なメモリ領域を使用している
管理用のメモリレイアウトが異なれば相互運用は不可能
385デフォルトの名無しさん:2008/11/21(金) 20:25:14
どんだけ同じ話題でループするんだよ
>>280で結論でてるだろうが
386デフォルトの名無しさん:2008/11/21(金) 20:25:46
new int[10]が返すポインタはヒープに確保した配列の先頭アドレスだが、
配列の先頭要素のアドレスでもある
deleteが貰うのはアドレスの値だけだから区別が出来ないので
プログラマが区別してやらないといけない

D&Eの10章にその辺の苦労話が書いてある
387383:2008/11/21(金) 21:04:00
>>384, >>386 多謝
なるほどね、>>361のdelete、delete[]であってたのか
おれ、>>370>>361は完全に間違ったこと言ってるんだと思った

>>385
すまん、最新50カキコだけで、そんな前のカキコなんて読んでなかった
388デフォルトの名無しさん:2008/11/21(金) 21:33:07
delete[]の場合は要素数が(処理系には)「分かる」から
必要なぶんだけデストラクタが呼べるわけだろう

配列ではないnewを、要素数1の配列と同じように確保するのなら
deleteとdelete[]を区別する必要は無いのだろうけど、
ゼロオーバーヘッドルールがそれを妨げているんでないの
要素数を入れる32bitかそこらの領域を余分に必要とするのだろうからな
389388:2008/11/21(金) 21:33:39
うわ>>384にほぼ同じことが書いてあるな
390デフォルトの名無しさん:2008/11/21(金) 22:04:10
DLLからDLLを操作するのって最短でどうやれば可能?
391デフォルトの名無しさん:2008/11/21(金) 22:21:28
fopen
392デフォルトの名無しさん:2008/11/21(金) 22:29:15
>>390
EXEからDLLを使うのと同じ。
393デフォルトの名無しさん:2008/11/22(土) 13:18:04
thx!!
394デフォルトの名無しさん:2008/11/22(土) 16:51:25
>>287がエラーになるわけないだろ常考
と、たかをくくってたらおなじエラーが出て俺死亡

焦ってデバッグしてみたら追い討ちをかけるように
rowに値を入れる前にnewしてことが判明
395デフォルトの名無しさん:2008/11/22(土) 19:16:05
strstr()をつかってxxx\\aaa.txtみたいな文字列の\\以前を削除してbuff2に入れています。

p = strstr(buff, "\\"); //buffから\\をサーチ
buff2 = p+1


こんな感じでです。

これをstringやSTLのアルゴリズムを使ってもっと簡単にかけますか?
396デフォルトの名無しさん:2008/11/22(土) 19:45:28
↑自己解決しました
その代わりこれを・・・

sscanf(s, "%[^_]_%s", s2, s3);を
istringstreamで書き直す方法を教えてください
397デフォルトの名無しさん:2008/11/22(土) 21:28:03
どうしても istringstream じゃないとダメ?
string でもいいなら、

string s("hoge_fuga");
string::size_type pos = s.find("_");
string s2(s.substr(0, pos)), s3(s.substr(pos+1));

とできるけど
398デフォルトの名無しさん:2008/11/22(土) 21:28:55
できました。ありがとございまs
399デフォルトの名無しさん:2008/11/22(土) 22:01:25
c++にはsplit()みたいのってないんだっけ?
400デフォルトの名無しさん:2008/11/22(土) 22:53:55
boost::algorithm::split
401デフォルトの名無しさん:2008/11/23(日) 01:13:53

func2(const double data[]){

cout <<data[0];

]


func1(const double data[]){

func2(data);

}


main(){

double data[100]:

func1(data);


}
これってfunc2内でちゃんと元のデータ参照できますか?
402デフォルトの名無しさん:2008/11/23(日) 01:40:43
>>401
できなかったの?
403デフォルトの名無しさん:2008/11/23(日) 06:48:46
コンパイルできないから参照できないよ
404デフォルトの名無しさん:2008/11/23(日) 12:08:03
struct Hoge{

double data;

char name[20];

}

Hoge hoge[100];

という配列の0番目から40番目の中で、nameの出現回数順にソートする方法ってどういうのがありますか?
405デフォルトの名無しさん:2008/11/23(日) 13:05:14
よくわかんないけど例えばABBACBだったらBBBAACに並べ直せばいいの?
406デフォルトの名無しさん:2008/11/23(日) 13:11:22
nameは配列のどの要素にも1個ずつあると思うけど
407デフォルトの名無しさん:2008/11/23(日) 13:13:22
並びなおすというより、出現回数の順に別の場所に入れる感じですかね・・・

hoge[0].name →ABC
hoge[1].name →ABC
hoge[2].name →CDE
hoge[3].name →FGH
hoge[4].name →ABC

だったら



(ABC 3)
(CDE 1)
(FGH 1)

ってかんじに
408デフォルトの名無しさん:2008/11/23(日) 14:02:46
まずname毎の配列作って振り分ければいいんじゃないの
409デフォルトの名無しさん:2008/11/23(日) 14:32:31
hogeを先頭からみてnameをキーにmapの値(int)をインクリメント

全部なめたら、

mapの頭からキーと値を別の構造体に入れる。

その構造体をintをキーにソートって考えましたが・・・
どうでしょう?
410デフォルトの名無しさん:2008/11/23(日) 14:39:32
decolate-sort-undecorateパターン(イディオム)やね
まず集合から要素→頻度のマップを作ってそれを頻度順にソート
でソート後のマップから要素を取り出して集合を作り直す
妥当だと思うヨ
411デフォルトの名無しさん:2008/11/23(日) 15:15:28
C++で

#include <fstream>

のファイル入出力ストリームと


#include <cstdlib>
のfopenを同じソースないで一貫性なく両方つかっていますが、動作的に問題が起きますでしょうか?
412デフォルトの名無しさん:2008/11/23(日) 16:26:25
>>411
それだけの条件じゃなんともいえないな。
なんで問題が起こるかもしれないと思うの?
413デフォルトの名無しさん:2008/11/23(日) 16:32:07
>>411
標準入力でのprintfとcoutの併用みたいなこと気にしてるんなら大丈夫だよ
414デフォルトの名無しさん:2008/11/23(日) 18:23:36
>>412
なんとなく、強いて言えば、勘かな
415デフォルトの名無しさん:2008/11/23(日) 19:07:43
コンパイラのバージョンによってはロケール周りがバグるよ。
416デフォルトの名無しさん:2008/11/23(日) 19:09:31
>>411
古いコンパイラ(例えば古いgccとか)では
ios::sync_with_stdio(true); しないとダメだったりする。
規格的にはこんなことしなくても使えないといけないんだけどね。
(デフォルトは true だと規格に書いてある。)
まあ今は気にする必要は無いと思う。多分。
417デフォルトの名無しさん:2008/11/23(日) 19:41:15
http://mp.i-revo.jp/user.php/kp-msonoyama/attach/5/chuusen_sjis.c
とあるブログで見つけたC言語のプログラムなんだが、
コメントがあるから何をやってるのかは大体分かるが、ソース自体がまったく読めない・・・

「static char *__entry_list[]」とか、一体何者・・・?
418デフォルトの名無しさん:2008/11/23(日) 19:44:11
SJIS で嫁
419417:2008/11/23(日) 19:47:11
>>418
文字化けして読めないって意味じゃなくて、内容が難しすぎるって意味。
420デフォルトの名無しさん:2008/11/23(日) 19:48:23
__entry_list はまんまエントリーリストだろうし、
どの辺が分からんのだ。
421デフォルトの名無しさん:2008/11/23(日) 19:50:24
_ を何か特殊な記号と思ってるとか
422デフォルトの名無しさん:2008/11/23(日) 19:50:54
時間取得する部分は seed = time(NULL); の方がいいな。
time_t と long のサイズが同じとは限らないんだし、ポインタをキャストするのは危険。
423デフォルトの名無しさん:2008/11/23(日) 19:52:24
static char *__entry_list[] がわからんというのは、
まあなんか参考書読みなね、とかそういうレベルだわな。

まさか文字列リテラルは const char * にしないとダメよねー、
とかそういうツッコミを迂遠に言ってるのかもしれない。

あるいは、2重アンダースコアで始まる名前は
コンパイラの予約語とぶつかる可能性あってダメじゃん、
とかそういうツッコミをしてるのかもしれない。
424デフォルトの名無しさん:2008/11/23(日) 19:55:48
C++勉強してるんだけど
戻り値がいまいち理解できないな。
一体どういった活用すればいいのだろう?
425デフォルトの名無しさん:2008/11/23(日) 19:58:43
>>417
結果を見やすくするために・・・と最後を半角空白で埋めてるが、
printfで幅指定すればいいだけ。
条件式内でstrlenを使ったり空白の追加にstrcatを使ったりするなど実装に無駄が多く、
完全に無駄な処理。(こんなのsprintfで一発でできる。)
ランダムシャッフルも定番の高速なアルゴリズムがあるのに、それを使っていない。
突っ込みどころが多過ぎる。
426417:2008/11/23(日) 19:58:50
>>420-423
うお。
お前らすげーな。

まずヘッダファイルからして、俺にはチンプンカンプン過ぎる。何がなんだが・・・・
それに加え、「*__entry_list」や「__entry_list[]」なら何となく分かるが、「*__entry_list[]」ってなんぞ・・・ってそうゆうレベル。

まだまだ勉強しないといけない事が山ほどあるなorz
427デフォルトの名無しさん:2008/11/23(日) 20:00:21
単なる文字列へのポインタの配列じゃん。
428デフォルトの名無しさん:2008/11/23(日) 20:00:38
> __entry_list
まぁ、ヤな変数名ではあるw
429デフォルトの名無しさん:2008/11/23(日) 20:01:54
>まだまだ勉強しないといけない事が山ほどあるなorz
orzじゃないだろ、シャキーンだろ
430デフォルトの名無しさん:2008/11/23(日) 20:03:13
>>424
数学で言う所の関数を思い浮かべればいい。
数学で戻り値の無い関数なんて思い浮かばないし、存在意義も見いだせないだろう。
関数には戻り値があるのが自然の姿。
戻り値の無い関数の方が特殊な姿で、
中には戻り値が無いものを関数とは呼ばない言語もある。(FORTRANとか)

戻り値のない関数にはなぜ戻り値が必要ないのか、
ということをむしろ考えた方がいい。
431デフォルトの名無しさん:2008/11/23(日) 20:08:07
>>417 で1ファイルソースなのにstatic配列,static関数にする意味あるんですか?
432デフォルトの名無しさん:2008/11/23(日) 20:10:51
アクセスが高速になる
433デフォルトの名無しさん:2008/11/23(日) 20:11:01
公開するつもりのない関数・変数は static にしておく癖をつけた方が良い。
434デフォルトの名無しさん:2008/11/23(日) 20:14:16
>>431
全体的にしろうとくさい書き方のコードだから、あんまり細かいことは気にスンナ。
435デフォルトの名無しさん:2008/11/23(日) 20:24:45
こんばんは。
BCCで猫でもわかるwindowsプログラミングを勉強しているのですが、
6章のメニューを作るところができません。リソースをコンパイル
するときにwindows.hが開けませんというエラーがでます。
どうすればいいか教えてください。
436デフォルトの名無しさん:2008/11/23(日) 21:03:23
>>435
BCCよくしらないけど、環境変数のINCLUDEに設定するとか、引数で/Iとかに設定するとか、
windows.hのパスを教える方法がなんかあるんじゃね?
437デフォルトの名無しさん:2008/11/23(日) 21:06:28
リソースはwindows.hをインクルードしたりしませんが
438デフォルトの名無しさん:2008/11/23(日) 21:17:03
>>437
インクルードするときもあるだろ。
439435:2008/11/23(日) 22:02:23
http://www.kumei.ne.jp/c_lang/bcc/bcc_05.htm
ここに乗ってるのまるまるコピーしてきたんで、ソースが悪いんじゃなくて
やっぱり設定なんですかね?パソコンも初心者なんでよく分からないですが、
調べてみます。もし誰か詳しい人いたら教えて頂けたらありがたいです。
440デフォルトの名無しさん:2008/11/23(日) 22:05:53
>>438
普通しないと思うけどなぁ

>>439
この場合は消しても問題ないと思うよ
441435:2008/11/23(日) 22:39:47
>>440
windows.h消したらうまく行きました!これで先に進めますありがとうございます。
442デフォルトの名無しさん:2008/11/23(日) 22:45:38
僕もコンパイラのincludeフォルダからwindows.hを消したら
うまく動きました!
443デフォルトの名無しさん:2008/11/23(日) 22:55:56
粗悪の権化だからな
444デフォルトの名無しさん:2008/11/23(日) 22:58:07
こういうの見ると

本気で間違えて覚えていたらかわいそうだから教えてあげた方がいいのかな?

と思いながら放置する
445デフォルトの名無しさん:2008/11/23(日) 23:42:55
BCCではリソーススクリプトでwindows.hのインクルードが不要なのは仕様。
446デフォルトの名無しさん:2008/11/24(月) 03:36:27
>>426
int main(int argc, char *argv[])
という書き方を見たことがないか、見たことあるけど__に惑わされたかのどちらかだなあ
447デフォルトの名無しさん:2008/11/24(月) 08:19:46
まあ、__で始まる名前は規格違反だから使う方も悪いけどな
448デフォルトの名無しさん:2008/11/24(月) 09:47:26
>430
数学の関数でいうのなら、「処理が成功したら0、失敗したらエラーコードを返す」
ってのはオカシな考えだなあ。
449デフォルトの名無しさん:2008/11/24(月) 11:14:23
>>448
それはコンピータさんの都合でしょ
450デフォルトの名無しさん:2008/11/24(月) 11:34:54
>>448
ん?ディリクレの関数というものがありまして‥‥‥。
451デフォルトの名無しさん:2008/11/24(月) 11:59:18
関数型言語と副作用
452デフォルトの名無しさん:2008/11/24(月) 14:30:04
>>433
そんな事したらメンバ変数が使えないじゃないか!!
453デフォルトの名無しさん:2008/11/24(月) 14:40:18
   ∩___∩       |            , '´l,
   | ノ\     ヽ      |         , -─-'- 、i
  /  ●゛  ● |      |       _, '´ /     ヽ、
  | ∪  ( _●_) ミ     j     iニニ, "● ∪    ヽ、
 彡、   |∪|   |           iニニ、_          ',
/     ∩ノ ⊃  ヽ            〈`'ー;==ヽ、〈ー- 、 !
(  \ / _ノ |  |             `ー´    ヽi`ヽ iノ
.\ “  /__|  |                      ! /
  \ /___ /                    r'´、ヽ
                            `´ヽノ
454デフォルトの名無しさん:2008/11/24(月) 16:00:17
Cはstaticに色々な意味があるのでガンバ!
455デフォルトの名無しさん:2008/11/24(月) 16:24:33
456デフォルトの名無しさん:2008/11/24(月) 16:53:23
if( (a>10) && (b>10) )って式は右と左ってどちらが先に評価されますか?
機種依存だったりします?
457デフォルトの名無しさん:2008/11/24(月) 16:55:08

あと左を評価して偽だったら右は評価しない
458デフォルトの名無しさん:2008/11/24(月) 16:55:08
>>456
a > 10 のほうが先
459デフォルトの名無しさん:2008/11/24(月) 17:41:44
std::vector::findで要素が見つからなかった場合って何が返るんですか?
460デフォルトの名無しさん:2008/11/24(月) 17:45:13
end()
461459:2008/11/24(月) 17:50:10
>>460
ありがとうございます
462デフォルトの名無しさん:2008/11/24(月) 17:56:14
c++で<math.h>を使わずに自然対数の底の値(e=2.718282…..小数点以下15桁まで)を求めるプログラムを
作成しようとしているのですが、さっぱりわかりませんので誰か詳しい人いたら教えて頂けたらありがたいです。
463デフォルトの名無しさん:2008/11/24(月) 18:02:34
e^x = 1 + ( x / 1! ) + ( x^2 / 2! ) + ( x^3 / 3! ) + ... + ( x^n / n! )
後はわかるな?
464デフォルトの名無しさん:2008/11/24(月) 18:07:52
真値との誤差評価と多売長演算入らないか
465デフォルトの名無しさん:2008/11/24(月) 18:09:11
>>463
数学関数使えないので^と!は使えないのではないのでしょうか
466デフォルトの名無しさん:2008/11/24(月) 18:17:32
>>465
地道に計算すればいいだろ
ただし、単純に計算しただけだと小数点以下15桁も有効数字は無い。せいぜい8桁程度
それ以上欲しいなら、さらに工夫が必要
467デフォルトの名無しさん:2008/11/24(月) 18:22:09
三角関数とかって自分で実装するとしたら級数展開するしかないの?
468デフォルトの名無しさん:2008/11/24(月) 18:24:37
そのためのテイラー展開です
469デフォルトの名無しさん:2008/11/24(月) 18:25:16
470デフォルトの名無しさん:2008/11/24(月) 18:26:02
表引きと補間の組み合わせという手もある
471デフォルトの名無しさん:2008/11/24(月) 18:33:10
>>465
eを求めたいのならx=1だから後は簡単
472デフォルトの名無しさん:2008/11/24(月) 19:57:52
サブプロセスでPython使って計算する
473デフォルトの名無しさん:2008/11/24(月) 20:25:14
おかげでできましたありがとうございました。
474デフォルトの名無しさん:2008/11/25(火) 00:03:09
BCCでWindowsXPの環境です。
特定のディレクトリ内のファイルを全てを読み込むにはどうすればよいのでしょうか。
よろしくお願いします。
475デフォルトの名無しさん:2008/11/25(火) 00:03:58
まちがってさげてしまった。
476デフォルトの名無しさん:2008/11/25(火) 00:10:19
危ないこのするんでしょ
477デフォルトの名無しさん:2008/11/25(火) 00:15:38
direct.hをインクルードしていろいろやる
478デフォルトの名無しさん:2008/11/25(火) 00:16:09
>>476
? いや、普通にディレクトリ内のデータを基に処理して、結果をアクセスで使えるようにCVSにしたいだけです。
479デフォルトの名無しさん:2008/11/25(火) 00:17:06
>>477
ありがとうございます。調べてきます。
480デフォルトの名無しさん:2008/11/25(火) 05:36:10
rand()の生成アルゴリズムって規格で決まっていないのですか?
つまりその、コンパイルした環境によって、実行結果が変わってしまいますか?
481デフォルトの名無しさん:2008/11/25(火) 05:49:35
>>465
関数を使わないで自分で計算すればいいだろ
ちなみに>>463のようにあらわすのをテイラー展開という
482デフォルトの名無しさん:2008/11/25(火) 06:23:53
>>480
そのとおりです。大概の rand() は線形合同法だと思います。
483デフォルトの名無しさん:2008/11/25(火) 11:43:46
>>478
ConcurrentVersionSystem?
もしかして: CSV
484デフォルトの名無しさん:2008/11/25(火) 11:58:58
CVSというと一般的にはコンビニだな。
485デフォルトの名無しさん:2008/11/25(火) 15:44:10
Linux で巨大なファイル (1GB) の読み込みをしようとしています。

ひとまず、HDD のシーケンシャルリード性能を hdparm -t で計測したら、
60MB/s でした。

次に fgets() で一行ずつ読み込むプログラムを書いて計測したところ、
140MB/s という hdparm より大幅に良い値が出ました。なぜこうなるのか理由
がわからないのですが、どうしてでしょうか?

fgets() で読み込むプログラムはこんな感じです。

while( fgets( linke, LINE_MAX, fp ) ) {
if ( ferror( fp ) ) {
exit( -1 );
}
}
486デフォルトの名無しさん:2008/11/25(火) 16:21:11
マシン構成は?
487デフォルトの名無しさん:2008/11/25(火) 17:11:57
C/C++でDBからデータを取ってきてグラフを描きたいのですが
私にヒントをください
488デフォルトの名無しさん:2008/11/25(火) 17:29:38
#include <stdio.h>
#include <stdlib.h>

char *GetNumStr1(char *get, int num)
{
sprintf(get, "%d", num);
return get;
}

char *GetNumStr2(int num)
{
static char keep[32];
sprintf(keep, "%d", num);
return keep;
}

int main(void)
{
char str[32];
GetNumStr1(str, 1);
printf("%s\n", GetNumStr2(10));
printf("%s\n", GetNumStr2(100), GetNumStr2(1000));
return 0;
}

関数でなんらかの処理をし、
その結果を文字列を返す関数で
上の2つの関数だと、どちらがいいでしょうか。

2は呼び出し元で文字列を用意しなくてすみますが、
static分の容量が常に必要なのと、
1行で複数使うとよくないみたいです。
489デフォルトの名無しさん:2008/11/25(火) 17:34:05
上の GetStr1()

> 1行で複数使うとよくないみたいです。
とか
戻りをポインタで保持し、その後再び関数呼び出しすると…
char* p1 = GetNumStr2(10);
char* p2 = GetNumStr2(100);
printf("%s,%s\n", p1, p2);

出力結果は 100,100 になっちまうし
490デフォルトの名無しさん:2008/11/25(火) 18:07:39
>>489
ありがとうございます。
1にしたいと思います。

2で変数を用意しないで使える便利さも、
関数の中に関数を書くことで、
見づらくなるデメリットもありますし。
491デフォルトの名無しさん:2008/11/25(火) 18:23:34
文字列を検索するのはわかったんですが

CString str.Find(_T("abc"), 0);

文字列群を検索するにはどうすればいいんでしょうか?

CString str1 = _T("abc");
CString str2 = _T("def");
CString str3 = _T("ghi");
492デフォルトの名無しさん:2008/11/25(火) 23:28:10
>>485
hdparm -Tだと?
493デフォルトの名無しさん:2008/11/25(火) 23:29:53
>>491
3回検索すれば。。。
494デフォルトの名無しさん:2008/11/26(水) 02:47:29
>>485
計測ルーチンにバグが無いと確信できるならば、
ページキャッシュについて調べてみるとよい。
495デフォルトの名無しさん:2008/11/26(水) 17:07:21
あるクラスのオブジェクトを生成するときに、必ず外から与えて欲しいメンバ変数の値があります。
例えば

class hoge{
private:
int m;
public:
...
}

とかなっているときに、必ずmの値を指定して生成したい場合などです。
このとき、コンストラクタでmの値を指定することが考えられますが、
その場合、引数を持つコンストラクタのみを使って欲しくて、デフォルト
コンストラクタは使ってほしくないという状況になります。

こういう場合、コピーコンストラクタをprivateメンバに宣言して使用禁止に
するように、デフォルトコンストラクタを使用禁止にするというのは妥当な手段でしょうか。
普通自動生成禁止にするという話になると、大抵コピーコンストラクタの話が出てきて、
デフォルトコンストラクタについて触れられることはほとんど無いので、良い方法なのか
確信が持てません。
496デフォルトの名無しさん:2008/11/26(水) 17:16:59
引数のないコンストラクタとデフォルトコンストラクタの区別をつければ解決する
497デフォルトの名無しさん:2008/11/26(水) 18:08:57
>>495
何らかのコンストラクタを自分で定義すれば、デフォルトコンストラクタは自動生成されない
引数を持つコンストラクタを作るだけでおk

>>496
それは同じだ
498495:2008/11/26(水) 18:18:14
>>497
>何らかのコンストラクタを自分で定義すれば、デフォルトコンストラクタは自動生成されない
本当だ…orz
基本でした。すみません。
どうもありがとうございます。
499デフォルトの名無しさん:2008/11/26(水) 19:07:38
Cのプログラムから時計を設定したいんですが、どんな関数を使えばいいでしょうか?
windows&VC++とLinux&gccのそれぞれを知りたいのですが、教えていただけますでしょうか?
500デフォルトの名無しさん:2008/11/26(水) 20:08:44
>>499
time.hの関数一通り眺めてみればいいんじゃないかな

501デフォルトの名無しさん:2008/11/26(水) 20:18:08
>時計を設定
win32なら
SetLocalTime
ことを言っているのかな
502デフォルトの名無しさん:2008/11/26(水) 20:20:15
>>500
阿呆は無理に書き込みしなくてもいいんですよ。

>>499
WinAPIスレ、Unixプログラミングスレへどうぞ。
どっちみち、権限がないと設定できないと思うのだけど。
503499:2008/11/26(水) 20:25:05
>>500
なるほど!その考えはなかったわ。と思って
C:\Program Files\Microsoft Visual Studio\VC98\Include 以下と
C:\cygwin\usr\include 以下を見てみたんだけど、
windowsなら_setsystime()であってますか?調べてみたけど使い方がわからない。
Linuxの方はcygwinで調べてみたけど、それらしいのがない・・・orz
504499:2008/11/26(水) 21:12:33
>>501
それも調べてみます。

>>502
了解しました。行って来ます。
505デフォルトの名無しさん:2008/11/26(水) 21:18:25
質問です

BALL ball[1000];
memset(&ball,0,sizeof(ball));

このソースでball1000個分ちゃんと0クリア
されるのでしょうか?
506デフォルトの名無しさん:2008/11/26(水) 21:32:44
BALLがPOD型なら
507デフォルトの名無しさん:2008/11/26(水) 21:34:02
>>505
BALLが doubleだったり、ポインタ型だったり、それらをメンバにもってたり、コントラクタもってたりしなければ

POD型というだけではダメだろう
508デフォルトの名無しさん:2008/11/26(水) 21:34:55
いやdoubleはほぼ間違いなく大丈夫だし、ポインタも大概大丈夫ではあるけどさ
509デフォルトの名無しさん:2008/11/26(水) 21:37:27
>>505
&はいらない
510デフォルトの名無しさん:2008/11/26(水) 22:10:09

ttp://xy.yu.to/ (ここは本来のサイトではないが)
この荒れまくりカオス絵チャのminiっていう部屋の
秘密スペース(枠外)への書き込みってどうやれば
できるようになるのか解析して教えろ。

あと、1人の防衛プログラマーのクリアツールが強すぎて、
荒しプログラマーがことごとく全員返り討ちになってるから
オマエラが面白くしてみろ。

ゲハハハごめんね
511デフォルトの名無しさん:2008/11/26(水) 22:40:42
>>506-509
ありがとうございます
なんかsizeofってよくわからないんす
げ、&いらないっすかそういえばそうですね
あるとまずかったりします?w
512デフォルトの名無しさん:2008/11/26(水) 22:55:38
ヘッダーで変数を宣言したらnewしなくても既に作られているんですか?
513デフォルトの名無しさん:2008/11/26(水) 23:00:44
>>512
Javaじゃないんだからそもそもnewなんて使わなくていい。
514デフォルトの名無しさん:2008/11/26(水) 23:01:34
>>511
そもそもmemset()を使うよりも自分でループを回してきちんとクリアする習慣をつけるべき。
memset()を使うのは大人になってからw
515デフォルトの名無しさん:2008/11/26(水) 23:11:19
相談させてください。

Cでメモリマップドファイルと、Win32APIイベントオブジェクトを使って、1対nのプロセス間通信を
考えているんですが、「対n」の部分がうまくいきません。
複数のプロセスが発生したイベントを1度ずつ参照して、その後にイベントをオフにする、そんな
サンプル、もしくは案があったら教えていただけませんか?
516デフォルトの名無しさん:2008/11/26(水) 23:12:25
取り敢えずマルチスレッドプログラミングスレに移動してみてはいかがでしょう。
517デフォルトの名無しさん:2008/11/26(水) 23:22:01
>>516
マルチスレッドかAPIのスレに行ってみようと思います
ありがとうございます
518デフォルトの名無しさん:2008/11/27(木) 01:55:28
>>510
普通に枠外に書いたら普通に書けて困った
519デフォルトの名無しさん:2008/11/28(金) 19:55:12
placement newで組み込み数値型やポインタ変数を作ったときって、デストラクタ呼ぶべきなんでしょうか。
520デフォルトの名無しさん:2008/11/28(金) 20:23:31
いらない
521デフォルトの名無しさん:2008/11/28(金) 21:03:04
組み込み型のデストラクタって呼べるんだっけ
522519:2008/11/28(金) 21:12:06
回答ありがとうございます。
改めて考えてみると一番の疑問のありどころが>>521
デストラクタ呼べるのならどうせ最適化で消えるだろうし、呼ぶのが未定義の動作を招くのなら違うコードを作ろうと思っていました。

VC++2008では
template<typename T>
void call_destructor(T &obj)
{
obj.~T();
}
というコードで問題なく動いているように見えます。
523デフォルトの名無しさん:2008/11/28(金) 22:59:16
うーむ

5.2.4 擬似デストラクタの呼び出し
1 ドット演算子.又は矢印演算子->の後ろに≪疑似デストラクタ名≫を付けた表現は、型名の表す非クラス型に対するデストラクタを表す。
その結果は、関数呼び出し演算子()の演算対象にしか使ってはならず、その呼び出し結果の型は、void型とする。
その効果は、ドット又は矢印の前にある≪後置式≫を評価することだけとする。

これ読む限り、こんな風に書けて、効果は「i;」と同じ、っていう風に読めるけどなぁ
VC++2008は文法エラーではねつける…(522のcall_destructor<int>は通るのに)

int i;
i.~int();

規格に詳しい人頼む
524デフォルトの名無しさん:2008/11/29(土) 05:27:56
>>523
文法要素としての擬似デストラクタ名 pseudo-destructor-name の中で、 ~ の後ろに
現れるのは type-name なんだけど、文法要素としては識別子とは別格のキーワードである
int, long, ... などはこの type-name に含まれないので文法エラーになる。

ちなみに、一般に「型名」と呼ばれる箇所は、文法要素としては simple-type-specifier が
対応し、これには type-name 単体に加えて、それに名前空間指定などを追加したものも
含まれるほか、 int, long, ... などの組み込み型をあらわすキーワードも含まれる。

完全に文法上の問題でキーワードを受け付けないだけなので、↓なら通ったりする。

typedef int Int;
Int i;
i.~Int();
525デフォルトの名無しさん:2008/11/29(土) 08:13:24
いくつかソフトを作ってきましたが、多態性と動的結合というものにまったく縁がありませんでした。
これはどういうときに使うんですか?使い方さえわかればよく使う便利なものになるんですか?
526デフォルトの名無しさん:2008/11/29(土) 11:07:28
>>524
なるほど、よくわかりました
キーワードは≪型名≫じゃないのか、盲点だった
527デフォルトの名無しさん:2008/11/29(土) 11:38:29
>>525
規模が大きくなるとありがたみが出てくる
あとは仕様変更が多い時とか
528デフォルトの名無しさん:2008/11/29(土) 16:11:27
>>525
C#の例で申し訳ないけど、

class Hoge {
  :
  :
  public void Write(Stream stream)
  {
    foreach (byte ch in tbl)
      stream.WriteByte(ch);
  }
}

↑こういうメソッドがあったとして、それを使う側は、
streamから派生してるクラスならなんでも渡せる。

Hoge hoge = ……;

FileStream file = ……; // ファイルにデータを出力
hoge.Write(file);

MemoryStream mem = ……; // メモリにデータを出力
hoge.Write(mem);
529デフォルトの名無しさん:2008/11/29(土) 17:28:01
>>525
多様な処理を、実行時に動的に切り換えたり組み合わせたりするソフトを作る時に便利
530デフォルトの名無しさん:2008/11/29(土) 18:15:53
>>527
俺は逆にベタで書けばよかったと後悔するほうが多かったけどね
531デフォルトの名無しさん:2008/11/29(土) 18:23:48
そこは設計ミスを後悔しろよ
532デフォルトの名無しさん:2008/11/29(土) 18:26:42
>>531
仕様変更があったらどんな先読み名人でも無理だろ
結局、プログラムなんて汎用性なんてつけずに
いま必要なものだけをシンプルに組んだほうがいいと悟った
533デフォルトの名無しさん:2008/11/29(土) 18:34:31
画面に図形を表示してそれをマウスで操作するっていう、オブジェクト指向の教科書の
例題に出てきそうなシステムをやったことあるけど、C++なのに、ぜんぜん
オブジェクト指向っぽい書き方してなくて、コード中がswitchの嵐で、あーあって
思ったことがあったな。
534デフォルトの名無しさん:2008/11/29(土) 20:31:31
>>532
たしかに。お仕事ソフトはいらない機能が多すぎる。
535デフォルトの名無しさん:2008/11/29(土) 20:32:03
>>533
それってWMがらみ?ならばいたしかたないかと。
536デフォルトの名無しさん:2008/11/30(日) 12:49:16
for ((初期化); (条件),(条件); インクリメントとか ) {
 内部処理
}

この場合の(条件)にはさまれた,はどういう意味ですか?
||とか&&の類でしょうか?
537デフォルトの名無しさん:2008/11/30(日) 12:51:08
>>536
for の継続条件には一番右の評価結果が採用されます
538デフォルトの名無しさん:2008/11/30(日) 12:54:27
そう
「A,B」はAを評価してからBを評価するっていう演算子
Aの結果は捨てられるから、Bが本当の条件でAはその前処理だな

初期化とインクリメントの所ではよく使うけど、条件で使うのは良くないなぁ
539デフォルトの名無しさん:2008/11/30(日) 13:30:46
使いどころによって良かったり良くなかったりするもんか?
別にどこで使ってもいいと変わらんと思うが。
540デフォルトの名無しさん:2008/11/30(日) 13:34:33
寧ろカンマは可読性を落とすからどこであろうとも使わない方がいいな。
そもそも関数呼び出しのカンマと区別がつきにくい段階で要らない子だ。
# forの初期化みたいにその子が役立つときもあることはあるが。
541デフォルトの名無しさん:2008/11/30(日) 13:36:41
if (c=getchar(), c == 'a') のような記述か?
どきっとするコードではあるな。
542デフォルトの名無しさん:2008/11/30(日) 13:47:34
>>540
マクロを書くときにも使える。
543デフォルトの名無しさん:2008/11/30(日) 14:04:04
>>539
初期化、インクリメントは副作用の方が必要だけど
条件節は式の評価の値が大事
そこに式全体の評価に寄与しないカンマ左辺みたいなのがあると混乱するから良くない
544デフォルトの名無しさん:2008/11/30(日) 21:30:01
struct Task {
//略
};

Task* InitTaskList() {
Task* task = new Task[NUM_TASK];

      //中略

return task;
}

int main() {
Task* taskArray = InitTaskList();

delete[] taskArray;
return 0;
}

この処理でInitTaskList()で動的に確保したメモリはちゃんと開放されますか?

あと、deleteでもコンパイル通るんですが
delete taskArray ←配列の先頭だけ開放
delete[] taskArray ←配列全体を開放

といった解釈でよろしいでしょうか?
545デフォルトの名無しさん:2008/11/30(日) 21:33:47
>>544
省略された箇所で例外が発生すると開放されない。
あと、 delete taskArray は未定義動作。

気にしなくてもあんまり問題になることはないんで、そのままでも
いいかもしれないが、完璧を求めるなら std::vector<Task> などの
標準コンテナを使うのがおすすめ。
546デフォルトの名無しさん:2008/11/30(日) 23:01:43
質問です。
iconvを使ってShiftJISのファイルをUTF8に変換するプログラムを書いています。
http://d.hatena.ne.jp/hp-ux/20081123
を参考に
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8164.c
を書きましたが、うまく動きません。
*outbuf に十分な空きがない。
と言う内容のエラーが出ます。
ですが、自分としては結構な容量を確保しているつもりです。
というかmallocしているoutbufの容量に00を二つ足しても、同じエラーが出ます。
どこか、悪い点を指摘していただけないでしょうか?
ちなみに、
byteread = read(fileno(src), inbuf, sizeof(inbuf));
という処理だけは、引数を含めて変更することは出来ません。
547デフォルトの名無しさん:2008/11/30(日) 23:24:44
>>546
char *inbuf = (char *)malloc(21701); を
char inbuf[21701]; にしてみたら?

ポインタに、sizeof(inbuf)すると、21701じゃなくて4になるよ。
548デフォルトの名無しさん:2008/11/30(日) 23:45:13
>どこか、悪い点を指摘していただけないでしょうか?
あんたの頭。
549デフォルトの名無しさん:2008/11/30(日) 23:47:11
>>548
初心者スレであんまり調子コキ過ぎなレスつけんな
以降、みんな相手にしないように
550デフォルトの名無しさん:2008/11/30(日) 23:47:58
iconvの使い方、間違ってる。
551デフォルトの名無しさん:2008/11/30(日) 23:49:45
いつからここが初心者スレになったんだか。

マジで書くと、iconv云々以前にCの基本も理解できてないしストリーム系I/Oと低レベルI/Oを混ぜる馬鹿も晒しているし、
なのにread()の処理だけは変更できないなんて妙な拘束条件は提示してもその原因は伏せたまま。
どう考えても悪いのは頭だろ。
552デフォルトの名無しさん:2008/12/01(月) 00:03:46
うまく真似できなかっただけみたいだから、そう怒らんでもいいのでは?
553デフォルトの名無しさん:2008/12/01(月) 00:12:23
愛昆布
554デフォルトの名無しさん:2008/12/01(月) 00:33:14
>>547
すいません。有り難うございます。
>>548
すいません。
>>550
どういう風に違うのでしょうか?
ファイルをメモリに読み込んで->即変換->変換した物を書き出し
とういう処理を行いたいのですが...
>>551
すいません。
>マジで書くと、iconv云々以前にCの基本も理解できてないしストリーム系I/>Oと低レベルI/Oを混ぜる馬鹿も晒しているし、
>なのにread()の処理だけは変更できないなんて
>妙な拘束条件は提示してもその原因は伏せたまま。
>どう考えても悪いのは頭だろ。
一応filenoを使ったのですが、駄目だったでしょうか?
read()の処理を変えられないのは、
実際の処理はソケットディスクリプタからreadするからで、
それ以外の方法がサンプルコードに乗ってなかったし、
試してもソケットからうまく読み込む事が出来なかったからです。



555デフォルトの名無しさん:2008/12/01(月) 00:39:34
>実際の処理はソケットディスクリプタからreadするからで、
そういうのは先に書こう。
まぁ、iconv以前にソケットから読み込むだけのプログラムでも作って充分納得してからiconvに挑戦することだね。
556デフォルトの名無しさん:2008/12/01(月) 00:53:39
>>555
>まぁ、iconv以前にソケットから読み込むだけのプログラムでも作って充分納得してからiconvに挑戦することだね。
いや、そこはもう出来て、満足してるんで別に良いんです。
iconvが動作しないから困ってるんです。
557デフォルトの名無しさん:2008/12/01(月) 01:02:58
> byteread = read(fileno(src), inbuf, sizeof(inbuf));
これでホントに動かしているの? どうしようもねぇな。
558デフォルトの名無しさん:2008/12/01(月) 01:10:14
すいません。
なんかGDBで変数を見ながら、
うさん臭いところなおしたら、なんか動きました。
有り難うございます。
ポインタをsizrofすると、このばあいchar *のサイズがかえってくる事を
うっかりしていました。
有り難うございます。
559デフォルトの名無しさん:2008/12/01(月) 01:31:53
>>551
スレタイも読めないのかお前は、2chド初心者丸出し
お前、頭悪いぞ!
560551:2008/12/01(月) 01:36:00
すいませんC++相談室と間違えてました
561551:2008/12/01(月) 02:14:41
馬鹿は騙るな。下らん。
それとも何か? 「初心者歓迎」だから「初心者スレ」だとでも?
他に文字通り初心者向けのスレがあることも認識できないのか?
562デフォルトの名無しさん:2008/12/01(月) 02:30:41
と馬鹿が申しております
563デフォルトの名無しさん:2008/12/01(月) 10:39:05
何ができるようになれば上級者ですか?
564デフォルトの名無しさん:2008/12/01(月) 11:39:03
>>563
初心者に寛容になったらと思ってる
565デフォルトの名無しさん:2008/12/01(月) 11:46:03
どの程度のレベルまで行けば初心者を脱出できるんですか?
566デフォルトの名無しさん:2008/12/01(月) 12:32:20
>>565
誰かをうざがったり馬鹿にしたりという独りよがりをし始めたら
567デフォルトの名無しさん:2008/12/01(月) 13:06:38
>>565
その質問をする側じゃなくて答える側になったら
568デフォルトの名無しさん:2008/12/01(月) 13:10:05
実力に関わらず初心を忘れていれば
569デフォルトの名無しさん:2008/12/01(月) 13:18:38
クラスの練習をと思い、稚拙ながらプログラムを組んでみたところ
どう対処してよいか分からないエラーが出たので、質問させていただきます

ソースコードはこちらです
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8168.txt

エラーの内容は以下の通りです
-----------------------------------------------------------------------
class.cpp(19) : error C2059: 構文エラー : 'switch'
class.cpp(19) : error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます

どうもswitchの様子がおかしいようですが、どう対処したらいいものか・・・
お願いします
570デフォルトの名無しさん:2008/12/01(月) 13:24:04
>>569
switchの前に}があるのがおかしい
571デフォルトの名無しさん:2008/12/01(月) 13:27:10
>>570
そんな仕様があったんですか

このswitch文をクラスの外に出しても、switchはmainで機能しますかね?
572デフォルトの名無しさん:2008/12/01(月) 13:36:02
>>571
「そんな仕様」が何を指しているのか判らんが、
関数の外には実行文は置けない。
クラス云々以前に、先ずは普通にプログラミングしてみてはどうか。
573デフォルトの名無しさん:2008/12/01(月) 13:38:20
>>571
setegara() の中で switch したいのなら
setegara() の中に記述しろ ってことだ
ロダにあがってるソースは setegara() { } switch() { }
ってなってるじゃん と
574デフォルトの名無しさん:2008/12/01(月) 13:41:37
>どう対処してよいか分からないエラーが出たので、質問させていただきます
PCを窓から投げ捨てろ。
さもなくば、入門書なりサイトなりのサンプルをそのまま動かしてみろ。
575デフォルトの名無しさん:2008/12/01(月) 13:56:41
>>572
すいません、関数とか実行文なんかの概念もキッチリ定着していないので
基本的なタブーなんかを理解出来ていないようです

>>573
その方法でやったら出来ました、有難うございます
そして一つ気付いたのですが、どうも}の数が一つ足りなかったようです
こんなケアレスミスで質問してしまい、すいませんでした

>>574
PC投げ捨てだけは勘弁してください

ご解答していただいた方々、有難うございました
576デフォルトの名無しさん:2008/12/01(月) 16:19:25
解答じゃなくて回答な。
あと「ご回答いただいた」か、「回答していただいた」かどっちかでいいぞ。
577デフォルトの名無しさん:2008/12/01(月) 16:23:46
ご開帳いただきありがとうございました。
578デフォルトの名無しさん:2008/12/01(月) 19:04:35
#include <iostream>
#include <stdio.h>

using namespace std;

int main() {
int num;
int* Array = new int[40960];
scanf("%d",&num);
delete[] Array;
return 0;
}

このプログラムなんですが、配列を動的に確保しているんですが
タスクマネージャーなどで見てもメモリ使用率が増えていないんですが
メモリの使用状況を調べる方法はありますか?
579デフォルトの名無しさん:2008/12/01(月) 19:25:48
確保した配列をゼロクリアしてみたら?
580578:2008/12/01(月) 19:38:15
memsetしてみましたが結果は変わりませんでした…
581デフォルトの名無しさん:2008/12/01(月) 19:52:37
>>578
40960って1MBないだろ?w
160kぐらいだろ?
微妙に変わってるけど気づいてないか
あらかじめ一定量取られちゃってて変化無しか
ってとこじゃね?
582578:2008/12/01(月) 20:10:22
int* Array = new int[40960000];
でやってみましたが変化ありませんでした…
583デフォルトの名無しさん:2008/12/01(月) 20:15:16
>>582
それ今度はnew失敗してるでしょ?
たしか限界あった希ガス
584デフォルトの名無しさん:2008/12/01(月) 20:18:19
メモリ使用量ではなく、仮想メモリサイズを見るべき (デフォルトでは非表示)
585デフォルトの名無しさん:2008/12/01(月) 20:28:48
ああ、newだから失敗しないのか
配列だとたしかすぐ駄目なんだよねスマンコ
586デフォルトの名無しさん:2008/12/01(月) 20:34:52
>>578
とりあえず
ttp://d.hatena.ne.jp/NyaRuRu/20051022
でも見れ
587578:2008/12/01(月) 20:41:58
タスクマネージャのコミットチャージの欄で生成と解放で上下しているのを確認できました。
色々助言ありがとうございました!
588デフォルトの名無しさん:2008/12/02(火) 00:10:48
>>576
全然よくねーよ
589デフォルトの名無しさん:2008/12/02(火) 21:01:36
>>576
お前さん 敬語をもっと勉強しないとやばいぜ?
590デフォルトの名無しさん:2008/12/03(水) 05:18:29
VisualStudio2005 SP1(Pro)で開発しています。
開発OSはXPでターゲットはVistaです。
開発したソフトがXPでは問題なく動作するのですが、Vistaでは動作しません。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\\Services\自分のKey
以下へアクセスしたいのですが、レジストリのキーの値を読むことはできるのですが、
値を変更(削除してから書き込み)ができません。
具体的にはStartレベルを変更できません。
試したこととしては、管理者権限で実行を行い実行>レジストリ値変更できず。
管理者権限で実行&XP(SP2)互換で実行>レジストリ変更できず。
プログラム的な問題なのか?もっと別の問題なのかがわかりません。
どなたか、上記について詳しいサイト、書籍などご存知でしたらご教授願えないでしょうか?
591デフォルトの名無しさん:2008/12/03(水) 07:14:25
他のクラスのインスタンスを使うとき、長いコードを書いているのを小さくしたいです。

((CMainFrame*)AfxGetMainWnd())->m_wndFile.m_Edit.InitEdit();

これはポインタで
CEdit *m_newEdit = ((CMainFrame*)AfxGetMainWnd())->m_wndFile.m_Edit;
m_newEdit->InitEdit();

それか、参照で
CEdit &m_newEdit = ((CMainFrame*)AfxGetMainWnd())->m_wndFile.m_Edit;
m_newEdit.InitEdit();

どっちがいいんですか?どっちも同じなんですか?参照を使ったことがないので教えてください。
592デフォルトの名無しさん:2008/12/03(水) 07:46:26
>>591
対象が変わらないなら参照の方がいいね。ポインタだと、使い回しを疑って見ないといけなくなる。
593デフォルトの名無しさん:2008/12/03(水) 08:06:55
なるほど、参照わかりました。
これから使っていけそうなきがしてきました
どうもです!
594デフォルトの名無しさん:2008/12/03(水) 09:10:59
class A {
 static const int ARRAY_N = 10;
 int array[ARRAY_N];
};

class B {
 int array[ARRAY_N];
};

って感じで、BでもAのprivate使いたいときがたまにあるんだけど、
friendしちゃってもイイのかな?(・∀・)
595デフォルトの名無しさん:2008/12/03(水) 09:47:21
あ、俺freiendでコード実行できたことないんだけど
どういう関係のとき使えるの?
静的じゃないとどうしようもなくない?
596デフォルトの名無しさん:2008/12/03(水) 09:57:40
それだけのためにfriendは普通しない
つうか設計がおかしいだろww
597デフォルトの名無しさん:2008/12/03(水) 10:03:46
ゲッターとセッターとは別に高速化の為に配列への直アクセスを許したいときなんかにfriendつけた
598デフォルトの名無しさん:2008/12/03(水) 10:04:16
>>596
じゃあどうすればいいの
599デフォルトの名無しさん:2008/12/03(水) 10:50:01
>>590
UACだろ。マニフェストで管理者権限への移行できるようにする。
600デフォルトの名無しさん:2008/12/03(水) 11:34:57
>>598
A, B,の関係やARRAY_Nの意味が分からないとなんとも言えない
601デフォルトの名無しさん:2008/12/03(水) 11:36:07
>>594
static const は public にしてもいいんじゃね?どうせ書き換えられないんだし。
あ、その値に外部から見て意味があるんならね。
602デフォルトの名無しさん:2008/12/03(水) 11:37:56
>>594 の例だと、public でいいんじゃね?
friend 使ってまで「あるクラスの持つ定数を
他のクラスに見せたくない」理由が解らん。
603594:2008/12/03(水) 11:51:10
みんなどうもあんがと。
AとB以外には意味のない、ただのマジックナンバーを全体に公開するのも気がひけるなぁ
と思ったんだけど、やっぱfriendはダメかな?

2つ以上のクラスで使う定数はグローバルに出すって人もいるけど、僕はああいうの嫌い
604デフォルトの名無しさん:2008/12/03(水) 11:52:58
>>597
inlineじゃだめなの?
605デフォルトの名無しさん:2008/12/03(水) 11:53:45
>>603 >600
606デフォルトの名無しさん:2008/12/03(水) 12:05:52
class C { protected: static const int ARRAY_N = 10; };
class A : C { int array[ARRAY_N]; };
class B : C { int array[ARRAY_N]; };
こんな感じ?
607デフォルトの名無しさん:2008/12/03(水) 12:25:51
>>606
なんか気持ち悪いな
608デフォルトの名無しさん:2008/12/03(水) 13:02:17
>>600
やっぱそんなもんか
よくそんなんで否定できるな
609602:2008/12/03(水) 13:09:10
>>608
>596 == >600 なのか?
610デフォルトの名無しさん:2008/12/03(水) 13:11:37
それよりマジックナンバーを全体に公開の意味がわからない
定数のことか?
611デフォルトの名無しさん:2008/12/03(水) 14:06:18
>>609
ちゃうわww
612デフォルトの名無しさん:2008/12/03(水) 14:07:19
namespaceあるんだからそこまで神経質にならんでもいいと思うけどな
613デフォルトの名無しさん:2008/12/03(水) 14:10:35
名前のある定数はマジックナンバーとは言わないような
614デフォルトの名無しさん:2008/12/03(水) 14:16:18
名前付きマジックナンバー
615デフォルトの名無しさん:2008/12/03(水) 14:18:05
マジックネーム?
616デフォルトの名無しさん:2008/12/03(水) 14:19:42
無名定数
617デフォルトの名無しさん:2008/12/03(水) 15:37:26
数値の直書きがマジックナンバーじゃないのか
マクロや変数で他人にも意味のわかる名前付けたらマジックナンバーじゃない
618デフォルトの名無しさん:2008/12/03(水) 16:23:33
ファイル関連で質問です
任意のディレクトリ以下のcsvファイルのフルパス(サブディレクトリのファイル含む)を取得したいです。
FindFirstFileとかででいけそうと思ったのですが、ファイル名しか取得できなくて困っています。
どうすればディレクトリも取得でlきますか?
619590:2008/12/03(水) 17:08:39
>>599
レスサンクスです。
マニフェストで、管理者権限与えるのは
右クリック「管理者権限で実行する」と同じものだと思っていたんですが違うんですか?
ttp://www.game-create.com/archives/578#more-578
マニフェストはまだやっていないのですが、
VistaのUAC切って実行したんですが、ダメでした。
620デフォルトの名無しさん:2008/12/03(水) 17:40:26
そこのアクセス権限はどうなっている?
普通はAdministratorsにフルアクセスがあるはずだと思うんだけど。
621デフォルトの名無しさん:2008/12/03(水) 17:44:33
とりあえずGetLastError()を。
622デフォルトの名無しさん:2008/12/03(水) 17:53:46
書き込み権限ありでオープン時に失敗するのか、書き込み時なのかは?
623590:2008/12/03(水) 17:57:11
レスサンクスです。
>>620
レジストリのアクセス権限の調べ方について、今から調べてきます、、、orz。
>>621
今から実装して調べます。
>>622
書き込み権限はありますが、レジストリキーの値(Start)を
削除するときに失敗します。(レジストリが上書きできないので、削除⇒書き込みとしています)
>>621の言うように何で引っかかっているのかをGetLastError調べてみます。
624デフォルトの名無しさん:2008/12/03(水) 18:14:30
>>618
「任意のディレクトリ以下」って言ってんだから、そのディレクトリ名は分かってんだろ?
後はそのディレクトリ名とファイル名を結合するだけじゃないか。
パス関係のAPIはこれな。
ttp://msdn.microsoft.com/en-us/library/bb773559.aspx
625590:2008/12/03(水) 20:16:43
うまく動作するようになりました。
お騒がせしてすみません。

レジストリキーの値を削除できなかった理由ですが、
ドライバが稼動中のため、できなかったためだとわかりました。
最小構成単位のプログラムで実験してわかりました。
みなさまのおかげで解決へといたりました。
(XPでも同様の理由でうまくいかないはずなのですが、
 実験環境がたまたま動作してしまったのかもしれません)

スレ汚し申し訳ありません。
626デフォルトの名無しさん:2008/12/03(水) 23:34:56
>>624
ありがとうございます。
例えばC:\temp以下&サブディレクトリ(数、名前は不定)のcsvファイルのフルパスを取得もできるってことですすか?
未だサブディレクトリの取得方法がわかりません。
リンク先みましたがどれが該当するかわかりませんでした。。
627デフォルトの名無しさん:2008/12/04(木) 00:27:11
>>626
FindFirstFile("c:\\tmp\\?*", lp)とでもして
いったん全部列挙すればディレクトリを取りこぼさない

*.csvならおk
ディレクトリなら再帰探索
それ以外は捨てる
628デフォルトの名無しさん:2008/12/04(木) 00:28:53
そしてfoo.csvなんて名前のディレクトリで嵌まるんですね?
629デフォルトの名無しさん:2008/12/04(木) 00:33:28
頭の悪い質問ですいません。
入力した文字をひっくり返したい(例.abc→cba)ので↓のようにしてみたのですがひっくり返された文字+謎の文字の羅列が出てきてしまいます
どこを直せば良いでしょうか?
#include <stdio.h>

int main()
{
int i,j=0,k=0;
char aa[100],bb[100];
printf("99文字以下の文字列を入力してください");
scanf("%s",aa);
for(i=0;i<100;i++)
{
if(aa[i]==0)
break;
}
for(j=0;j<i;j++)
{
bb[j]=aa[i-j-1];
}
printf("入力された文字は%sで、これをひっくり返すと%sです。\n",aa,bb);
}
630デフォルトの名無しさん:2008/12/04(木) 00:35:28
>>629
フォーループを脱出したら、bbの該当箇所にナル文字入れてやらんと。

それはさておき、99文字以下なら%sじゃなくて%99sにしておくのが無難。
631デフォルトの名無しさん:2008/12/04(木) 00:58:28
>>630
すいませんが変更部分だけでいいのでプログラミングを書いてくれませんでしょうか。
632デフォルトの名無しさん:2008/12/04(木) 01:03:44
for(j=0;j<i;j++)
{
bb[j]=aa[i-j-1];
}
bb[j]=0; //これを追加?
printf("入力された文字は%sで、これをひっくり返すと%sです。\n",aa,bb);
633デフォルトの名無しさん:2008/12/04(木) 01:07:47
>>632
おぉ、出来ましたー。
ホントにありがとうございました。
634デフォルトの名無しさん:2008/12/04(木) 01:39:37
bb[j]='\0'; の方が良い、と誰かが言うと思う
635デフォルトの名無しさん:2008/12/04(木) 01:40:49
どっちでも一緒だろ、と誰かが言うと思う
636デフォルトの名無しさん:2008/12/04(木) 06:12:41
どうせだからforの条件も'\0'にした方が、と誰かが言うと思う
637デフォルトの名無しさん:2008/12/04(木) 07:43:28
char型の配列やポインタで文字列を入れるときは '\0' を使うな
整数として使うときはのときはもちろん0だが

文字定数ってint型なんだよな
638デフォルトの名無しさん :2008/12/04(木) 07:58:42
>>637
なんで?
639デフォルトの名無しさん:2008/12/04(木) 08:36:52
>>637
ここはCとC++のスレdだぞCスレじゃない
640デフォルトの名無しさん:2008/12/04(木) 10:59:21
COMとDLLの違いってなんですか?
641デフォルトの名無しさん:2008/12/04(木) 11:35:44
COMの形態の一つにDLLがある
642デフォルトの名無しさん:2008/12/04(木) 13:07:02
DLLがプログラムを小さくできる、だと
COMはなにができるんですか?
COMにしなきゃいけない場面がわからないです
643デフォルトの名無しさん:2008/12/04(木) 13:29:06
他の言語(特にVBやスクリプト言語)から使えるようにもできる。
644デフォルトの名無しさん:2008/12/04(木) 13:44:18
引数 const _variant_t& varValue にCStringを渡したい場合はどう書けばいいんでしょうか
645デフォルトの名無しさん:2008/12/04(木) 14:00:02
CString型の変数sに対して_bstr_t(s)のようにする。
646デフォルトの名無しさん:2008/12/04(木) 14:32:57
thx!
647デフォルトの名無しさん:2008/12/04(木) 18:07:22
関数は基本的に小文字で宣言してるんだが、
マクロ関数は大文字の方がいいだろうか?
648デフォルトの名無しさん:2008/12/04(木) 18:25:36
基本的には大文字だろうな
関数のように見せかけたいとか、関数に置き換える可能性があるとかなら関数の命名に従うのもあり
649デフォルトの名無しさん:2008/12/04(木) 20:34:50
どっちでもないから大文字か…ありがとう。
650デフォルトの名無しさん:2008/12/04(木) 22:01:59
int a[10000];
for(i;i<10000;++;){
配列aを使用
}

for(i;i<10000;++;){
int a[10000];
配列aを使用
}

上のように、ループ内などで一時的に利用したい変数を、ブロック外で予め宣言しておく書き方と、
下のようにその都度ループ内で確保する書き方では、(実感できるかはともかく)上の方が実行速度の面で良好ですか?

一応実測では、(膨大な回数のループを繰り返して)前記の方法の方がわずかに速かったのですが…
651デフォルトの名無しさん:2008/12/04(木) 22:34:04
>>650
ホントに差が出た? 初期化がないなら同じでいいはずなんだけどね。
最適化してないなんて落ちはないだろね。
652デフォルトの名無しさん:2008/12/04(木) 22:42:53
>651
すみません、その落ちでした…

つまり、きちんと最適化が施されているならどちらの記法でも変わらない
(一時作業領域なんだからむしろ後者が好ましい)ということですね
653デフォルトの名無しさん:2008/12/05(金) 00:45:16
99文字までの文字列を入力し,アルファベットの小文字は大文字に,アルファベットの大文字は小文字に,またアルファベット以外の文字はアスタリスク’*’に変換した文字列を出力するプログラムを作成せよ.
このプログラムの実行例は次の通り.

99文字以下の文字列を入力してください.
abcABC123sDFgh#"x32YY=
変換された文字列はABCabc***SdfGH**X**yy*です.

注意:このような課題に適したライブラリ関数もあるが,ここではそれらを使用せずにプログラムを作成せよ

誰かこれお願いします。明日までにやらなきゃいけないんですけど全く分かりませんorz
654デフォルトの名無しさん:2008/12/05(金) 00:47:51
宿題スレへどうぞ
655デフォルトの名無しさん:2008/12/05(金) 00:57:55
>>654
スレチですいませんでした
656デフォルトの名無しさん:2008/12/05(金) 05:42:21
>>653
こんなの文章通りにプログラム組んで終わりじゃねーか?w
これが全くわからないレベルってもう組んでもらって
ソースを貼るしか解決策ねーだろマジでw

そもそも四則演算以外の知識マジでいらなくね?
小学生が喜んでとく問題・・・みたいな・・・
657デフォルトの名無しさん:2008/12/05(金) 09:50:55
関数型言語だったら楽なのにね☆
ある文字を一行目の法則で変換する関数fを作って、
map f 入力文字列
で終了
あ、C++は関数型言語パラダイムも含んでいるんだっけ
658デフォルトの名無しさん:2008/12/05(金) 09:55:13
この宿題はべつに関数型言語で楽になる内容ではない。
659デフォルトの名無しさん:2008/12/05(金) 12:35:14
boostライブラリって何ができるんですか?STLはすぐ実用的で使えたんですが
boostはなにが出来るのかすらよくわかりません。
660デフォルトの名無しさん:2008/12/05(金) 12:39:12
>>659
ググればいくらでも出てくると思うんだが。
661デフォルトの名無しさん:2008/12/05(金) 12:51:47
STLを一言でいうと動的配列とその操作
だとするとBoostは一言でなんですか?解説が難しすぎてまったく理解できません。
662デフォルトの名無しさん:2008/12/05(金) 12:59:51
663デフォルトの名無しさん:2008/12/05(金) 13:00:36
>>661
一言でいえるなんて考えてる限り理解できるわけ無いな。

あえて質問にだけ答えると、 boost.org のトップにあるとおり。
"Boost provides free peer-reviewed portable C++ source libraries"
664デフォルトの名無しさん:2008/12/05(金) 13:00:39
>STLを一言でいうと動的配列とその操作

赤点。一週間後に再テストな。
665デフォルトの名無しさん:2008/12/05(金) 13:00:56
プログラミングに限らず、ディテールが頭に入っていない状態で
「まとめられた一言」を聞いても、全然効果が無いと思うよ。解説なんかよりずっと難しい。
666デフォルトの名無しさん:2008/12/05(金) 13:12:09
でもやっぱり必要だとか便利だから使おうかってなるじゃないですか?
その部分が一言でむりなライブラリってことですか?
667デフォルトの名無しさん:2008/12/05(金) 13:17:55
一言で言うと
「便利なライブラリの集合」

個々のライブラリについては概要についてそれなりに言えるけど
そんなもん個々のライブラリのドキュメントのintroductionとかmotivationを読めばいいし
668デフォルトの名無しさん:2008/12/05(金) 14:13:10
operator[]に2つ以上の引数を渡すにはどう記述すればいいでしょうか。
ググっても引数1つの例しか見つけられず…よい方法があれば何卒お力添えを
669デフォルトの名無しさん:2008/12/05(金) 14:17:15
>>668 a[std::make_pair(0,1)]
670デフォルトの名無しさん:2008/12/05(金) 15:07:17
>>669
2つ引数渡せました、ありがとうございます。
a[0,1] みたいにブラケットだけで渡すのは無理そうですかね
671デフォルトの名無しさん:2008/12/05(金) 15:08:44
>>670
無理だがoperator()ならオーバーロードすればいける。
672デフォルトの名無しさん:2008/12/05(金) 15:11:11
>>670
元々 [] が単項の演算子なのでどうしようもない

>>671 のような演算子をオーバーロードする
673デフォルトの名無しさん:2008/12/05(金) 15:24:51
>>671-672
うーむ、やっぱり無理かぁ…残念。
ベクトルの要素へoperator[]でアクセスできればいいなあと思ってました。
operator()でやってみますね。どうもありがとうございました。
674デフォルトの名無しさん:2008/12/05(金) 15:32:26
いや、vectorの要素ならそもそも引き数は一つだろ。
675デフォルトの名無しさん:2008/12/05(金) 16:12:55
>>672
[]は単項演算子か?
676デフォルトの名無しさん:2008/12/05(金) 16:21:12
開発環境は、VisualStudio net2005 OSはXPです。
スライダーコントロールで下記の様に使いたいのですが
良い方法がありましたら教えて戴けませんでしょうか?
0------------100
--------------
通常時は、0-50までしか動かせない。
チェックボックスに、チェック入れば0-100まで動かせるようになる。
677デフォルトの名無しさん:2008/12/05(金) 16:33:12
>>676
50から先に動かしたときに、イベントハンドラで強制的に50に戻してしまえば委員で内甲斐。
678デフォルトの名無しさん:2008/12/05(金) 16:34:46
>>676
サブクラス化汁
679676:2008/12/05(金) 16:45:27
676さん、678さん、ありがとうございます。
OnNMCustomdrawSlider内で、無理やりやってみました。
出来ました。ただチップ表示させると50以降に持っていった時に
50じゃなくて、47とか49とか描画がついてこない?時があります。
もうちょっと、あがいてみます。

サブクラス化については、ググってみます。。
680デフォルトの名無しさん:2008/12/05(金) 17:27:46
なにサブクラスって
681デフォルトの名無しさん:2008/12/05(金) 18:37:24
>>680
win32用語
メッセージをがめる的使い方をする
682デフォルトの名無しさん:2008/12/05(金) 19:04:25
質問させてください。
例外処理で言う例外というのは「エラー」に限定して捉えた方が
いいのでしょうか?それとも呼び出し側の関数からみて想定していない
動作が起こる場合も例外として捉えていいのでしょうか?

言葉でうまく説明できないのですが下のような設計(麻雀)は例外処理の使い方として
あるべき姿かどうか教えてください。

ゲーム管理=順番や牌の受け渡しを管理する

プレイヤ=ゲーム管理から渡された牌に基づき手を作る

ゲーム管理がプレイヤへツモ牌を渡して、戻り値として捨て牌を要求

ゲーム管理側にすれば捨て牌が戻ってくるのが想定している動作

一方、プレイヤ側からすれば、捨て牌がない場合もある(渡されたツモ牌で和了する場合、カンをしたい場合など)

これを解決する方法として、和了例外、カン例外を用意してプレイヤ側がゲーム管理側に自分の判断を通知


例外を使わない場合よりもすっきり書けそう、という理由でこのようなやり方にしようと思ったのですが
エラー処理以外に例外を使用してもいいのだろうか?という疑問がありましてこれを採用してもいいのか迷っています。
683デフォルトの名無しさん:2008/12/05(金) 19:07:19
別にそういう例外仕様で実装するのは構わないと思うのだけど、
本来のエラー処理の例外も実装する必要があるだろうし、
例外の仕様が膨らむと見通しの悪い非効率なプログラムになってしまう危険は孕んでいるね。
684682:2008/12/05(金) 19:22:51
>>683

ありがとうございます。このやり方でいこうとすると
エラー処理も含めてどの位の例外処理が必要になるか考えていませんでした
例外についてはまだまだ不勉強なところがあるので、特にデメリットに
ついて勉強して採用するかしないか決めたいと思います。
685デフォルトの名無しさん:2008/12/05(金) 20:10:11
>>682
俺なら戻り値はプレイヤの操作を受け取りたいかなぁ。
捨て牌は引数にポインタかなんかあげといて、捨て牌アリの操作のときだけ拾う。
エラー以外で例外処理使うとごちゃ混ぜになりそうで嫌だねぇ。
686デフォルトの名無しさん:2008/12/05(金) 20:42:31
一般的には例外をフロー制御に用いるのは良くないことだとされていると思う。
この場合、ユーザーの操作としては和了、カンなんかはごく普通に発生するわけだから
例外として扱うのは相応しくないと思う。
>685 の通り、捨て牌ではなくて(牌を捨てることも含めて)ユーザー操作が返ってくるべきなんじゃない?
687デフォルトの名無しさん:2008/12/05(金) 20:53:35
以下、キーワード「戻り値」だけに反応した超脳筋レス

大抵の関数の戻り値はBOOLとかboolにして値は引数で受け取るべき
try、catchは俺は嫌い
動作がわけわかんねー
throwとか投げられてもどう対処していいのかさっぱりわからん
っていうか一番対処方法をわかってるのなんて出したその箇所に決まってるのに
なんで上に投げてくるのかわからん
詳細なんてテメーで処理しろっての
こっちが必要なのはあくまでbool値、成功か失敗かだけだろが

言語開発者マジ殴りてぇ
っていうか多くの現場で当然のごとく使われて無い
当たり前だ
こんな暇なもん実装してられるか

そうそうそれと本題だけどシステム的にこれ以上続けようがないってのがエラーで
続けて対処する仕様まであるならそれは仕様であってエラーではないと思うよ

あー、すっきりした
688682:2008/12/05(金) 20:56:26
>>685

ありがとうございます。操作と捨て牌を戻してもらって必要な時だけ
捨て牌を読むというのは考えてませんでした。このやり方なら
例外を使った場合と結果的に変わらない処理の流れが実現できますね。
(僕は例外を使わない場合として捨て牌を表さない値が返ってきたら、管理側から
改めて和了するのかをboolで、カンするのかをboolで、と逐一確認する方法を
考えていました・・・未熟ですorz)

標準ライブラリの例外の継承構造を見ても非エラーを表すような
クラスはなかったのでやはり、エラー時に使うのが前提。とまではいかなくても
わりやすいということになりますね。
689デフォルトの名無しさん:2008/12/05(金) 21:43:59
try
{
  安倍政権();
  throw "空気読めない";
}
catch(char *str)
{
  cout << "Exception raised: " << str << '\n';
  try
  {
    福田政権();
    throw "あなたとは違うんです!";
  }
  catch(char *str)
  {
    cout << "Exception raised: " << str << '\n';
    try
    {
      麻生政権();
      throw "漢字読めない。";
    }
    catch(char *str)
    {
      cout << "Exception raised: " << str << '\n';
      while(!政権交代);  // ← 今ココ!
    }
  }
}
690682:2008/12/05(金) 21:52:38
>>686
ありがとうございます。確かに和了やカンを例外と扱うのは違和感がありますよね。
スタックを巻き戻ることができる機能として例外を捉えていた部分があるので、皆さんの
意見を参考にもう一度検討してみます

>>687
ありがとうございます。エラーの定義が自分の中であいまいな部分があったので
システム的にこれ以上続けようがないと言うのを参考にさせていただきます
691デフォルトの名無しさん:2008/12/05(金) 21:56:35
string hoge;


これをLPCTSTRに変換したいんですが・・・
どういった方法がありますか?
692デフォルトの名無しさん:2008/12/05(金) 22:00:35
>>687
一般的に、プログラムを部品化していくと、エラーを検知した場面では最適な対処方法を
知る術は無い状況はすぐに発生する。

そう思わないのなら、たぶん部品化をあまり行っていないか、部品化するまでも無い
プログラムしか書いたことがないんだろう。まぁ別にそれ自体は悪いことじゃないが、
自分がよくわからない物事を嫌ったり不要だと決め付けたりする姿勢は、技術者としては
かなりのマイナスだね。
693デフォルトの名無しさん:2008/12/05(金) 22:07:49
>>691

stringって、STLの文字列か?

ATLの文字列変換マクロとか使うのが簡単かな。

#include <atlbase.h>
#include <atlconv.h>

CString ConvSTLstringToCString(string &str)
{
  USES_CONVERSION;

  return CString(A2T(str.c_str()));
}

これでCStringに変換されるはず。 キャストなしでLPCTSTRとしても
使える。
694デフォルトの名無しさん:2008/12/05(金) 22:11:46
>>691
たとえば、void func(LPCTSTR); みたいな関数に渡すだけなら、

func(CString(hoge.c_str())); で。

バッファにコピーしたいなら、
std::vector<TCHAR> buf(hoge.size() + 1);
lstrcpy(&buf[0], hoge.c_str());
みたいな感じで。
695デフォルトの名無しさん:2008/12/05(金) 22:14:36
>>693
>>694

CstringってSTLにはないですよね?ATLってやつですか?
VSexpressでも使えるんでしょうか
696デフォルトの名無しさん:2008/12/05(金) 22:16:26
>>695
MFCだから、たしか、expressじゃ使えなかったと思う。
697デフォルトの名無しさん:2008/12/05(金) 22:18:56
>>696
じゃあ使えないんですね・・・・

どうしよう・・・
698デフォルトの名無しさん:2008/12/05(金) 22:20:24
APIのみだったら、

#if _UNICODE
#endif

みたいので、文字コードをMultiByteToWideChar()で変換するコードを入れるしかないのかな?
699デフォルトの名無しさん:2008/12/05(金) 22:21:44
プロジェクトのプロパティにはATLの使用とかMFCの使用の設定があるのにな
expressではつかえない
700デフォルトの名無しさん:2008/12/05(金) 22:22:51
>>698
なんか難しそうですね・・・
わかりません
701デフォルトの名無しさん:2008/12/05(金) 22:23:02
>>693
現在のCStringTはXCHAR*、YCHAR*両方のコンストラクタを
持っているから、CStringを作る気なら直接char*文字列を食わせればよい

さらに言うと、現在は
USES_CONVERSIONを定義する必要がないCA2T(マクロとテンプレートの
あわせ技)が使えるので、
マクロを使うのなら、そっちを使ったほうがいい
702デフォルトの名無しさん:2008/12/05(金) 22:25:20
あのーさっぱりわからんですw
703デフォルトの名無しさん:2008/12/05(金) 22:25:25
汎用テキストは面倒なだけだから、WCHARに決めうちがいいよ。
TCHAR系は使わない方向で。
TCHAR使ったって、MBCSとUNICODEの両方に対応したコードを書くのはムリ。
704デフォルトの名無しさん:2008/12/05(金) 22:29:45
>>697
LPCTSTRは、Unicodeビルド時は「const WCHAR *」、非Unicode時は
「const CHAR *」に変換されるので、Unicodeビルドでなければ
(MBCS=シフトJIS)、STLのstringの中身は、LPCTSTRでキャストして
やれば問題ないはず。

  (LPCTSTR)str.c_str()

Unicodeビルドで、ATLマクロ等ふが使えないなら、Win32 APIの
MultiByteToWideChar()とか使って自分でワイド文字列に変換する
関数を作るしかないな。

もしくは、STLの方で、stringではなくwstringを使うかだ。
705デフォルトの名無しさん:2008/12/05(金) 22:31:18
文字列クラスは、stringじゃなくて、wstringを使うようにする。
文字列のリテラルはLをつける。 L"abc" みたいな感じ。
APIはMessageBoxだったらMessageBoxWみたいに後ろにWをつける。

とすれば、変換は考えなくていいかな?
706デフォルトの名無しさん:2008/12/05(金) 22:33:22
>>703
Unicodeを使う(デフォルトの設定のまま)にして

MessageBox( NULL, _T("aaa") , _T(""), MB_OK );

こういうのをWにかえればいいんですか?
707デフォルトの名無しさん:2008/12/05(金) 22:37:20
>>706
そう。

MessageBoxW(NULL, L"aaa", L"", MB_OK); みたいな感じ。
708デフォルトの名無しさん:2008/12/05(金) 22:38:11
  (LPCTSTR)str.c_str()
これはexpressでも使えるのでしょうか?


STLのほうを変えたらどうかという提案ですが、そちらは都合で変えることができません
709デフォルトの名無しさん:2008/12/05(金) 22:41:45
string test ="テスト";

MessageBoxW( NULL, (LPCTSTR)(test.c_str()) , (L"test"), MB_OK );



これでやったら、ものすごい文字化けがおこりましたw
710デフォルトの名無しさん:2008/12/05(金) 22:43:13
>>708
それは、_MBSCでビルドしたときにだけ使える。
_UNICODEでビルドすると使えない。

片方でしか使えないコードを書くと時はLPCTSTRとか使う意味がない。
711デフォルトの名無しさん:2008/12/05(金) 22:43:13
こんなところで質問せずに
汎用テキストマッピング TCHAR
あたりのキーワードでぐぐって一度しっかり理解しろ
Windows特有だが、大して難しい話じゃないから
712デフォルトの名無しさん:2008/12/05(金) 22:45:29
>>709
リテラルはLをつけるだけでいいけど、それ以外はLPCTSTRでキャストしてもだめ。
MultiByteToWideChar()とかで変換する必要がある。
713デフォルトの名無しさん:2008/12/05(金) 22:46:05
>>710
_MBSCでビルドすることに変えたらなにか注意することありますか?
714デフォルトの名無しさん:2008/12/05(金) 22:50:31
_MBSCでビルドしたらコンパイルできない箇所が生じました・・・

MultiByteToWideChar()を使うしかなさそうですね
715デフォルトの名無しさん:2008/12/05(金) 22:52:55
>>713
一部のUnicode文字は、MBCS(シフトJIS)では扱えない。ただし、Unicode
でも、シフトJISの機種依存文字は扱えない。
716デフォルトの名無しさん:2008/12/05(金) 22:53:29
717デフォルトの名無しさん:2008/12/05(金) 22:57:24
>>716
expressだから、ライブラリの類はつかえないらしいよ。
使えるのかな?
718デフォルトの名無しさん:2008/12/05(金) 22:57:35
Unicodeなんてないの前提だよ(俺の関わったところは全部)
719デフォルトの名無しさん:2008/12/05(金) 22:58:46
MultiByteToWideChar()の使い方がわかりません



int MultiByteToWideChar(
UINT CodePage, // コードページ         
DWORD dwFlags, // 文字の種類を指定するフラグ  これはなんですか?
LPCSTR lpMultiByteStr, // マップ元文字列のアドレス
int cchMultiByte, // マップ元文字列のバイト数
LPWSTR lpWideCharStr, // マップ先ワイド文字列を入れるバッファのアドレス
int cchWideChar // バッファのサイズ
);



:MultiByteToWideChar(CP_ACP, ?, 元, バイト数1, 先, バッファ)
720デフォルトの名無しさん:2008/12/05(金) 23:04:14
>>718
_MBCSで作られてて、中途半端に汎用テキストつかってるシステムを
UNICODE対応にさせられてて、ちょうどむかついてる最中。
721デフォルトの名無しさん:2008/12/05(金) 23:09:06
>>720
そんな金にならない仕事あるんだ?w
722デフォルトの名無しさん:2008/12/05(金) 23:15:19
UNICODEを意識しないって、いまだにVC6を使ってるとか?
723デフォルトの名無しさん:2008/12/05(金) 23:18:33
速攻で
プロパティ→構成プロパティ→文字セット→マルチバイト文字セットを使用する
設定
724デフォルトの名無しさん:2008/12/05(金) 23:22:23
725デフォルトの名無しさん:2008/12/05(金) 23:24:57
俺も汎用テキストは意味ないって思ってるけど、OSの中がunicodeだから、
LやらWやらつけるほうが素直で、あとあとトラブルもなさそうと思うけど、
そういうのも分からんって言われちゃう現場だと_MBCSになっちゃうかもね。
726デフォルトの名無しさん:2008/12/05(金) 23:29:02
>>721
そもそも、Expressって商用には使えないんじゃなかったっけ?

Visual Studio Expressじゃなくて、Twilight Expressかもしれんが。
デスマ経由地獄行き列車か?

>>722
2003も、2005も、2008も持ってるけど、VC6を一番使ってるぞ。
727デフォルトの名無しさん:2008/12/05(金) 23:29:23
いや実際_ismbblead()だのmbs系関数いちいち使うぐらいなら
wchar_tのがナンボか楽だろ

今時_MBCSとか本気で意味わからん
728デフォルトの名無しさん:2008/12/05(金) 23:31:18
>>726
VC1.5とか使ってるところとかあるしな。
729デフォルトの名無しさん:2008/12/05(金) 23:34:25
>>724
それの日本語みてるんですが、わかrません
730デフォルトの名無しさん:2008/12/05(金) 23:35:33
> そういうのも分からんって言われちゃう現場だと_MBCSになっちゃうかもね。

そんな奴にC++なんて奇怪語を触らせるなよ……
と俺はいいたいが

まあ関係ないからどうでもいいや
731デフォルトの名無しさん:2008/12/05(金) 23:36:05
MS-C/C++ ver.7 使っているところ未だに多いしな
732デフォルトの名無しさん:2008/12/05(金) 23:37:09
#include <cstdio>
#include <clocale>
using namespace std;

int main(){
  ::setlocale(LC_ALL, "Japanese");
  ::setlocale(LC_NUMERIC, "C");
  printf("%s\n","あいうえお");
  wprintf(L"%s\n",L"あいうえお");

  return 0;
}
これで下の出力がありません。何が足りないんでしょうか?
733デフォルトの名無しさん:2008/12/05(金) 23:38:25
wprintf(L"%hs\n",L"あいうえお");
734デフォルトの名無しさん:2008/12/05(金) 23:50:06
すまん間違えた
wprintf(L"%s\n",L"あいうえお"); でマルチワイド変換させたいんだろ?
wprintf(L"%hs\n","あいうえお");
735デフォルトの名無しさん:2008/12/06(土) 00:09:03
_tsetlocale(LC_ALL,TEXT(""));
てやつでした。これってただのsetlocaleと何が違うんですか?
736デフォルトの名無しさん:2008/12/06(土) 00:26:41
>>732
%s -> %ls
737デフォルトの名無しさん:2008/12/06(土) 00:28:56
だいたいUnicodeなんて対応して誰に触ってもらいたいのかわからん
ていうかそれ関連の関数ってわけわからん仕様の関数が多すぎ
738デフォルトの名無しさん:2008/12/06(土) 00:46:16
で、パスに♥とか入ってるだけで開けない糞プラグラムができるわけだな。
739デフォルトの名無しさん:2008/12/06(土) 01:00:40
>>738
そういう文字を使ったファイルは、エクスプローラ使っても、Linux+Sumba
で動くNASとかにコピーすっとコピーに失敗する。

そんな製品でも、Windowsで動作確認などと平気で謳ってる。(w
740デフォルトの名無しさん:2008/12/06(土) 01:02:59
赤信号皆で渡れば怖くない理論かw
せめてSambdaと書いてやれよ

LinuxもUTF-8+CIFSでちゃんとセットアップされた環境なら
問題なくUTF-16なファイル名を扱えるんだがね
741デフォルトの名無しさん:2008/12/06(土) 01:11:11
お仲間がいようが糞は糞
742デフォルトの名無しさん:2008/12/06(土) 01:25:40
>>735
まあ別にsetlocale使うのと同じ。

VC++などにはsetlocaleにもワイド文字版の_setlocaleがあって、
さらに、Windows API同様のワイド・マルチバイト切替版が_tsetlocale。
引数の型が違うだけで、効果に違いはない。
743デフォルトの名無しさん:2008/12/06(土) 03:40:11
>>738
仮にそういうのをデータベースに突っ込んだりするとどうなるの?
っていうのとかどうせ俺とか考えてないしはじめから未対応のが気が楽っちゃ楽
正直、そんなくだらない対応するぐらいなら期間削って安く仕上げてくれって客としか
仕事したことないわ
744デフォルトの名無しさん:2008/12/06(土) 03:50:00
それは技師としてどうなの
745デフォルトの名無しさん:2008/12/06(土) 03:50:45
×技師
○作業員
746デフォルトの名無しさん:2008/12/06(土) 10:29:33
会社ぐるみで全部CP932でやらせてるんだろうから
全員作業員ってこったな
工事現場以下だ
747デフォルトの名無しさん:2008/12/06(土) 10:31:44
やさしいな、おまいら。
Win32API スレではぐだぐだになってたぞ。
748デフォルトの名無しさん:2008/12/06(土) 13:53:00
w_charに読み込んだ文字列が数字であるかないかを判定したいんですが、どうすればいいでしょうか?

atoiみたいな関数つかって変換して・・・っていうのは思いつきましたがその後がわかりません
749デフォルトの名無しさん:2008/12/06(土) 13:57:15
先頭にwがついた似たような関数があるよきっと
750デフォルトの名無しさん:2008/12/06(土) 13:57:46
(CDから)ターボデバッガをインストールした後
BCC Developerをインストールしたが
BCC Developerの<デバッグ>ボタンを押しても、ターボデバッガが起動しない。

ターボデバッガのインストール後のパスの設定はどうするのでしょうか。
本には「Bcc Developerの環境設定を参照」とあるが、さっぱり分かりません。
751デフォルトの名無しさん:2008/12/06(土) 13:59:07
>>749
検索しても出てこないんですよねー
752デフォルトの名無しさん:2008/12/06(土) 14:02:24
>>749
_wtoiを使うのはわかるんですが

例えば12a3aみたいな文字列だったときは12に変換されますよね?

これをエラーとみなしたいんですが
753デフォルトの名無しさん:2008/12/06(土) 14:07:10
>>752
atoiだってその仕様じゃないか
wstrtolとかは?
754デフォルトの名無しさん:2008/12/06(土) 14:22:54
>>753
wstrtolって何インクルードすればいいんですか?
755デフォルトの名無しさん:2008/12/06(土) 14:28:27
>>754
strtolと同じ
756デフォルトの名無しさん:2008/12/06(土) 14:31:14
>>755
stdlibですよね?識別子がないといわれるんですが・・・
757デフォルトの名無しさん:2008/12/06(土) 14:33:45
環境は?
758デフォルトの名無しさん:2008/12/06(土) 14:34:48
Visual C++ 2008 express editionです
759デフォルトの名無しさん:2008/12/06(土) 14:35:41
>>756
wchar.h に wcstol がある

>>753
wstrtol なんてあるのか?
760デフォルトの名無しさん:2008/12/06(土) 14:37:12
>>759
それだ、すいません間違えました
761デフォルトの名無しさん:2008/12/06(土) 14:39:16
wstrtol がある環境もあるよ。 wstring.h に入ってる。
762デフォルトの名無しさん:2008/12/06(土) 14:40:49
>>759
ありました
できました!
どうも!
763デフォルトの名無しさん:2008/12/06(土) 17:23:48
下のような階層構造の構造体を作って、コンパイルしたときに、配列数が多い場合に、コンパイルできませんでした。
そこで、C++のクラスを使って、各層の配列をnewで配列数を無駄なく設定したら良いのではないと思い、トライしているのですが、方法がわかりません。
環境は、Linux(Fedora8)、コンパイラは、C++4.1.2です。
お願いします。
///////////////////////////////////////////////////
typedef struct {
int num; //!< ある層のノード数
UNIT unit[NUM_UNIT]; // <- ここを各層ごとに宣言したい。
} LAYER;

typedef struct{
int num; //!< 層の段数
LAYER layer[NUM_LAYER];
} CLASS;
///////////////////////////////////////////////////

764デフォルトの名無しさん:2008/12/06(土) 17:29:01
763です。
NUM_UNITとNUM_LAYERは、defineで宣言しています。
ちなみに、
#define NUM_UNIT   ノードの最大値(10000とか)
#define NUM_LAYER 5とか

765デフォルトの名無しさん:2008/12/06(土) 17:31:39
>>763
どこまで試して、どういう状態になったのか書いて。

ちなみに配列 new 使うぐらいなら std::vector 使うのがおすすめ。
766デフォルトの名無しさん:2008/12/06(土) 17:51:23
763です。
以下のようなサンプルで試しています。
もちろん、/**/の行でコンパイル時に以下のようなエラーがでます。
test.cpp:25: error: expected `;' before ‘new’
///////////////////////////////
class LAYER{
public:
 int *bb;
};
class CLASS{
public:
LAYER *aa; // クラスBBのポインタを宣言(のちに配列を動的に確保)
CLASS( int nn,... ){
printf("層数=%d\n",nn);
LAYER *aa = new LAYER[nn]; // クラスLAYERをnum個生成
int *nnum = new int[nn]; // 第2引数以降を格納するための一時配列
va_list args; va_start(args, nn);
for( int ii=0; ii<nn; ii++ ){ nnum[ii] = va_arg(args, int); printf("nnum=%d[%d]\n",nnum[ii],ii); }
for( int ii=1; ii<nn; ii++ ){//層//
int Num = nnum[ii]; // 各層のノード数
/* ここの表現がわからない */ aa[ii].bb new int[Num]; //各層のノード数分確保したい。
printf("[%d]",ii);
}printf("\n");
}
};
int main()
{
CLASS a(3,4,3,2); // ( 層数,各層のノード数 )
return 0;
}
767デフォルトの名無しさん:2008/12/06(土) 18:05:07
>>766
そのコードは "=" が抜けてるだけじゃないか。

まぁ案の定 delete が抜けてたりするんで、 std::vector で置き換えるのが
おすすめだけどね。
768デフォルトの名無しさん:2008/12/06(土) 18:15:44
763です。
ということは
やろうとしているクラスで、階層構造の無駄のない領域の確保は可能ということなんですね?
そして、デストラクタを除けば、サンプルプログラムで表現できていると判断してよいのでしょうか?
"vector"については、知らないので、これから知らべて、書き換えていきます。
769デフォルトの名無しさん:2008/12/06(土) 18:18:12
>>767
delete[]だろ、一応。
770デフォルトの名無しさん:2008/12/06(土) 18:21:26
>768
そうですね。ありがとうございます。
精進します。
771デフォルトの名無しさん:2008/12/07(日) 04:30:42
CString bufstr;
m_EDIT.GetWindowTextW((LPTSTR)(LPCTSTR)bufstr,160);
LPTSTR pszText;
pszText=const_cast<LPTSTR>(static_cast<LPCTSTR>(bufstr));
CString bufName = *((CString*)pszText);

bufstrが取り出せません助けて!
772デフォルトの名無しさん:2008/12/07(日) 05:33:48
>>771
つ[CString::GetBuffer()]
773デフォルトの名無しさん:2008/12/07(日) 05:44:51
すいません解決しました。>>772ありがとう!

wchar_t bufstr[160];
m_EDIT.GetWindowTextW(bufstr,160);
CString bufName = bufstr;
774デフォルトの名無しさん:2008/12/07(日) 05:50:39
CString bufstr;
m_Edit.GetWindowTextW((LPTSTR)(LPCTSTR)bufstr,160);
wchar_t* bufName = bufstr.GetBufer();

ってことかありがとう!
775デフォルトの名無しさん:2008/12/07(日) 07:53:43
>>774
違う。ちゃんとヘルプ嫁。
776デフォルトの名無しさん:2008/12/07(日) 08:39:25
配列とvectorって、サイズ固定の場合だと効率は同じと考えてよかですか?

それだと配列の立場なくなる気もするけど。。
777デフォルトの名無しさん:2008/12/07(日) 08:39:57
やばい771が馬鹿に見えてきた
これで行けてしまった・・・

CString bufstr;
m_EDIT.GetWindowTextW(bufstr);

778デフォルトの名無しさん:2008/12/07(日) 09:50:05
m_edit(笑)
779デフォルトの名無しさん:2008/12/07(日) 10:14:20
>>777
> やばい771が馬鹿に見えてきた

みんな判ってて言わないだけだから安心しる。

> GetWindowTextW

なんでわざわざワイド文字に限定にするんだろ?
780デフォルトの名無しさん:2008/12/07(日) 11:42:17
下の様なクラスで、クラスAを複数宣言して、クラスAの要素ごとにクラスBのvector bbの要素数を変えたい。
つまり、
const int num[3] = { 100, 50, 200 }; // クラスBのbbの要素数格納
A aa[3]; //クラスAを複数宣言
aa[0]のクラスBのbb要素数をnum[0](100)。
aa[1]のクラスBのbb要素数をnum[1](50)。
aa[2]のクラスBのbb要素数をnum[2](200)。
としたい。
これってできますか?
//////////////////////////////
class B{
public:
vector<int> bb;
};

class A{
public:
B *b;
};
781デフォルトの名無しさん:2008/12/07(日) 11:47:48
vectorなら要素数を格納する必要なんてないと思うのだが。
なんでわざわざそんな突拍子もないことをする必要があるのか、そこから検討しなおした方がいい。
782デフォルトの名無しさん:2008/12/07(日) 11:51:31
for (int i=0; i<3; ++i) aa[i].b->resize(num[i]);
783デフォルトの名無しさん:2008/12/07(日) 11:57:53
>>780
いろいろやり方あると思う。要素数を constructor の引数で決めるとか、
要素数を指定するメンバ関数用意するとか。
784デフォルトの名無しさん:2008/12/07(日) 12:22:13
780です
/*クラスA内で、*/
B *b;
A( void ){
B *b = new b[3];
for( int ii=0; ii<3; ii++ ){
b[ii].num = Num[ii];
printf("num=%d\n",Num[ii]);
}
}

/*main()で*/
printf("%d\n", a.b[0].numsize() );
printf("%d\n", a..b[1].num.size() );
printf("%d\n", a.b[2].num.size() );

とすると
意図した値がでません。
アドレスも違うようです。なぜなのでしょうか?お願いします。
785デフォルトの名無しさん:2008/12/07(日) 12:58:46
せめてコンパイルの通るものを書いてくれ。
786デフォルトの名無しさん:2008/12/07(日) 13:00:24
typedef std::vector<int> B;じゃ、いかんのだろうか。
787デフォルトの名無しさん:2008/12/07(日) 13:23:00
>785
すいません。きをつけます。

>786
実際つかうときには、もう一段クラスを介するつもりなのです。
788デフォルトの名無しさん:2008/12/07(日) 13:38:00
class hoge {};
hoge obj1;
としたときに、
sizeof(obj1);
の結果が1バイトになります。これってどうしてですか?
Linuxの g++ 4.2.4 です。


789デフォルトの名無しさん:2008/12/07(日) 13:44:44
サイズが0だったらmallocできんだろう
hoge a[10]; のように配列として扱うときも &a[0] と &a[10] が同じアドレスになってしまうではないか
790デフォルトの名無しさん:2008/12/07(日) 13:58:02
でも、C言語で同じような構造体を定義してsizeof()すると0バイトになります。
#include <stdio.h>
struct hoge{};
int main(){
struct hoge a;
printf("%d\n", sizeof(a));
return 0;
}
791デフォルトの名無しさん:2008/12/07(日) 14:05:48
なぜなのかという問いの答えにはならないが
標準規格では中身のない構造体は認めていない
792デフォルトの名無しさん:2008/12/07(日) 14:49:07
#include <stdafx.h>
#include <string.h>
int main(void)
{
int i,n;
double unew,unow,uold,dt,m,f,k;

n=10;
dt=10;
m=10;
f=100;
k=10;
unow=0;
uold=0;

for(i=1;i<=n;i++){
unew=dt*dt/m*(f-(k*unow))+(2*unow)-uold;
uold=unow;
unow=unew;
}
printf("u(n+1)=%lf\n",unew);
return 0;
}


上記のプログラムで(error C3861: 'printf': 識別子が見つかりませんでした)というエラーが出てしまいます。
visual C++2008です。
全角とかも使ってないし、どうすれば解決するのかわかりません。
どうか教えて下さい。
793デフォルトの名無しさん:2008/12/07(日) 14:56:31
ねぇ釣りでしょ?これ釣りでしょ?
794デフォルトの名無しさん:2008/12/07(日) 15:22:19
>786
これってもしかして、クラスBを配列にするって意味合いになるのでしょうか?
795デフォルトの名無しさん:2008/12/07(日) 15:23:41
#include <stdio.h>
796デフォルトの名無しさん:2008/12/07(日) 15:23:56
std::vector<int>にBという別名を付ける、という意味合い。
797デフォルトの名無しさん:2008/12/07(日) 15:25:50
>>795
stdafx.hのなかでincludeされてないんだっけ?
798デフォルトの名無しさん:2008/12/07(日) 15:29:21
>>797
されていないとしか思えない。
799デフォルトの名無しさん:2008/12/07(日) 15:35:37
PDCursesをVC++に導入するにはどうすればいいんでしょうか?
nmake vcwin32.mak
でビルドするとこまではできたのですが、
次はどうしたらいいのかわかりません。
800デフォルトの名無しさん:2008/12/07(日) 15:46:25
stdafx.hってプリコンパイルヘッダを作るためのものだろ
801デフォルトの名無しさん:2008/12/07(日) 18:39:36
どーせ標準ヘッダなんだから2重インクルード防止されてるんだから
無いっていわれたならないんだろうから四の五の言わずインクルードしろよ。
802デフォルトの名無しさん:2008/12/07(日) 18:45:11
どーせ>>792はstdio.hをインクルードしないとprintfは使えないって知らないんだろうよ
下手するとインクルードの意味も分かってないかもしれない
803デフォルトの名無しさん:2008/12/07(日) 19:05:58
gcc なら printf などがビルトイン関数としても提供されているから #include しなくても使えるけどな
804デフォルトの名無しさん:2008/12/07(日) 19:12:13
>>803
どっから出てくるんだそんなデマ。
805デフォルトの名無しさん:2008/12/07(日) 19:14:58
分割コンパイル+演算子オーバーロード で困っています。
対処法を教えて下さい。

ファイルは以下の3つです。
HOGE.h(本体)、ho.cpp(HOGEクラスの関数定義)、
XY.h(HOGEクラス内で使うデータ型を定義)

これをコンパイルすると、
 g++ ./ho.o ./main.o -o exe
 ./main.o: In function `operator+(XY const&, XY const&)':
 ././XY.h:12: multiple definition of `operator+(XY const&, XY const&)'
 ./ho.o:././XY.h:12: first defined here
 collect2: ld returned 1 exit status
 make: *** [exe] エラー 1
とエラーが出ます。
環境は、
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
です。

以下ソースコード
806805:2008/12/07(日) 19:17:42
>>805

// HOGE.h
#include<iostream>
using namespace std;

class HOGE{
 private:
 public:
  void ho();
};

#endif

----------------------------

// ho.cpp
#ifndef __HOGE_ho__
#define __HOGE_ho__

#include"./HOGE.h"

void HOGE::ho(){
 XY h0={10,10};
 XY h1={20,20};
 XY h2=h0+h1;
};

#endif
807806:2008/12/07(日) 19:18:28
>>806

// XY.h
#ifndef __XY__
#define __XY__
#include<iostream>
using namespace std;

struct XY{
 int X; int Y;
};

XY operator+(const XY& t0, const XY& t1){
 XY ret = {(t0.X+t1.X), (t0.Y+t1.Y)};
 return ret;
}
#endif
808デフォルトの名無しさん:2008/12/07(日) 19:23:54
>>805
ヘッダで非 inline 関数定義するな。宣言だけにするか inline にしろ。

あと、エラーとは関係ないけど
インクルードガードに予約識別子使うな。
ヘッダで using namespace するな。
809デフォルトの名無しさん:2008/12/07(日) 19:27:33
俺もC++はあまり詳しくないが、演算子のオーバーロードもメソッドみたいに構造体定義(宣言か?)にプロトタイプ宣言必要じゃないか?
あと、昔のソースみたら2項加算のときにfriendにしてた。
なんでそうしてるのかはもう忘れた。

あやふやなんで流してもいいよ。
810デフォルトの名無しさん:2008/12/07(日) 19:51:12
いままでコンソールのアプリしかつくったことないんですが、GUIのwindowsアプリを作りたくなりました。
なにでやるのがらくですか?
811デフォルトの名無しさん:2008/12/07(日) 19:54:07
>>810 VisualStudio で C#
812799:2008/12/07(日) 19:57:14
私に質問はスレチでしたか?
813デフォルトの名無しさん:2008/12/07(日) 19:57:26
>>802
Cなら、インクルードしなくてもコンパイルできるだろ。
814805:2008/12/07(日) 20:03:27
>>808
コンパイル通りました。
ありがとうございます。

>インクルードガードに予約識別子使うな。
知りませんでした。
ありがとうございます。
>ヘッダで using namespace するな。
ごもっともです。。。
815デフォルトの名無しさん:2008/12/07(日) 20:28:10
>>811
C++をつかうならどうでしょうか
816デフォルトの名無しさん:2008/12/07(日) 20:30:06
>>815
楽がしたいのか勉強がしたいのかどっちなんだ?
後者ならどれでも自分で選んでみればいいだろ。
817デフォルトの名無しさん:2008/12/07(日) 20:30:27
>>815
C++を捨ててC#を勉強し始めるというのはどうだろうか
818デフォルトの名無しさん:2008/12/07(日) 20:39:31
>>813
まだこんなバカが学校の情報処理で増産されているのか?
819デフォルトの名無しさん:2008/12/07(日) 20:43:04
>>818
それは、インクルードしたほうがいいって話?
コンパイルできるかどうかって話とは別ですね。
むしろ、プロトタイプがなくてもコンパイルが通るってことを知らないほうが、
危険です。
820デフォルトの名無しさん:2008/12/07(日) 20:43:13
>>818
821デフォルトの名無しさん:2008/12/07(日) 20:43:21
>>813
なんで「Cなら」なの?馬鹿?
822デフォルトの名無しさん:2008/12/07(日) 20:44:29
>>821
>>792のソースがCでもコンパイルできるから。
823デフォルトの名無しさん:2008/12/07(日) 20:48:03
>>822
どう考えてもできないと思うんですけど
ひょっとしてこれでコンパイルが通るようなコンパイラがあるのか?

あと、Cのコードの大概はC++でもコンパイルできるだろ
824デフォルトの名無しさん:2008/12/07(日) 20:57:48
>>823
C++のコンパイラでコンパイルできるから、>>792がC++のコードだということになって、
「stdio.hをインクルードしないとコンパイルできるってことも知らないバカ」
って勘違いした煽りが正当化されるってことにはならないよ。
825デフォルトの名無しさん:2008/12/07(日) 21:03:36
>>823
空の stdafx.h を用意してやれば gcc 3.4 でコンパイルできたよ。
826デフォルトの名無しさん:2008/12/07(日) 21:04:39
>>823
#include <stdafx.h> を抜かせば、少なくとも gcc-4.0.1、gcc-4.3.2 でコンパイル通って動いたけど
827デフォルトの名無しさん:2008/12/07(日) 21:07:04
>>819
>>818 ではないが、printf が入ってて stdio.h include しないで
C compiler で compile 通るってことは一般には無いはずだよ。
compiler によってはあるかもしれんが。
828デフォルトの名無しさん:2008/12/07(日) 21:08:56
>>827
デマながすな。
プロトタイプ必須ってC++だけだろ。
VC++でもコンパイルできるし。
829デフォルトの名無しさん:2008/12/07(日) 21:10:18
>>827
Cコンパイラならコンパイルできるべきなのに
どうしてそう思うんだ?
830デフォルトの名無しさん:2008/12/07(日) 21:22:05
Cコンパイラだとプロトタイプ不明関数は戻り値intとしてコンパイルされたな。
引数はどうなるんだっけ?
831デフォルトの名無しさん:2008/12/07(日) 21:24:09
>>830
可変長引数関数と同じでしょ
K&R時代と同じといってもいいけど

要は暗黙の型変換の類は一切行われず、積んだものがそのまま渡る
832デフォルトの名無しさん:2008/12/07(日) 21:26:51
>>830
渡した型のままで積んでくれる
833831:2008/12/07(日) 21:26:56
ちょっと不正確だったな
charだのshortだのはintに拡張されるはずだ

そこまで含めて可変長引数関数と同じ
834デフォルトの名無しさん:2008/12/07(日) 21:27:29
ややこしいことに C99 で宣言無しの関数呼び出しができるとは保証されなくなってるんだぜ。
警告つきで C89 以前の動作を保つコンパイラがほとんどだろうけどな。

http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf
> A new feature of C99:
> The rule for implicit declaration of functions has been removed in C99.
> The effect is to guarantee the production of a diagnostic that will
> catch an additional category of 25 programming errors. After issuing the
> diagnostic, an implementation may choose to assume an implicit
> declaration and continue translation in order to support existing
> programs that exploited this feature.
835デフォルトの名無しさん:2008/12/07(日) 21:27:34
>>825-826
そ、そうなのか・・・知らなかったぜ
理由が知りたい・・・

>>824
いや、別に煽ったつもりも正当化するつもりもないんだけど
CならというからにはC++じゃコンパイルできないのか?ってことが言いたかったんだ
836デフォルトの名無しさん:2008/12/07(日) 21:35:05
>>828-829
int main(){
printf("hello\n");
}

% g++ test.c
test.c: In function ‘int main()’:
test.c:2: error: ‘printf’ was not declared in this scope
% gcc testC.c
test.c: In function ‘int main()’:
test.c:2: error: ‘printf’ was not declared in this scope

コンパイラ通ること保証されてるの?
837デフォルトの名無しさん:2008/12/07(日) 21:39:07
>>836
gcc --version
よろ
838デフォルトの名無しさん:2008/12/07(日) 21:41:22
おれが三行でまとめてやるぜ。

C89 (C90?) 準拠のコンパイラなら >830-833 が正解。
C99 準拠のコンパイラなら未定義動作。ただし C89 の動作を保つことがほとんど。
C++ なら規格のバージョンにかかわらずコンパイルエラー。
839デフォルトの名無しさん:2008/12/07(日) 21:43:01
>>836
$ gcc a.c
a.c: In function ‘main’:
a.c:2: 警告: incompatible implicit declaration of built-in function ‘printf’

警告が出るだけでコンパイルは通るし実行もできる @ gcc 4.3.0
840デフォルトの名無しさん:2008/12/07(日) 21:44:04
>>839 と同じ結果
-std=c99指定しても一緒
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
841デフォルトの名無しさん:2008/12/07(日) 21:46:52
>>835
まあ、>>821あたりは完全にあおりですね。

「Cなら」という仮定をもちだしたのは、このスレのタイトルが「C/C++」で
>>792がCでもC++でもコンパイルできるから。

煽ったり正当化ってのは、>>802がC++と決め付けて(もしくはCならコンパイル
できると知らない)で、あおりぎみにレスしてるのにツッコミ入れたら、バカとか、コンパ
イルできないとか見当違いの反論してきたやつがいて、それらに向けた言葉。
842デフォルトの名無しさん:2008/12/07(日) 21:48:31
取り敢えずうちではこうなった。
--
$ g++ foo.c
foo.c: In function `int main()':
foo.c:1: error: `printf' undeclared (first use this function)
foo.c:1: error: (Each undeclared identifier is reported only once for each function it appears in.)

$ gcc foo.c

$ gcc foo.c -std=c99
foo.c: In function `main':
foo.c:1: warning: implicit declaration of function `printf'

$ gcc --version
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


--
843デフォルトの名無しさん:2008/12/07(日) 21:56:33
正確には C89 では
・ 戻り値の型は int
・ 引数の型は不明(型チェックはないが、可変個引数と同じ形の暗黙の型変換が行われる)
と扱われる。
つまり、int foo(); のような形でプロトタイプ宣言した場合と同じ。
int foo(...); ではない、というか、(...) という宣言は C の仕様的に不可能。
(... の前には必ず別の引数が必要だから)

ここでの暗黙の型変換には
・ char, short → int
・ float → double
の2種類がある。
正確には、char や short と int が同じサイズの場合のみ、
unsigned char や unsigned short は unsigned int に変換される。
そうで無い場合は signed int に変換される。
K&R C まで遡ると unsigned char や unsigned short は
常に unsigned int に変換されるが、C89 でこの点は仕様変更された。
844デフォルトの名無しさん:2008/12/07(日) 22:32:28
>>837
gcc version 4.1.1 20061011 (Red Hat 4.1.1-30)
gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)

ともに同じ結果。

>>839-840 あたりを見るとなぜかわからん。
俺はいつも include してるから気づかんかったが。
C コンパイラ仕様が今更変わったとするとちょっと気になるが。
845デフォルトの名無しさん:2008/12/07(日) 22:39:09
C89でコンパイルしてみたら?
846デフォルトの名無しさん:2008/12/07(日) 22:51:33
>>842
-pedantic-errors -Wall くらいは指定しとけ。
847デフォルトの名無しさん:2008/12/07(日) 22:55:16
>>844
alias で gcc='gcc -x c++' になってるとかw
848デフォルトの名無しさん:2008/12/07(日) 23:08:51
>>846
ソレつけないと無意味だよなw
849デフォルトの名無しさん:2008/12/07(日) 23:17:16
このスレでこれだけのgcc使いを見ることになろうとはな
環境依存OKとはいえ大抵VC++だし
850836,844:2008/12/07(日) 23:37:51
>>846,848
それは付けたけどまったくおなじエラーメッセージなんで省いたんだよ。
>>847
gcc に alias かけたりはしてないから。

ちなみに icc だと 8.0, 9.1 ともに

% icc -Wall testC.cc
test.c(2): error: identifier "printf" is undefined
printf("hello\n");
^

851デフォルトの名無しさん:2008/12/08(月) 00:21:06
>>850
俺、インクルード無しでCコンパイラならコンパイルできると知らなかった。
もし、これが正しいなら、C++コンパイルモードで動作してるんじゃない
強制的に純粋Cコンパイラモードに出来ないの?
852799:2008/12/08(月) 00:22:57
私の質問はスレチなんでしょうか?
質問の仕方が悪いのでしょうか?
853836,844:2008/12/08(月) 00:34:48
もう一度チェックしたところCでやると確かに警告は出るけど、
compile できました。ついファイル名を .cc にしてたため、
gcc でもicc でも c++ モードで compile しようとしていたみたいです。

アホな事言ってすみませんでした。
854デフォルトの名無しさん:2008/12/08(月) 00:35:37
>>799
「導入」の意味がよく分からないけど、
プリプロセス時にcurses.hをインクルードして、
リンク時にpdcurses.libをリンクして、
実行時にpdcurses.dllをロードすればいいだけでは。
855デフォルトの名無しさん:2008/12/08(月) 00:35:52
>>852
ググってみたけどかなりレアな感じだしみんな知らないってとこじゃね?
856デフォルトの名無しさん:2008/12/08(月) 00:43:29
テーブルをやるにはデータグリッドビューを使うのが良い?
857デフォルトの名無しさん:2008/12/08(月) 00:45:31
たぶんノコギリかハンマーのほうが良い。
858デフォルトの名無しさん:2008/12/08(月) 00:48:11
それだと金属製のテーブルはヤるのはむずかしそうです。
859799:2008/12/08(月) 00:55:15
>>854
リンカにいろいろ怒られちゃいました
なにか足りないようですが、初心者の私にはさっぱりです・・・

>>855
そうなんです。ググってもわからないんです。
860799:2008/12/08(月) 00:56:18
エラーの状況
c:\test>cl test.c /link pdcurses.lib
(中略)
/out:test.exe
pdcurses.lib
test.obj
pdcurses.lib(pdckbd.obj) : error LNK2019: 未解決の外部シンボル __imp__GetKeyStat
e@4 が関数 __get_key_count で参照されました。
pdcurses.lib(pdckbd.obj) : error LNK2019: 未解決の外部シンボル __imp__MapVirtual
KeyA@8 が関数 __get_key_count で参照されました。
pdcurses.lib(pdcutil.obj) : error LNK2019: 未解決の外部シンボル __imp__MessageBe
ep@4 が関数 _PDC_beep で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__FindWindo
wA@8 が関数 __find_console_handle で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__wsprintfA
が関数 __find_console_handle で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__SendMessa
geA@16 が関数 __set_console_info で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__GetWindow
ThreadProcessId@8 が関数 __set_console_info で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegCloseK
ey@4 が関数 __init_console_info で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegQueryV
alueExW@24 が関数 __init_console_info で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegQueryV
alueExA@24 が関数 __init_console_info で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegOpenKe
yExA@20 が関数 __init_console_info で参照されました。
test.exe : fatal error LNK1120: 外部参照 11 が未解決です。
861デフォルトの名無しさん:2008/12/08(月) 01:09:16
>>860
pdcurses内から参照されてるWin32 APIが未解決。
コマンドラインの最後に
user32.lib advapi32.lib
を追加。
862799:2008/12/08(月) 01:18:33
>>861
有り難うございます!!
無事にビルドできました。

Win32 APIの知識不足だったようですね。どうもお騒がせしました。
863デフォルトの名無しさん:2008/12/08(月) 01:25:38
>>799
ncursesじゃなきゃやだやだってだだこねてた人?
864デフォルトの名無しさん:2008/12/08(月) 01:34:09
データテーブルはwin32で用意されてないの?
865デフォルトの名無しさん:2008/12/08(月) 01:48:58
何を言いたいのかさっぱり分かるんだけど
win32のデータテーブルは用意されてるよ
866デフォルトの名無しさん:2008/12/08(月) 01:53:34
ちなみに教えて下ちい
データグリッドビューのwin32版
867デフォルトの名無しさん:2008/12/08(月) 01:55:47
データグリッドビューの何版なら知ってるの?
868デフォルトの名無しさん:2008/12/08(月) 01:57:16
clr版
869デフォルトの名無しさん:2008/12/08(月) 01:57:44
それはWin32で動作しないの?
870デフォルトの名無しさん:2008/12/08(月) 01:59:11
しないよ.netだから
871デフォルトの名無しさん:2008/12/08(月) 01:59:51
おちょくるのもほどほどにしてやれよw
こういう向きには何でも「ない」といっておけばいい。
872デフォルトの名無しさん:2008/12/08(月) 02:03:37
本当に無いだけだろ?
873デフォルトの名無しさん:2008/12/08(月) 02:20:11
どうしたの?答えられないの?
874デフォルトの名無しさん:2008/12/08(月) 02:42:19
xを探しに来た人が、xがもしあったら自分の負けみたいな種類の喧嘩腰を
披露し始めるのが意味不明だが、
とりあえず俺も>>871にならって「ない」と言っておこうw
875デフォルトの名無しさん:2008/12/08(月) 02:46:32
無いのか
876デフォルトの名無しさん:2008/12/08(月) 02:47:46
はい、無いです
877デフォルトの名無しさん:2008/12/08(月) 02:55:49
これから悪魔の証明が始まります
お楽しみに
878デフォルトの名無しさん:2008/12/08(月) 03:00:23
Win32の範囲内において無いことを示せばいいんだから悪魔でも何でもないだろ。
879デフォルトの名無しさん:2008/12/08(月) 03:07:57
あー、Win32で実装されてるかどうか?でいいの?
Win32ベースで作成されたものを誰も用意していないということを証明するんじゃないの?
880デフォルトの名無しさん:2008/12/08(月) 03:13:10
証明とかはどうでもいいよ。
もう「ない」って決まったのw
881デフォルトの名無しさん:2008/12/08(月) 03:24:39
A fast and lightweight cell control の事か
882デフォルトの名無しさん:2008/12/08(月) 03:27:12
何故用意されて無いのかね?
win○yは表示してたが、あれはdelphiからの贈り物に過ぎないのかね?
他のGUIライブラリとかMFCにも無いのかね?
883デフォルトの名無しさん:2008/12/08(月) 03:34:28
WinnyってDataGridViewつかってんの?
884デフォルトの名無しさん:2008/12/08(月) 03:38:18
多分、c++ビルダーにある奴を使ってるんだろうけど
それの実態はdelphiの奴
885デフォルトの名無しさん:2008/12/08(月) 04:31:13
質問です。
int i = 10*20; のような計算の計算速度と、if(i > j) {} のような比較の速度、
AND演算やOR演算ではどれが1番速くてどれが1番遅いのですか?

また、関数呼び出しと比べるとどのくらい差が出るのですか?
886デフォルトの名無しさん:2008/12/08(月) 04:47:34
>>885
実測するほかない。
「のような計算」と一口に言っても数値の型や演算子ごとに事情は違ってくるし、
それも含めて大概の要素が処理系にもよるし、CPUにもよるから。
887デフォルトの名無しさん:2008/12/08(月) 06:22:14
>int i = 10*20;
10を20回足してメモリに書き込むため遅い

>if(i > j) {}
メモリからi,jをレジスタに読み出し比較したのち条件分岐するため
パイプラインのフラッシュが発生して遅い

>AND,OR演算
メモリからレジスタに読み出しAND,ORをかけてからメモリに書き込むため遅い

結論。どれも遅いよ
888デフォルトの名無しさん:2008/12/08(月) 06:44:24
質問は「どれが1番速くてどれが1番遅いのですか?」だから
それは結論でも何でもないよね。
889デフォルトの名無しさん:2008/12/08(月) 07:15:53
>int i = 10*20;
コンパイラが10*20を200に定数畳み込みしてレジスタに入れるため速い

>if(i > j) {}
コンパイラがそれぞれの確率を予測して
確率の高い方が分岐の少ないコードになるよう配慮してくれるため速い
が予測が外れると遅い

>AND,OR演算
最適化の余地が少ないためどう足掻いても遅い

結論。
掛け算はもっとも速い
次に条件分岐が速いがたまに遅い
AND,OR演算は遅い
890デフォルトの名無しさん:2008/12/08(月) 07:28:34
質問文と質問意図に差があるな、と判断するなり、俄然張り切り出して
「いかに意図のほうをちっとも満たさないまま文にだけきっちり答えるか」
を追求するモチベーション、伝統的にマには多いが、そろそろ何か名前が欲しいところだな。
891デフォルトの名無しさん:2008/12/08(月) 07:59:49
信じられるのは実測値のみって答えでてるだろ
892デフォルトの名無しさん:2008/12/08(月) 12:28:20
一般論は無い、で終わりにしとけ
893885:2008/12/08(月) 13:18:44
>886-892
返信ありがとうございます。
実測したほうがいいようなので計ってみることにします。
894デフォルトの名無しさん:2008/12/08(月) 13:23:54
演算対象や組み合わせによっても全然違う結果になる可能性があるから、
個々の要素を比べる意味はあんまり無いよ。

実際に組みあがったプログラムについて計測しないと意味無い。
895デフォルトの名無しさん:2008/12/08(月) 22:51:41
ヘッダのクラス宣言のところでクラス内の非inline関数の中身を記述するのはマナー違反なの?
896デフォルトの名無しさん:2008/12/08(月) 22:56:05
>>895
クラス宣言内で関数を記述したら、非inline関数にはならないと思うのだが。
897デフォルトの名無しさん:2008/12/08(月) 22:58:35
class B{
public:
  void Draw() { printf("BのDraw\n"); }
};

class A{
public:
  void Draw(const B *b) { b->Draw(); }
};


こういう方法でA::DrawではBの中身を変更しないことを明示的にしたいのですが、
B::Draw' : 'const B' から 'B &' へ 'this' ポインタを変換できません。
というエラーがでます。どうすれば良いのでしょうか?
898デフォルトの名無しさん:2008/12/08(月) 23:01:17
>  void Draw() const { printf("BのDraw\n"); }
899デフォルトの名無しさん:2008/12/08(月) 23:05:18
>>898
ありがとうございます。
コンパイル通りました。
constにそんな使い方があったんですね。
900デフォルトの名無しさん:2008/12/08(月) 23:09:49
>>896勝手にinline関数扱いになるんですよね?>>808の言葉が気になったもんで・・・

Hoge.h
class Hoge{
public:
  void hoge(){処理} <-これを呼び出したら、インライン展開される
};

ということでよろしいですか?
901デフォルトの名無しさん:2008/12/08(月) 23:13:22
インライン展開されるかどうかはコンパイラ次第。
少なくとも、インライン展開されたかの如く振舞うことは期待できる。
902デフォルトの名無しさん:2008/12/08(月) 23:15:56
>>901レスありがとうございます。速度優先とか、サイズ優先とかのオプションによって展開されるかどうかが
決まるという訳ですね?(そもそも展開不可な関数もありますが)
これからもビシバシヘッダに処理を書かせていただきます。
903デフォルトの名無しさん:2008/12/08(月) 23:26:29
inline とつけたときと同じだというだけだからね
904デフォルトの名無しさん:2008/12/08(月) 23:43:44
はい
905デフォルトの名無しさん:2008/12/09(火) 00:36:44
質問です。
VS9.0を使い、floatを用いた計算が必要なアプリケーションを作っています。

このアプリケーション、分岐などは特にないのですが、
私の家のPC(WindowsXP、Pen4)での計算結果と、
友人の家のPC(WindowsXP、CPUは不明。必要がありそうなら今度聞いてきます)での計算結果が微妙に異なるのです。

こんなことってありえるのでしょうか?
気になってぐぐってみたところ

floatはCPUでの計算中は精度が高く、メモリーに書き出すを精度が落ちる。
なのでメモリーアクセスのタイミングしだいで結果が異なることもありえる?
というようなページを見つけました
ttp://hw001.gate01.com/eggplant/tcf/cpp/floatprecision.html

この「同じ計算をしているのに、PCによって結果が(微妙に)違う」というのを避ける方法はありますでしょうか?
float変数は、メンバ変数やグローバル変数でも使う必要があるため、ローカルで全部やれ!というのはできません…。
906デフォルトの名無しさん:2008/12/09(火) 00:55:11
>>905
同一のexeじゃないよね?コンパイルオプション一緒にしてみてはどう?
907デフォルトの名無しさん:2008/12/09(火) 01:03:56
>>905
doubleを使え。floatで計算するよりももしかしたら速いかも知れないし。
それでも結果が違うなら、FPUの精度を外部で指定しているのだろう。
908デフォルトの名無しさん:2008/12/09(火) 01:12:18
分数を約分するプログラムを作っています。
自分ではどこが間違っているかわかりません。
お願いします。

http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8266.c
909デフォルトの名無しさん:2008/12/09(火) 01:13:38
>>905
ほんとうにどんな環境でも同じ値が欲しければ、
浮動小数点数演算を自前でエミュレートするしかない。
910デフォルトの名無しさん:2008/12/09(火) 01:15:57
最近DirectX初心者質問スレで見たな。
CPUによってFPUの精度は違うから、適度に補正をかけて細かいところで結果がズレても表面化しないようにすべきって話じゃなかったかな。
911デフォルトの名無しさん:2008/12/09(火) 01:44:46
>>909
CPUがIEEE 754に厳密に従っていればそこまでする必要もあるまい。
ただ、x86のFPUがそうであるかどうかは果たして……。
912デフォルトの名無しさん:2008/12/09(火) 02:02:07
>>908 なんか昨日も違うスレで約分のプログラム作った気がするが、まあいいや
fraction normalize(fraction x){ /*約分*/
int a, b, c;
a = x.n;
b = x.d;

if(a<0) a = -a;
if(b<0) b = -b;
if(a<b) { c=a; a=b; b=c; /*aとbを交換*/ }
while(b>0){
c = a%b;
a = b;
b = c;
}
x.n /= a;
x.d /= a;
return x;
}

int main(){
fraction x = {6, 9};
x = normalize(x);
printf("x = %d/%d\n", x.n, x.d);
return 0;
}
913デフォルトの名無しさん:2008/12/09(火) 02:12:58
>>905
最近のIntelのCPUは80bit精度で浮動小数点演算をして
メモリに書き戻すときに切り捨てするから、
コンパイラの最適化の加減によって結果が変わってくるという現象が起こる。
floatでもdoubleでも起こる。

浮動小数点誤差は回避できないので、誤差が発生することは受け入れて、
プログラムの側をロバストにしてやる方がよい。
たとえば、0.0 から 10.0 まで101回のループを回したければ
比較時に微小な値のずれを加味して以下のようにする
(この場合は整数を使った方がいいけど)。
  const double EPS = 1e-9;
  for (double x = 0.0; x += 0.1; x <= 10.0 + EPS) { ... }
914デフォルトの名無しさん:2008/12/09(火) 02:33:37
>>908
narmalize()はそのままでもちゃんと結果が出る。
マイナスの扱いはそれでいいのかという疑問はあるが。
出力がおかしいのはprintfの%dに対応するところに
intじゃないものを渡しているからなので、
>>912みたいにするといい。
915デフォルトの名無しさん:2008/12/09(火) 03:14:13
>>905
そのページを参考にvolatileつけたら?
ついでにdoubleにした方がいいと思うけど。
916デフォルトの名無しさん:2008/12/09(火) 08:58:39
>>905
自分のがデバッグビルドで友人のがリリースビルドなんてことは無いよな?
917905:2008/12/09(火) 09:29:58
たくさんのご回答ありがとうございます。

DirectXスレで、自分の生き写しのような質問を見つけました。
あちらでも先月話題になっていたようです。

_control87 を使う
floatの細かい部分。たとえが小数点以下4位未満を切り捨てる

などが対処法のようです。
_control87 については初見ですので、これから調べます。
今夜か明日にでもまた友人とテストできると思いますので、結果を報告したいと思います。
ありがとうございました
918デフォルトの名無しさん:2008/12/09(火) 09:42:06
/fp:strictもな〜

919デフォルトの名無しさん:2008/12/09(火) 10:18:04
>>918
そうでした。


ところで早速実験してみたのですが、どうやらDirectXが、初期化を行うと浮動小数点の精度を24bitに変更してしまうようです。
(Direct3Dを使ってはいるのですが、まさかfloatの精度に絡んでるとは思わなかったため、こちらのスレに相談にきたのです。)

これをうけて考えてみると、私の環境でも友人の環境でも、精度は24bitに変更されていることになります。
なので _control87 の呼び出し相当のことをすでにやっていると考えられます。

ちなみにDirectXスレによると、D3Dの初期化の際に D3DCREATE_FPU_PRESERVE を指定すれば精度の変更が行われないそうです。

となると、/fp:strict でズレが回避できるかが今回の課題かなと思います。
920908:2008/12/09(火) 16:17:20
>>912
>>914
書き込みが遅くなって申し訳ありません。
ありがとうございました。
921デフォルトの名無しさん:2008/12/09(火) 19:48:02
template<class T> inline void checked_array_delete(T * x)
{
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete [] x;
}
というのは何を意図してこの様な書き方をしているのでしょうか
sizeof(T)の結果が0だったらエラーにさせるためということで合ってますか?
あと、もしそうだったら0になる場合ってどんなときでしょうか
922デフォルトの名無しさん:2008/12/09(火) 20:06:47
たしか不完全型をdeleteするとデストラクタが呼ばれないというフザケた仕様があった気がする
それをチェックして弾くためにやってるんだと思う
923922:2008/12/09(火) 20:08:43
すまん、記憶違いだった
不完全型のdeleteは未定義らしい
でもまぁ目的は一緒だ
924デフォルトの名無しさん:2008/12/10(水) 01:03:27
クラスをDLLにエクスポートして、そのメンバ関数を使ったアプリケーションが場合に、
クラスのメンバを追加したDLLに差し替えてもアプリケーションは安全に動作するのでしょうか?

例えば、
class Test {
public:
void Hoge();
}

というクラスの入ったDLLを、
int main() {

HMODULE module;
Test* test;

module = ::LoadLibrary("test2.dll");
test = reinterpret_cast<Test*>(::GetProcAddress(module, "Testクラス"));
if(test != NULL) {
test->Hoge();
}
::FreeLibrary(module);

}

というアプリケーションからロードします。
その後、メンバを追加したDLLと差し替えた場合の動作です。
925デフォルトの名無しさん:2008/12/10(水) 01:15:26
Visual C++では、特に保証はしていないけど
仮想関数周りをいじったり、(非静的な)メンバ変数が増減したりしない限り、動くはず。

ただ、COMがこの問題を突き詰めた結果の1つでもあるんで、
興味があれば、ここのPDF立ち読みも見ていったらいい。
http://www.ascii.co.jp/books/books/detail/4-7561-3066-6.shtml
926デフォルトの名無しさん:2008/12/10(水) 01:20:22
ヘッダファイルにグローバルな変数定義をするときの注意点ってありますか。
そのグローバル変数はプロジェクト全体で参照したいのです。
例えばDLLを作るとき不都合があるとか。
927デフォルトの名無しさん:2008/12/10(水) 01:30:40
自動キー入力をしたい場合はどのように記述すればいいですか?
たとえばifをつかってある条件を満たした際にキーボードの右(→)を自動で押されるようにしたいのですが・・・
あとOpenCVに詳しい方いましたら質問したいです。
928デフォルトの名無しさん:2008/12/10(水) 02:21:21
>>922
>>923
そういうケースがありえるんですね
どうもありがとうございました
929デフォルトの名無しさん:2008/12/10(水) 02:22:41
>>927
環境かかないと答えられないよ
930デフォルトの名無しさん:2008/12/10(水) 03:36:56
>>927
押されたと認識させたいウィンドウにキーダウンメッセージをとばす
931924:2008/12/10(水) 05:14:51
>925
なるほど、複雑な構造のクラスをDLLに入れないほうがいいのですね。

リンクもありがとうございます。
COMは今一よく分かってなかったので、非常に勉強になりました。
932デフォルトの名無しさん:2008/12/10(水) 07:27:47
Doubleって何て読むの?
933デフォルトの名無しさん:2008/12/10(水) 07:30:53
ごめんわかったbって小文字のBだ
934デフォルトの名無しさん:2008/12/10(水) 08:23:57
おいおい、小学生じゃないんだからさぁ……
935デフォルトの名無しさん:2008/12/10(水) 08:32:57
表示用はC++ + DirectXで
制御用のGUIをpython + wxPythonあたりで作りたいんだけど、
こういう場合って、ソケット通信で制御すればいいんかな?

共有メモリやパイプってのもあるっぽいけど、どうすればいいか良くわかんない。
表示用のウィンドウを子プロセスで起動できたら嬉しい。
936デフォルトの名無しさん:2008/12/10(水) 09:53:30
>>935
てか、別プロセスにする積極的な理由がないなら
表示部分を DLL にして、python から呼ぶ方が簡単だと思うんだが。
937919:2008/12/10(水) 16:14:42
floatの環境依存についての報告です。

_control87、_controlfpなどでは問題は解決しませんでした。
念のため毎フレーム呼び出すなどもしましたが…。
同様に、/fp:strictでも問題は解決しませんでした。

現在は、ずれてほしくないfloatに対して
x = (float)((int)(x * 1000.0f)) / 1000.0f;
とすることで、ある程度回避できるようになりました。

が、やはり稀にずれます。
おそらく、2.000000f と 1.999999f は以前ですとほぼ同一のものですが、今回の補正をかけると0.001fずれることになります。
このずれが原因かと。

最終的には、ずれて欲しくないデータにfloatを使わないという解決方法が必要そうです。
938デフォルトの名無しさん:2008/12/10(水) 16:19:57
キャストよりfloor使った方がすっきりしそうだな
939デフォルトの名無しさん:2008/12/10(水) 16:22:16
それはないわ。
940デフォルトの名無しさん:2008/12/10(水) 18:07:11
だからdoubleで計算しろよ、と。
941デフォルトの名無しさん:2008/12/10(水) 18:16:19
>>940
頼むからログ読んでから口はさんでくれよっと
942デフォルトの名無しさん:2008/12/10(水) 20:05:35
Test *ptr;
ptr = new Test;
ptr->~Test();
ptr = new (ptr) Test();
delete ptr;

これは偶然うまく動いているだけですか?
943デフォルトの名無しさん:2008/12/10(水) 21:47:07
俺には答えられないが、
Exceptional C++ に似たような話がある。
944デフォルトの名無しさん:2008/12/10(水) 22:52:45
>>908
約分ってgcdするだけじゃん。
945デフォルトの名無しさん:2008/12/10(水) 23:04:14
struct P {
int x;
};

とあって
P() として一時変数を作ると0で初期化されたものになるんですよね?
946デフォルトの名無しさん:2008/12/10(水) 23:12:00
>>945

xが0になるかって質問であれば、ならない。
以下のようにすればなるはず。

struct P {
int x;
P():x(){}
}
947デフォルトの名無しさん:2008/12/10(水) 23:12:23
なる.保証されてる.
948デフォルトの名無しさん:2008/12/10(水) 23:14:21
>>946は無視すること
949デフォルトの名無しさん:2008/12/10(水) 23:33:48
>>942deleteはデストラクタを呼ぶのとメモリの解放までやってるんじゃね?だから
struct hoge{
int* i;
hoge():i(new int(0)){
}
~hoge(){
delete i;
}
};
みたいなやつになって初めて副作用が出るかも
950デフォルトの名無しさん:2008/12/11(木) 02:47:51
コンストラクタとデストラクタの呼び出し回数記録して出力するのを用意したら解放し忘れはきちんとチェックしきれるかな?
951デフォルトの名無しさん:2008/12/11(木) 03:18:15
そんな的の外れた努力をするくらいならスマートポインタを使いなさい。
952デフォルトの名無しさん:2008/12/11(木) 03:51:37
C++/CLI使えばいいお
953デフォルトの名無しさん:2008/12/11(木) 10:33:35
reference countっていうidiomがあります
で、それを実装に利用したのがスマートポインタなんですねーこれが
954デフォルトの名無しさん:2008/12/11(木) 12:19:49
>>947
初めて知ったぜ畜生・・・
955デフォルトの名無しさん:2008/12/11(木) 13:19:41
>>947
なんでそんな仕様なの?
956デフォルトの名無しさん:2008/12/11(木) 13:38:14
>>955
未初期化の結果生まれる不定値は危険なバグの元だから。
初期化処理を省きたければ C と同じように書けばいいわけで、
逆に初期化しない理由が無い。
957デフォルトの名無しさん:2008/12/11(木) 16:45:37
switchの中で配列を作ると↓と言われて動かないです。
どうすればいいですかー?

error C2361: 'items' の初期化が 'default' ラベルによって行われませんでした。
958デフォルトの名無しさん:2008/12/11(木) 16:46:18
caseの中身を{}でブロック化し、その中で変数を宣言する。
959デフォルトの名無しさん:2008/12/11(木) 16:47:53
case 0:
{
  int a[100];
}
みたいに{}でくくるとうまくいかないか?
960デフォルトの名無しさん:2008/12/11(木) 16:48:19
ブロック
961デフォルトの名無しさん:2008/12/11(木) 16:48:24
わぁお被った
962デフォルトの名無しさん:2008/12/11(木) 16:49:56
できたです。どーもです。
963デフォルトの名無しさん:2008/12/11(木) 17:31:39
自分はこれがイヤだから、switchではなくifで分けるほうが多いな。
964デフォルトの名無しさん:2008/12/11(木) 19:40:11
>>956
C++/CLIはどうか知らんが、int型にデフォルトコンストラクタなんて
ないし、クラスのコンストラクタで初期化していないのだから、C++
の言語仕様では0にはならんだろ。

それに初期値として0が妥当かどうかはケースバイケース。
965デフォルトの名無しさん:2008/12/11(木) 19:53:05
見かけ上であればあるよな
int x(10);とか
int y;
y = int(10;
とか
966デフォルトの名無しさん:2008/12/11(木) 19:53:51
y = int(10);
とか
y = int();
967デフォルトの名無しさん:2008/12/11(木) 20:09:11
だってクラスだもん
968デフォルトの名無しさん:2008/12/11(木) 20:26:59
>>956
その説明では納得できないな。
P p; と P() は両方変数を作成する構文なのに
後者の場合だけメンバ変数まで初期化するのに妥当な理由が見出せない。
仕様のどこに規定されている?
969デフォルトの名無しさん:2008/12/11(木) 20:50:55
>>968
前者は変数を作成する構文で、後者は値を生成する構文。
970デフォルトの名無しさん:2008/12/11(木) 21:17:12
>>969
組み込み型の話をしてないか?
964や967の言うとおりクラスの話なんだが。
両方ともオブジェクトをインスタンス化する構文だろ。
971デフォルトの名無しさん:2008/12/11(木) 21:25:48
>>970
>>968の書いていることが間違っていると指摘しただけなんだが
972デフォルトの名無しさん:2008/12/11(木) 21:32:35
>>971
ん、ごめん。よく分からないな。
P()は一時「変数を作成」する構文だと思ってるのだけど、
「値の生成」なの?
そこがよく分からなかったので、970で、「それは組み込み型の話じゃないの?」って
聞いたんだけど。
973デフォルトの名無しさん:2008/12/11(木) 22:17:01
デフォルトコンストラクタとコピーコンストラクタといってくれ
974デフォルトの名無しさん:2008/12/11(木) 22:19:30
>>972
一時変数ではなくて一時オブジェクトなのだが
975デフォルトの名無しさん:2008/12/11(木) 22:23:23
どう違うの?
976デフォルトの名無しさん:2008/12/11(木) 22:57:18
ウィンドウズのGUIアプリを作りたいんですが、今の主流はなんですか?WIN32API?
977デフォルトの名無しさん:2008/12/11(木) 23:02:37
wpf
978デフォルトの名無しさん:2008/12/11(木) 23:03:42
>>976
フリーソフトやパッケージソフトの類なら、その通りかな
979デフォルトの名無しさん:2008/12/11(木) 23:55:00
#include<iostream>
using namespace std;
struct A{int i;};
A ga;
int main(){
static A sa;
A la;

cout << "ga.i = " << ga.i << endl;
cout << "sa.i = " << sa.i << endl;
cout << "la.i = " << la.i << endl;
cout << "ra.i = " << A().i << endl;
}

結果(VC2008)
ga.i = 0
sa.i = 0
la.i = 2406644
ra.i = 0

普通の変数と一緒だな
980デフォルトの名無しさん:2008/12/12(金) 00:17:33
>>968
5.2.3の2段落目や8.5の7段落目でT()は値初期化するとなっているが、
8.5の9段落目では、デフォルトコンストラクタを持たない型で
初期化子のないオブジェクトは初期化されないと決められている。

newだと両方の書き方ができるので、分かりやすいかもしれない。
new intは初期化子がないので、初期化されない。
new int()は空の初期化子を持つので値初期化(組込型ではゼロ初期化)される。
981デフォルトの名無しさん:2008/12/12(金) 00:25:06
イテレータのポインタへの変換ってやっても大丈夫なの?
とりあえず動いてはいるみたいなんだけど・・・
982デフォルトの名無しさん:2008/12/12(金) 00:40:09
>>981
キャストしての変換だったら駄目ぜったい。

&*itなら、vectorならおk、basic_stringも今度から認められる。
配列へのポインタのごとく足したり引いたりしていい。

それ以外のコンテナでの&*itは、単純にその要素へのポインタとしてしか使えない。
983デフォルトの名無しさん:2008/12/12(金) 02:57:16
cをちょこちょこっとかじってからc++に移行し始め、今まで毎回バグって全然動かなかったDxのプログラムが初めてマトモに動いた

   イィィヤッッッッホオォォォー

    *     +    巛 ヽ
               〒 !   +
         +    。  |  |
      *     +   / /   +
          ∧_∧ / /
         (´∀` / / +
         ,-     f
         / ュヘ    | *
        〈_} )   |
           /    ! +
          ./  ,ヘ  | 
    ガタン ||| j  / |  | |||
   ―――――――――――――

     誰かに届け、この喜び
984デフォルトの名無しさん:2008/12/12(金) 02:59:43
>>964
int にデフォルトコンストラクタがあるとか初期値として 0 が常に妥当だとか、
誰もそんなこと言ってないのになんで偉そうに間抜けを晒すかね。
985デフォルトの名無しさん:2008/12/12(金) 03:05:31
>>982
ありがとう、気をつけるよ
そしてうまくいかないのは別の原因だった罠・・・orz
986デフォルトの名無しさん:2008/12/12(金) 03:07:39
>>983
その気持ち、忘れるなよ。
987デフォルトの名無しさん:2008/12/12(金) 06:35:26
>>984
BASICプログラマは黙ってろ!
988デフォルトの名無しさん:2008/12/12(金) 10:59:59
989デフォルトの名無しさん:2008/12/12(金) 11:10:20
















990デフォルトの名無しさん:2008/12/12(金) 11:38:49
>>987
>>980 が難しくて解らなかったのか、それとも単に読み飛ばしたのか。
991デフォルトの名無しさん:2008/12/12(金) 12:44:45
CString str = _T(test 1 test 2 test 3);
CString in = str.SpanIncluding(_T("1234567890"));

in に 123 がはいりません_T("")になってます。どうしてですか?
992デフォルトの名無しさん:2008/12/12(金) 12:50:16
文字列の最初の文字から始まり、pszCharSet. にない文字が出現するところで終了する
だった解決した
993デフォルトの名無しさん:2008/12/12(金) 16:12:48
>>980
ありがとう。規格を読んで全部ではないが理解できた。
PODでは0初期化されるんだな。

そしてnon-POD class typeではデフォルトコンストラクタが呼ばれるから0初期化されないと。
979でstruct A{int i; virtual void Func(){}}; とすると A().i != 0 となったよ。
俺はPODでもこうなると勘違いしてたよ。勉強になった。
994デフォルトの名無しさん:2008/12/12(金) 18:49:28
しかし、 古いコンパイラだと実際には初期化してくれないことも・・・
995デフォルトの名無しさん:2008/12/12(金) 19:31:30
void func()
{
int i;

cout << i << endl;
}

現実問題、市販フリー問わず現在市場に出回ってるコンパイラで、iの
値が0に初期化されることが保証されるコンパイラってあるのか?

警告レベル上げれば初期化されていない変数を参照しているって警告を
出すけど、ほとんどのコンパイラでiの値は不定だと思うが?
996デフォルトの名無しさん:2008/12/12(金) 19:36:05
セグメント次第
997デフォルトの名無しさん:2008/12/12(金) 23:04:43
つぎすれ だれか たのむ
998デフォルトの名無しさん:2008/12/13(土) 00:17:38
>>995
初期化されると思う方がどうかしている。話題になっているのは、その書き方の話ではない。
999デフォルトの名無しさん:2008/12/13(土) 00:24:06
立てた。
【初心者歓迎】C/C++室 Ver.62【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1229095398/l50

>>8
たぶん何度もコピペされたからだと思う。
1000デフォルトの名無しさん:2008/12/13(土) 00:29:46
千と千尋の金閣寺
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。