2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2006/08/21(月) 16:33:13
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.29【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1152367512/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

2 :デフォルトの名無しさん:2006/08/21(月) 16:35:51
また双子スレか

3 :デフォルトの名無しさん:2006/08/21(月) 16:45:51
ここは重複スレ
本スレはこっち
http://pc8.2ch.net/test/read.cgi/tech/1156145524/

4 :デフォルトの名無しさん:2006/08/21(月) 16:56:08
>>1


5 :デフォルトの名無しさん:2006/08/21(月) 17:55:07
おもしろいな、専用ブラウザで>>3のリンクをクリック連打してっと行ったり着たりできる

6 :デフォルトの名無しさん:2006/08/21(月) 17:57:29
>>5
再帰構造ととらえてよろしいのか?

7 :デフォルトの名無しさん:2006/08/21(月) 19:15:51
相互再帰か

8 :デフォルトの名無しさん:2006/08/21(月) 19:18:03
なにこのすれ

9 :デフォルトの名無しさん:2006/08/21(月) 20:23:47
まあ向こうは後で再利用すればよいだろう。

10 :デフォルトの名無しさん:2006/08/21(月) 20:28:41
どっちがどっちだかわからなくなってきた

11 :デフォルトの名無しさん:2006/08/21(月) 20:36:20
そっくりくりくりくりっくり

12 :デフォルトの名無しさん:2006/08/21(月) 20:56:02
削除人が困るぞw


13 :デフォルトの名無しさん:2006/08/21(月) 21:01:03
どっちが何なんだか分かんねーよ

14 :デフォルトの名無しさん:2006/08/21(月) 21:02:38
質問しづらいな

15 :【初心者歓迎】C/C++室 Ver.31【環境依存OK】:2006/08/21(月) 21:35:39
☆★☆ここは 【初心者歓迎】C/C++室 Ver.31【環境依存OK】 予定地☆★☆


エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

16 :【初心者歓迎】C/C++室 Ver.31【環境依存OK】:2006/08/21(月) 21:39:26
☆★☆ここは 【初心者歓迎】C/C++室 Ver.30【環境依存OK】 本スレ☆★☆ 


エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 
ただしその場合、質問者は必ず、環境を書きましょう。 
※sageは禁止です。 
【前スレ】 
【初心者歓迎】C/C++室 Ver.29【環境依存OK】 
http://pc8.2ch.net/test/read.cgi/tech/1152367512/ 
【アップローダー】(質問が長い時はココ使うと便利) 
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm 

17 :デフォルトの名無しさん:2006/08/21(月) 21:40:22
>>15 
判らなくなるだろw 

18 :デフォルトの名無しさん:2006/08/21(月) 22:12:19
C言語に興味を持つ 
↓ 
解説書購入 
↓ 
printfやifを一通り使えるようになるレベル ←いまココ 


オセロは何段階くらい先? 

19 :デフォルトの名無しさん:2006/08/21(月) 22:30:53
ミラーリング阻止

20 :デフォルトの名無しさん:2006/08/21(月) 22:36:36
人により1段階〜無限段階 

21 :デフォルトの名無しさん:2006/08/21(月) 22:37:34
人により1段階〜無限段階

22 :デフォルトの名無しさん:2006/08/21(月) 22:44:11
ミラーリング阻止 したところでどちらを削除してよいかは分かるまい


23 :デフォルトの名無しさん:2006/08/21(月) 22:45:27
わろす 
俺もミラーリング参加する! 

24 :デフォルトの名無しさん:2006/08/21(月) 22:46:59
遅いほう削除するに決まってるだろ。

25 :23:2006/08/21(月) 22:48:33
俺としては削除して欲しくない。

正常に運営しつつ、「双子スレ」の記録を狙ってみては。


26 :デフォルトの名無しさん:2006/08/21(月) 22:50:00
Turboスレでやれ

27 :デフォルトの名無しさん:2006/08/21(月) 22:50:14
こっちは重複スレ

28 :デフォルトの名無しさん:2006/08/21(月) 22:51:33
あほか

29 :デフォルトの名無しさん:2006/08/21(月) 22:52:50
ミラーリングするとか言っている奴は相当暇なんだな

30 :デフォルトの名無しさん:2006/08/21(月) 23:09:28
同期を取りました。

31 :デフォルトの名無しさん:2006/08/21(月) 23:11:46
誰も言わないから俺が言ってやる



まさに マルチスレッド

32 :デフォルトの名無しさん:2006/08/21(月) 23:13:56
馬鹿じゃねぇの?

33 :デフォルトの名無しさん:2006/08/21(月) 23:13:57
>>31
ハゲワラタ

34 :デフォルトの名無しさん:2006/08/21(月) 23:15:34
ミラーリング厨が都合の悪いレスだけ別の文にしてるwwwwww

35 :デフォルトの名無しさん:2006/08/21(月) 23:17:30
>>34
次はメール欄もちゃんとミラーリングしろよ

36 :デフォルトの名無しさん:2006/08/21(月) 23:18:42
リビルド不能です。
廃棄をおながいします。

37 :デフォルトの名無しさん:2006/08/21(月) 23:39:26
こっちのスレだけ加速させればいいだけ

38 :デフォルトの名無しさん:2006/08/21(月) 23:40:04
久しぶりにアホなスレに嗤ったw
この話題で30も行くとこうなるのか。

39 :デフォルトの名無しさん:2006/08/21(月) 23:40:38
どっかの馬鹿のせいでこんな流れか

40 :デフォルトの名無しさん:2006/08/21(月) 23:41:37
ミラーリング厨が泣きながら去っていきます

41 :デフォルトの名無しさん:2006/08/22(火) 00:02:09
よし次はストライピングだ

42 :デフォルトの名無しさん:2006/08/22(火) 00:03:10
>>41
ああ、俺がちょうど書いてやろうと思ったのに。

43 :デフォルトの名無しさん:2006/08/22(火) 00:09:22
微妙に改行が少ない件

44 :953:2006/08/22(火) 01:13:54
前のスレではみなさんにお世話になりました。
>>18私はC++を勉強して4ヶ月目で、授業では一応教科書一冊の範囲(ポインタまで)も終わったんですが
ぜんぜん駄目でした。

45 :デフォルトの名無しさん:2006/08/22(火) 01:18:13
strcmp関数とかのソースコードを見たいのですが、どこらへんにソースファイルがあるのでしょうか・・?
OSはfreebsd4.11です。

#一応findしてみたところ/usr/includeにstring.hはあったのですが、
肝心のコードが書いてあるファイルが見つかりませんでした・・・

46 :デフォルトの名無しさん:2006/08/22(火) 02:12:41
C++の参考書ってどれがいいんですか?
Cは一通りわかってます。

47 :AcceralatedC++とかEffectiveC++とか:2006/08/22(火) 02:44:37
>>46
スレ違い。書籍スレにでもどうぞ。

48 :デフォルトの名無しさん:2006/08/22(火) 04:31:09
これは双子スレ?ミラーリングされてるの?

49 :デフォルトの名無しさん:2006/08/22(火) 08:56:38
おまえら、遊ぶのはせめて一桁までにしておけよ

50 :デフォルトの名無しさん:2006/08/22(火) 09:26:41
おまえらマルチポストするなよ

51 :デフォルトの名無しさん:2006/08/22(火) 09:27:54
>>50
失敗ぷっ

52 :デフォルトの名無しさん:2006/08/22(火) 11:26:33
>>51
失敗ぷっ

53 :デフォルトの名無しさん:2006/08/22(火) 11:37:05
なめんな

54 :デフォルトの名無しさん:2006/08/22(火) 11:48:30
何このスレ

55 :デフォルトの名無しさん:2006/08/22(火) 13:55:55
ぱやぱやC

56 :デフォルトの名無しさん:2006/08/22(火) 14:41:19
>>57
できない

57 :デフォルトの名無しさん:2006/08/22(火) 14:53:07
printf関数の書式%pの出力形式を自分で制御できませんか?
自分の環境(bc++5.5.1)では16進数で表示されるのですが、これを10進数で表示したいです。

58 :デフォルトの名無しさん:2006/08/22(火) 14:53:57
unsigned intにキャストするとかsprintfで16進にしたあとstrtolで整数に戻すとか。

59 :デフォルトの名無しさん ◆BSGKNxcQW. :2006/08/22(火) 15:04:12
ぱやぱやC

60 :財前丈太郎 ◆WodAdTnrzc :2006/08/22(火) 15:10:02
だっぽん

61 :デフォルトの名無しさん:2006/08/22(火) 15:33:28
ぷにぷにC

62 :デフォルトの名無しさん:2006/08/22(火) 15:39:02
ゲームとかで聞くアルゴリズムって何ですか?

63 :デフォルトの名無しさん:2006/08/22(火) 15:51:38
つttp://www.wakhok.ac.jp/~sumi/stl/header/algorithm.html

64 :デフォルトの名無しさん:2006/08/22(火) 15:52:14
>>62
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0

あと本スレはこっち
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/

65 :デフォルトの名無しさん:2006/08/22(火) 21:30:49
最初数個が浮動小数点で、
残りが10個以下ではあるけど何個かわからない整数を
1行ずつ構造体の配列に読み込みたいのですが、
どうしたらいいもんでしょうか?
4.543 3.12 45.32 6 3 4 3 6
3.1 7.4 3.1 4 1
84.32 2.33 1.22 9 4 3 1
こんな感じのテキストファイルを
tyepdef struct{
double a1;
double a2;
double a3;
int b[10];
} Hoge
みたいな構造体に入れていきたいのですが。
固定のものならfscanfで1行読み込んでたのですが、
何個かわからないものの読み込み方がわからないです。

66 :デフォルトの名無しさん:2006/08/22(火) 21:37:01
構造体に個数も持てば?

67 :デフォルトの名無しさん:2006/08/22(火) 21:39:32
>>65
sscanfで変換した個数が戻るから、それを利用する。

68 :デフォルトの名無しさん:2006/08/22(火) 22:09:06
レスありがとうございます。
>>66
すいません、その個数の数え方がわかりません。
>>67
sscanfについて調べてみます。


69 :デフォルトの名無しさん:2006/08/23(水) 14:42:27
・SUN4/20
・Solaris2.5X
上記環境で動いているCのプログラムを移植する事になったのですが、この環境
でのintのバイト数は幾つになるのでしょうか?

70 :仕様書無しさん:2006/08/23(水) 14:55:08
>69
sizeof(int)/sizeof(char)

71 :デフォルトの名無しさん:2006/08/23(水) 15:01:55
SUN4/20 てなんだっけ。Sparcなら4、680X0なら2だろ。うちにあるSunOS4マシンは4だが
ディスプレイがないので怖くて電源あげられねえorz

72 :69:2006/08/23(水) 15:12:33
>>70
そのマシンは触らせてもらえないので、テストPG等作れません。

>>71
資料には
・サーバー:SUN4/20
・CPU:SuperSparc
とあります。
>Sparcなら4
4バイトに該当するのでしょうか?
現行のシステムを作ったのは別の会社で、問合せ窓口が無く、
ユーザー側にもそこまで分かる方がいないので困ってます。


73 :デフォルトの名無しさん:2006/08/23(水) 15:18:00
まず4で間違いない。しかし sizeof int がそんな気になるのかね?typedef int INT とかして
プロジェクト始めりゃ大した問題出ないんじゃね?そうでなくても移植してりゃすぐ気づくだろ。

74 :69:2006/08/23(水) 15:26:55
>>73
ありがとうございます。
sizeof(int)の指定でintの値をバイナリのまま可変長レコードでファイルに読み書き
していて、そのファイルの解析も兼ねてintのサイズが知りたかったのです。


75 :デフォルトの名無しさん:2006/08/23(水) 15:28:51
>>74
そのファイルは 相互環境で port するの?

76 :デフォルトの名無しさん:2006/08/23(水) 15:36:45
sparc は big-endian だぞ。

77 :デフォルトの名無しさん:2006/08/23(水) 15:37:30
一度貼り付けた画像を一回クリアするために画面を塗りつぶすのを
なんて言うんでしたっけ。

78 :69:2006/08/23(水) 15:39:10
>>75
そのファイルは作成後に別の会社の別システムに転送しているので
そのまま使います。


79 :69:2006/08/23(水) 15:41:05
>>76
>sparc は big-endian だぞ。
と言う事はバイトの格納順位が逆になっていると言う事ですか?


80 :デフォルトの名無しさん:2006/08/23(水) 15:42:25
移植先のマシンが little-endian ならな。

81 :デフォルトの名無しさん:2006/08/23(水) 15:45:21
なんつーかこっちの方が盛り上がってるな

でも一応こっちが本スレ
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/

82 :デフォルトの名無しさん:2006/08/23(水) 15:50:13
>>77
(゚Д゚)ハァ? なんのコミュニティの話だ?とりあえずOSを言ってみろ。
スレ違いなヤカン…

83 :デフォルトの名無しさん:2006/08/23(水) 15:56:13
>>78
エンディアンとか含めて、仕様の sizeof(int) 自体が問題アリっぽくないか?

84 :77:2006/08/23(水) 15:58:26
>82
うぃんどうずです。
ゲームで一度貼り付けた画像クリアするんですけども、
画面を何か適当な色で塗りつぶすことでクリアとするじゃないですか。
それをなんと言うのか忘れてしまって。

85 :82:2006/08/23(水) 16:06:08
すまんな、しらん。思いつくコトバは WM_ERASEBKGND, Validate くらいだな。
DirectXXXとかならやったことねえ。

86 :69:2006/08/23(水) 16:09:55
>>80
>移植先のマシンが little-endian ならな。
すいません、書き漏れましたがWindowsに移植します。
リコンパイル+α程度で行けそうだったのですが、大変そうになってしまいました。


87 :デフォルトの名無しさん:2006/08/23(水) 16:15:44
+αの範疇だろ。ただ、「なんとなくやな感じ」に対して工数をゲットできないのがつらいんだよな。

88 :デフォルトの名無しさん:2006/08/23(水) 16:31:43
>>69
問題のファイルを出す喰う別会社の別システム は SUN4/20 のまま
自社のシステムが Windows
ってことか…

微妙に嫌なポーティング作業だね

89 :デフォルトの名無しさん:2006/08/23(水) 16:41:47
Linuxにすればぁ?

90 :デフォルトの名無しさん:2006/08/23(水) 16:44:35
元のプログラムに潜在的なバグがあって大ハマリに1レジスタウィンドウ

91 :デフォルトの名無しさん:2006/08/23(水) 17:03:43
strlenの戻り値を変数の初期化に使う方法はありますか?

92 :デフォルトの名無しさん:2006/08/23(水) 17:07:11
int len = strlen(arg); これは初期化と言うんじゃないかね。
配列の要素数のことを言ってるなら_

93 :デフォルトの名無しさん:2006/08/23(水) 17:12:54
すみません、条件をいくつか書き忘れてしまいました。
static属性のついたsize_t型の変数を初期化します。

94 :デフォルトの名無しさん:2006/08/23(水) 17:15:45
C++ なら
static size_t len = strlen(arg);
は許されるよな? arg が先に定義されてないといけないけど。

95 :デフォルトの名無しさん:2006/08/23(水) 17:19:46
++なら、か・・・
ありがとうございます、導入を検討してみます

96 :デフォルトの名無しさん:2006/08/24(木) 08:26:27
C99ならローカルな可変長配列も使える。

97 :デフォルトの名無しさん:2006/08/24(木) 23:35:22
誰か助けて!

ifstream f("test.txt", ios_base::binary | ios_base::in);
......
unsigned short n;
f >> n;
// f.read((char*) &n, 2);

こんなソースを書いて、 f >> n だとエラーになるのに、
コメントのように read 関数を使うと、ちゃんと読めるのです。
原因はなんでしょうか。よろしくお願いします。


98 :デフォルトの名無しさん:2006/08/25(金) 00:00:15
本スレ誘導
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/

99 :デフォルトの名無しさん:2006/08/25(金) 00:00:30
>> はバイナリを読み込む演算子じゃない

100 :デフォルトの名無しさん:2006/08/25(金) 00:02:11
>>98
すいません、そちらに行きます。
>>99
と思ったら、お答えいただきました。
誠にありがとうございます。m(_ _)m

101 :デフォルトの名無しさん:2006/08/27(日) 08:18:30
可変個機能が使えるva_listがありますが、
それ+個数、型がチェック出来る物が、
C、C++、ウィンドウズのどれかでないでしょうか。

102 :デフォルトの名無しさん:2006/08/27(日) 08:35:45
>>101
個数がチェックできるのなら可変じゃないような。
printf()系みたいにフォーマット指定があってそれと比較すると言うことか?
C++なら類似機能をクラスで作れるとは思うが、やりたいことをもっと具体的に。

103 :101:2006/08/27(日) 08:50:28
>>102
kahenko(10); → 10と出力
kahenko(5, "15", '8'); → 5 15 8と出力

例えばこんな事がしたいです。
va_arg(ap, ***)だと、型が分からないし、個数も分かりません。

104 :デフォルトの名無しさん:2006/08/27(日) 08:53:41
>>103
vector<boost::any>でも使ってコンテナに入れて渡せ。可変長引数の
代用になる物を考えろ。

105 :101:2006/08/27(日) 08:59:41
ありがとうございます。やってみます。

106 :デフォルトの名無しさん:2006/08/27(日) 20:20:49
>>103
各引数の情報をprintf()の様に渡してやる必要がある。
個数、型共にわかる情報をな。

107 :デフォルトの名無しさん:2006/08/30(水) 19:17:09
向こうがなにやら変なことになってるけど
これは最悪板行きコースかね?

108 :デフォルトの名無しさん:2006/08/31(木) 15:00:13
win98でも動くようにと思いながら作ってて試してみたら正常に動かなかったので、環境依存の問題として質問させてください。

値が変になったクラスは、APIとかmfcとか使ってなく、純粋な演算系のクラスなんですが、
__int64の演算と、__int64の変数をBYTEにキャストして1バイトずつ処理しているところがあります。

1.win98では、__int64は使えないのでしょうか。
2.int変数や、使えるなら__int64変数に確保される領域は、win98も32bitxpも同じと思って間違いないでしょうか。
3.int内のBYTEコードが逆順に並んでいるとかはwin98(dos/v intel)でも同じと思って間違いないでしょうか。


109 :デフォルトの名無しさん:2006/08/31(木) 15:27:21
1,OS依存ではなくコンパイラ依存
2.コンパイラによる
3.エンディアンはCPU依存

そしてここは重複スレだ

110 :デフォルトの名無しさん:2006/08/31(木) 15:43:53
みなさんこんにちわ(o*。_。)o
お尋ねしたい事があり書き込みさせて頂きます。

色々なサイトでIDやPassを自動配信するシステムがありますよね?
そのシステム方法を教えて頂けないでしょうか。
探してみて無料配布しているところなど探してみたのですが
見当たりませんでした。配布されているものじゃなく作る物なのでしょうか?
もし、作る物であるのならわかる方に教えて頂きたく思います。

どうぞ宜しくお願い致します(*- -)(*_ _)

111 :デフォルトの名無しさん:2006/08/31(木) 16:01:14
誘導スレに誘導するってのも変な話だが
http://pc8.2ch.net/test/read.cgi/tech/1066747198/

112 :デフォルトの名無しさん:2006/08/31(木) 16:06:06
111さん、ありがとうございました(*- -)(*_ _)
誘導スレに書き込めば良いのですね!

113 :デフォルトの名無しさん:2006/09/13(水) 00:51:12
bool値を反転させるのって皆さんどうしてます?

bool flag = false;
.....
flag = flag != true;

以外にありますかね?

114 :デフォルトの名無しさん:2006/09/13(水) 01:00:17
flag = !flag;
じゃいかんの?

115 :デフォルトの名無しさん:2006/09/13(水) 01:01:05
>>114
...orz
ありがとうございました……

116 :デフォルトの名無しさん:2006/09/13(水) 01:27:07
釣りじゃなかったのか・・・

117 :デフォルトの名無しさん:2006/09/13(水) 09:02:52
すいません。
2を乗算するのってどうしてますか?
i=i*2;
以外にありますか?

つりではないです。

118 :デフォルトの名無しさん:2006/09/13(水) 09:03:44
i+=i でもいいよ。

119 :デフォルトの名無しさん:2006/09/13(水) 09:09:58
i <<= 1;

120 :デフォルトの名無しさん:2006/09/13(水) 09:33:47
i*=2 だろ。

121 :デフォルトの名無しさん:2006/09/13(水) 09:38:07
どうせ現代コンパイラの最適化の前ではどれも同じさ。
自分が書きやすいように書けばいい。

122 :デフォルトの名無しさん:2006/09/13(水) 13:03:38
すいません。
10倍するのってどうしてますか?
i=i*10;
以外にありますか?

つりではないです。

123 :デフォルトの名無しさん:2006/09/13(水) 13:06:21
i = i * (2 + 8);

i = i * 2 + i * 8;

i = (i << 1) + (i << 3);


124 :117:2006/09/13(水) 13:07:40
>>122
は?
i=i+i+i+i+i+i+i+i+i+i;
でいいと思ってんの?アフォ?

125 :デフォルトの名無しさん:2006/09/13(水) 13:18:22

i が int だと勝手に思い込んでる香具師ら

126 :122:2006/09/13(水) 13:55:21
iはdoubleです

127 :デフォルトの名無しさん:2006/09/13(水) 14:01:31
doubleで加算を繰り返すと桁落ちする

128 :デフォルトの名無しさん:2006/09/13(水) 15:22:02
strstream s;
s << i << '0' >> i;

かなり C++ 忘れたな・・・。

129 :122:2006/09/13(水) 15:34:45
< '0' >ニョー

130 :デフォルトの名無しさん:2006/09/13(水) 20:23:54
>>122
i *= 10;

131 :デフォルトの名無しさん:2006/09/14(木) 02:12:23
i = pow(10, log(i) + 1);

132 :デフォルトの名無しさん:2006/09/14(木) 02:29:50
i = (int)(pow(10, log(i)/log(10) + 1) + .5);

133 :デフォルトの名無しさん:2006/09/14(木) 14:00:28
ウィンドウ上でDISABLEになっているコントロールの色(GRAYTEXTではなく)はdefineされていますか?
もし無いならば、どこから持ってくればいいのでしょうか?

134 :デフォルトの名無しさん:2006/09/14(木) 14:12:31
>>133
画面のプロパティでの設定に依存

135 :133:2006/09/14(木) 14:17:20
>>134
GetSysteColror()等で持って来れないかな?と。

136 :デフォルトの名無しさん:2006/09/14(木) 14:18:12
すみません。超初心者です。
この度、VC6からVC2005に変えて勉強しています。
質問ですが、VC2005はCreateWindow()は使えないのでしょうか?
また、文字列を引数とする関数全てに
「LPCWSTRに変換できません」
というエラーになってしまいます。(MessageBox()など)
LPCWSTRでキャストすれば通るのですが、文字列指定する関数には
毎回LPCWSTRでキャストしないといけないのでしょうか?
低レベルな質問で申し訳ないですが、よろしくお願いします。


137 :デフォルトの名無しさん:2006/09/14(木) 14:39:48
すみません。スレ違いでしたね。
くだすれVisual C++(超初心者用)その3 で質問してきます。
お騒がせしました。


138 :デフォルトの名無しさん:2006/09/15(金) 23:09:26
重複スレが1000逝ったから、こちらをageておくか。

139 :デフォルトの名無しさん:2006/09/16(土) 04:27:41
Windowsのコンソールのウィンドウハンドルを取得したいのですが、
どのAPIを使えばいいのでしょうか。

140 :デフォルトの名無しさん:2006/09/16(土) 05:00:02
>>139
GetConsoleWindow()

ちなみに、まず必要ないと思うけど、9xからコンソールのウインドウハンドルを取得したいなら、
SetConsoleTitle()で、コンソールのタイトルバーをユニークな文字列にして、
FindWindow()で行けた。

141 :デフォルトの名無しさん:2006/09/16(土) 13:24:21
LFU式のキャッシュを作る良い方法はないですか?
参照数カウント式だとオーバーフローのときどうしよう
とか困ってしまってわんわんわわん。

142 :デフォルトの名無しさん:2006/09/16(土) 15:05:02
すいません。初歩的なことですが、

unsigned int x = -1;
printf("%d" , x);


これで -1 と出力されるのは何故ですか?

143 :デフォルトの名無しさん:2006/09/16(土) 15:13:08
"%u"

144 :デフォルトの名無しさん:2006/09/16(土) 15:14:07
ああちなみに"%d"で-1と表示される保証はどこにもないからね。
機種依存です。内部表現によります。

145 :デフォルトの名無しさん:2006/09/16(土) 15:51:23
そういえば、どこぞの携帯で%sとか%dってメール書くと落ちるっての聞いてためしたんだけど

printf("%d");

ってのはぬるぽを表示しようとしてるってことかな?

146 :デフォルトの名無しさん:2006/09/16(土) 16:10:16
  ∧_∧
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ     人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/ ←>>145
 (_フ彡

147 :139:2006/09/16(土) 16:27:55
>>140
ありがとうございます。

148 :デフォルトの名無しさん:2006/09/16(土) 21:41:24
>>143
すごい数になりました。
>>144
ありがとうございます。少し研究してみます。

149 :デフォルトの名無しさん:2006/09/16(土) 23:57:44
>>148
とりあえず、-1は
1 << (sizeof(int) * 8 - 1)
だから、同じビット表現のままunsigned型変数に入ったんだろうな。

そうすると表示された数は、intが32bitだと仮定すると2147483648じゃないか?

150 :デフォルトの名無しさん:2006/09/17(日) 00:00:41
>>149
> とりあえず、-1は
> 1 << (sizeof(int) * 8 - 1)

そんな環境もあるのか。世界は広いな。

151 :149:2006/09/17(日) 00:02:54
俺はバカです。

-1 は ~0 の否定です。
表示されたと思われる数は4294967295です。

152 :デフォルトの名無しさん:2006/09/17(日) 00:05:51
>>151
> -1 は ~0 の否定です。

~0 の否定って、 0 じゃね?

153 :デフォルトの名無しさん:2006/09/17(日) 00:07:00
>>151
お前はバカじゃなくてただの無能だ
もう書くなクズ

154 :149:2006/09/17(日) 00:07:11
自分の行動に動揺しすぎてる。

>>152
その通りだな。
誰か訂正してやってください。

吊ってくるわ。

155 :デフォルトの名無しさん:2006/09/17(日) 00:11:44
軽々しく吊るとか言うな。
首吊って自殺した友人に謝れ。

156 :デフォルトの名無しさん:2006/09/17(日) 00:13:05
2の補数取れよ。~してから+1。

157 :デフォルトの名無しさん:2006/09/17(日) 00:14:30
フフフ

158 :デフォルトの名無しさん:2006/09/17(日) 00:32:20
1 の 2 の補数であって 0 の 2 の補数なわけじゃないだろ。

159 :デフォルトの名無しさん:2006/09/17(日) 00:40:39
0ってどっから出てきたんだ?流れ読めってか?

160 :デフォルトの名無しさん:2006/09/17(日) 00:41:30
負の数を符号無し型に変換する場合、
その型で表せる最大の値に1加えた数から、
元の負の数を加えたものが結果の値となる。

つまり142の場合、xは(UINT_MAX + 1) + -1、
つまりUINT_MAXで初期化されたことになる。

符合無し型から符号有り型への変換の場合、
元の値が変換先の型では範囲外となる場合、
その結果は処理系定義。

161 :初心者ボーイ:2006/09/17(日) 01:40:36
環境:visual studio.NET 2003 visual C++
directX 9.0 2006 August

質問:directXとdirectshowを使ってプログラムをつくりたいのですが、
現在webカメラで画像を取り込みながらdirectxで3D表示をするプログラムをつくっています。
とりあえずコンパイルができません。どうすればいいのでしょうか?教えてください。

エラー内容:
warning C4005: 'WIN_TYPES' : マクロが再定義されました。
error C2061: 構文エラー : 識別子 'LPDIRECT3D'
error C2061: 構文エラー : 識別子 'LPDIRECT3DDEVICE'
error C2061: 構文エラー : 識別子 'LPDIRECT3D'
error C2061: 構文エラー : 識別子 'LPDIRECT3DDEVICE'
error C2061: 構文エラー : 識別子 'LPDIRECT3D2'
error C2061: 構文エラー : 識別子 'LPDIRECT3DDEVICE2'
error C2061: 構文エラー : 識別子 'LPDIRECT3D'
error C2061: 構文エラー : 識別子 'LPDIRECT3DDEVICE'
error C2061: 構文エラー : 識別子 'LPDIRECT3D2'
error C2061: 構文エラー : 識別子 'LPDIRECT3DDEVICE2'
error C2061: 構文エラー : 識別子 'LPDIRECT3DVIEWPORT'
error C2061: 構文エラー : 識別子 'LPDIRECT3DVIEWPORT'
error C2061: 構文エラー : 識別子 'LPDIRECT3D'
error C2061: 構文エラー : 識別子 'LPDIRECT3D2'
error C2061: 構文エラー : 識別子 'LPDIRECT3D2'

includeの順番:windows.h d3dx9.h dshow.h qedit.h stdio.h

補足:directshowにはISampleGrabberを使っているのでqeditをincludeしています。
qeditを外してincludeするとエラーが出ないため、qeditのところでエラーが出ているとは思います。

162 :デフォルトの名無しさん:2006/09/17(日) 01:45:24
つttp://forums.belution.com/ja/vc/000/181/05.shtml

163 :初心者ボーイ:2006/09/17(日) 01:51:46
directXのディレクトリを上にしているのですが、
無理なんです。はい。

あとplatform sdkのdirectshowをincludeするようにもしてみましたが、駄目でした


164 :デフォルトの名無しさん:2006/09/17(日) 03:21:58
qedit.hはDirectX7以降のDirect3Dヘッダと互換が無い。
って書いてあるな。ヘルプに。
ISampleGrabberのインターフェース関係だけコピーして持ってくるのはどう?

165 :デフォルトの名無しさん:2006/09/17(日) 10:30:27
質問です。
MESOって名前の8バイトの構造体を定義して、
struct MESO *masaru = (struct MESO *) 0x12345

for (i=0;i<1;i++){
masaru+1
}
ってやったら、masaruは8バイトの構造体の変数だから、masaruはfor文で
1アドレスを進めてますけど、実際は0x12345+8のアドレスにになりますよね?

166 :デフォルトの名無しさん:2006/09/17(日) 10:33:13
>>165
アドレスの進み方については、そう考えて問題ない。

167 :デフォルトの名無しさん:2006/09/17(日) 11:20:29
どうもです!

168 :デフォルトの名無しさん:2006/09/17(日) 12:47:28
まぁ、0x12345はまず無いがな。

169 :デフォルトの名無しさん:2006/09/17(日) 21:25:18
質問です
ファイルに以下のように書き込みたいんですが。

はじめの処理を行って、A、Bを書き込んで
次の処理が終わったら、C,Dを書き込んで・・・・
という風に、追記していきたいのですが
どうすればいいのでしょうか?

A,C,E,G・・・
B,D,F,H・・・

fprintfで何かコマンドとか、あるんでしょうか?






170 :デフォルトの名無しさん:2006/09/17(日) 21:29:58
>>169
その都度fopen()するなら"a"でオープンすればいい。
但し処理系によっては最後にEOFコードを付加する環境があるので、
1バイト削って追記するなど工夫しないといけない場合あり。

171 :デフォルトの名無しさん:2006/09/17(日) 21:33:37
>>170
ありがとうございます。
ちょっとやってみます!

172 :デフォルトの名無しさん:2006/09/17(日) 21:47:38
c言語が必要になってきたので勉強したいのですが、どういった本がお勧めでしょうか?

柴田本が読みやすいと聞いたことがあって今日見てきたのですが、初心者のくせに細かい疑問が出てくる僕には合わなそうでした…
詳しく書いてあるんだけど、とっつき易い簡単な入門者向きの本はありますか?
あれば是非教えてください、お願いします。

173 :デフォルトの名無しさん:2006/09/17(日) 22:25:22
>>172
ある本をみてダメと思うんなら他人が教える本はほとんどダメだぞ
あと、本屋で身銭を切って損をして自分にあった情報収集の方法を知るってのも勉強だ

とりあえず、お前はJISの規格書でも買っとけ

174 :デフォルトの名無しさん:2006/09/17(日) 23:47:08
>> 172

柴田本の入門書は読み始めはちときつかったけど(著者偉そうなのがとくに)
内容はかなり良かったと思います。

とりあえず、お前はJISの規格書と柴田でも買っとけ
ゆっくりでもがんばりな。

175 :デフォルトの名無しさん:2006/09/17(日) 23:51:44
>172
漢は黙ってK&R

176 :デフォルトの名無しさん:2006/09/18(月) 00:05:30
>>170
もう少し>169を注意深く読んでくれ。

>>169
>170の方法では、常に最後に追加する形だから、>169の順番で書くには使えない。
ACEGの順番で書けるようにそれらを一旦メモリ上にキープするなどの対策が必要。
いっそ、何をしたいのか具体的に書いてみたら?

177 :172:2006/09/18(月) 00:41:00
実は今既に2冊もっているので、それにあわせて柴田本と規格書を買って頑張ってみようと思います。
K&Rは初めて聞きましたので検索してみたのですが、初心者向きではなさそうですがw

また書店に行ってみます、皆様有難うございました。

178 :デフォルトの名無しさん:2006/09/18(月) 03:21:28
男はもっと黙ってプログラム言語C++第三版。
黙ってというか、ぐうの音も出なくなるが。

179 :デフォルトの名無しさん:2006/09/18(月) 03:28:59
>178
いや172が必要としてるのはCだから

180 :デフォルトの名無しさん:2006/09/18(月) 03:44:44
おおう、こりゃ失礼。

馬鹿ついでに聞きたいんだけど、俺JISの規格書って読んだことねーだなあ。

http://www.amazon.co.jp/exec/obidos/ASIN/454212889X/%73%65%63%6c%61%6e%64%6c%6c%6a%70%2d%32%32/%72%65%66%3d%6e%6f%73%69%6d/

C以外のBASICとかには用が無い場合は何買えばいいのかね?

181 :デフォルトの名無しさん:2006/09/18(月) 09:42:34
>>180
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+3010%3A2003&dantaiCd=JIS&status=1&pageNo=1
見るだけなら、http://www.jisc.go.jp/からJIS検索で規格番号X3010を探せば見つかる。
ただしどっちもC99相当。
ちなみにC++はX3014。

182 :デフォルトの名無しさん:2006/09/18(月) 13:32:16
>177
いや、俺は最初の本がK&Rだったぞ。20年前だが。

183 :デフォルトの名無しさん:2006/09/18(月) 15:17:19
>細かい疑問が
ならば
ttp://www.amazon.co.jp/gp/product/images/4756102700/ref=dp_image_text_0/249-4390771-9582731?ie=UTF8
漏れが使ってたのは第三版ではないが、K&Rよりは理解しやすかったな
ただし例がunix系の表現なのでそこんところが理解できないと難書になるかも

184 :デフォルトの名無しさん:2006/09/18(月) 15:39:43
>>183
あ、その本なつかしー。
K&Rと併読した記憶があるな。

185 :デフォルトの名無しさん:2006/09/18(月) 16:06:36
質問です。

環境:RedHat(pthread)

下記のようなスレッド生成エンジン部分を扱っています。

#define TH_GEN_MAX 10

int ret;
pthread_t thid[TH_GEN_MAX];
int ret_th[TH_GEN_MAX];
int i;

for(i=0;i!=TH_GEN_MAX;i++){

  if((ret=pthread_create(thid[i], NULL, (void*)TH_MAIN(void*), (void*)TH_ARGV)) !=0){
    ErrExit();
  }

}

TH_MAINでは、iの値で処理をスイッチさせるようになっています。

前まで論理CPU1個の環境でこれを走らせていて、子スレッドが確実にiの値を
判別してうまく処理をスイッチ出来ていたのですが、ミューテクス使わないのはまずい
だろと言われたので、mutex_lock/unlockを追加しようと思います。

思ったのですが、うまいタイミングが思いつきません。

感じ的には、生成するスレッドは生成直前にlock、生成後にunlock
生成されたスレッドは実行開始直後にlock、iの値を確実に取得した後unlock
で問題ないかと思うんですが、どうでしょう。。。

186 :デフォルトの名無しさん:2006/09/18(月) 16:14:43
>TH_MAINでは、iの値で処理をスイッチさせるようになっています。
どうやってんだか分からないのだが


187 :デフォルトの名無しさん:2006/09/18(月) 16:31:45
TH_MAINは

<<---

switch(i){

case(0):
>>---
FUNC0;
break;

以下略

}

になってるだけです。
<<---でlock
>>---でunlockかなと思ってます。

188 :デフォルトの名無しさん:2006/09/18(月) 17:11:45
よくわかんないけど、ある変数を複数のスレッドで共有して、その内容で処理を
振り分けるのなら、その変数の読み書きの前後でロック・アンロックすればいい。
これは全てのスレッドで行う必要がある。

189 :デフォルトの名無しさん:2006/09/18(月) 21:37:31
iで処理分けるなら普通スレッドに渡す関数を別にしないか?

190 :デフォルトの名無しさん:2006/09/18(月) 21:41:24
というかiという変数名な癖にグローバル変数なのか?
ローカルなら排他も糞もないだろうし。

191 :デフォルトの名無しさん:2006/09/18(月) 21:43:48
それはないだろ。iはスレッド起動時に引数で渡してるはずさ・・・たぶん・・・

192 :デフォルトの名無しさん:2006/09/18(月) 23:17:42
例だろ
実際のプログラムはもっとまともな名前・・・だといいな・・・

193 :デフォルトの名無しさん:2006/09/18(月) 23:22:04
↓妄想
親:lock
親:i=0代入
親:スレッド0生成
親:unlock
子0:lock
子0:i==0で分岐
子0:unlock
親:lock
親:i=1代入
親:スレッド1生成
子1:lock ← unlock待ち
親:unlock
子1:i==1で分岐
子1:unlock

↓たいていこうなる
親:lock
親:i=0代入
親:スレッド0生成
親:unlock
親:lock
親:i=1代入
親:スレッド1生成
親:unlock
子0:lock
子0:i==1で分岐 ← wwwwwww
子0:unlock
子1:lock
子1:i==1で分岐
子1:unlock


194 :デフォルトの名無しさん:2006/09/18(月) 23:25:39
よって子が親に変数 i を受け取ったことを通知する必要がある
class Event {
public:
    Event() { flag = false; }
    void notify();
    void wait();
private:
    bool flag;
    pthread_mutex_t mutex;
    pthread_cond_t  cond;
};
void Event::notify() {
    pthread_mutex_lock(&mutex);
    flag = true;
    pthread_mutex_unlock(&mutex);
    pthread_cond_signal(&cond);
}
void Event::wait() {
    pthread_mutex_lock(&mutex);
    if (!flag) {
        pthread_cond_wait(&cond, &mutex);
    }
    pthread_mutex_unlock(&mutex);
}
親はスレッドを作るたびに wait、子は i による分岐を終了した後に notify

間違っていても謝らない
細かいところは自分で直せ


195 :デフォルトの名無しさん:2006/09/18(月) 23:31:21
一々グローバルなデータを使って排他制御に苦労するよりも
スレッド起動時に引数で渡したほうが楽じゃね

196 :デフォルトの名無しさん:2006/09/18(月) 23:39:31
i がローカル変数であっても
pthread_createで渡されるのは i のポインタだぞ


197 :デフォルトの名無しさん:2006/09/18(月) 23:44:11
↓要するにこのケースもある罠
親:lock
親:i=0代入
親:スレッド0生成
親:unlock
親:lock
親:i=1代入
親:スレッド1生成
親:unlock
親:スレッド終了 ← i がスタックから消える
子0:lock
子0:i で分岐 ← 実体が無い、テラヤバス
子0:unlock
子1:lock
子1:i==1で分岐  ← もうだめぽ
子1:unlock


198 :デフォルトの名無しさん:2006/09/19(火) 00:00:48
いやこうじゃないか?
i(){}

199 :デフォルトの名無しさん:2006/09/19(火) 00:08:06
>>196
なぜわざわざポインタ経由で渡すw
値で渡せば問題ないでしょ

200 :デフォルトの名無しさん:2006/09/19(火) 07:35:06
おまいら餅つけ。
処理の分岐はメインスレッドでと書いておるぞ。

201 :デフォルトの名無しさん:2006/09/19(火) 07:44:07
>>200
どこに?

202 :デフォルトの名無しさん:2006/09/19(火) 07:46:14
処理の分岐はTH_MAINでやると書かれてるが。

203 :デフォルトの名無しさん:2006/09/19(火) 07:47:20
リロードしてなかった。
>>202>>200へのレス。

204 :デフォルトの名無しさん:2006/09/19(火) 16:18:04
さきほどCの本を読んで
今C++を使ってます。
コンパイラはBorland C++ 5.5.1 for Win32 です。
C標準ライブラリとC++標準ライブラリと名前空間に関することで
聞きたいのですが、
#include <stdio.h>
でincludeすると、名前空間を指定しないで
識別子を参照でき、
#include <cstdio>
でincludeすると
std::printf();
のように使わないといけないと本で読みました。
しかし、std::をつけると
Error E2451 test.c 5: Undefined symbol 'std' in function main
Error E2379 test.c 5: Statement missing ; in function main
となってしまいます。
cstdio.hをエディタで見てみても
using std{}
のような箇所は見当たらないのですが、
なぜですか?

205 :デフォルトの名無しさん:2006/09/19(火) 16:19:45
間違えました。
using std{}
ではなくて
namespace std{・・・}
です。

206 :デフォルトの名無しさん:2006/09/19(火) 16:36:37
>>204
拡張子がcだからCのソースとしてコンパイルされている。
拡張子をcppなどにすればC++としてコンパイルされ、その本のとおりになる。

あと、<cstdio>をインクルードするからと言っても、
実際にcstdioやcstdio.hというファイルが存在しなければならないわけではない。(規格書にもそう明記されている)
Borland C++の場合はプリプロセッサが適当に処理している。

207 :デフォルトの名無しさん:2006/09/19(火) 16:57:34
>>206
ありがとうございます。
解決しました。

208 :デフォルトの名無しさん:2006/09/20(水) 02:25:55
>あと、<cstdio>をインクルードするからと言っても、
>実際にcstdioやcstdio.hというファイルが存在しなければならないわけではない。(規格書にもそう明記されている)

そーだったのか。
知らなかった。

209 :デフォルトの名無しさん:2006/09/20(水) 02:40:23
Cの関数は、cstdioなどでインクルードしても、std名前空間に
包まれているようで、実は漏れているしな。

std::を付けても付けなくてもエラーは出ない。

210 :デフォルトの名無しさん:2006/09/20(水) 02:52:25
>Cの関数は、cstdioなどでインクルードしても、std名前空間に
>包まれているようで、実は漏れているしな。

それ、漏れてるんじゃなくって互換性のために漏らしてるんじゃね?
少なくともVCとgccのそれは作為的だったはず。

211 :デフォルトの名無しさん:2006/09/20(水) 07:58:47
コンパイラによっては漏れてなかったりするのかな。
てか、stdをつけることになってるから
つければいいんでね? std くらいたいしたことない

212 :デフォルトの名無しさん:2006/09/20(水) 08:52:59
>>211
1998年の規格では漏れてもいい事になってて、C++0xでは見直す方向に
ある。

213 :デフォルトの名無しさん:2006/09/20(水) 08:58:26
std::printfとかstd::strlenと書くのはかなり違和感がある

214 :デフォルトの名無しさん:2006/09/20(水) 09:25:45
class X{
int func(){return 1;}
};

class X{
int func();
}
int X::func(){return 1;}

を相互に変換できる定番のプログラムとかあったらおしえてください。



215 :デフォルトの名無しさん:2006/09/20(水) 09:29:58
gcc 3.4.4をつかっています。


216 :デフォルトの名無しさん:2006/09/20(水) 11:41:11
std::printf 特に抵抗ないけど。
Math.sin みたいで逆にいい感じ。

この際 std:printf でいいかなと思うけど。コロン1つね。

217 :デフォルトの名無しさん:2006/09/20(水) 11:45:55
gotoラベルと見分けがつかない。

218 :デフォルトの名無しさん:2006/09/20(水) 12:18:20
>>206-212
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#456

219 :デフォルトの名無しさん:2006/09/20(水) 12:39:35
>>208
一応言っておくが、<stdio.h>や<iostream>とか全ての標準ライブラリのヘッダに当てはまるからな。

220 :デフォルトの名無しさん:2006/09/21(木) 05:27:14
>>219
そーだったのか。
ますます知らなかった。
つーか普通にK&Rに書いてあるじゃん。
おらびっくりしただよ。

221 :デフォルトの名無しさん:2006/09/21(木) 08:30:36
実際某処理系は、標準インクルードは全てプリコンパイルドヘッダを参照するようになっている。

222 :デフォルトの名無しさん:2006/09/21(木) 09:28:12
某処理系って?

223 :デフォルトの名無しさん:2006/09/21(木) 12:49:23
剃刀(某某な毛を処理できる)

224 :デフォルトの名無しさん:2006/09/21(木) 13:26:10
^^;<帰ってください

225 :デフォルトの名無しさん:2006/09/22(金) 00:04:16
#include <iostream>
ry
using namespace std;
using namespace hoge;

とあった時に、例えばmainの中で
::foo();
fooがstdとhogeの両方である関数としても、foo()は常に名前空間がstdの方で解釈されるのでしょうか?

226 :デフォルトの名無しさん:2006/09/22(金) 00:06:13
構造体に構造体のサイズを持たせたものを良く見るんだけど
あの情報っていったい何に使われているんでしょうか?

227 :デフォルトの名無しさん:2006/09/22(金) 00:09:06
>>225
だったらどうやってグローバルなfooを参照するんだよカスが
どんだけ無能なんだ

228 :デフォルトの名無しさん:2006/09/22(金) 00:15:00
>>225
いいえ。
::fooと限定してやると、グローバルな名前空間の中からしか名前を探さない。
usingディレクティブで指定された名前空間は探す対象にならない。(using宣言なら対象になるが)

仮にfooと書いてあったとして、stdとhoge両名前空間にfooという関数があったら、
曖昧ということでエラーになる。(ただし引数などが異なれば多重定義となり問題ない)
usingディレクティブは使うなと言われるのはこのため。

229 :デフォルトの名無しさん:2006/09/22(金) 00:19:28
すいません。ちょっと手がかりがつかめないのでよろしくお願いします。
テキストファイルのデータ
0001
0002
0003
0004
0005

までのHit.txtがあります。
それを下の構文で

std::fstream Fs("Hit.txt",std::ios::in | std::ios::out );
short readnum = 0;
std::streampos post;

Fs >> readnum;
//Fs.tellp();
Fs << "tp" << flush;
実行してみたんですが、Fs.tellp()が無い場合はテキストの内容が全く変わらず
Fs.tellp()を入れたら
0001tp0002
0003
のように変化します。
tellp()って現在位置を取るものですよね?
どういう動きでこういう結果になってしまうのかご教授願えないでしょうか。

230 :デフォルトの名無しさん:2006/09/22(金) 00:43:44
>>226
構造体を拡張した場合の互換性の為。
サイズが一種のバージョン情報になる。

231 :デフォルトの名無しさん:2006/09/22(金) 00:55:52
>>229
再現しないぞ。環境は何?

232 :デフォルトの名無しさん:2006/09/22(金) 01:01:00
>>231
環境というのは、VC++の設定のことでしょうか?
このプログラムはVCのWin32アプリケーションの空白の雛形に
コーディングしたものです。それ以外は特にいじってはいないつもりなんですが。
今ファイル入出力の勉強というかツール作りのためにやっているので
他はあまり触っていないです。

233 :デフォルトの名無しさん:2006/09/22(金) 01:16:56
>>232
結論を先に言うと、tellp()の後書き込みを行ってテキストファイルの
内容が変化するとは標準では決められていない。

std::ios::in | std::ios::outのオープンモードは、対応するCのオープン
モードでは"r+"であり、読み←→書きを切り替える前にファイルポインタ
をシークしなければならない。

だから、Fs.seekg(std::ios::beg); 等を行えば、書き込みが可能になる。

なお、ご存じのようにC++では読み取り用と書き込み用のファイルポインタ
は別々であり、いきなりstd::ios::curを指定してもうまくいかない。

234 :デフォルトの名無しさん:2006/09/22(金) 01:25:54
>>233
ご回答ありがとうございます。
ということは、つまり一度読み込みするたびに
seekgなどで位置を調整して書き込み再度位置を調整して読み込み
という処理を繰り返さなければいけないということになるのでしょうか。

あと
>ご存じのようにC++では読み取り用と書き込み用のファイルポインタ
>は別々であり
この件ですが、
ttp://www.kab-studio.biz/Programing/Codian/iostream/04.html
こちらのサイトのほうでも勉強させていただいてるんですが
こちらでは、
『このように std::fstream では、読み取りポインタと書き込みポインタが同じように扱われます。
これは、単なるポインタではなく「ファイルポインタ」を操作しているからなのです。』
という風な説明がありましたもので、あまり意識せずにseekp,seekgを適当に使ってたんですが
どういう風に理解したらいいものでしょうか?

235 :デフォルトの名無しさん:2006/09/22(金) 01:49:02
&演算について質問です。
あるコードがあって、
short型の変数hogeに0100 0000 1001 0010という値が入っていて、
1111 1111をアンドすると

0100 0000 1001 0010
& 1111 1111
___________________________
0100 0000 1001 0010

になりますが、この結果をchar型hugaに入れています。
これってhugaに1001 0010が入るのは分かるのですが、
変数から溢れたりしないのでしょうか?
2バイトの値に1バイトの値をアンドすると、アンドされなかった部分は無視されるのでしょうか?

236 :デフォルトの名無しさん:2006/09/22(金) 01:50:10
>>234
>ということは、つまり一度読み込みするたびに
>seekgなどで位置を調整して書き込み再度位置を調整して読み込み
>という処理を繰り返さなければいけないということになるのでしょうか。

これはC言語も同じだったと思います。読み込み→書き込みの時は、
EOFにファイルポインタが達している時以外はfseek()もしくはrewind()、
書き込み→読み込みの時は常にfseek()またはrewind()の呼び出しが
必要でした。

std::fstreamがファイルポインタを一つしか持たないというのは私も
知りませんでした。std::stringstreamも同じようです。これは私のミスです。
済みません。

規格書を見ると、seekp(pos)もseekg(pos)もrdbuf->pubseekoff(pos)を
実行するように書いてあり(§27.6.1.3.38と§27.6.2.3.2)、確かに同じようです。

237 :236:2006/09/22(金) 01:56:52
私もちょっと混乱してきたので、この件についてはもう少し詳しく調べて
みます。

但し、読み書きを切り替える時にシークが必要なのは間違いないです。

238 :デフォルトの名無しさん:2006/09/22(金) 02:02:26
>>236
C言語の知識もあやふやなもので大変勉強になりました。
常にfseekという発想が持てなかった物で大変助かりました。
アドバイスをいただいた上で力づくですが
std::fstream Fs("Hit.txt",std::ios::in | std::ios::out );
short readnum = 0;
std::streampos post;
int cnt = 0;

#if 1
while( 1 )
{
if( Fs.eof())
//if( 1 )
{
Fs.seekp( 6*cnt,ios::beg );
Fs << setfill('0') << setw(4) << readnum*10 << endl;
break;
}
Fs >> readnum;
Fs.seekp( 6*cnt,ios::beg );
Fs << setfill('0') << setw(4) << readnum *10 << endl;
cnt++;
}
#endif
を実行しましたら
0010
|
0050
と反映されました。とりあえずこれでいこうかと思います。

239 :デフォルトの名無しさん:2006/09/22(金) 02:07:08
>>238
うまくいってよかったですね。私も勉強になりました。
もしかしたらもっとスマートな書き方があるのかもしれませんが、
完全に分かるまで調べてみようと思います。

240 :デフォルトの名無しさん:2006/09/22(金) 02:18:45
次のようなプログラムで実験したら、std::stringstreamはseekp()とseekg()は
別々に扱われるようです。seekp()とseekg()が同じなのはstd::fstreamだけの
ようです。

std::stringstream s("00010002000300040005");
char buf[100];

std::cout << s.str() << std::endl;

s.seekp(std::ios::beg);

s.seekg(4, std::ios::beg);
s.read(buf, 4);
buf[4] = '\0';
std::cout << buf << std::endl;

s.write("ffff", 4);

s.seekg(std::ios::beg);
s.read(buf, 4);
buf[4] = '\0';
std::cout << buf << std::endl;

241 :デフォルトの名無しさん:2006/09/22(金) 02:21:59
と言う事は、同じrdbuf()->pubseekpos()を呼び出しているのにクラスに
よって結果が異なるというのは、pubseekpos()関数が仮想関数であり、
呼び出すクラスによって動作を切り替えているという事なのでしょう。

規格票にこの事が詳しく書かれていればいいのですが、今のところ
見つけられずにいます。もし詳しい方がいらっしゃったらぜひ教えて下さい。

242 :デフォルトの名無しさん:2006/09/22(金) 06:05:55
>>235
>になりますが、
なりますか?


243 :デフォルトの名無しさん:2006/09/22(金) 10:14:12
なるんです?
これは、アンドすることで、2バイトの変数の
下8ビットを切り分けている処理なんです。
で、不思議だなと思って。
たぶん、hugaが1バイトのポインタだから出来るんですかね?

244 :デフォルトの名無しさん:2006/09/22(金) 10:25:41
ひとつ教えてあげる。
2進数の11111111、つまり16進数で0xFFというのは
2進数の0000000011111111のこと。
その上で、>>235をもう一度考えてみ。

まあ、その後にcharに代入してるなら、
この結果自体はあまり関係ないだろうけどね。

245 :デフォルトの名無しさん:2006/09/22(金) 11:32:16
了解です。

0100 0000 1001 0010
& 0000 0000 1111 1111
___________________________
0000 0000 1001 0010

になるわけですね。
んで、char型のポインタに代入だから、1001 0010になると。

0100 0000 1001 0010
& 1111 1111
___________________________
0100 0000 1001 0010

上の自分が勘違いしてた奴でも、結局Char型のポインタに代入だから1001 0010
になるのは変わらないけれど、このコードの大事なところは、上8ビットが
アンド演算で0000 0000にしている事だと。
なんで下8ケタだけはいるのかというと、
char型のポインタはMOV BYTEだから、上四桁は無視されると。






246 :デフォルトの名無しさん:2006/09/22(金) 11:39:56
>>245
shortをcharに代入する時、型キャストしないと「変換後の精度が失われる」
のようなコンパイラ警告が表示されなかった?

247 :デフォルトの名無しさん:2006/09/22(金) 11:58:19
すいません。ないです。
char型へのポインタはMOV BYTE [番地]だと習ったので、
メモリの中で
番地0 1001 0010
番地1 0100 0000
みたいな感じになって、番地が1バイト分読みとられる意味になってキャストの警告はでないと思っていました。
さらに質問なんですけれども、
0xFFが0000000011111111になって計算されると言うのは、
異なる型同士で演算すると、大きい方の型に合わせて演算されるという理由からでしょうか?
それとも、0x00ffといちいち書くのが面倒だから、省略したのでしょうか?


248 :デフォルトの名無しさん:2006/09/22(金) 11:59:53
「変数」を「ポインタ」と呼ぶのはやめた方がいい、じゃなくて絶対やめろ。

なまじアセンブラをかじってるから、
(レジスタではない)メモリ上の変数をそう呼びたくなるのかもしれないが
アセンブラでも、変数は変数だ。
アドレスを保持する変数をC/C++ではポインタまたはポインタ変数と呼ぶだけ。

もし、*を使ったポインタで参照している中身のことを言っているのだとしても
それはやはり変数(配列変数かもしれない)であって、ポインタではない。
もちろん、ポインタの配列等はあるが、それはでもchar型のポインタとは言わない。

249 :デフォルトの名無しさん:2006/09/22(金) 12:02:52
>>247
算術変換を勉強するといい。
演算時のcharとshortはどちらもintに昇格されてから計算される。

警告が出るか出ないかはコンパイラ次第。規格にはないから。

250 :デフォルトの名無しさん:2006/09/22(金) 13:40:50
大分用語的な間違いはあるけど概ねそれでいいかと。

251 :デフォルトの名無しさん:2006/09/22(金) 14:10:48
質問です、現在DLLとEXE間でのクラスの受け渡しをしようとしています。
EXE側のソースコード
#include <stdio.h>
#include <windows.h>

class TestP{
public:
virtual ~TestP(){}

virtual void Suicide() = 0;
virtual void TestFunc() = 0;
};

typedef TestP* (*PFunc)();



252 :デフォルトの名無しさん:2006/09/22(金) 14:11:45
int main(){
HINSTANCE hLib;
TestP* Temp = NULL;
PFunc MyFunc = NULL;

hLib = LoadLibrary("HOGE.dll");

if(hLib){
MyFunc = (PFunc)GetProcAddress(hLib, "CreateInstance");
}
else{
printf("HOGE.dllの取得に失敗;\n");
}

if(MyFunc){
Temp = MyFunc();
}
else{
printf("CreateInstanceの取得に失敗;\n");
}

if(Temp){
Temp->TestFunc();
Temp->Suicide();
}

FreeLibrary(hLib);

return(getchar());
}

253 :デフォルトの名無しさん:2006/09/22(金) 14:12:25
DLL側のソースコード
#include <stdio.h>
#include <windows.h>

class TestP{
public:
virtual ~TestP(){}

virtual void Suicide() = 0;
virtual void TestFunc() = 0;
};

class TestC : public TestP{
public:
TestC(){
printf("こんすとらくた(TestC);\n");
}
~TestC(){
printf("ですとらくた(TestC);\n");
}

void Suicide(){
printf("すいさいど(TestC);\n");
delete(this);
}
void TestFunc(){
printf("てすとふぁんく(TestC);\n");
}
};

254 :デフォルトの名無しさん:2006/09/22(金) 14:14:50
extern "C"{
__declspec(dllexport) TestP* WINAPI CreateInstance(){
return(new TestC);
}
}

上記のコードで、VS.NET2003ではDLLとEXE間のクラス受け渡しに成功しました。
ところが、BCCでDLLをコンパイルするとTestC::Suicide()のdelete(this)でエラーが発生します。
(アクセス違反です)
何故か、また回避する方法は存在するのでしょうか?どなたか、教えて頂ければとorz

255 :デフォルトの名無しさん:2006/09/22(金) 14:17:04
EXEの本体もBCCでコンパイルした?

256 :デフォルトの名無しさん:2006/09/22(金) 14:20:43
>251
していません、異なるコンパイラ間で動作させる為のテストなので。
delete(this)で引っ掛かるという事は、恐らくはメモリ配置等の問題なのでしょうけれど…。
解決策が分からないのですorz

257 :デフォルトの名無しさん:2006/09/22(金) 14:21:48
異なるコンパイラ間でvtblの構造が一致している保証はどこにもない。

258 :デフォルトの名無しさん:2006/09/22(金) 14:24:17
>>256
クラスを諦めてCの構造体同様のレガシーな構造体にするか、
いっそOCXにでもするしか、コンパイラの壁を越えることはできないかと。

259 :デフォルトの名無しさん:2006/09/22(金) 14:26:33
Windows環境の場合、COMの関係でどこも同じような実装になってると思うけど、どうなんかな。
あと
typedef TestP* (*PFunc)();

typedef TestP* (WINAPI *PFunc)();

260 :デフォルトの名無しさん:2006/09/22(金) 14:28:27
あー、後メンバ関数も呼び出し規約を明記した方がいいと思うよ。
デフォの呼び出し規約が違うかも試練。

261 :デフォルトの名無しさん:2006/09/22(金) 14:32:52
そう言えば異なるコンパイラでDLLとの受け渡しで、仮想関数を
使った事は一度もないな。いつもCの呼び出し規約に合わせていた。

262 :デフォルトの名無しさん:2006/09/22(金) 14:36:28
>257
がはっ、そうでしたかorz
delete(this)以外は正常に呼び出されているのですが、vtblの構造の差異によるアクセス違反とかが発生しているのでしょうか?
>258
成る程です、異なるコンパイラ間でクラスは共有できないのですね。
という事は、クラスを諦めるかBCC等でのプラグイン作成を認めないか…後者の方が楽な選択ですねorz
>259
実はその部分、DLL側のソースコードがVC++からのコピペでは一発で通らず、
慌てて貼り付けたので関数ポインタ側の修正を忘れていたりしたのですorz
御指摘、有難う御座います。
>260
そうですね、面倒ではありますがこれもバグ回避の為ですorz

ついでに、もうひとつ質問させて頂きます。
同一コンパイラの同一ランタイムでクラスの受け渡しは可能ですが、異なるコンパイラでは不可能です。
しかし、VC++シリーズ(っていうのも変ですが)内では如何なのでしょうか? 6.0は論外としても、.NETと.NET2003と.NET2005位は共通しておいて欲しいのですが………。

263 :デフォルトの名無しさん:2006/09/22(金) 14:42:36
とりあえず、2003と2005の互換性は確認出来ました….NETだけ分からないので、どなたか教えて頂ければとorz

264 :デフォルトの名無しさん:2006/09/22(金) 14:47:05
デフォルトのアラインメントも違いそうだな。VC系は8でBCCは1だっけ?

265 :デフォルトの名無しさん:2006/09/22(金) 15:58:02
>>248,249,250様。
ご指導ありがとうございます。
用語の使い方、気をつけます。
どうもありがとうございました。

266 :デフォルトの名無しさん:2006/09/22(金) 21:34:13
>>263
.NET と .NET2003 って vc7.0 と vc7.1 ってことですか?
この2つはメモリ管理以外は互換性があるようです。

3dx max のプラグイン開発をしたときに vc7.1 を使用しているプラグイン側で new したオブジェクトを
vc7.0 を使用している本体側で delete したときにメモリリークが発生する問題を解決するために
Autodesk の提供しているライブラリを組み込んだことがあって、その状態で問題なく動きました。

ソース: ttp://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=7481394 の max_mem.zip


267 :デフォルトの名無しさん:2006/09/22(金) 21:58:00
単にnewとdeleteをクラス毎に多重定義すれば解決しそうな気がする。

268 :デフォルトの名無しさん:2006/09/22(金) 22:18:07
気がするだけかい。実際に LoadLibrary & GetProcAddress した結果を教えてくれyo。

つーか >266 は virtual void Suicide() = 0;
をインタフェースに含むんだったら互換性に問題ないよっていう意味だし。

269 :デフォルトの名無しさん:2006/09/24(日) 00:27:51
char abc[3][16];
こういう文字の配列があったとして
別の関数でabc[a][b]というような使い方がしたいのですが
このabcのアドレスを関数に渡して関数内で使用するには
どうしたらいいでしょう

普段はabc[0]みたいな感じで渡していたのでabcだけの場合
型をどうしたらいいのかわからないです。


270 :デフォルトの名無しさん:2006/09/24(日) 00:36:28
>269
void Hoge(char abc[]);
abcは引数なので、名前は何でも良い。
ただし、配列の要素数は関数側で特定出来ない。よって、
void Hoge(int Num, char abc[]);
のように、要素数も引数として渡すべし。

271 :デフォルトの名無しさん:2006/09/24(日) 00:39:11
と、二次元か。失礼。
二次元の場合は、
void Hoge(char abc[][16]);
といった感じで渡せばOK。
注意点としては、配列の「後ろの方」だけは要素数を書かなければならない点。

272 :デフォルトの名無しさん:2006/09/24(日) 00:45:00
void func(char *v, int m, int n);

273 :デフォルトの名無しさん:2006/09/24(日) 00:56:51
すみません混乱してまだよくわからないです

例えば
char abc[64];のアドレスを渡して関数使う場合は

hoge(char *abc) {

abc

}

こんなので出来ますよね?

それを
char abc[10][64];

こういうの関数内で

hoge(???????abc) {

abc[1]

}

こういったように参照して使いたいのですが
アドレスの渡し方がいまいちわからなくて

274 :デフォルトの名無しさん:2006/09/24(日) 00:59:47
http://www.google.co.jp/search?q=c+faq

275 :デフォルトの名無しさん:2006/09/24(日) 01:03:40
>>273 結局ポインタが分かってないようだね。

276 :デフォルトの名無しさん:2006/09/24(日) 04:03:52
>>271
すみません今頃になってようやくわかりました。
配列のアドレス表示させるサンプル作って気がついたんですけど
文字列の場合勝手にポインタになると勘違いしてました。
だから要素数とか言ってたんですね
おかげで出来ましたありがとう


277 :デフォルトの名無しさん:2006/09/24(日) 08:04:41
FILE *fp;
if((fp == fopen(filename,mode)) == NULL)
{
printf("ファイルを開くことが出来ません:%s\n",filename);
exit(-1);
}
//処理
fclose(fp);
このファイルを開く時のエラー処理を毎回書くと行数無駄に増えて嫌なんですけど、
関数にするとしたらどんな感じしたらいいんでしょうか?
なるべくFILE *fpと fclose(fp)って部分をいじりたくないのですが。
void FileOpen(FILE *fp,char filename[256], char mode[3])
{
 if((fp == fopen(filename,mode)) == NULL)
 {
  printf("ファイルを開くことが出来ません:%s\n",filename);
   exit(-1);
 }
}
というのを思いついたのですがこれだとFILE fp; FileOpen(&fp,"a.txt","r"); fclose(&fp);
となってしまって汎用性がないもので・・・

278 :デフォルトの名無しさん:2006/09/24(日) 08:25:22
FILE *fp; FileOpen(&fp,"a.txt","r"); fclose(fp);
を受け取るように関数を書き換えるんだ

279 :デフォルトの名無しさん:2006/09/24(日) 08:56:24
>>277
C++ 使うといいよ。

280 :デフォルトの名無しさん:2006/09/24(日) 09:38:51
だからexit()に-1を渡すなと。

281 :デフォルトの名無しさん:2006/09/24(日) 09:43:57
>>280
なぜ?

282 :デフォルトの名無しさん:2006/09/24(日) 09:50:07
何でEXIT_FAILUREが定義されてるのに使わないんだ

283 :277:2006/09/24(日) 09:52:50
そんなの人の勝手じゃないか?

284 :デフォルトの名無しさん:2006/09/24(日) 09:56:17
>>283
EXIT_FAILURE以外が渡った場合エラー終了扱いになるとは限らない。

EXIT_FAILURE定数は多くの場合1

285 :デフォルトの名無しさん:2006/09/24(日) 10:01:43
>>284
何の話をしてるのだ?

286 :277:2006/09/24(日) 10:01:43
>>284
だからそれでも人の勝手じゃないか?

287 :デフォルトの名無しさん:2006/09/24(日) 10:10:43
環境依存だからぶっちゃけOSがわからないと何ともいえん。

288 :デフォルトの名無しさん:2006/09/24(日) 10:24:26
1を返そうが、2を返そうが、-1を返そうが、受け取る側も自分で書くなら自由。

289 :デフォルトの名無しさん:2006/09/24(日) 10:31:05
ぶっちゃけWindowsのコマンドプロンプトでバッチファイルなどで
走らせると、1〜10程度の値を返して、それで処理を分岐させたりする。

EXIT_FAILUREは標準で定義されているが、それを使わなければならない
道理はどこにもない。

290 :デフォルトの名無しさん:2006/09/24(日) 10:35:57
よくわからんが、それはつまり
int *p=NULL;
とするのも
int *p=0;
とするのも人の勝手ということ?

291 :デフォルトの名無しさん:2006/09/24(日) 10:48:58
>>290
全然違う例えを引っ張ってこないように。

292 :デフォルトの名無しさん:2006/09/24(日) 10:49:17
>>290
それは自由だったと思う。
NULLが0で置き換え可能なのは保証されてる。

>>289
「使わなければならない」と「使うべき」は違うだろ。

293 :デフォルトの名無しさん:2006/09/24(日) 10:53:33
C++で主に(void*)0が0に置き換えられたのは、逆参照時に
キャストしなければならない手間を防ぐためだしな。

Cではその点は問題ない。

294 :デフォルトの名無しさん:2006/09/24(日) 15:00:42
EXIT_FAILUREを使わなくてもCは動く。
Cは、そんな仕様の言語だから。
でも互換性&可読性を考えれば、利用を推奨。
マジックナンバーは潰せ、って言うでしょ。

しかし重要なマクロだと個人的に思うけど、
何故stdio.hでなくstdlib.hなんだろう。

295 :デフォルトの名無しさん:2006/09/24(日) 15:27:47
重要だとstdio.hに入り、
重要でないとstdlib.hに入るというわけではないのだが。

296 :デフォルトの名無しさん:2006/09/24(日) 15:32:13
stdioが何の略かもわからんのだろうよ。

297 :デフォルトの名無しさん:2006/09/24(日) 15:51:21
strlenってバイト数を見てヒープ領域を確保するんですよね
333AAA を 333AAA と全角で書いた場合は2倍になるという認識でいいんですよね?

298 :デフォルトの名無しさん:2006/09/24(日) 15:55:19
>>297
領域の確保などしない。
全角を使ったときの長さはエンコーディング依存。

299 :デフォルトの名無しさん:2006/09/24(日) 17:24:47
BCC Developer使ってHello World作ったんだけど
exe実行したら、一瞬Hello Worldってでてプログラムが強制終了される。
Developerの実行つかったら閉じる押すまで終了しないで正常なんだがなぜだろうか・・・
たぶん、プログラムじゃなくて漏れのPCが原因だと思うんだが・・

よかったら誰か教えてくれ・・・

http://www.uploda.org/uporg526158.zip.html


300 :デフォルトの名無しさん:2006/09/24(日) 17:26:32
>>299
コマンドラインから実行しろ

301 :(^-^) ◆MONSOON/qo :2006/09/24(日) 17:29:07
>>299
printf("Hello World!\nキー押してね");
int a=getchar();

に変更してみて

302 :デフォルトの名無しさん:2006/09/24(日) 17:41:47
>>301
なるほど!getchar関数を使うということですか。
実際にやってみるとできました。
アリガト!(´▽`)
>>300
コマンドラインから実行・・
漏れは初心者なのでその辺ぐぐったのですが分かりませんでした・・
よかったらおしえてくれます?

303 :デフォルトの名無しさん:2006/09/24(日) 18:20:09
system("pause");
でも同じようなことができる

コマンドラインは(すれ違い?)
ファイル名を指定して実行 → cmd で出てくる画面だが知らんのなら
調べるより help コマンド使って自分で弄ったほうが多分理解が早い

304 :デフォルトの名無しさん:2006/09/24(日) 18:32:04
>>302
プログラム → アクセサリ → コマンドプロンプト

実行ファイルがあるディレクトリへ移動して、実行

or

コマンドプロンプトの ウィンドウへ、 実行ファイルをドロップ
Enter

305 :デフォルトの名無しさん:2006/09/24(日) 18:46:10
struct foo{
 int i;
 std::string str;
};
という構造体を宣言する時に、デフォルトの値として
i=0, str = ""を入れておく、という事は出来ますか?

306 :デフォルトの名無しさん:2006/09/24(日) 19:06:01
>>305 foo x = {};

307 :デフォルトの名無しさん:2006/09/24(日) 19:23:49
>>299
動体視力いいな。

308 :デフォルトの名無しさん:2006/09/24(日) 19:33:11
>>306
std::map <std::string, foo> hoge;
という形で、mapのvalueとしてfooを使おうと思っているので、
各keyに対してそれをやるとめんどくさくて。

hoge["fuga"].i++;
とやった時に"fuga"が登録されてなければhoge["fuga"].iの値が1になればいいんですが…
やっぱり
if(hoge.find("fuga") == hoge.end()){
 hoge[fuga].i = 0;
}
という処理を入れるしかないんですかね?

309 :デフォルトの名無しさん:2006/09/24(日) 19:35:49
>>308
コンストラクタで初期化すればいいじゃん

310 :305:2006/09/24(日) 19:43:53
>>309
すみません、具体的にはどう書けばいいんですか?

311 :デフォルトの名無しさん:2006/09/24(日) 19:48:57
>>308
operator [] で作成される要素は foo() で初期化されたものが使われるから、
何もしなくてもいい。試してみたの?

312 :デフォルトの名無しさん:2006/09/24(日) 20:13:36
>>310
std::mapとか使う前に、クラスの基本を勉強した方がいいよ。

313 :デフォルトの名無しさん:2006/09/24(日) 20:26:28
>>311
struct foo{
 int i;
std::string str;
};

int main(void)
{
std::map <std::string, foo> hoge;
hoge["fuga"].i++;
std::cout << hoge["fuga"].i << "\t" << hoge["fuga"].str << std::endl;
return 0;
}
こんなテストプログラム書いてみたら、1245009と表示されて、思うような結果にはなりませんでした。

>>312
すみません、時間がないもので…後で必ずやります。
mapのコンストラクタを再定義するって事ですか?

314 :デフォルトの名無しさん:2006/09/24(日) 20:34:08
>>313
fooのコンストラクタだよ。311さんが言ってるfoo()もfooのコンストラクタってことだ。
コンストラクタの書き方がわからなかったら、それはちゃんと調べること。
あと、classとstructはほとんど同じ、ということも知っておいたほうがいい。


315 :314:2006/09/24(日) 20:41:01
ああ、なるほど!!
struct fooを
class foo{
public:
 foo();
 ~foo();
 int i;
 std::string str;
};
foo::foo(){
 i = 0;
 str = "";
}
って感じで書き直せばいいんですね。
ありがとうございました。

316 :デフォルトの名無しさん:2006/09/24(日) 20:48:36
>>315
別にstructのままでもコンストラクタは持てるよ。

317 :デフォルトの名無しさん:2006/09/24(日) 21:01:05
>>313
ほう。
コンパイラは何使ってる?

318 :305:2006/09/24(日) 21:07:28
>>315の名前間違ったorz >>315 = >>305です。

>>316
そうなんですか。勉強になりました。
>>315のように書き直したらうまくいきました。
皆さん、ご教示どうもありがとうございました。

>>317
Visual Studio .NET 2005 Professional です。
iが初期化されてなかったんで、変な値が入ったんですね。

319 :317:2006/09/24(日) 21:16:21
>>318
ありがとう。 VS2005 だな。覚えておく。

320 :デフォルトの名無しさん:2006/09/24(日) 21:42:09
別にどんな処理系でも構わないだろ。
313の挙動は規格に則った動作だのはずだが俺の勘違いか?

321 :デフォルトの名無しさん:2006/09/24(日) 21:49:50
>>320
C++ 2003 の改定で、 foo() で i も int() になるようになったはず。
value initialization という動作。

322 :デフォルトの名無しさん:2006/09/24(日) 21:57:48
>>321
げ、失念していた。
サンキュー。

323 :デフォルトの名無しさん:2006/09/25(月) 00:25:34
>>303
>>304
♪♪♪ d(`Д´)b♪♪♪サンキュ
いろいろと教えてくれてどもっす
何とか理解できました
あれからいろいろコマンドプロントについて調べて
コマンドプロントについてよく勉強できました
Cはあまり触れたことがなかったのだが、、
これからがんがんプログラム作って生きたいと思う

>>307
動体視力がいいわけじゃない・・www
漏れのPCのスペック (((´・ω・`)しょぼいだけさ・・
処理オチのおかげでで見えた

324 :デフォルトの名無しさん:2006/09/25(月) 00:27:29
連投スマソ
いろいろ勉強できたっといったわりには
コマンドプロンプトをコマンドプロントと書いてしまった・・・orz


325 :デフォルトの名無しさん:2006/09/25(月) 16:43:06
>>324
大丈夫。

高校まで化学漬けだったおれは、
プログラムのグループのみんなの前で
コマンドプロトン
と言った。

326 :デフォルトの名無しさん:2006/09/25(月) 17:03:46
むしろ哲学的だな。

327 :デフォルトの名無しさん:2006/09/25(月) 17:09:23
コマンドプラトンとか。
そのうちコマンドフロイトとかちんことかまんことか言い出す奴が出るねんで。

328 :デフォルトの名無しさん:2006/09/25(月) 17:37:47
stdio.h は「スタジオ ヘッダ」でした
今はboostのコンパイルが終わらなくて暇です

329 :デフォルトの名無しさん:2006/09/25(月) 20:58:25
コマンドプロピレン

330 :デフォルトの名無しさん:2006/09/26(火) 08:24:57
マジレスすると、「スタジオ」は「studio」。
「stdio」は「スタンダードアイオー」、つまり「標準入出力」だ罠。

331 :デフォルトの名無しさん:2006/09/26(火) 08:31:49
         ざわ・・・
ざわ・・・
    この流れでマジレスっ・・・!

                ざわ・・・

332 :デフォルトの名無しさん:2006/09/26(火) 09:14:55
マジレスすると,「マジレスすると」さえ付ければ許されると思ってるヤツはうんこ

333 :デフォルトの名無しさん:2006/09/26(火) 09:41:19
何そのNever say never.

334 :デフォルトの名無しさん:2006/09/26(火) 09:56:17
#include<studio.h>って書いてエラー出したことならあるな

335 :デフォルトの名無しさん:2006/09/26(火) 10:01:12
カコワルイ

336 :デフォルトの名無しさん:2006/09/26(火) 16:32:19
#include <kunio.h>

337 :デフォルトの名無しさん:2006/09/26(火) 16:39:00
>>334
stdio.hファイルの方をリネームすればOK

338 :デフォルトの名無しさん:2006/09/27(水) 11:46:09
VisualC++6.0とEasyLinkLibraryでDirectXを使って簡単なプログラムを作っています
しかし、プログラムを実行する方法が
VisualC++の開発画面上でコンパイルする方法しか解りません

VisualC++がインストールされていないPCで
普通にアプリケーションとして起動させるにはどうすればいいのでしょうか?

つまり
市販されているソフトなんかと同じような状態にしたいです
新しいPCにプログラムをインストールして実行という感じで


339 :デフォルトの名無しさん:2006/09/27(水) 12:10:27
>>338
exe ファイルをコピーして実行すればいいんじゃね?

もう一度言う。
「やりたいこと」と「やったこと」と「どうなったのか」を全部
正確に書くように。

あと誘導されてきたんならその旨書くぐらいしとけ。

340 :デフォルトの名無しさん:2006/09/27(水) 13:58:11
おそらく開発専用ランタイム依存のバイナリ吐いてんだろう

341 :デフォルトの名無しさん:2006/09/27(水) 14:07:18
エクスプローラ等から起動するやり方も分からないように取れるが

342 :デフォルトの名無しさん:2006/09/27(水) 14:41:21
VS.NET2005使ってます。ラジオボタンを作成して複数選択できるようにしますがそれを
スタートボタンで実行できるようにするためにはどのようなコマンドを追加してスタートボタンに関連付ければいいでしょうか?
一応スタートボタンを押すと動く。という単純動作は出来ております。

343 :デフォルトの名無しさん:2006/09/27(水) 15:01:05
プロジェクトの種類は何かくらい書け

344 :デフォルトの名無しさん:2006/09/27(水) 15:31:33
>>338
ビルド設定に「Release」ってのないか?

345 :デフォルトの名無しさん:2006/09/27(水) 18:50:50
>>342
意味がわからん。

>スタートボタンを押すと動く。という単純動作は出来ております
とあるのに、
>スタートボタンで実行できるようにするためには
>どのようなコマンドを追加してスタートボタンに関連付ければいいでしょうか
この質問が発生する理由がさっぱりわからん。

スタート メニューディレクトリをSHGetSpecialFolderPathあたりで取って、
exeへのショートカット放り込むだけじゃねーのか?

346 :デフォルトの名無しさん:2006/09/27(水) 21:45:52
C言語を始めたばかりの超初心者です。
もの凄く素朴な疑問なんですけど、main関数なんかで、return 0とかreturn 1
とか返す場合って、あれはどういう意味があるんですか?
0は正常終了で、1は異常終了とか聞いたことがあるんですが、
そもそも、0とか1とかはどこで使ってるんですか?
初めから、0→正常とかってコンパイラ?が判断してくれるために書いてる??
たまにreturn -1とかもあるし.....

支離滅裂な質問だと思うんですけど、アドバイスお願いします<(_ _;;)>

347 :デフォルトの名無しさん:2006/09/27(水) 21:50:12
>>346
コマンドラインで実行する場合などに、
戻り値を受け取って、結果によって挙動を変えたりできる。
exeを、ブラックボックスとして機能する一関数として見ればわかりやすい。

348 :デフォルトの名無しさん:2006/09/27(水) 21:51:48
>>346
spawn()系の関数で子プロセスを呼び出した時に戻される値にもなる。

349 :346:2006/09/27(水) 21:56:04
>>347
普通の関数の場合、戻り値を受け取って、挙動を変えるってのは分かるのですが、
main関数ってreturnを受け取ると、そこでプログラムは終了しちゃいますよね。
それなのに戻り値を要求してるのが納得いかないというか.....

見当違いのことを言ってたらすみません.....

350 :346:2006/09/27(水) 21:57:19
>>348
すみません(^^;;
超初心者なので、おっしゃってる意味が......orz

皆さんありがとうございます。

351 :デフォルトの名無しさん:2006/09/27(水) 22:01:57
>>349
プログラムが関数を呼んで戻り値を受け取るのと同じで、
OSがプログラムを呼んで、その戻り値を受け取ってるって考えるのはどうかな

352 :デフォルトの名無しさん:2006/09/27(水) 22:08:14
>>346
例えば、TV録画ソフトがある。このソフトは指定された時間に起動し、
録画を終了したらアプリを終了する。
一方、録画管理ソフトがある。このソフトで、録画履歴を見られる。
この一覧で「録画成功」「録画失敗」などと表示するときはどうすればいいだろう?
そう、TV録画ソフトのmainのreturnで成功か失敗かを返せばいい。

まあ、そんな感じ。

353 :346:2006/09/27(水) 22:10:04
>>351,>>352
なるほど!よく分かりました。どうもありがとうございました。

何度も申し訳ないですが、最後に一つだけ質問させて下さい。
stdio.hなどを初めにインクルードすると思うのですが、
どれがどの関数を含むのか分からないので(たまにエラーがでるので)、
適当に本に載ってたヘッダファイルを10個くらいコピペして、インクルードしてます。
これって何か問題あるのでしょうか?
というか、わざわざヘッダファイルを分割している意味がよく分からないです.....

354 :デフォルトの名無しさん:2006/09/27(水) 22:17:13
>>353
わざわざファイルを分割しているのは、全部ひとつにまとめたら大きくなるからw

どれをインクルードすればいいか分からない場合は、その都度マニュアルを調べるべし。
慣れてくれば、よく使う関数がどのヘッダファイルを必要とするのか覚えるだろう。

355 :デフォルトの名無しさん:2006/09/27(水) 22:22:06
>353
分割してない場合を考えてみよう。
全く使わんものまでどかんとインクルードされるわけだ。

ひょっとすると予想外のマクロや定数などを踏んでまずいことになるかもしれない。
また、シンボル名も衝突するかもしれない。
そうでなくても生成されるバイナリの量が増えたり、コンパイル時間が長くなったりする。

あと、どこに何があるか知らんなら「標準Cライブラリ」でぐぐれ。
Unix-likeな環境なら、man 3 printfなどとしてマニュアルを引くと載ってる。

356 :346:2006/09/27(水) 22:25:58
>>354,>>355
詳しく教えてくださりありがとうございます。

そうですよね、慣れなきゃいけないですよね。
これからはその都度、調べるようにしてみます。
言われてみれば、確かに>>355のような危険性はありますよね。

皆さん、どうもありがとうございました!

357 :デフォルトの名無しさん:2006/09/28(木) 18:55:02
>>355
/usr/bin/printf というコマンドがあった…
こんなコマンドあったのね><

358 :デフォルトの名無しさん:2006/09/28(木) 19:04:53
man printfしたことなかったのか・・・

359 :デフォルトの名無しさん:2006/09/28(木) 20:36:36
まんまんみてちんちんおっきおっき

360 :デフォルトの名無しさん:2006/09/28(木) 22:13:26
koコマンドが無くてよかったね

361 :デフォルトの名無しさん:2006/09/28(木) 22:41:16
100とか1000個のファイルパスやディレクトリへのパスが書かれたテキスト形式のリストがあり、
これを任意のデリミタで分割し、検索のためのデータ構造をつくりたいのですが、どんな構造が
適しているのでしょうか?
Linux / Unix上で動作させたいと思います。

362 :デフォルトの名無しさん:2006/09/28(木) 22:45:31
hashでいいんじゃね

363 :361:2006/09/28(木) 23:10:59
>>362
リストは、

/home/hoge/sample/xxxxx/
/home/hoge/sample/zzz/
/var/log/message/
/tmp/hoge/
/home/hoge2/ero/ura/


となっていて、検索対象の文字列もパス形式で与えられるような状態にし、
パスの構成要素を単位として前方一致の検索をかけたいのです。

364 :デフォルトの名無しさん:2006/09/28(木) 23:17:48
trieかsuffix arrayなりを構築すればいんじゃね?

365 :361:2006/09/28(木) 23:34:21
ちょっとググってみた。trieだとメモリ結構食うみたいですね。
パトリシア木の方がいい感じかも。
サンプルコードはLISPばっかりでわからん。C言語でのサンプルがホスィ。
茶茎は読んでもどうなってるのかわかんねーや。

366 :(^-^) ◆MONSOON/qo :2006/09/29(金) 00:00:07
>>365
第一階層
1=home
2=var
3=tmp

第二階層
1=hoge
2=log
3=hoge2

として/home/log/なら4進数21を対応させ、/home/なら4進数1を対応させる
/tmp/hoge/なら13とする
そして配列にリストの番号をふっておけば一発で求まる

367 :(^-^) ◆MONSOON/qo :2006/09/29(金) 00:09:49
>>365
リストが次のものだけとする

/1/
/1/2/
/2/2/1/
/2/3/
/3/
/3/1/2/3/

このとき
a[1]=1
a[9]=2
a[26]=3
a[14]=4
a[3]=5
a[231]=6
その他は0とする
するとディレクトリのある場合は何番目か、ないかが決定できる

368 :デフォルトの名無しさん:2006/09/29(金) 06:45:04
>>367
ホント、無駄なことに頭使うの好きだなぁ。

369 :デフォルトの名無しさん:2006/09/29(金) 07:01:53
根っこの部分でアプローチ方法間違ってるよな。
誰か止めろよ。

370 :デフォルトの名無しさん:2006/09/29(金) 07:03:55
delete[]について質問です
環境:VC6
次のプログラムで試行錯誤の結果

Cスタイルのキャストでは(void*)にキャストしてからdelete[]が可能なのに
C++スタイルのキャストでは、無理でした
これは仕様のせいなんでしょうか
それともVC?

あまり良くわかってないので、コンパイル通るコードも
const_cast版はちゃんと動作してくれてるのか心配で
結局CスタイルのTCHAR*へのキャストでお茶を濁しています

371 :デフォルトの名無しさん:2006/09/29(金) 07:04:31
#include <windows.h>
int main(){
LPCTSTR str = new TCHAR[MAX_PATH];
str = "iyou";
//この3つはコンパイル可
delete[] const_cast<TCHAR*>(str);
//delete[] (TCHAR*)str;
//delete[] (void*)str;

//以下全てエラー
//delete[] str;
//delete[] (const char*)str;

//delete[] static_cast<TCHAR*>(str);
//delete[] dynamic_cast<TCHAR*>(str);
//delete[] reinterpret_cast<TCHAR*>(str);

//delete[] static_cast<void*>(str);
//delete[] dynamic_cast<void*>(str);
//delete[] reinterpret_cast<void*>(str);
//delete[] const_cast<void*>(str);
return 0;
}

372 :デフォルトの名無しさん:2006/09/29(金) 07:16:54
>Cスタイルのキャストでは(void*)にキャストしてからdelete[]が可能なのに
>C++スタイルのキャストでは、無理でした
>これは仕様のせいなんでしょうか

ちゃんと考えろ。
voidの配列って存在すると思うか?
出来なくて当然。

delete[] str が通らないのは、単にLPCTSTRが
const char* ないしはconst wchar_t*でtypedefされているから。

ついでに、

LPCTSTR str = new TCHAR[MAX_PATH];
str = "iyou";

この時点でnewされた内容は失われている。
ぶっちゃけメモリリーク。
strの中身は文字列リテラルを指していて、delete[]した瞬間何が起きても不思議じゃない。
strへのコピーにはstrcpy()あたりを使え。

JavaとかSTLとかの知識がごっちゃになってないか?
一度落ち着いて整理した方がいいぞ。

373 :デフォルトの名無しさん:2006/09/29(金) 07:27:13
>>372
えっと、voidの配列があったらサイズがわからないから
正しくdeleteできなさそうですね・・
そう言われてみたらむしろコンパイルが通るのが逆に不思議
仕様であろうとなかろうと使わないほうがよさげ・・かな

それにしても、これメモリリークだったとは^^;
いい勉強になりますた
そういうのがきちんとわかるように精進したいと思います


374 :デフォルトの名無しさん:2006/09/29(金) 08:23:22
しかも、TCHAR 使ってるのに文字列リテラルは _T("") か TEXT("") 使えよ
TCHAR って何か分かってるか?

375 :デフォルトの名無しさん:2006/09/29(金) 16:04:11
「変数」と「値」の区別がついてない上、当然配列とポインタが理解できてない
初心者の典型的なコードだな。

376 :デフォルトの名無しさん:2006/09/29(金) 16:33:59
TCHAR=tea茶

377 :デフォルトの名無しさん:2006/09/29(金) 22:04:26
でもやさしく教える372にちょっと惚れた


378 :デフォルトの名無しさん:2006/09/29(金) 22:11:00
>>371
C++スタイルのキャストでは const_cast 以外のキャストで定値性を消すことは出来ません。これはC++の仕様です。
ついでに delete や delete[] に渡す前にポインタの定値性を消す必要はありません。これもC++の仕様です。

重要なのは delete[] に渡すポインタの静的な型と new[] で指定した型が(const, volatile 修飾を除いて)
一致していない場合、動作未定義となることです。VC6〜8 の場合 delete[] に void* を渡すとデストラクタを
スルーして単なるメモリブロックの開放のみ行うため、メモリはリークしないのにその上に乗っかっている
リソースはリークするという厄介なバグの原因になります。

後アドバイスとして、月並みですが new[] ではなく std::vector や std::basic_string を使いましょう。
#include <windows.h>
#include <tchar.h>
#include <string>
typedef std::basic_string<TCHAR> tstring;

# べ、別に惚れたっていって欲しいんじゃないんだからねっ!

379 :デフォルトの名無しさん:2006/09/30(土) 02:36:37
質問です、DLLとEXEが存在したとして
EXE側でファイルのオープン/クローズを行います。

{
FILE* stream = fopen("Hoge.txt", "wb");
}

{
fclose(stream);
}

で、それに対しDLL側ではFILE*を利用し読み書きを行います。
(FILE*は引数などで受け取ったものとします)

{
fwrite(略);
};

このコードが同一バージョン違いコンパイラ、あるいは異種コンパイラで動作する保証はありますでしょうか?
(要は、FILE構造体の構造ってどのコンパイラでも同一になる様にされているのかを窺いたく)

380 :デフォルトの名無しさん:2006/09/30(土) 02:38:32
>>379
互換性はありません。

381 :デフォルトの名無しさん:2006/09/30(土) 03:51:58
C++覚え立ての俺がメモリーリークを学んだぜ
#include <iostream>
#include <string>
#include <cstdlib>
#include <new>

using std::string;
using std::cout;
using std::cerr;
using std::nothrow;

//文字列を操作するmyclassの定義
class myclass{
private:
string str;
char *pchar, *pwork, *pold;
int len;

myclass(){}
myclass(const myclass &mobj){}
myclass &operator=(const myclass &mobj){}

382 :デフォルトの名無しさん:2006/09/30(土) 03:52:36
public:
//1引数付きコンストラクタ
myclass(const char *pstr) : str(pstr)
{
//char型の動的な配列を作成する
const int size = static_cast<int>(str.length());

//sizeを指定して配列を割り当てる
//nothrowで、newのメモリ割り当て時失敗してもbad_allocをなげずNULLを返す。

//pwork,pcharにそれぞれヒープからメモリを割り当てる
pwork = pchar = new(nothrow) char[size + 1];

if(pchar == NULL){
cerr << "メモリ割り当てエラー";
exit(1);
}
//文字列をコピーする
strcpy(pwork, str.c_str());
len = strlen(pwork);
}


383 :デフォルトの名無しさん:2006/09/30(土) 03:53:08
//メモリーリーク領域へのポインタを返す。
//領域再割り当てを行うメンバ関数
char *realloc(const char *pstr)
{
//メモリーリーク領域へのポインタを保存
pold = pchar;

//strに文字列を代入しておく
str = pstr;

//char型の動的な配列を作成
const int size = strlen(pstr);

//sizeを指定して配列を割り当てる
pwork = pchar = new(nothrow) char[size + 1];
if(pchar == NULL){
cerr << "メモリ割り当てエラー";
exit(1);
}
//文字列をコピーする
if(false == strcpy(pwork, pstr)){
cout << "文字列コピーエラー \n";
return NULL;
}else{
len = strlen(pwork);
}

//メモリーリーク領域へのポインタを返す
return pold;
}


384 :デフォルトの名無しさん:2006/09/30(土) 03:53:37
//動的に割り当てた領域の文字列へのポインタを返す
const char *getstr(){ return pwork;}

//デストラクタ
~myclass(){
cout << "デストラクタ \n";

delete [] pchar;
}
//c型文字列長さ
int strlen(const char *cstr)
{
int i;
for(i = 0; cstr[i]; i++)
;
return i;
}
//c型文字列のコピー
bool strcpy(char *out, const char *in)
{
if( strlen(out) < strlen(in)){
cout << "コピー無理 \n";
return false;
}else{
while(*out++ = *in++)
;
return true;
}

}


385 :デフォルトの名無しさん:2006/09/30(土) 03:54:30
//アドレス表示
myclass *adress(myclass *mobj)
{
return mobj;
}


};

int main()
{
char *pchar = NULL;

{
myclass mcarray[] = {"今日も", "良い日で", "幸せで", "楽しく"};
const int size = sizeof mcarray / sizeof(myclass);
int i;

//mcarrayの要素を表示
for(i = 0; i < size; i++){
cout << mcarray[i].getstr() << ' ' << mcarray[i].adress(&mcarray[i]) << ' ';
}
cout << '\n';


386 :デフォルトの名無しさん:2006/09/30(土) 03:56:09
「メモリーリーク領域へのポインタ」ってなんじゃそら

387 :(^-^) ◆MONSOON/qo :2006/09/30(土) 03:57:09
メモリーリークってなんですか?

388 :デフォルトの名無しさん:2006/09/30(土) 04:49:00
//メモリーリークを発生させる
/*
reallocメンバ関数で、新たに割り当てられた領域は
古い割り当て済みの領域を解放せずに新しい領域を新たに
割り当てる。そのため、delete演算子をつかってメモリを
解放するが、古い割り当てられたメモリが残っており
メモリーリークがおこる。
*/
if(NULL == (pchar = mcarray[0].realloc("明日も")))
cout << "再割り当て失敗 \n";

//mcarrayの要素を表示
for(i = 0; i < size; i++){
cout << mcarray[i].getstr() << ' ' << mcarray[i].adress(&mcarray[i]) << ' ';
}
cout << '\n';

}
if(pchar == NULL){
cout << "とりあえず失敗 \n";
}else{
cout << "ブロックスコープを抜け出した \n";
cout << "すべてのオブジェクトは解放されているはず \n";
cout << "[メモリーリークとなった領域] : " << &pchar << pchar << '\n';
}


return 0;
}

389 :デフォルトの名無しさん:2006/09/30(土) 04:53:29
ていうか、何が言いたいんだ?

390 :デフォルトの名無しさん:2006/09/30(土) 09:32:36
c++ではjarの様にoファイルをまとめて実行形式のアーカイブにする事はできないんでしょうか

391 :デフォルトの名無しさん:2006/09/30(土) 09:35:32
>>379
同一コンパイラ同一CRTでも、CRTがスタティックリンクだとダメなんじゃなかったっけ。

392 :デフォルトの名無しさん:2006/09/30(土) 09:35:51
(; ゚Д゚)……

393 :デフォルトの名無しさん:2006/09/30(土) 10:10:16
>>384
そのstrcpyはねえだろ。
たしかにoutには十分なメモリが確保してあるものの、
全て0埋めしてあったら、コピー無理になるだろ。

394 :デフォルトの名無しさん:2006/09/30(土) 11:10:08
教える気ねえの?

395 :デフォルトの名無しさん:2006/09/30(土) 11:47:14
何を?

396 :デフォルトの名無しさん:2006/09/30(土) 12:21:36
>380>391
ありがとうございます、という事は関数でラップしなければならないのですねorz
うわぁ、やな感じorz

397 :デフォルトの名無しさん:2006/09/30(土) 13:44:05
ライブラリをリンクしたいのですがどうしたらいいのかわかりません
リンクしたいのはComctl32です。

今は
g++ -Comctl32 -o test.exe test.cpp
です。

398 :デフォルトの名無しさん:2006/09/30(土) 13:57:31
>>397
g++ -o test.exe test.cpp -lComctl32


399 :デフォルトの名無しさん:2006/09/30(土) 13:58:26
comctl32.dllとリンクすることはできないんで内科医?

仮に、libsome.aなんてライブラリがあれば-lsomeでリンクできるが。
mingw使うことになるだろうし、検索してみたら?

400 :デフォルトの名無しさん:2006/09/30(土) 14:39:07
>>399
最近のCygwinはMinGW相当も持っていて、
libcomctl32.aがあったりするんだな。

401 :デフォルトの名無しさん:2006/09/30(土) 15:50:22
C++のコンソール入力であるていどプログラムが組めるようになって、いざGUI表示とVC++のMFCに挑戦しましたが、
ごく基本的な「画面に文字を表示する」部分でつまづいております。

どんな感じで操作すればいいのか、ざっと流れ的なのを説明していただければ幸いです。
(とりあえずHELLO WORLDとウィンドウに表示させるレベルまで)

ちなみにVC++Net 2003、OSはXPです。

402 :(^-^) ◆MONSOON/qo :2006/09/30(土) 16:10:11
>>401サン
コンパイルの設定をWindowsアプリケーションにかえてから
次を実行してください

#include <windows.h>

int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hPreInst,
LPSTR pCmdLine,int nCmdShow)
{
MessageBox(NULL,"Hello, World","タイトル",MB_OK);
return 0;
}

403 :デフォルトの名無しさん:2006/09/30(土) 16:43:07
ドピュドピュッ!

404 :デフォルトの名無しさん:2006/09/30(土) 17:30:35
>>401
リソースエディタでStaticTextを貼り付けて、そこに件の文字を書くのではダメ?
>402のやり方はダイアログに出力するいちばん簡単な手順だけどMFCとはなんの関係もないコードだしね。

405 :401:2006/09/30(土) 17:46:47
すみません>>402 >>404とも当方の読解力が足らずよくわかりません。

テキストにはネットの入門サイト(猫含む)
あと秀和システムの逆引き大全使ってますが、

やはりちゃんとした本買わないと駄目ですかね・・・



406 :338 です:2006/09/30(土) 18:03:03
本気でどうすればいいか 分からないです
ネットや書籍もかなり調べました
どなたか、どうかお願い致します

>>344 リリースビルドという物は仕様として存在するようなのですが
     それが在るはずのダイアログで
     「Project Win 32 el」としか表示されていません


>>339 exeファイルという意味もわからないくらいの初心者ですが
      一応ファイルの構成はこうです

--単体のファイル--
・プロジェクトファイル(.dsp)
・プロジェクトワークスペース(.dsw)
・CPPソースファイル (.cpp)
・リソースファイル (.rc)

---複数のファイル--
・ヘッダーファイル (.h)
・WAVファイル (.wav)
・MIDIファイル (.midi)


407 :デフォルトの名無しさん:2006/09/30(土) 18:04:09
コンパイルすればよくね?

408 :デフォルトの名無しさん:2006/09/30(土) 18:28:11
>>405
文字を出力することにこだわらず、まともな入門書か入門サイトの通りにやれば?
少なくとも、>402も>404も理解できない人間が自己流だなんて虫が良すぎる。

409 :デフォルトの名無しさん:2006/09/30(土) 18:40:34
>ネットや書籍もかなり調べました
>>339

このスレは質問者の幅が広いですねー

410 :デフォルトの名無しさん:2006/09/30(土) 18:49:26
includeとjavaのimportには違いがあるのでしょうか

411 :デフォルトの名無しさん:2006/09/30(土) 18:54:12
C++のオブジェクトファイルとjavaのクラスファイルはなにが違うの

412 :デフォルトの名無しさん:2006/09/30(土) 18:55:24
402はプロジェクトの新規作成、から
Windowsアプリケーションを選んでプロジェクトを作り、
.cppのソースをプロジェクトに加えてビルドするということ。

413 :デフォルトの名無しさん:2006/09/30(土) 18:57:21
>>410
全然違う。ウンコしに行って帰ってきたほど違う。

414 :デフォルトの名無しさん:2006/09/30(土) 18:58:38
338
VC6はこんな感じでできたと思う。
@アクティブな構成をRelaeseにする
Aビルトする
Bプロジェクトフォルダ下Releaseフォルダにあるxxxx.exe
を対象のPCにコピー
Cxxxx.exeを開く

401
MFCには「標準出力」「文字出力」はない。
対象のクラスよってに表示方法がちがう。たとえば
CxxxxViewなら
OnDraw()でTextOut()する。またはDrawText()する。

415 :デフォルトの名無しさん:2006/09/30(土) 19:05:02
>>413
すみません、よくわからないです。
つまりincludeするファイルがウンコしに行って終わったら帰るって事ですか?
ウンコじゃなくてもっと解りやすいものに例えてほしいです。

416 :デフォルトの名無しさん:2006/09/30(土) 19:12:14
そもそも言語が違うんだし、比べる事自体おかしいと思うが。

417 :デフォルトの名無しさん:2006/09/30(土) 19:17:15
includeが物理的で、importが論理的。

418 :デフォルトの名無しさん:2006/09/30(土) 20:09:40
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2724.txt

上のプログラムについて質問です。
char型のテスト用malloc/freeを作ったのですが、
なぜMalloc側はMallocReturnで、戻り値を代入しないとうまくいかなくて、
Free側はFreeReturnで、戻り値を代入しなくてもうまくいくのでしょうか。

419 :はい:2006/09/30(土) 20:14:31
http://search.msn.co.jp/results.aspx?v=1&RS=CHECKED&CY=ja&FORM=MSNH&q=want+pc

420 :デフォルトの名無しさん:2006/09/30(土) 20:16:39
>>418
freeしたら用済みだから、それを返す必要は無い。

Mallocがうまくいかないのは、これがうまくいかないのと同じ理屈。
#include <stdio.h>

void hoge(int n)
{
    n = 777;
}

int main(void)
{
    int x = 666;
    hoge(x);
    printf("%d\n", x);

    return 0;
}

421 :デフォルトの名無しさん:2006/09/30(土) 20:19:23
>>418
char **strにして、*strにmallocの戻り値を代入したらうまく行く。

422 :418:2006/09/30(土) 20:29:22
みなさま、ありがとうございます。
理解しました。

423 :デフォルトの名無しさん:2006/09/30(土) 20:32:18
初心者の質問だと思いますがお願いします。

class Test でメンバ変数 m_flag を宣言して
if(条件) m_flag = 1;
else m_flag = 0;
と変数に値を代入しておきます。

これを別のクラス class Main で
Test fg
if(fg.m_flag == 1) 処理1;
else 処理2;

というふうに別のクラスで変更した値を見るにはどうすればいいですか?
このままだとfgに何も入ってないので正しく動作しません。
メンバ変数をpublicで宣言してポインタを使うとできますか?

424 :デフォルトの名無しさん:2006/09/30(土) 20:33:41
>>423
クラス共通変数にしたいのならstaticクラス変数を使えばどう?

425 :423:2006/09/30(土) 20:37:58
>>424
レスありがとうございます。
staticを使わずにやりたいのですが難しいですか?

426 :デフォルトの名無しさん:2006/09/30(土) 20:40:39
>>423
Test に bool Flag() const { return m_flag; } でも足せば?
実際はもっと意味のある名前にしとけよ。

427 :デフォルトの名無しさん:2006/09/30(土) 20:42:18
要するにコンポジションになってるクラスの変数を見たいわけでしょ。
コンストラクタでTest& fg として、元のクラスを参照で持たせておくか
ポインタを持って初期化しないと意味ないよ。

クラスは金太郎飴だからね。

friend使ったりアクセサ(この場合はread専用)を使ったりする。

428 :デフォルトの名無しさん:2006/09/30(土) 21:13:29
>>423
漏れなら、
class Main に Test *fg; を置き
Testクラスにm_flagをread onlyするパブリックメンバー関数を加える

429 :423:2006/09/30(土) 21:31:37
皆さんレスありがとうございます。
いろいろ知らない言葉があってぐぐったりしてみたんですが
アクセサ、readonlyというのは
いわゆるGet〜というような関数のことですか?


実際にコードを書いていただけると幸いです。
(できれば特にポインタを使う部分を)

430 :デフォルトの名無しさん:2006/09/30(土) 21:37:23
>>429
未だに何がしたいのか良く分からんのだが。

>>423 の「変数に値を代入」はどこに書いてるんだ?
Test のコンストラクタで書いとけば、 >>423 の下のコードでも問題なさそう。
メンバ関数に書いてるんなら fg.m_flag を見る前に呼び出しとけばいい。

431 :デフォルトの名無しさん:2006/09/30(土) 21:37:35
#include <iostream>

class Test {
bool m_flag;
public:
Test(bool b = false) : m_flag(b) {}
void set_flg(bool b) { m_flag = b; }
bool get_flg() { return m_flag; }
};

class Main {
Test& fg;
public:
Main(Test& f) : fg(f) {}
void abc() {
if (fg.get_flg())
std::cout << "flag is true" << std::endl;
else
std::cout << "flag is false" << std::endl;
}
};

int main()
{
Test t;
Main m(t);

std::cout << std::boolalpha << t.get_flg() << std::endl;
m.abc();
}

432 :デフォルトの名無しさん:2006/09/30(土) 21:44:33
Windowsで仮想ドライブを作るソフト
(GMail DiskやPGP DiskやDaemon Toolsのようなもの)
を作りたくてDDKをインストールしたんだが
どのサンプル見るのがよさそう?

なんか解説してくれてるありがたいサイトないかい?

433 :デフォルトの名無しさん:2006/09/30(土) 21:46:22
お前には無理だ。あきらめろ。

434 :デフォルトの名無しさん:2006/09/30(土) 21:47:20
>>432
デバイスドライバについて勉強しろ

435 :デフォルトの名無しさん:2006/09/30(土) 21:48:53
>>433
氏ね

>>434
わかった

436 :デフォルトの名無しさん:2006/09/30(土) 22:34:44
とりあえずフィルタドライバを作るのがいいかも

あとSoftICEとか使わないとデバッグが大変だと思う

437 :デフォルトの名無しさん:2006/09/30(土) 22:37:38
SoftICEって販売終了したんじゃなかった?

438 :デフォルトの名無しさん:2006/09/30(土) 22:39:34
スレ違いな知ったか乙。

439 :デフォルトの名無しさん:2006/09/30(土) 23:10:56
void *func(void *arg);
void* func(void* arg);
void * func(void * arg);
C でどれがスタンダード?
スペースをタブに置き換えても見易いのはどれ?


440 :デフォルトの名無しさん:2006/09/30(土) 23:12:27
>>439
一番上。
そこでタブを使う人はほとんどいないでしょう。(つまり、使うな)

441 :デフォルトの名無しさん:2006/09/30(土) 23:26:01
C++だと真ん中が多いような

442 :デフォルトの名無しさん:2006/09/30(土) 23:35:57
C++を始めて真ん中の書き方に慣れるために苦労していた時、つい

int* ptr, ptr2;

とやって、ptrがint型になってしまうのに気づかなくてエラー連発していた
頃が懐かしい。

かと言ってreturn* this; はやり過ぎだし。

443 :デフォルトの名無しさん:2006/09/30(土) 23:44:15
俺も真ん中の書き方しかしないな。

変数側の属性だろって頭でわかってても、
ポインタ型って考えた方がしっくりくること多いからなー。

最後のは無いだろう。

444 :デフォルトの名無しさん:2006/09/30(土) 23:46:44
void *func(void *arg);
これでまだ戸惑うなら、未だに初心者じゃないかな?


445 :デフォルトの名無しさん:2006/09/30(土) 23:47:58
きたな労外

446 :デフォルトの名無しさん:2006/10/01(日) 00:12:13
ん?int型になるのはptr2の方だろ?
さすがに、return* this;は見たこと無いというか、宣言でしかやらないだろ、普通。

447 :デフォルトの名無しさん:2006/10/01(日) 00:16:46
void* func(void *arg);
今こうやってるけど真ん中に変えようかなと思ってる

448 :デフォルトの名無しさん:2006/10/01(日) 00:18:12
今まで
int*
をイントピーって読んでて、(int型のポインタ)型だと思ってた俺ガイル

(´・ω・)恥ずかしいス

449 :デフォルトの名無しさん:2006/10/01(日) 00:18:40
上だろうが真ん中だろうがどっちでもいいけど、片方に統一してないと気持ち悪くないか?

450 :デフォルトの名無しさん:2006/10/01(日) 00:18:52
void *func(void *arg);

だなー。今更変える気も無いし。

451 :デフォルトの名無しさん:2006/10/01(日) 00:51:32
まあ、どっちかだよな。
俺は真ん中だが、これそもそもやりだしっぺは誰なんだ?

452 :デフォルトの名無しさん:2006/10/01(日) 00:58:24
一番下も結構見るんだが

453 :デフォルトの名無しさん:2006/10/01(日) 00:59:39
int * hoge()
は偶にあるな

454 :デフォルトの名無しさん:2006/10/01(日) 01:00:50
そこでMSの LPVOIDですよ

これで無問題

455 :デフォルトの名無しさん:2006/10/01(日) 01:01:47
exeの中身みたくてvisualC++いれたんだけど意味不明
どうすればてっとりばやく中身みれますか?

456 :デフォルトの名無しさん:2006/10/01(日) 01:02:35
>>455
中身?
何を期待してるの?

457 :デフォルトの名無しさん:2006/10/01(日) 01:03:20
>>455
PEフォーマットの仕様書みれ

458 :デフォルトの名無しさん:2006/10/01(日) 01:03:22
ソースコードがみたいんです

459 :デフォルトの名無しさん:2006/10/01(日) 01:04:28
>>458
ソースコードはEXEには普通書かれてません//

460 :デフォルトの名無しさん:2006/10/01(日) 01:05:21
まったくの初心者なのでよくわかりません
とりあえず>>457さんの言っているPEフォーマットの仕様書とやらを見ればいいのでしょうか?

461 :デフォルトの名無しさん:2006/10/01(日) 01:08:06
>>460
全くの初心者さんが、何を理由にしてVC突っ込んでEXEの中身見ようとしたのかわからんです
とりあえずあなたのやろうとしてることは、あなたにとって無理が大きすぎるのは確かなので諦めてください

それよりなぜ逆コンパイルしようとおもったのか書くといいかもしれません


462 :デフォルトの名無しさん:2006/10/01(日) 01:09:07
うpろだにあったものにウイルス入りじゃないか調べたかったのです

463 :デフォルトの名無しさん:2006/10/01(日) 01:12:03
ウィルスチェッカ使えばいいだろ

それより初心者なのに自分でexeみてウィルスかどうかどうやって判断するんだよ


464 :デフォルトの名無しさん:2006/10/01(日) 01:13:06
>>462
とりあえずアンチウィルスソフト使ってみて、何もなければ諦めることだね
きっとEXEの中身がどーのこーのを思いつくあなたでは、色々無理

465 :デフォルトの名無しさん:2006/10/01(日) 01:13:56
わかりました 諦めます


466 :デフォルトの名無しさん:2006/10/01(日) 01:16:52
ゲームのツールなんですが
ウイルスじゃなくてゲーム内で勝手に喋ったりするものでした

467 :デフォルトの名無しさん:2006/10/01(日) 01:17:39
void * func(void * arg);
これも最近見慣れてきたけどなぁ
時々、自分もこう書いてしまうときがある

468 :デフォルトの名無しさん:2006/10/01(日) 01:29:36
見たこと無いなあ。
誰が始めたスタイルなんだろう?

469 :デフォルトの名無しさん:2006/10/01(日) 01:36:43
TOKYO STYLE

470 :デフォルトの名無しさん:2006/10/01(日) 05:42:24
単純に、WM_TIMERにMessageBox(hWnd...)を置くと
ウイルスみたいになってしまうからな。
エラーチェックの為に入れていたが、えらいことになった。

471 :デフォルトの名無しさん:2006/10/01(日) 07:44:18
モーダルダイアログでも再入するパターンだな。
タスクトレイから操作するアプリも注意した方がいい。

472 :デフォルトの名無しさん:2006/10/01(日) 10:52:13
void * func(void * arg);
この表記は、 pthread.h だ!
俺の不確かな記憶抜粋

473 :デフォルトの名無しさん:2006/10/01(日) 12:32:01
次のプログラムのような例だと、変数に代入しないと
デストラクタを呼び出す方法ってないよな?

struct leak{
static leak* get(){return new leak();}
operator int(){return 1;}
};
int main(){
int is_leak = *leak::get(); //上側:deleteできん。メモリリーク
leak* no_leak = leak::get(); //下側:deleteできる。
delete no_leak; //メモリリークなし
return 0;
}

474 :デフォルトの名無しさん:2006/10/01(日) 12:35:57
newした領域をいきなりintで持つ時点でおかしいだろ。

475 :デフォルトの名無しさん:2006/10/01(日) 12:36:25
>>473 あたりまえ

476 :デフォルトの名無しさん:2006/10/01(日) 13:24:43
delete leak::get();

477 :デフォルトの名無しさん:2006/10/01(日) 13:38:20
>>476
シュールだな

478 :384:2006/10/01(日) 13:40:39
遅レスですみません
>>393さんが指摘下さった部分で
すべて0埋めしてあったらコピーが無理になるというのは
newでバッファを割り当てた時の中身が0で埋まってたら
(先頭アドレス内容じゃなくても途中でも0があったら)
無理ということで理解して良いでしょうか。
間違ってたら、すいませんが教えて下さい。

479 :デフォルトの名無しさん:2006/10/01(日) 13:41:39
strcpy()じゃなくてmemcpy()使えよ。

480 :デフォルトの名無しさん:2006/10/01(日) 13:44:38
>>478
たぶん>>384
> if( strlen(out) < strlen(in))
がいけないかと

outが0埋めされてたら、strlen(out)は0になるよね
で、ifの中に入れなくてコピーもされない

481 :デフォルトの名無しさん:2006/10/01(日) 13:51:12
漢ならstrdup()ぜよ

482 :デフォルトの名無しさん:2006/10/01(日) 20:33:12
main()とmain(void)の意味の違いについてどなたか教えてください

483 :デフォルトの名無しさん:2006/10/01(日) 20:39:41
>>482
C だと、前者は引数の型や数を指定しない宣言で、後者が引数なしを指定する宣言。
C++ ならどちらも同じで、 C での後者と同じ意味。

484 :デフォルトの名無しさん:2006/10/01(日) 21:32:39
ANSI-Cが推奨するプログラムは
#include<stdio.h>
int main(void){
return (EXIT_SUCCESS);
}
である。
main(){
}
のようにしない理由を答えよ。
これにどう答えていいのかさっぱりわからないのですが、どなたか
素人の僕にもわかるように教えてください

485 :デフォルトの名無しさん:2006/10/01(日) 21:34:30
・省略するとintと解釈されちゃうよおにいちゃん
・プロセスは戻り値を明示的に返す方が好ましいよおにいちゃん

486 :デフォルトの名無しさん:2006/10/01(日) 21:40:22
>>484
上のプログラムは正しくない。
- stdio.h のインクルードは必要ない
- stdlib.h のインクルードが必要 (EXIT_SUCCESS のため)


487 :デフォルトの名無しさん:2006/10/01(日) 21:52:21
>>486すみません、僕が間違えて書いてました。stdlib.hでした。

>>485ごめんなさい、まだわからなくて本当にごめんなさい。

488 :デフォルトの名無しさん:2006/10/01(日) 22:04:27
>>484
同じ質問を繰り返したら誰か答えてくれるとでも思ってるのか?
今までの反応を省みて質問を考え直すか、消えるかのどっちかにしろ。

489 :デフォルトの名無しさん:2006/10/01(日) 23:55:11
どうみても宿題です

490 :デフォルトの名無しさん:2006/10/02(月) 01:25:04
夜遅くにすみません…

今、VC++でプログラミングしてるんですが、
ダイアログボックスから変数を持って行きたい時はどうすればいいですか?

例えば

ダイアログボックスで
次の数の二乗を算出します
とか書いてユーザに入力を求めて、そしてユーザが入力したら
その値を元に計算→出力
的な感じなんですが…

491 :デフォルトの名無しさん:2006/10/02(月) 01:29:51
http://pc8.2ch.net/test/read.cgi/tech/1156206091/135
このコピペはやってるの?

492 :デフォルトの名無しさん:2006/10/02(月) 01:30:35
ていうか最近はこの板全体が荒らされてる

493 :デフォルトの名無しさん:2006/10/02(月) 08:19:18
>>492
Javaスレとか、意味不明に酷いな。

>>490
>ダイアログボックスから変数を持って行きたい
日本語でおk

入力をどうやって、どこから得るのかとか、どこに出力するのか、とか
詳細がさっぱりわからないんだが、
GetDlgItemIntでぐぐってみるのはどうだろう。

494 :デフォルトの名無しさん:2006/10/02(月) 12:53:14
ファイル内の情報のグルーピングがしたいです。
ネットで似たようなプログラムを探して、下記のプログラムを見つけました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2688.txt

しかし、このプログラムの実行の仕方がわからないのです。
コンパイルして、実行するとコマンドプロンプトが出るだけなのです。
初心者なものですいません。どなたか教えていただけませんか?
たぶん、tagの情報をグルーピングしているプログラムだと思います。
よろしくお願いします。



495 :デフォルトの名無しさん:2006/10/02(月) 13:10:44
>>494
何やら標準入力から10項目のcsvを取り込んで、tagIDごとにファイル出力しているようだが。
取り敢えずコマンドインタプリタで標準入力を取り込みたいcsvファイルにリダイレクトすればいいんじゃね?
#つーか、ここはソフトの使い方すれでもなければ環境の使い方スレでもないんだけどなぁ。

496 :デフォルトの名無しさん:2006/10/02(月) 13:14:40
これだとおも
ttp://pc8.2ch.net/test/read.cgi/tech/1158844912/118
ttp://hp28.0zero.jp/diary/see_diary.php?dir=569&num=1&uid=akiyu0901&hiduke=20060925&now=0

497 :デフォルトの名無しさん:2006/10/02(月) 14:17:27
>>495
すいません!初心者なので、ぜんぜん分かりません。
リダイレクトとはどうやるのですか?
コマンドプロンプトに何を入力すれば、ファイルのグルーピングがされ
テキストが作成されるのですか?
>>496
正解です。

498 :デフォルトの名無しさん:2006/10/02(月) 15:38:34
なんか文字だしたり計算してんのに飽きました
ちょっとしたゲームみたいなの作りたいんだけどどうすればいいですか?

499 :デフォルトの名無しさん:2006/10/02(月) 16:30:54
>>497
2688.txtをコンパイルしてできた実行モジュールが2688.exeならば、
2688 < recv_20550606162223.log
でOK。

500 :デフォルトの名無しさん:2006/10/02(月) 16:32:07
>>498
手軽なところで、Hit&Blowなんてどうでしょう。
fgets()を使えてprintf()を使えるなら作れるでしょう。

501 :デフォルトの名無しさん:2006/10/02(月) 21:50:15
おながい

標準入力で入力された最後5行を表示するプログラム

コマンドから入力、列は固定で行は固定ではない

502 :デフォルトの名無しさん:2006/10/02(月) 21:53:19
あ、ポインタを使ってで。二次元配列ではなく

503 :デフォルトの名無しさん:2006/10/02(月) 22:02:07
自己解決しました

504 :デフォルトの名無しさん:2006/10/02(月) 22:36:57
昔、変数のtrue/falseをifを使わず一行で切り替えるコードを見て感動したんですが
どんなコードか忘れてしまいました。確かビット演算か何かしてたような気がするんですが
わかる方いませんか?

505 :デフォルトの名無しさん:2006/10/02(月) 22:39:06
>>504 !

506 :501、2:2006/10/02(月) 22:41:44
ちなみに私は自己解決してませんよ〜
お願いします

507 :デフォルトの名無しさん:2006/10/02(月) 22:47:31
hoge = !hoge;
hoge = (hoge==false);

508 :デフォルトの名無しさん:2006/10/02(月) 22:56:34
sage = sage ? false : true;
sage ^= 1;  // 微妙

509 :デフォルトの名無しさん:2006/10/02(月) 23:08:12
>>488
そう言われて必死に色々参考書読みまくってたら解決しました。

510 :501、2:2006/10/02(月) 23:16:37
私も>>509さんと同じように頑張って自己解決します。

511 :501 ◆8zHol6NAOo :2006/10/03(火) 00:46:04
何が楽しいんだか>>510さん

512 :デフォルトの名無しさん:2006/10/03(火) 00:52:46
>>501
進みぐわいはどう
>>501っ宿題じゃないのか?



513 :デフォルトの名無しさん:2006/10/03(火) 01:07:42
Wrapperってなんですか?

514 :デフォルトの名無しさん:2006/10/03(火) 01:14:12
クラス内でのみ通用する、constな変数を設定するにはどのようにしたらよいのでしょうか?

515 :デフォルトの名無しさん:2006/10/03(火) 01:29:20
>>514
日本語でOK

コンストラクション時に値が決まって、以降内部でも値を動かさない変数が欲しいって話だろうか。

class A
{
const int cv;
...

みたいなことをしたいなら、コンストラクタの初期化子で初期化すれば大丈夫だぞ。
上の例なら

A::A():
cv(12345)
{}

みたいな。



516 :デフォルトの名無しさん:2006/10/03(火) 01:38:28
514が欲しているのはprivateなstatic constな定数とも読み取れる。
(そうだとして)それが整数型でなければ、他の静的変数同様定義を書き、そこで初期化すればよい。


517 :デフォルトの名無しさん:2006/10/03(火) 01:41:58
>>513 http://www.asahi-kasei.co.jp/saran/products/saran_h/saran_h.html

518 :デフォルトの名無しさん:2006/10/03(火) 01:45:50
>>512
「ぐあい」ね、「具合」。

>>513
包み紙。対象物を直接利用せず、共通I/Fを与える目的などで間接的に利用することなど。

519 :デフォルトの名無しさん:2006/10/03(火) 19:22:00
windows2000、VC++6で開発しているのですが、
一画面にコントロールを318個(うちスタティックテキストは72個)作りたいのですが、
途中で作れなくなってしまいます。
リソースエディタを使わずに直接rcファイルを書き換えると作れるのですが、
リソースエディタでコントロールをダブルクリックしても新規メンバを作れなくなってしまいます。
なんとか250個以上のコントロールをつくれないでしょうか?

本来は画面設計をしなおして画面を分ければいいので作ってみたのですが、
実際の操作盤と同じような見た目にしたいという強い要望なので、
それに答えられないかなぁと思い質問した次第です。
よろしくお願いします。

520 :デフォルトの名無しさん:2006/10/03(火) 19:26:31
リソースエディタを使わずに直接rcファイルを書き換える

521 :デフォルトの名無しさん:2006/10/03(火) 19:49:25
一次元の配列int a[5]を関数に受け渡す時引数で配列名を渡すと
仮引数にはint a[]とint *aと二通りに書けますが、
二次元配列int a[3[5]を関数に受け渡す時には引数に配列名を渡すと
int a[][5]という書き方とは別にポインタっぽく書くとどう書いたら良いのでしょうか。
int *a[5]かと思ったのですが『問題のあるポインタの変換』と
エラーになってよく分からないのでどなたか教えてください。

522 :デフォルトの名無しさん:2006/10/03(火) 19:57:05
少し前にも同様の質問があったよな…

523 :519:2006/10/03(火) 20:24:40
>>520
そうですね。自分でそう言っていました。
コントロールを作る方法じゃなくて、
「リソースエディタでコントロールを作る方法」か
「rc直書きで作ったコントロールをリソースエディタでダブルクリックして関数を作る方法」
を聞きたかったんですが、
よくよく考えたら、クラスウィザードから作ればよかったんですね。
ありがとうございました。

524 :デフォルトの名無しさん:2006/10/03(火) 21:57:21
>>521
int (*a)[5]

525 :デフォルトの名無しさん:2006/10/03(火) 22:13:06
>>524
うわぁあありがとうございますっ!!!
出来た、出来ました!!
昨日からずっと考えててポインタの本読んだりしてもint *a[5]
ってなると思ったらそういうことでしたか!
>>269も見たのですが自分の知りたいポインタ風にするってことが分からなくて悩んでました。
出来てホントに嬉しいです!心からありがとうございます!(´;ω;`)ブワッ


526 :デフォルトの名無しさん:2006/10/03(火) 22:41:43
>>525
まだ今はわからないかもしれないけど、ちょっとだけ説明しておく。
int *a[5]では、*演算子よりも[]演算子の優先度の方が高いので、
int *(a[5])と解釈される。これは大きさ5のint型へのポインタ配列と
なって意味が違ってしまう。

int (*a)[5]は、int型の大きさ5の配列へのポインタとなり、通常の
二次元配列 a[3][5]は、コンパイラ内部ではすぐにこの形に変換
され利用される。Cでは一番左側の次元以外の大きさを省略でき
ないのはこのためである。

527 :デフォルトの名無しさん:2006/10/03(火) 22:42:42
>>526
宣言時に”演算子”を突っ込まない方がいいんでね?
実際演算子じゃないし

528 :デフォルトの名無しさん:2006/10/04(水) 00:04:29
>>527
「宣言子演算子」という名の立派な演算子だが何か?

529 :デフォルトの名無しさん:2006/10/04(水) 00:10:55
うーん、ありえないけどとりあえずググってみた
ttp://www.google.co.jp/search?complete=1&hl=ja&q=%22%E5%AE%A3%E8%A8%80%E5%AD%90%E6%BC%94%E7%AE%97%E5%AD%90%22&lr=

どっかにソースあるならおすえて

530 :デフォルトの名無しさん:2006/10/04(水) 00:21:50
>>528
お前の言ってる事は筋が通ってるから、>>527の戯言は許してやれ。

531 :デフォルトの名無しさん:2006/10/04(水) 02:27:06
シンボル名って何ですか?


532 :デフォルトの名無しさん:2006/10/04(水) 12:58:55
os:windows XP
言語はCでお願いします。

コマンドプロンプトを開きます。
C:\Documents and Settings\Owner>cd "\Program Files\TagLocator2005\Sample\bin"
C:\Program Files\TagLocator2005\Sample\bin>LpsRecvSample /C:1 9876 1000 1 1
*** SPACEキー押下で受信開始/終了 *** _/*ここでスペースを押します。*/
*** 受信開始 ***
_/*ここから1時間後にもう一度スペースを押す。*/
*** 受信終了 ***
*** 平均受信0件/秒 ***
以上の操作をプログラムで自動的にやりたいです。




533 :デフォルトの名無しさん:2006/10/04(水) 13:01:53
>>532
プログラム作成依頼か?ならお断りだ。

534 :デフォルトの名無しさん:2006/10/04(水) 13:05:46
>>532
「以上の操作」のどれをプログラムでやりたいんだ?
まさか、プログラムでスペースキーを押したいだけか?

535 :デフォルトの名無しさん:2006/10/04(水) 13:35:21
>>534
以下の操作すべてです。
@コマンドプロンプトを開く。
AC:\Documents and Settings\Owner>とでたら
Bcd "\Program Files\TagLocator2005\Sample\bin"と入力。
CC:\Program Files\TagLocator2005\Sample\bin>とでたら
DLpsRecvSample /C:1 9876 1000 1 1と入力。
E*** SPACEキー押下で受信開始/終了 *** とでたらスペース入力。
F1時間後にもう一度スペース入力。
このような操作です。
お願いします。


536 :デフォルトの名無しさん:2006/10/04(水) 13:42:25
…(スペース入力が微妙だけど(リダイレクトで済めば)) バッチファイルでいけないか?

537 :デフォルトの名無しさん:2006/10/04(水) 16:14:28
「自動的にやりたい」からなんだ?
何を「お願い」してるんだ?

538 :デフォルトの名無しさん:2006/10/04(水) 17:00:37
DLLに関しての質問です、色々とgoogleで検索しても具体的な答えが見つからなかったので(汗
関数呼び出し規約に関してですが、__cdeclはC/C++の標準規約、__stdcallはWindowsAPIの標準規約とあります。
で、DLLから呼び出せるようにする関数は__stdcallにしておくべきとありますが、__cdeclでも問題はないのでしょうか?
勿論、C/C++から呼び出す事のみを前提にした場合の話ですが…どなたか、教えて頂ければと(礼

539 :デフォルトの名無しさん:2006/10/04(水) 17:03:20
(汗
(礼

特にこの表現が気に食わない

540 :デフォルトの名無しさん:2006/10/04(水) 17:07:15
>>539
お前はうつ病だろ。速く死ねよ!

541 :デフォルトの名無しさん:2006/10/04(水) 17:08:41
速く死ねワロスwwwwwww

542 :デフォルトの名無しさん:2006/10/04(水) 17:09:12
速く死ぬ姿を想像したら笑った

543 :デフォルトの名無しさん:2006/10/04(水) 17:10:44
素早く、腹をかっ切るんだろうな。
ところで、おまえの神経質はキモイ。
早く死んでくれないか?

544 :538:2006/10/04(水) 17:10:57
>538
ありがとうございます
>540
お前誰だよw

545 :538:2006/10/04(水) 17:11:29
訂正:>538→>539

546 :デフォルトの名無しさん:2006/10/04(水) 17:12:00
>>538
呼び出される側がDLLをまたぐなら、__stdcallにしとけ、スタックがおかしくなるぞ。
DLL内なら、好きにしる。

547 :デフォルトの名無しさん:2006/10/04(水) 17:12:14
いや、>>538の方がキモイ。

おまえ、もう初潮は来たか?

548 :デフォルトの名無しさん:2006/10/04(水) 17:12:16
訂正しなくていいと思うよ

549 :538:2006/10/04(水) 17:15:04
>546
ありがとうございます、という事はDLLからの可変長引数な関数は呼び出し不可でしょうか?
DLL・EXE側共にC/C++なら__cdeclで渡せると思ってましたorz

>547
秘密です

>548
勘違い防止用です

550 :デフォルトの名無しさん:2006/10/04(水) 17:16:09
>>544-545
おまえも速く死ねよ。

551 :デフォルトの名無しさん:2006/10/04(水) 17:18:36
>>549
だから、お前はしつこいんだよ。
しつこいとまた神経質な奴が出て来るぞ!!

552 :デフォルトの名無しさん:2006/10/04(水) 17:20:18
>>551
だから、お前はしつこいんだよ。
しつこいとまた神経質な奴が出て来るぞ!!

553 :デフォルトの名無しさん:2006/10/04(水) 17:21:03
昨日からC++関連スレに在日朝鮮人と思われる粘着質が
出没しております。注意!!

554 :デフォルトの名無しさん:2006/10/04(水) 17:24:06
>>553 自分のことをここで晒すな。

555 :538:2006/10/04(水) 17:28:08
自己解決致しました、荒らしの発端になったようですみません。
ちなみに私のレスは>538と>544、>549とこのレスのみです。

ttp://www.ne.jp/asahi/hishidama/home/tech/vcpp/dllusage.htmlの記述によりますと、
「他言語からもこの関数を呼び出したい場合は__stdcallにする必要がある」とありますので、
C/C++からの呼び出しに限れば__cdeclは使えそうです(とはいえ、明示されてないのが気になりますが)



556 :デフォルトの名無しさん:2006/10/04(水) 17:28:14
>>546
user32.dll に wsprintf(A/W) がいて __cdecl 呼び出しの export できていているのだが…

「呼び出される側がDLLをまたぐ」 ということが具体的にどういうことを指してる?
 DLL側のコード生成時に前提している呼び出し規約と
 DLL関数呼び出し側で把握している呼び出し規約とが一致してないなら
スタック壊しそうだけど

557 :デフォルトの名無しさん:2006/10/04(水) 17:39:05
>>555
ここで質問するぐらい気にしているし、
お前はググッて調べたんじゃなかったのか?

後だしジャンケンは本当に嫌われるんだよなぁ。
ほんとキモイから、家で引きこもりやってろ!な!

558 :デフォルトの名無しさん:2006/10/04(水) 17:44:34
>>557はキモイ引きこもりに決定!な!

559 :デフォルトの名無しさん:2006/10/04(水) 17:46:45
お前ら迷惑なんだけど?

560 :豊臣秀吉:2006/10/04(水) 17:54:05
自作自演乙

561 :デフォルトの名無しさん:2006/10/04(水) 18:16:26
cout と printf って使い分けるの。・?

562 :デフォルトの名無しさん:2006/10/04(水) 18:18:00
すみません。
Borland C++ コンパイラ 5.5.1使っています。
テキストファイルを一括して変数に取り込みたいのですが、
よくわかりません。
何か便利な関数とかないでしょうか?

一行一行を読み込んで、配列に追加していくしかないのでしょうか?

C言語2日目なので巧く質問になっていなかったらごめんなさい。

563 :デフォルトの名無しさん:2006/10/04(水) 18:19:08
自分はC++かCかで使い分けている。
ただ、coutは可変個機能が無いので、
stdargを使って自前に作っているが。

564 :デフォルトの名無しさん:2006/10/04(水) 18:47:44
while (何かの条件) {
char string[256];
string = ・・・何かの処理・・・
・・・以下略・・・
}

こんな感じでwhileの中に配列の宣言を入れていると
メモリをどんどんと食って行くのでしょうか?


565 :デフォルトの名無しさん:2006/10/04(水) 18:49:16
行きません。

566 :デフォルトの名無しさん:2006/10/04(水) 18:53:26
ループ毎にstringが確保、解放されていく
実際は最適化によって確保部分がループの外に出されて
使いまわされてるかもしれない

567 :564:2006/10/04(水) 18:56:06
わかりました。
回答をありがとうございます。

568 :デフォルトの名無しさん:2006/10/04(水) 21:03:15
Borland のCコンパイラ 5.5.1を使っています。

char str[] = "我輩は猫である。";

とすると配列の長さをあわせてくれますが、

char *s;
s = (char *)malloc(100);
strcpy (s, "我輩は猫である");

この、文字列の長さに合わせて配列の長さを宣言したいのですが、
どうしたらよいでしょうか?

char str[] = s; とか char str[strlen(s)+1]; とかしても
型が変換できないというエラーが出るものでわかりません。

569 :デフォルトの名無しさん:2006/10/04(水) 21:08:16
>>568
配列のサイズはコンパイル時に定まっている必要がある。
変数sが指す文字列の長さはコンパイル時に分からないのだから無理。
(配列でないならmalloc(strlen(s)+1)とやればいい。)

570 :568:2006/10/04(水) 21:29:43
>>569
ありがとうございます。
配列の可変は無理なんですね。
C++ならば標準ライブラリにvectorというのを見つけて
良さそうだったのですが、ちょっと頭が追いついていません。

mallocやreallocを使ってポインタ操作でいきたいと思います。

回答をありがとうございました。

571 :デフォルトの名無しさん:2006/10/04(水) 21:37:44
>>570
そこをなんとかがんばってvectorやstringを使うとかなり楽だyo。


572 :デフォルトの名無しさん:2006/10/04(水) 21:41:53
gccみたいにC99の可変長配列をサポートしてるコンパイラだったら可能だけどね。

573 :デフォルトの名無しさん:2006/10/04(水) 22:08:24
>>570
領域が足りなくなったらreallocというのも非効率だから、文字列長+1で毎回きっちり確保するのではなく
あらかじめ十分な大きさで確保するというのも良いよ。
それなら固定長配列で十分な大きさを用意しておくというのもある。
「十分な大きさ」というのが決められるような用途でないと使えないけど。

こうすれば楽にできるケースもある、というだけのことだから、
reallocが悪いと言ってるんではないので、念のため。
初めのうちは、勉強のためにいろいろなやり方をやってみるのもいいよ。

574 :568:2006/10/04(水) 22:18:53
>>571-573

ご助言をありがとうございます。
C言語をはじめて3日ですので、まずは動くものを作ってから
そのあとに新しいスキルを使って改良などをしていきたいと思います。
実はポインタも何となく理解はしたのですが、まだまだ
考え方が身についていませんので、そっちからやってみたいと
思います。

まだまだ、覚えなきゃいけない基本的な所が多くて大変です。w

575 :568:2006/10/04(水) 23:37:39
char *str = (char *)malloc(sizeof(char)*11);
strcpy (str, "0123456789");
str = (char *)realloc(str, sizeof(char)*17);
strcat (str, "ABCDEF");
printf ("%c\r\n", str[10]);

mallocで領域を確保した変数は配列として使えたんだ。
なんだか、まだまだわからん事ばかりだ・・・。orz

576 :デフォルトの名無しさん:2006/10/04(水) 23:59:05
>>575
printfなどで改行するつもりなら、\rは要らないぞ。
Cでは\nが改行を表す。

実際の改行コードが\nでない環境(Windowsなど)では、
外部との入出力時に変換がなされる(テキストモードのとき)。

577 :デフォルトの名無しさん:2006/10/05(木) 02:11:11
質問させてください。

charの配列の中に、全角半角の英字数字漢字からなる文字列
char str{30] ="あ1いa2うA";

があったとき、この文字列の中から、
「全角半角英数字を取り出し、すべて半角英数字」にしたい
#上記の例であったとき取り出したい文字列は、"1a2A"です。

チェックする文字列が、半角のみや全角のみであれば
文字コードで見れそうなのですが、
半角と全角がランダムに混じっている文字列をチェックする方法がわかりません。

そのようなことができるメソッドなどあれば、ご教授ください。

578 :デフォルトの名無しさん:2006/10/05(木) 02:56:23
>>577
悪い、そんな便利なメソッドは標準には無い。
頭からスキャンして、半角か全角か判定した上で、
全角英数字をおもむろに手で変換してしまえ。
何、大した手間じゃない。

579 :デフォルトの名無しさん:2006/10/05(木) 03:15:09
質問です。

クラス(あるいは構造体)においてコピーコンストラクタと代入演算子は定義せずともコンパイラが自動的に作成してくれます。
その際のコピーコンストラクタ及び代入演算子が、どのように作られるのかが分かりません。
色々と調べてみた結果、

コピーコンストラクタ
・メンバがクラスなら、クラスのコピーコンストラクタを使う
・それ以外(組み込み型)なら、ビットを全てコピーする

とありました。代入演算子も、同じ考え方で良いのでしょうか?

580 :デフォルトの名無しさん:2006/10/05(木) 10:10:13
代入演算子は
・メンバがクラスなら、クラスのoperator=を使う

581 :デフォルトの名無しさん:2006/10/05(木) 12:23:39
Borland C++ 5.5.1を使っています。
正規表現のライブラリを使ってみようかと思って鬼車をダウンロードしたのですが、
コンパイルでエラーが出ます。
コンパイルの仕方はVCしか載っていないので、コマンドやオプションの違いから
わけがわかりません。

BCCでコンパイルできた方の方法や、参考になるサイトなどを
教えてもらえないでしょうか?
色々なキーワードでぐぐってみましたが、お手上げ状態です。
よろしくお願いします。

cl -O2 -nologo /W3 -DHAVE_CONFIG_H -DNOT_RUBY -DEXPORT /I. /I.. /Foreggnu.obj /
c reggnu.c
process_begin: CreateProcess((null), cl -O2 -nologo /W3 -DHAVE_CONFIG_H -DNOT_RU
BY -DEXPORT /I. /I.. /Foreggnu.obj /c reggnu.c, ...) failed.
make (e=2): 指定されたファイルが見つかりません。
make: *** [reggnu.obj] Error 2

582 :デフォルトの名無しさん:2006/10/05(木) 15:00:53
コマンドプロントを開いて、コンパイルしたいソースファイルがあるフォルダに移動して、
bcc32 hello.cとかやればできるよ。

583 :デフォルトの名無しさん:2006/10/05(木) 15:06:06
初心者はコマンドプロント慣れてないと思うから、支援ソフト入れるか、VC使いな

584 :デフォルトの名無しさん:2006/10/05(木) 16:37:26
クラスの設計の仕方について質問です
次の二つのクラスの定義で
どちらが良い、あるいは使い分けなどあるのでしょうか

class NotPointer{
private:
MyClass hoge;
//...
};
ポインタを使わず直接hogeを宣言
hogeデストラクタが呼ばれるので、deleteを気にしないで済む

class Pointer{
private:
Myclass* hoge;
//..
};
ポインタを使ってhogeを宣言
deleteを呼ばなければならない
pimplパターンが使える
hogeをstlコンテナに入れるならこっち?

下のほうが良いような気もするけど、どうもdeleteし忘れが・・

585 :デフォルトの名無しさん :2006/10/05(木) 17:00:00
よく車輪の開発って聞くんですが、いったいなんなのでしょうか?
線形リストや双方向リスト、循環リストを作る事ですか?
もしくわ、リストで使う構造体のメンバ変数の内容に応じた
関数を作ることですか?
それとも全く違うもんなんでしょうか。
どなたか教えていただきたいです。

586 :デフォルトの名無しさん:2006/10/05(木) 17:00:52
>>584
>どうもdeleteし忘れが・・
boost::sared_ptr


587 :585:2006/10/05(木) 17:03:00
間違えました
循環じゃなく環状リストでした。

588 :デフォルトの名無しさん:2006/10/05(木) 17:21:00
>>585 http://d.hatena.ne.jp/keyword/%bc%d6%ce%d8%a4%ce%ba%c6%c8%af%cc%c0

589 :デフォルトの名無しさん:2006/10/05(木) 17:28:35
>>586
ども、実は今ちょうどboostのインストール中です

基本的にポインタ版に書き換えようと思ってるんですが
shared_ptrなどを使うと
非ポインタ版の有利な点ってほとんどないんかなぁ

590 :デフォルトの名無しさん:2006/10/05(木) 18:55:38
typedef void (*FP)( int = 0 );
void func( int ) {
}
int main() {
FP fp = func;
fp();
}

このようにするとtypedefでエラーが発生してしまいます。
関数ポインタを使用するときはデフォルト引数を使用できないのでしょうか?


591 :デフォルトの名無しさん:2006/10/05(木) 19:19:33
typedef void (*FP)( int a= 0 );
やりたいのはこういうこと?
できない予感がするがどうだったっけ?

592 :デフォルトの名無しさん:2006/10/05(木) 19:36:40
8.3.6-3-にそれっぽい事書いてある。
> This means that default arguments cannot appear, for example,
> in declarations of pointers to functions, references to functions,
> or typedef declarations.

593 :デフォルトの名無しさん:2006/10/05(木) 19:54:47
>>591-592
ありがとうございます。
期待するのはfp();でfunc(0);が呼ばれることだったのですが
どうやらできないみたいですね。
ちなみにtypedefの行での変数名は書き忘れでした。
(書いてもエラーが発生しました)

594 :デフォルトの名無しさん:2006/10/05(木) 20:41:17
>>589
>非ポインタ版の有利な点
newする必要がない(スタックに置ける)

595 :デフォルトの名無しさん:2006/10/05(木) 23:22:27
/* >>581 bcc32 regexp0.cpp (regexp0.exeは正規表現にマッチした行のみ表示する) */
#define SIZE 4196
#include <stdio.h>
#include <stdlib.h>
#include <regexp.h>
int main(int argc, char *argv[]) {
 size_t sLength;
 char *p;
 char c[SIZE];
 switch(argc) {
 case 2:
  break;
 default:
  fprintf(stderr, "regexp0 [rR].*p < regexp0.cpp");/* 入力をリダイレクト */
  exit(EXIT_FAILURE);
 }
 TRegexp o(argv[1]);
 for(;;) {
  p=fgets(c, SIZE, stdin);
  if(p==NULL)
   break;

  o.find(p, &sLength, 0);
  if(sLength==0)
   continue;

  fputs(p, stdout);
 }
 return EXIT_SUCCESS;
}

596 :589:2006/10/05(木) 23:32:08
>>594
なるほど。スタックって早いんでしたっけ
とりあえずポインタを通さない分は早くなりそうですね

ただ、スタックだとヒープのように巨大なメモリは取れなさそうですが
軽い、大量に作成するようなクラス向けってカンジでしょうか

597 :デフォルトの名無しさん:2006/10/05(木) 23:37:52
>>596
みたところ、君にはC/C++は向いてないよ。もう止めとけ。

598 :デフォルトの名無しさん:2006/10/06(金) 01:18:27
>>597
みたところ、君にはこのスレは向いてないよ。もう止めとけ。

599 :デフォルトの名無しさん:2006/10/06(金) 02:04:48
>>596
スタックが溢れちゃうのって嫌だよな。

600 :デフォルトの名無しさん:2006/10/06(金) 05:12:58
char c[] = "def";
std::string s = "abc" + (std::string)c;

こんなキャストってやっていいんですかね?
何の問題も無く動くんですけど。

601 :デフォルトの名無しさん:2006/10/06(金) 05:24:51
std::stringにはconst char*を取るコンストラクタがあり、暗黙の型変換があるからキャストできる。
さらに、std::string&を返すoperator+(const char*,const std::string&)もある

602 :デフォルトの名無しさん:2006/10/06(金) 05:28:45
>>601
なるほど。
ところで、なんでstringには、string::to_int()みたいなメソッドってないのでしょうか?
何か実装する上で問題でもあるんでしょうか?

603 :デフォルトの名無しさん:2006/10/06(金) 08:00:42
boost::lexical_cast

604 :デフォルトの名無しさん:2006/10/06(金) 09:27:08
boost使えない人ならstd::stringstream

605 :デフォルトの名無しさん:2006/10/06(金) 11:54:02
別にatoi()でいいじゃん。

606 :デフォルトの名無しさん:2006/10/06(金) 12:00:38
atoiはエラー処理してくんないけどね。

607 :デフォルトの名無しさん:2006/10/06(金) 12:10:58
strtol()なら検出できるけど。
#そこまでするならboost使うか。

608 :デフォルトの名無しさん:2006/10/06(金) 13:02:25
初心者ですよろしくお願いします。

#include <stdio.h>

int main(void)
{
FILE *fp;

int a;
a = 1;

fp=fopen("test.txt","w");

fprintf(fp,"%d\n",a);

fclose(fp);

return 0;
}


ファイルが無い状態で test.txt を作り 1 を書き込めたのですが
繰り返し処理は勉強しますので、
fopenの 1.txtの部分を変数にして 1.txt 2.txt 3.txt ・・・とすることが出来ますか?
aの数字と同じ名前のファイルを作りたいのです。

1.txt 内容 1
2.txt 内容 2
3.txt 内容 3
こんな感じです。
fopenって変数使えませんか?

609 :デフォルトの名無しさん:2006/10/06(金) 13:09:30
#include <stdio.h>

int main()
{
FILE *fp;
int a;
char fname[16];

for (i = 0; i < 3; i++) {
sprintf(fname, "%d.txt", a);
fp = fopen(fname, "w");
fprintf(fp, "%d\n", a);
fclose(fp);
}

return 0;
}

610 :デフォルトの名無しさん:2006/10/06(金) 13:21:56
どうもありがとうございます。

#include <stdio.h>

int main()
{
FILE *fp;
int a,i;
char fname[16];

a = 1;

for (i = 1; i < 5; i++) {
sprintf(fname, "%d.txt", a);
fp = fopen(fname, "w");
fprintf(fp, "%d\n", a);
fclose(fp);
a++;
}

return 0;
}


これで1.txt〜4.txtまで書き込みできました。

611 :デフォルトの名無しさん:2006/10/06(金) 14:10:12
#include <stdio.h>

int main()
{
FILE *fp;
int i;
char fname[16];

for (i = 1; i < 5; i++) {
sprintf(fname, "%d.txt", i);
fp = fopen(fname, "w");
fprintf(fp, "%d\n", i);
fclose(fp);
}

return 0;
}

でいいね。

612 :デフォルトの名無しさん:2006/10/06(金) 14:58:38
>>610
それじゃ1.txtに4回書き込むことにならね?

613 :デフォルトの名無しさん:2006/10/06(金) 15:08:04
教えてください。

Visual C++(3)はじめてのMFCプログラミング
という書籍の例(VC++ 6)をVS2005上で実行しているのですが、

> m_Job.InsertString(-1, "プログラマ");

のようにしてもコンボボックスに項目が追加されません。
m_Jobはコンボボックスに割り付けたCComboboxクラスのメンバ変数です。

VS2005だと、何か他にすることが必要なのでしょうか?

614 :デフォルトの名無しさん:2006/10/06(金) 15:16:33
m_Job.InsertString(-1, _T("プログラマ"));
UNICODEのビルド設定の予感。

615 :デフォルトの名無しさん:2006/10/06(金) 15:22:37
609さんのをそのままやりましたら
未定義のシンボル i と出まして
int に i を追加してやると
0.txt 内容 0 の1つだけ出来ましたので
a = 1; と a++; 入れたんですが

今 a++;を抜いても同じになりました。
いらないみたいですね。

>>611
ありがとうございます。
a 無くても出来たんですね。

616 :デフォルトの名無しさん:2006/10/06(金) 15:26:45
>>614
ありがとうございます。
文字セットは設定なしでプログラミングするようにしています。

解決しました。 コンボボックスの展開したときの大きさが小さく、
項目が追加されていたのが見えないだけでした……。
お騒がせしました。

617 :デフォルトの名無しさん:2006/10/06(金) 16:13:14
C++でダイアログベースでプログラムを作っています。
プリクリエイトウィンドウが動いていないみたいなのですが、ダイアログベースでは使えないのですか?

618 :(^-^) ◆MONSOON/qo :2006/10/06(金) 17:08:10
すみません
初心者なんですがwindowsプログラムっていうのはどうやれば良いですか?
メニュー出して処理したいんですが

619 :デフォルトの名無しさん:2006/10/06(金) 17:59:50
http://www.kumei.ne.jp/c_lang/

620 :デフォルトの名無しさん:2006/10/06(金) 18:02:03
出力結果の値が 1.#INDってなるんですがこれってどういう意味ですか?

621 :デフォルトの名無しさん:2006/10/06(金) 18:08:01
>>620
ttp://msdn2.microsoft.com/ja-JP/library/0ecbz014.aspx

622 :620:2006/10/06(金) 18:14:57
>>621
解決しました
ありがとうございます

623 :デフォルトの名無しさん:2006/10/06(金) 22:21:54
char *srting;
while (何かの条件) {
string = (char *)realloc(何かの計算);
string = ・・・何かの処理・・・
・・・以下略・・・
}

 こんな処理を続けていけば、メモリが細切れで使われて効率が
悪く、消費しているメモリがどんどん増えていくのでしょうか?
 Win95/98とWinNT系ではメモリの管理が違うと聞きますが、
それによって違いなどが出てくるでしょうか?

 確かめる方法が思い浮かばないので、どなたかお教えください。

624 :デフォルトの名無しさん:2006/10/06(金) 23:00:26
>>623
VC使ってるなら_CrtDumpMemoryLeaks
他は知らない

625 :デフォルトの名無しさん:2006/10/06(金) 23:08:43
メモリのフラグメント対策:

こいつのC版みたいなのを昔公開してたけど、
boostで同じようなのを出してきた。

http://www.boost.org/libs/pool/doc/concepts.html

626 :デフォルトの名無しさん:2006/10/06(金) 23:54:11
>>624-625
回答をありがとうございます。
Wikipedia(Malloc)ではOSに依存するが、性能が低下したり
メモリ確保に失敗する可能性が高くなると書かれていました。
http://ja.wikipedia.org/wiki/Malloc

覚えたてで考えるのが面倒なため、reallocを頻繁に使うような
ルーチンを組んでいましたが、少し考え直したいと思います。

627 :デフォルトの名無しさん:2006/10/07(土) 01:29:33
入門者で質問させていただきます。
MicrosoftのVisualStudioっていうものはコンパイルから実行までそれ一つで出来るんですか?
ボーランド社のものとかっていうのは用意しなくてはいいんでしょうか?

628 :デフォルトの名無しさん:2006/10/07(土) 02:09:51
>>627
MS社製のコンパイラも付属しているから安心して良いよ。


629 :(^-^) ◆MONSOON/qo :2006/10/07(土) 02:11:23
>>627
ボーランドでもMicrosoftでもコンパイルすれば
ほとんどどのWindowsに持っていっても実行できるよ



630 :デフォルトの名無しさん:2006/10/07(土) 02:41:34
まあ、素直にVC使っときなさい。
C、C++と一口に言うが、実作業の効率はIDEへの慣れなんかも含まれるもの。
ならば潰しの利くメジャーな環境を使うのが吉に決まってる。
VCなら、一部の例外除けば大体において最適化性能とかでもBCに勝ってるし、
当然ながら他のMicrosoftのSDK類との親和も高い。

631 :(^-^) ◆MONSOON/qo :2006/10/07(土) 02:49:21
>>630
学習用にはボーランドがいいよ コンパイルが速いし

632 :デフォルトの名無しさん:2006/10/07(土) 03:39:52
ずぶの素人です。
株取引のシステムを作るためにC#の学習を始めようと思います。
その前に、サンプルのシステムのプログラムを現時点でどう解釈しているか、
アップして添削してもらっていいですか????
勉強のとっかかりがないもので…

633 :デフォルトの名無しさん:2006/10/07(土) 03:43:30
>>632
甘えんな。金払って学校行け。

634 :(^-^) ◆MONSOON/qo :2006/10/07(土) 03:47:34
>>632
ここでもやってるよ


★★★自動売買ソフトを作ろうぜ★★★ Part12
http://live19.2ch.net/test/read.cgi/stock/1159246240/

635 :デフォルトの名無しさん:2006/10/07(土) 06:40:17
Visual C++ 2005 Express Editon でHELP希望です
UNICODE関係なのですが、W32コンソールアプリです

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
#ifdef _UNICODE
 printf("_UNICODE defined\n");
#endif
 _tprintf(_T("あいうえお\n"));
 _tprintf(_T("abcde\n"));
 getchar();
 return 0;
}
----結果----
_UNICODE defined
abcde
--------
「あいうえお」が表示されないです
解決方法知ってる人教えてください

636 :デフォルトの名無しさん:2006/10/07(土) 07:47:07
>635
setlocale(LC_ALL, "");
でとりあえず日本語が表示されるようにはなる。

が、副作用で wcout が壊れる VC2005 のバグはどうやれば回避出来るんだろ?
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7

637 :デフォルトの名無しさん:2006/10/07(土) 09:53:36
正直C++のlocaleと、そのiostreamの仕様は腐っているとしか思えない。
あんなものなら、無いほうがまだまし。
というかなぜロケール外の文字は無効にするんだろう。
余計なお世話という気がしてならない。

638 :デフォルトの名無しさん:2006/10/07(土) 09:54:41
SP1ベータで直ってるんじゃない?

639 :至福:2006/10/07(土) 10:03:58
はじめまして

C言語で素数列挙プログラムをつくっているのですが
高速にするためには剰余計算を
足し算(もしくは引き算)で行うようにするといいと言われました

いったいどのようなアルゴリズムで剰余計算を加算(or減算)で
おこなえるのでしょうか?

640 :デフォルトの名無しさん:2006/10/07(土) 10:08:37
マルチ乙

641 :(^-^) ◆MONSOON/qo :2006/10/07(土) 10:43:57
50%7=50-7-7-7-・・引けなくなるまで続けた残り

642 :(^-^) ◆MONSOON/qo :2006/10/07(土) 10:45:33
引き算だと繰り返して判定使うことになるから、50 - 7*(50/7)の方がいいとおもわれ

643 :デフォルトの名無しさん:2006/10/07(土) 12:07:32
あんた馬鹿?

644 :デフォルトの名無しさん:2006/10/07(土) 13:10:07
>>643
まぁまぁ。
俺には 641,642は見えないから、何が書いてあるのか解らないけど、もちつけ。


645 :デフォルトの名無しさん:2006/10/07(土) 13:16:40
>>639
質問の後半は A%B よりも速い剰余計算ってことだよね。
余程の馬鹿コンパイラじゃない限り難しいんじゃないの?
"素数列挙"ってあるから普通のintとかじゃ無いのかも知れないけど。

質問の前半を見ると、あなたがやるべきことは剰余計算の速度アップ
では無い様に見えるが。

646 :デフォルトの名無しさん:2006/10/07(土) 18:54:43
GC(ガベジコレクト)の特性についてはよく把握してないんだが、
Rubyをコンパイルするときに最適化の影響でオブジェクトが
レジスタにのってメモリ上に存在しないようになると、
GCで回収されなくなるってきいた。
(だからGCCのコンパイルオプションを-O3にするとダメなんだと)

今、Bohem GCを使ったソフトをコンパイルしてるんだが、
最適化オプションは最強にしない方がいいんかな?

647 :デフォルトの名無しさん:2006/10/07(土) 20:59:02
Visual Studio.2003 をつかっていてfloat型の256*256の配列をいくつか宣言して
実行時に強制終了するのは何故なんでしょう?
3個の場合は問題なくて5個のときは駄目でした。

648 :デフォルトの名無しさん:2006/10/07(土) 21:01:35
スタックサイズの不足。動的確保するかstaticで宣言するかリンカオプションでスタックサイズを変更する。

649 :デフォルトの名無しさん:2006/10/07(土) 21:02:45
>>647
スタックがあふれたんじゃね?
いまどきはそれほど気にするほどのものでないけど、
デカめの配列はヒープに確保するのが普通。

650 :デフォルトの名無しさん:2006/10/07(土) 21:44:46
>> 648-649
ありがとうございます。動的確保をやってみます。

651 :635:2006/10/07(土) 23:38:42
>>636 とりあえず日本語表示できました。ありがとうございました。

652 :(^-^) ◆MONSOON/qo :2006/10/08(日) 03:11:56
すみません
質問なんですが
数字のnビット目が1なら1を取り出すにはどうしたらいいですか?
なるべく計算コストがかからないやつが良いです

653 :デフォルトの名無しさん:2006/10/08(日) 03:17:57
X >> n & 1

654 :デフォルトの名無しさん:2006/10/08(日) 03:19:34
>>652
「やりたいこと」はわかったから、「やったこと」と「どうなったのか」を頼む。

655 :(^-^) ◆MONSOON/qo :2006/10/08(日) 03:19:43
>>652
どうもありがとう

656 :デフォルトの名無しさん:2006/10/08(日) 04:42:25
g++って三項演算子をちゃんと扱えてない気がするんだけどどうですか?

pc.reset(id == 0 ? new aaa(0, "Aaa"):
     id == 12 ? new aaa(12, "Aaa"):
           new bbb(id) );
みたいなかんじなの

657 :デフォルトの名無しさん:2006/10/08(日) 05:20:04
>>656
new aaa と new bbb じゃ型が違うからダメなんだろ。

658 :デフォルトの名無しさん:2006/10/08(日) 11:37:49
文字列から一行分を取り出すgets見たいな関数って標準でありますか?

659 :デフォルトの名無しさん:2006/10/08(日) 11:40:03
>>658
getline

660 :デフォルトの名無しさん:2006/10/08(日) 11:47:13
>>659
速攻でのお答えありがとうございます。
説明不足で申し訳ありませんでした。
でも、ファイルからではなく文字列ポインタから取り出すような
関数ってないでしょうか?

661 :デフォルトの名無しさん:2006/10/08(日) 11:48:45
sscanf(文字列, "%[^\n]", 取り出した文字列を格納する場所をさすポインタ);

662 :デフォルトの名無しさん:2006/10/08(日) 11:51:28
>>660
strstreamに一旦入れればいいんでね?

663 :デフォルトの名無しさん:2006/10/08(日) 11:52:13
findでいいじゃん。
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
int main(){
    string s="Hello\nWorld";
    string s2(s.begin(),find(s.begin(),s.end(),'\n'));
    cout<<s2<<endl;
}

664 :デフォルトの名無しさん:2006/10/08(日) 11:59:04
>>661-663
回答をありがとうございました。
勉強をはじめたばかりで、標準の関数ですっきりと
表記できないかと思い質問をしました。

勉強になりました。

665 :デフォルトの名無しさん:2006/10/08(日) 14:12:55
strstreamよりstringstreamの方が新しいのでオススメ

666 :デフォルトの名無しさん:2006/10/08(日) 15:02:28
VC2005を使用。

int foo;
//...fooに対する演算
int bar[foo];//ここでコンパイルエラー

配列宣言の添え字には定数式が必要だと怒られてしまう。
任意の領域の分だけ確保したいんですが、どうすれば良いですか。

667 :デフォルトの名無しさん:2006/10/08(日) 15:11:20
何と言うことだ・・・。
何となく書き込んだら666をgetしてしまった。
不吉極まりない。俺は間違いなく明日死ぬ。

668 :デフォルトの名無しさん:2006/10/08(日) 15:12:07
new使えよ >666

669 :デフォルトの名無しさん:2006/10/08(日) 15:13:10
>>668
了解。

670 :デフォルトの名無しさん:2006/10/08(日) 16:02:44
いや配列なら vector だろ。

671 :デフォルトの名無しさん:2006/10/08(日) 16:19:15
車があるから自転車はいらない。

672 :デフォルトの名無しさん:2006/10/08(日) 16:25:03
そうだな、自転車あるから一輪車いらんしな

673 :デフォルトの名無しさん:2006/10/08(日) 16:33:31
一輪車があるから足はいらない。

674 :デフォルトの名無しさん:2006/10/08(日) 16:37:16
>>673
一輪車をこげないぞw

675 :デフォルトの名無しさん:2006/10/08(日) 16:39:59
>>666
gccを使う。

676 :デフォルトの名無しさん:2006/10/08(日) 16:49:19
C/C++があるからアセンブラはいらない。

677 :デフォルトの名無しさん:2006/10/08(日) 17:02:38
newがあるからHeapAllocはいらない

678 :デフォルトの名無しさん:2006/10/08(日) 17:03:24
俺がいるからお前らいらない

679 :デフォルトの名無しさん:2006/10/08(日) 17:05:15
何でvectorよりデフォルトでnewを使おうとするやつらが多いんだろ。不思議。

680 :デフォルトの名無しさん:2006/10/08(日) 17:26:52
new hoge []なんて
最初にC++学ぶときに解説本のサンプルで使って以来
使わないな


681 :デフォルトの名無しさん:2006/10/08(日) 19:02:21
今日があるから明日はいらない

682 :デフォルトの名無しさん:2006/10/08(日) 19:06:23
ジャックハンマー乙

683 :デフォルトの名無しさん:2006/10/08(日) 23:04:54
>679
scoped_array/shared_arrayに入れるのならまだ許せる。

684 :デフォルトの名無しさん:2006/10/08(日) 23:37:44
STLがまともに使えない時代があったからねぇ。
MSDNは、未だに日本語マニュアル提供しないし。

685 :デフォルトの名無しさん:2006/10/08(日) 23:54:50
BCCの話なんだけど、GetOpenFileNameの動作で
ttp://homepage3.nifty.com/aokura/tips/trouble.html
↑この構造体のエラーが起こってます。
けど、同じ環境でやってるのに以前はこんなエラー出ませんで、今回初めてです。
前は別にOSのバージョン指定しなくても出たし・・・。
なぜ今日は出たんだい?という疑問が消えません。エスパーの方助言をください。

686 :685:2006/10/08(日) 23:55:39
あっと環境はwindowsXPです。スレ違いかな?

687 :デフォルトの名無しさん:2006/10/09(月) 00:05:24
エラーメッセージも書いてないようだしESPで回答。
構造体を宣言してるヘッダファイル、複数のファイルからインクルードされてない?


688 :デフォルトの名無しさん:2006/10/09(月) 00:14:34
C++の勉強をしたいのですが、何の本を買ったらいいのでしょうか?
数年前にCをやったことがあります。
あまり覚えていませんけど。
環境はVisual Studio 2005 EE が入っています。


よろしくお願い致します。

689 :デフォルトの名無しさん:2006/10/09(月) 00:18:09
プログラミング言語C++。
マジデ。

690 :デフォルトの名無しさん:2006/10/09(月) 00:18:45
>>688
たくさん。取り敢えずEffective C++/More Effective C++とか、
独習C++とか。

691 :デフォルトの名無しさん:2006/10/09(月) 00:18:51
>>688
Cでどの程度までやったかによる。
C++はCを包含してはいるが、その割合は思ったより小さいぞ。
Cのことなぞ忘れて最初っからC++に関して学べ。

692 :デフォルトの名無しさん:2006/10/09(月) 00:23:17
Accelerated C++とか。

そういやC++ Primerが新しくなってたな。やっぱり厚いけど。

693 :デフォルトの名無しさん:2006/10/09(月) 00:24:14
レスありがとうございます。

>>689

7000円位する分厚いやつですよね?
第3版の。

>>680

独習C++は結構評判がいいらしいですね。
見てみます。

>>691

結城浩氏の入門書を読んだ程度です。
それ以外は読んでいません。



694 :デフォルトの名無しさん:2006/10/09(月) 00:24:59
Cが小さいというか、C++が巨大なんだよな。

以前このスレだかで出た話題では、独習〜系は好みが分かれる様子だった。
俺は個人的には嫌いだけど、合う人もいるのかもしれない。

C++のちゃんとした本っつーと、それこそ「プログラミング言語C++第三版」とかなんだが、
初学者向きとは言いがたい本でもある。
いずれ買うことにはなるとは思うけど。

695 :デフォルトの名無しさん:2006/10/09(月) 00:26:07
いい加減、スレ違いだ
どうして推薦図書スレに行かないのやら…┐( ̄ー ̄)┌

696 :デフォルトの名無しさん:2006/10/09(月) 00:27:53
レスありがとうございます。

>>692

分厚くないのを紹介して頂きたいです。
読みやすいのでしたら、分厚くても構わないんですが。



697 :685:2006/10/09(月) 00:35:35
>>687
あ、すみませんエラーといったのは間違いです、コンパイルは通るんですが
実行時にGetOpenFileNameの戻り値がFALSEになっちゃうというわけです。
要はOPENFILENAME構造体のlStructSizeへの指定値がまずいのだと思います。
lStructSizeを直接76にしたらちゃんとファイルオープンダイアログが開きましたので。

ただどうして今までは開かなかったのだろう?と疑問に思った次第でして。

698 :685:2006/10/09(月) 00:36:38
今までは開かなかったのだろう? → 今までは開いていたのだろう?

699 :デフォルトの名無しさん:2006/10/09(月) 00:37:37
ポインタと参照の違いを教えてください。
どうしても同じにしか見えないんです。

700 :デフォルトの名無しさん:2006/10/09(月) 00:42:39
中身は同じ。
一番重要なポイントは参照は必ず初期化されなければならないってことかな。
NULLチェックが入らなくなるから重宝するかも。

あとはコードの見ための違いね。

701 :デフォルトの名無しさん:2006/10/09(月) 00:42:41
>>699
見えないものをいくら説明したって見えるようにはならんよ。

702 :デフォルトの名無しさん:2006/10/09(月) 00:43:59
「何も指さない参照」は存在しない、てことでいいのかな。
ポインタの場合はNULL。

703 :デフォルトの名無しさん:2006/10/09(月) 00:44:27
>>702
よい。

704 :699:2006/10/09(月) 01:19:22

レスどうもです。

なんとなくわかったような・・・です。
ポインタを勉強し直した方が良さそうですね。

ありがとうございました。


705 :デフォルトの名無しさん:2006/10/09(月) 01:25:43
あとは、参照は何を指すかが初期化時に決まってそれ以降は変更できないけど、
ポインタは何を指すかを好きなように変更できる。何も指さないのもあり。
ポインタの演算で、連続して配置された同じ型のデータをあれこれ指し示すことも可能。

706 :デフォルトの名無しさん:2006/10/09(月) 01:38:11
>>684
過去(VC6のころ)は提供してた。
なんで英語になっちゃったんだろう?

707 :デフォルトの名無しさん:2006/10/09(月) 01:57:16
>>697
今まではどこかで偶然_WIN32_WINNTが適当に定義されていたのでは?

ところでNT系専用のプログラムを作るのではない場合、
個人的には_WIN32_WINNTを0に定義するのがおすすめ。

>>706
つい最近までWebでも見れた(ググれば見つかった)のだが、とうとう消えてしまった。

708 :デフォルトの名無しさん:2006/10/09(月) 02:01:27
>>706
まだ規格がきっちり決まっていない頃に実装されたSTLを元にしたマニュアルで、
古くなりすぎて切り捨てたのでは?

709 :デフォルトの名無しさん:2006/10/09(月) 02:30:52
たしかにあそこにはドラフトを基にしていると書かれていた覚えがある。

710 :デフォルトの名無しさん:2006/10/09(月) 14:34:19
今まで_itot_sのような関数のバッファ指定には
_itot_s(774, args ,sizeof(args)); ってやっていたのですが、argsの型がcharからwchar_tになると
文字列長<関数に渡すバイト数 となってあぼんしてしまいます。

こういう関数へのバッファ指定というのは、変数の宣言した長さで直接
_itot_s(774, args, 260); とするのが普通なんでしょうか?
長ったらしくても sizeof(args) / sizeof(args[0]) とか指定するの普通?

711 :デフォルトの名無しさん:2006/10/09(月) 16:12:38
ポインタは常に0がセットされていないことを確認することって、本に書いてあるがそれは、なぜ?

712 :デフォルトの名無しさん:2006/10/09(月) 16:12:41
意味的にsizeof(args) / sizeof(args[0]の方が分かり易いと思う。
配列の要素数を求める関数テンプレートって、標準かboostになかったっけ?

713 :デフォルトの名無しさん:2006/10/09(月) 16:24:01
>>710
>文字列長<関数に渡すバイト数 となってあぼんしてしまいます。
3引数を取る _itot_s の仕様をよく確認してみると隠者内科医?

まあそれはともかく
>_itot_s(774, args, 260); とするのが普通なんでしょうか?
数字を直書きは普通しない。BUF_SIZE みたいな識別子を使うのは普通。
sizeof/sizeof も普通。C++ だと template の推論機能で同じことが出来る。
C++版 _itot_s がバッファ長を必要としないのはこの機能を使っているから。

714 :デフォルトの名無しさん:2006/10/09(月) 16:43:48
free() によって開放されたメモリ領域へ
アクセスするバグを南斗言いますか?

715 :デフォルトの名無しさん:2006/10/09(月) 16:44:58
>>712-713
なる。勉強になります。
確かに、標準関数だとバッファ長求めないものがありました。
WinAPIだと必須ですけどsizeof/sizeofも単純な
マクロかtemplateで書けるようなのでそっちにすべきですね。

>関数に渡すバイト数
渡すのは文字単位ダネ

716 :デフォルトの名無しさん:2006/10/09(月) 16:46:02
オーバーラン (Overrun)?

717 :デフォルトの名無しさん:2006/10/09(月) 16:53:04
>>714
不正アクセス

718 :デフォルトの名無しさん:2006/10/09(月) 19:54:26
>>714
開放済み領域への不正アクセス

719 :デフォルトの名無しさん:2006/10/09(月) 20:13:01
>>714
AV

720 :デフォルトの名無しさん:2006/10/09(月) 20:17:08
AV!?Adult Video!(;´Д`)ハァハァハァハァ

721 :デフォルトの名無しさん:2006/10/09(月) 20:26:05
Access Violation

722 :デフォルトの名無しさん:2006/10/09(月) 20:26:50
>>721
マジレス、かっこわるい

723 :デフォルトの名無しさん:2006/10/09(月) 23:10:10
関数ポインタの使用用途がわかりません。
教えてください。

724 :デフォルトの名無しさん:2006/10/09(月) 23:16:13
>>723
コールバックのことが多いかと。

725 :デフォルトの名無しさん:2006/10/09(月) 23:18:59
>>723
qsort(), bsearch()のマニュアルページでも参照してください。

726 :デフォルトの名無しさん:2006/10/09(月) 23:22:03
関数内でmallocで宣言した領域は関数が終わると
freeを使わなくても開放されたと考えていいの?

727 :デフォルトの名無しさん:2006/10/09(月) 23:22:03
HファイルとCppファイルに分ける意味がわからん。


728 :デフォルトの名無しさん:2006/10/09(月) 23:25:39
>>726
いいえ。
>>727
.hに宣言を、.cppに実装を書くと便利な理由があるのです。

729 :デフォルトの名無しさん:2006/10/09(月) 23:25:42
>726
いいえ

>727
そんな貴方におすすめのJava

730 :デフォルトの名無しさん:2006/10/09(月) 23:27:16
>>726

freeを使いなさい。

731 :726:2006/10/09(月) 23:38:51
>>728-730
回答ありがとうございます。
そうだったんですか。

関数の返値に使っているんですが、どうしたらよいでしょうか?
最初に関数外で定義しておくべき?

732 :デフォルトの名無しさん:2006/10/09(月) 23:44:53
>>731
場合による。
あらかじめ必要な容量がわからない場合にはその関数内で確保することも止む無し。
メモリの解放は呼び出し側で行うことをドキュメントに記載せよ。

733 :726:2006/10/09(月) 23:47:16
>>732
了解です。
勉強になりました。
>>728-730>>732回答をありがとうございました。

734 :デフォルトの名無しさん:2006/10/09(月) 23:50:32
int (*(*p()))(int (*[])());

ってなんですか?


735 :デフォルトの名無しさん:2006/10/10(火) 00:04:31
int (*(*p()))(int (*[])());
戻り値がintで引数なしの関数ポインタの配列を引数に取る戻り値がintの関数のポインタのポインタを返す関数のプロトタイプ宣言

736 :デフォルトの名無しさん:2006/10/10(火) 00:04:49
ちょっとした質問なんですが
operator=をprivate宣言したクラスAがあったとして

A a;
A b = a;

としたときbの初期化はコピーコンストラクタによって行われますよね?

737 :デフォルトの名無しさん:2006/10/10(火) 00:05:44
おっとしまった。
戻り値がintで引数なしの関数ポインタの配列を引数に取る戻り値がintの関数のポインタのポインタを返す引数なしの関数のプロトタイプ宣言

738 :デフォルトの名無しさん:2006/10/10(火) 00:26:13
日本語で説明してもらうより、int (*(*p()))(int (*[])());を直見した方が理解が容易い俺は脳内にCコンパイラが入ってるのだろうか。

739 :デフォルトの名無しさん:2006/10/10(火) 00:32:41
そういやエディタに自動インデントも対応括弧強調も無かった頃のLISPプログラマってどうやってたんだろう

740 :デフォルトの名無しさん:2006/10/10(火) 00:35:23
emcas使ってた

741 :デフォルトの名無しさん:2006/10/10(火) 00:44:22
>>734
http://kmaebashi.com/programmer/pointer.html

>>736
そのとおり。

742 :デフォルトの名無しさん:2006/10/10(火) 00:48:13
やっと理解できた。
#include <stdio.h>
int (*(*p()))(int (*[])()); // p is function returning pointer to pointer to function with array of pointer to function returning int returning int
int f(int (*[])());
int (*g)(int (*[])()) = f;
int (**h)(int (*[])()) = &g;
int x();
int y();
int (*a[])() = {x, y};
int main(void)
{
printf("%d\n", f(a));
printf("%d\n", (*g)(a));
return 0;
}
int (*(*p()))(int (*a[])()) { return h;}
int f(int (*a[])())
{
int i = a[0]() + a[1]();
return i;
}
int x()
{
return 1;
}
int y()
{
return 2;
}

743 :デフォルトの名無しさん:2006/10/10(火) 00:50:02
あ、この方がいいな。
printf("%d\n", (**h)(a));

744 :デフォルトの名無しさん:2006/10/10(火) 00:54:19
つか、そんなの理解できる必要は無い

745 :デフォルトの名無しさん:2006/10/10(火) 00:57:01
ややこしい宣言を見ると、無理矢理動くプログラムにしたくなる俺は変態でつか?

746 :デフォルトの名無しさん:2006/10/10(火) 00:59:57
そこでリファクタリングですよ

747 :デフォルトの名無しさん:2006/10/10(火) 01:26:09
typedef int (*arg[])(void) ;
typedef int (**ret)(arg) ;

ret func(void) ;

int (*( *p() )) ( int (*[])() ) ;

int main()
{
  std::cout << typeid(func).name() << std::endl ;
  std::cout << typeid(p).name() << std::endl ;
}

たまたまスレを見たばかりに、30分も暇つぶししてしまった。
なるほどなるほど。

748 :デフォルトの名無しさん:2006/10/10(火) 02:10:41
class使わないでnamespaceだけで書いてる僕は、アホなんでしょうか?

749 :デフォルトの名無しさん:2006/10/10(火) 02:19:23
>>748
関数のみを分類したいならそれでもいいでしょうが、
データを分類したくなると構造体を使いたくなりませんか?
構造体を用意したら、その構造体のメンバをアクセスする関数を作ってカプセル化したくなりませんか?
もし同意できないようでしたら阿呆ですが、同意できるかどうか判断できないのでしたら勉強不足ということですね。

750 :デフォルトの名無しさん:2006/10/10(火) 03:56:04
Cを勉強中の初心者です。
ファイルのオープンに失敗したとかで、強制的にプログラムを終了させたいときに
exitを使いますよね?
参考書によっては、exit(-1)だったりexit(1)だったり、
引数が違うんですけど、何か意味があるんでしょうか?

751 :750:2006/10/10(火) 04:11:23
あわわ…↑の方に書いてありましたね!
スルーしてください。すいませんでした

752 :デフォルトの名無しさん:2006/10/10(火) 08:13:48
ドンマイ

753 :デフォルトの名無しさん:2006/10/10(火) 16:49:06
ファイルを任意の位置から指定した範囲だけ読み取りたいのですが、どうすれば良いんでしょうか。

754 :デフォルトの名無しさん:2006/10/10(火) 16:53:13
任意の位置に移動してから、範囲を指定して読み取るしかあるまい。
特殊なオープンの仕方、とかは無いな。

755 :デフォルトの名無しさん:2006/10/10(火) 17:01:25
>>754
ありがとうございます

756 :デフォルトの名無しさん:2006/10/10(火) 18:14:32
fseek、ftellとかでね。

757 :デフォルトの名無しさん:2006/10/10(火) 18:26:17
ftell()は要らんがな。

758 :デフォルトの名無しさん:2006/10/10(火) 18:30:51
ファイル先頭よりバイト数ではない位置から
バイト数ではない範囲 (読んでみないとわからないようなフォーマットでの勘定とか) とかだと
先頭から逐次読みながら必要かどうか判断しないといけないかも

759 :デフォルトの名無しさん:2006/10/10(火) 21:21:55
最近C++の勉強を始めたんですが、
C++ではクラス名の前には必ず"C"をつけるものなんでしょうか?
つけなくてもコンパイルは通るみたいなんですが。

760 :デフォルトの名無しさん:2006/10/10(火) 21:27:57
構造体に_t付けるようなもの。
好きな名前付けるがよろし

761 :デフォルトの名無しさん:2006/10/10(火) 21:29:09
キモイ命名法だなあ

762 :デフォルトの名無しさん:2006/10/10(火) 21:29:10
昔Microsoftがそういう書き方を推奨してたってだけ
ハンガリアン記法 でググルと吉

763 :デフォルトの名無しさん:2006/10/10(火) 21:45:32
俺はつけない。

764 :デフォルトの名無しさん:2006/10/10(火) 21:55:27
おれも前C付けてたことあったが、
クラスしか使ってないことに気づき、止めた

765 :デフォルトの名無しさん:2006/10/10(火) 22:02:16
長いものには巻かれろってことで、俺は付けてるけどね。
マイクロソフトが長いものかどうかは賛否両論あるだろうが。

766 :デフォルトの名無しさん:2006/10/10(火) 22:07:29
環境はVC++ .Net 2002版です。

char c[256];
int i;
for(i=0;i<256;i++){
c[i]= i;
}
とした結果、c[]の0x81から0x9Fと 0xe0から 0xfcには0が入ってしまいます。
char型には代入できない値があるのでしょうか?

単純に指定した値0〜255を代入したいのですが。

767 :(^-^) ◆MONSOON/qo :2006/10/10(火) 22:09:42
>>766
unsigned charを使おうぜ!

768 :デフォルトの名無しさん:2006/10/10(火) 22:10:08
>>766
unsigned

769 :デフォルトの名無しさん:2006/10/10(火) 22:13:42
i とか dw とかは嫌いだけど、C、g は使うな。たまに p も。

770 :デフォルトの名無しさん:2006/10/10(火) 22:21:48
将来に備えて、
char c[256];

long long c[256];
にしる。

771 :デフォルトの名無しさん:2006/10/10(火) 22:22:32
>>765
そのMicrosoftは.NET Frameworkからハンガリアン記法を捨てていますが。

772 :デフォルトの名無しさん:2006/10/10(火) 22:28:24
766です。レスありがとうございます。
デバッガの変数ウィンドウで確認しているのですが
unsigned charとしても同じでした。
いま組んでいるプログラムで大事な部分なのでショックなのです。


773 :しょう:2006/10/10(火) 22:33:46
色々なサイトに入って行ったら、virtual DAEMON manager V3.47と言うパソコンの右下に出て来てしまい、パソコンを再起動してもデスクトップから消えません。どうすれば消せますか。


774 :デフォルトの名無しさん:2006/10/10(火) 22:36:55
>>772
符号は全く関係ない。
> デバッガの変数ウィンドウで確認
これが怪しい。何を持って代入されてないと思っているのかが。
for(i=0;i<256;i++){

printf("02X\n,(unsigned)c[i]);
}
これでどう表示される?

775 :デフォルトの名無しさん:2006/10/10(火) 22:40:14
>>773
OSを再インストールするかPCを買い換えればいいと思うよ

776 :デフォルトの名無しさん:2006/10/10(火) 22:40:29
>>773
WWWWWwwwwwwwwwwwwwwwwwwww

777 :デフォルトの名無しさん:2006/10/10(火) 23:11:14
>>773
こういうのって釣りだよなぁ。
うむぅ。

778 :デフォルトの名無しさん:2006/10/10(火) 23:16:27
まずさ、
> 0x81から0x9Fと 0xe0から 0xfc
これがさ、まんま Shift-JIS の半角文字コードじゃん
あやしい

779 :デフォルトの名無しさん:2006/10/10(火) 23:16:58
766です

CString str;
str.Format("%02X\n", c[0xe0]);
AfxMessageBox(str)

上記にて確認したところ、値0xE0は正常に入っていました。
デバッガでは値欄に0が入っていたので、悩んでました。
>>774さん、ありがとうございます


780 :デフォルトの名無しさん:2006/10/11(水) 00:25:43
文字列strから、一行毎を取り出してstr2に入れるルーチンを
考えたのですが、もっとエレガントにする方法はないでしょうか?
何となく面倒な方法をとっているような気がするのですが、
これ以外の方法が思いつきませんでした。

よろしくお願いします。
----- ↓ テストしてみたソース -----
#include <stdio.h>
#include <string.h>

main()
{
char str[] = "ABCDEF\nGHIJK\nLMNO"; // 文字列の最後に改行がない可能性もあります
char str2[16]; // 配列を16文字にしているのはこの場合は適当です。
char *s;

while (sscanf (str, "%[^\n]", str2)) {

printf ("%s\n", str2); // 内容確認のための表示です。

s = strstr (str, "\n");

if (s) {
s++;
strcpy (str, s); // strの内容は破壊されて大丈夫です。
}
else break;
}
return 0;
}

781 :デフォルトの名無しさん:2006/10/11(水) 00:28:59
sopen();
sgets();
sclose();

782 :ヒント:sscanf()のフォーマットを工夫すると楽になる:2006/10/11(水) 00:39:38
>>780
取り敢えずいいんでない?
文字列処理にもっとなれてくればもっと手ごろな方法も思いつくだろうけど。
まぁ、strstr()はstrchr()で充分だね。


783 :デフォルトの名無しさん:2006/10/11(水) 01:13:32
>>781
sgetsがあったら良いのにというのは見つけましたが・・・。
すみません、よくわかりませんでした。

>>782
ありがとうございます。
なにぶん、勉強をはじめて一週間ほどですので頭の回転が
追いついておりません。
関数はstrchr()を利用したいと思います。
収穫となるご助言をありがとうございました。


784 :デフォルトの名無しさん:2006/10/11(水) 02:16:46
i=rand()/RAND_MAX,j=rand()/RAND_MAXで選ばれたi,jの2次元配列
grid[i][j]に隣接している配列(grid[i+1][j],grid[i-1][j],grid[i][j+1],
grid[i-1])の最小値をgrid[i][j]に代入するプログラムを作りたいのですが
どうすればよいでしょう?
ちなみに上のは全体がループの中でi,jは毎回選ばれます。grid[i][j]が
の中身が空の時のみくりかえし処理されます。

785 :デフォルトの名無しさん:2006/10/11(水) 03:13:46
> i=rand()/RAND_MAX
0 しか入らないぞ

>ちなみに上のは全体がループの中でi,jは毎回選ばれます。
日本語でおk

>grid[i][j]がの中身が空の時のみくりかえし処理されます。
空ってなに

int g0 = grid[i+1][j];
int g1 = grid[i-1][j];
int g2 = grid[i][j+1];
int g3 = grid[i][j-1];
grid[i][j] = min(g0, min(g1, min(g2, g3)));

でええんちゃう
端のグリッド選んだときに注意な

786 :デフォルトの名無しさん:2006/10/11(水) 03:43:25
ごめん、分かりにくく書いてしまった。つまり、このようなプログラムを書きたいのです。
#define grid[L][L]
clear_grid(i,j,label);   //グリッド全部を0(空)にする関数。grid[i][j]=0
int i,j,n;

i=(int)((L-2)(double)rand()/RAND_MAX+1);//1からL-1までの乱数を用意。
j=(int)((L-2)(double)rand()/RAND_MAX+1);
label[i][j]=1; //最初のラベルは1
largest =1; //最大のラベル。。。最初は1
for(n=2;n<L*L;n++){
i=(int)((L-2)(double)rand()/RAND_MAX+1);//1からL-1までの乱数を用意。
j=(int)((L-2)(double)rand()/RAND_MAX+1);
if(label[i][j]=0){ //でたらめに選んだサイトが空の場合のみ実行
if(label[i+1][j]+label[i-1][j]+label[i][j+1]+label[i][j-1] ==0){//隣のサイトも空の場合
largest=largest+1;  //最大ラベルを更新
label[i][j]=largest;  //最大ラベルをそのサイトに付けます。
}else{    //近隣のサイトが空で無い場合
check_neighbor(...);  //近隣サイトの最小ラベルをそのサイトのラベルにします。
}

という感じのプログラムで、check_neighbor(...)の関数の中身を作るのに
四苦八苦してました。
>>785さん、ありがとう。最後のラインは考えつかなかったです。

787 :デフォルトの名無しさん:2006/10/11(水) 05:24:56
>>785さん、ありがと。
何とか、Percolationのシミュレーションが出来ました。

788 :デフォルトの名無しさん:2006/10/11(水) 10:20:10
アホな質問で申し訳ないのですが、もし宜しければお答えください。
簡単なゲームを作るとして、メーン関数、描画関数、入力関数とファイル分割して
作成しようとし、描画関数と入力関数とで共用して使う変数Aは何処で
どう宣言すればいいのでしょうか?


789 :デフォルトの名無しさん:2006/10/11(水) 10:31:24
extern

790 :デフォルトの名無しさん:2006/10/11(水) 10:45:16
printfで文字を表示するのですが、文字の色を指定するのを
簡単にする標準的な関数などはありますか?

791 :デフォルトの名無しさん:2006/10/11(水) 10:46:52
>>790
環境依存である
ANSI標準だと全くないはず

792 :デフォルトの名無しさん:2006/10/11(水) 10:54:23
Cのコンソールで日本語をキーボードから直接入力する方法はありませんか?

793 :デフォルトの名無しさん:2006/10/11(水) 11:08:24
ありますよ

794 :デフォルトの名無しさん:2006/10/11(水) 11:53:07
>>791
ありがとうございました。


795 :デフォルトの名無しさん:2006/10/11(水) 12:05:18
>>793
それを詳しく

796 :デフォルトの名無しさん:2006/10/11(水) 12:15:43
http://pc7.2ch.net/pcqa/

797 :デフォルトの名無しさん:2006/10/11(水) 12:30:24
>>796
いや実行画面で
editboxに入力するような感じでできないかと

798 :デフォルトの名無しさん:2006/10/11(水) 12:37:09
自分のプログラム上でIMEの制御をしたいというのならWinAPIスレへ。
自分で入力する文字列を日本語にしたいというならPC初心者板へ。

どう考えても>>792は後者だろ?

799 :デフォルトの名無しさん:2006/10/11(水) 12:41:00
alt+漢字はダメダメのダメなの?

800 :デフォルトの名無しさん:2006/10/11(水) 12:41:45
自作したい可能性も捨てきれないな

801 :デフォルトの名無しさん:2006/10/11(水) 12:43:50
いや待て、Windows以外かもしれないぞ!

802 :デフォルトの名無しさん:2006/10/11(水) 12:45:01
前者というかそれをコンソールで出来ないかと
入力したローマ字に応じてカナ文字に変えていく事になるんですか?

803 :デフォルトの名無しさん:2006/10/11(水) 12:45:44
いまどき珍しいCUIだったりする?

804 :デフォルトの名無しさん:2006/10/11(水) 12:47:31
何をしたいのかさっぱりわからない

805 :デフォルトの名無しさん:2006/10/11(水) 12:53:05
BCCですがkbhit()とgetc()でローマ字は入力できますよね
それを例えば配列に入れて先頭から'a'なら'あ'、
'k''a'なら'か'を出力みたいな事がもう少し楽にできないものかと

806 :デフォルトの名無しさん:2006/10/11(水) 13:07:36
BCCですがkbhit()とgetch()×2回で日本語入力できます
コンソールへの日本語の入力方法がわからないなら>>796

807 :デフォルトの名無しさん:2006/10/11(水) 13:08:16
getsじゃダメなの?

808 :デフォルトの名無しさん:2006/10/11(水) 13:13:21
もしかしたらかな漢字変換のアルゴリズムについて研究してるのかも

809 :デフォルトの名無しさん:2006/10/11(水) 13:15:05
>>807
適切な板に誘導されてるんだから、誘導された板で聞いてみたら?

810 :デフォルトの名無しさん:2006/10/11(水) 13:15:40
>>806
getch()2回なんてやり方があるんですか。調べてみます
ありがとうございました

>>807
getsから2つ取り込めばできるかもしれませんね・・・。どうもです

811 :デフォルトの名無しさん:2006/10/11(水) 13:28:42
>>807
gets() を推奨するな。
fgets() にしとけ。

812 :デフォルトの名無しさん:2006/10/11(水) 14:41:39
>>810
fgets(buf, 2, stdin)

813 :788:2006/10/11(水) 21:45:12
>>789
レス遅くなりましたが、有難う御座います。

814 :デフォルトの名無しさん:2006/10/11(水) 23:58:35
prinfの中で""を使って
ここは"東京"です。
という風にしたいのですが、どうしたらいいですか?

815 :デフォルトの名無しさん:2006/10/12(木) 00:00:09
>>814
\"

816 :デフォルトの名無しさん:2006/10/12(木) 00:10:05
printf("ここは\"東京\"です。");

817 :デフォルトの名無しさん:2006/10/12(木) 00:13:46
>>815
>>816
ありがとうございます。m(_ _)m

818 :デフォルトの名無しさん:2006/10/12(木) 00:31:20
printf( "%5d",a);
のようにaを5桁表示したい場合なんですが、
この「5」桁というのをマクロで定義しておいて、後から変えたいと思ってるんですが、

#define KETA 5

pritnf( "%KETAd",a);

こんな感じでやったら %K と ETAd に分かれてしまって、うまくいきませんでした。
何か良い方法ありますか?

819 :デフォルトの名無しさん:2006/10/12(木) 00:33:31
>>818
void prt(int KETA, int a){
char s="% d";
if(!(1<=KETA && KETA<=9)) return;
s[1]=KETA+'0';
printf(s,a);
}

ってできたっけ?

820 :デフォルトの名無しさん:2006/10/12(木) 00:34:08
char s=..;

char[] s=..;

821 :デフォルトの名無しさん:2006/10/12(木) 00:35:26
>>818
#define KETA "5"
printf( "%"KETA"d",10); 

#define KETA 5
printf( "%*d,KETA,10); 

822 :818:2006/10/12(木) 00:49:48
>>819
関数にするんですか…なるほど

>>821
そういう方法もあるんですね。
試したらできました!

みなさんありがとうございました!

823 :デフォルトの名無しさん:2006/10/12(木) 02:06:17
> 関数にするんですか

おいおい

824 :デフォルトの名無しさん:2006/10/12(木) 02:45:19
どちらに置いてもよい。
どっちかっつーとどっち側寄りどっち側所属なのかをよく考えて、
好きな方に置くとよい。

でもそもそも変数を共通で使いまわすやり方は、きょうびあまり流行らない。
C++なら、メーンのクラスを一っこ書いて、そこから描画と入力を呼び出すようにするとよい。
ファイルを分割した方がいいかは、書いたコードの量と相談して決めるとよい。

よいったらよいぞ。メーン。

825 :デフォルトの名無しさん:2006/10/12(木) 02:53:36
ドウッ!コテッ!


先生!
>>826君がツキやってます!

826 :デフォルトの名無しさん:2006/10/12(木) 04:32:28
月に代わって……やめた。

827 :デフォルトの名無しさん:2006/10/12(木) 06:55:53
ofstreamでファイルに出力する際に、小数点以下の出力する桁数を設定したいのですが、
setprecisionを使おうと
fout<<setprecision(20);
のようにすると、コンパイルできません。
どこのようにすればよいのでしょうか?

828 :デフォルトの名無しさん:2006/10/12(木) 07:47:18
>>827
それではどこが悪いか判断しかねる。
エラーメッセージを張りなさい。

829 :デフォルトの名無しさん:2006/10/12(木) 07:53:05
#include <iomanip>

830 :デフォルトの名無しさん:2006/10/12(木) 07:54:35
iomanipをincludeしてないんじゃね?

831 :827:2006/10/12(木) 08:03:32
thx

832 :デフォルトの名無しさん:2006/10/12(木) 08:30:51
visual C++ 5.0ではビルドできたソリューションやソースがVisual Studio 2005 Express ではビルドできないってことあるんでしょうか?

visual C++ 5.0でかかれたオープンソースがマニュアルに従ってビルドしようと思ってもどうしてもできなくて困ってます.
ヘッダファイルが足りないとかじゃなくて「';'が'&'の前にありません」とか,そういうソースの書き方に問題があるらしくエラーが出てしまうんです.


833 :デフォルトの名無しさん:2006/10/12(木) 08:35:11
クラス名を変更せずに、継承して機能を追加することはできませんか?

834 :デフォルトの名無しさん:2006/10/12(木) 08:46:52
>>832
ある

835 :デフォルトの名無しさん:2006/10/12(木) 08:51:50
>>833
ただ答を言うなら「できる」になるけど、あんたのそれはまず間違いなく
訊きたいことと訊いてることが一致していない。

836 :デフォルトの名無しさん:2006/10/12(木) 08:58:25
>>833
裏側にありそうな話としては
・継承して機能を追加するには、クラス名を変更しなければならない
こういう考え方結構好き

837 :デフォルトの名無しさん:2006/10/12(木) 09:28:02
>>834
visual C++ 6.0ならできたりするんでしょうか?

838 :デフォルトの名無しさん:2006/10/12(木) 10:40:35
「初心者歓迎」っていっても程度があると思う
>814とか>818とか,リファレンスを読めばすぐ解ることまで人に聞くのはいかがなものか

839 :デフォルトの名無しさん:2006/10/12(木) 11:10:16
だと思うならスルーするべきだと思う
答える気もないのに提言をした気になって一人前のつもりになるのはいかがなものか

840 :デフォルトの名無しさん:2006/10/12(木) 11:30:57
>>839やっといち人まんだね。

841 :デフォルトの名無しさん:2006/10/12(木) 11:46:41
>>832
case by case

842 :デフォルトの名無しさん:2006/10/12(木) 12:32:40
>>841
ですかー.
またなんとかやってみます.
どうもありがとうございました.

843 :デフォルトの名無しさん:2006/10/12(木) 13:20:31
template <class Super>
class Foo : public Super
{
};
みたいにやって

Foo<Bar> a; // Barの機能を追加したFoo
Foo<Baz> b; // Bazの機能を追加したFoo

みたいにしたいんですが、SuperからFooのメンバにアクセスするにはどうすれば良いですか?

(私は833とは別人です)

844 :デフォルトの名無しさん:2006/10/12(木) 13:35:31
Super クラスに interface 用の virtual なメソッドが置いてないなら
Super クラスの設計ミスっぽいが…

「this に対して dynamic_cast で 型チェックしながら回す?」のも
そのコードを "Super クラス内で記述する" には、既に継承された子一覧がないと…ムリポ

# Super* なポインタだけど、実体は Foo<Bar>, Foo<Baz> ならやりようはあるんじゃね?

845 :デフォルトの名無しさん:2006/10/12(木) 13:37:41
VC2005を使用しています。
char配列を0xFFFFF確保しようとすると、異常終了してしまいます。
約1MBで異常終了なんですが、本当は15MBくらい必要なんです。
どうしたら良いですか。

846 :デフォルトの名無しさん:2006/10/12(木) 13:38:32
template <template <class> class Super>
class Foo : public Super<Foo>
{
};

としてSuperの中で
static_cast<Foo>(*this)
するといける。

847 :デフォルトの名無しさん:2006/10/12(木) 13:42:25
訂正
template <template <class> class Super>
class Foo : public Super<Foo>
{
};

template <class Derived>
class Bar
{
  void f(){
    Derived& derived = *static_cast<Derived*>(this);
    // derivedのメソッドを呼び出す。
  }
};

これで
Foo<Bar> hoge;
hoge.f();
とするといけるはず。

848 :844:2006/10/12(木) 13:50:36
>>847
かなり複雑な template の使いまわし方だ orz
template<type> で type がさらに template になってるから ややこしいったらありゃしないw

>>843 の意図が微妙だな。
Super のメソッド内記述で Derived へアクセスしたいように見えるけど、 >>847 コードはダメだよね?

849 :デフォルトの名無しさん:2006/10/12(木) 13:51:43
>>845
スタック

850 :デフォルトの名無しさん:2006/10/12(木) 14:00:36
クラス内で複数のメソッドで共有できる定数を使いたいのですが、
どのように書けばよいのでしょうか?


851 :847:2006/10/12(木) 14:09:11
ごめん>>847のコードじゃ通らないやw

このコードは通るけど
#include <iostream>
#include <string>
using namespace std;
template <class Derived>
class Bar
{
  public:
  void f(){
    Derived& derived = *static_cast<Derived*>(this);
    cout << "call method of " << derived.name() << endl;
  }
};

// ここのBarを決め打ちしたくない
class Foo : public Bar<Foo>
{
  public:
  string name(){
    return string("Foo");
  }
};

int main(){
  Foo a;
  a.f();
  return 0;
}

う〜む。

852 :デフォルトの名無しさん:2006/10/12(木) 15:47:41
    char *str;
    str = (char *)malloc(4);
    strcpy (str, "ABC");
    str++;
    printf ("%s", str);
    free (str);

としたときに開放されるメモリはmallocで獲得した領域から?
それとも+1された領域から開放されて、この場合は1バイトが
ゴミとして残るのでしょうか?
それとも開放されないのでしょうか?

    str--;
    printf ("%s", str);
    free (str);
    printf ("%s", str);

をつなげたら次のように表示されました。
BCABC「@


853 :デフォルトの名無しさん:2006/10/12(木) 15:49:56
してはいけない

854 :デフォルトの名無しさん:2006/10/12(木) 15:52:05
何をしてはいけないかを教えてください。

855 :デフォルトの名無しさん:2006/10/12(木) 15:53:16
するなといったらするな

856 :デフォルトの名無しさん:2006/10/12(木) 15:54:31
非NULL で malloc の戻り値でない値に対しての free は動作未定義
ポインタ操作したいなら、ポインタのコピー取っとけ

char* str;
char* p;
p = str = (char*)malloc(4);
p++; とかポインタ操作
 ......
free(str);

857 :デフォルトの名無しさん:2006/10/12(木) 15:55:52
mallocの戻り値以外をfreeしてはいけない。
またfreeしても、使っていたメモリは(たいていは)そこにそのまま残っているが
アクセスしてはいけない。

858 :デフォルトの名無しさん:2006/10/12(木) 15:55:55
アブノーマルな思考ワロス

859 :デフォルトの名無しさん:2006/10/12(木) 15:59:42
>>856-857
malloc の戻り値でない値に対しての free は動作未定義
という事でしてはいけないのを理解しました。
ありがとうございます。

>>858
喜んでいただけて何よりです。(笑)

860 :デフォルトの名無しさん:2006/10/12(木) 16:07:10
動作未定義というのはな、何があってもシランという恐ろしい仕様だ。
OS道ズレで落ちる 〜 何もしない までバリエーションは色々

861 :デフォルトの名無しさん:2006/10/12(木) 16:54:07
>>860
「道連れ(みちづれ)」

862 :デフォルトの名無しさん:2006/10/12(木) 17:19:58
鼻から悪魔

863 :デフォルトの名無しさん:2006/10/12(木) 19:12:32
文字列から数字の変換は
i = atoi(str);
のようにやるみたいなので、文字列の中の一部(必ず2文字目)から0〜9の一桁を取りたいと思い、
i= atoi(str[1]);
とやるとcharからconst char *に変換できませんって言われます。
どうやれば一桁の数字だけを取れるんでしょうか?

864 :デフォルトの名無しさん:2006/10/12(木) 19:16:30
str[1]-'0'

865 :デフォルトの名無しさん:2006/10/12(木) 19:24:26
おお、なるほど。
0のアスキー番号を引けば、欲しい数字になるんですね。
ありがとうございました。

866 :デフォルトの名無しさん:2006/10/12(木) 20:18:50
初心者なら初心者らしく素直に聞いとけと言いたいんだが、自分の意見を
出して反発する初心者には正直うんざりする。

こういう馬鹿が一番学びが遅い。

867 :デフォルトの名無しさん:2006/10/12(木) 20:24:47
賛成しかねるな。

868 :デフォルトの名無しさん:2006/10/12(木) 20:36:19
まぁ、該当者が絶対賛成したがらない意見だからな。

869 :デフォルトの名無しさん:2006/10/12(木) 22:37:27
教えてもらったものを盲目的に受け入れててはいつまでたっても初心者だ。納得するまでいくらでも疑問をぶつけるべきだと思う。
ただし疑問をぶつける先はまずGoogleや書籍などであるべきだな。何でも人に聞こうとするやつはもっと成長しない。

870 :デフォルトの名無しさん:2006/10/12(木) 23:05:00
後の869である。

871 :デフォルトの名無しさん:2006/10/13(金) 00:03:29
宿題まだ?

872 :デフォルトの名無しさん:2006/10/13(金) 00:08:16
残念ながらここは宿題スレではない

873 :デフォルトの名無しさん:2006/10/13(金) 00:13:04
#include <stdio.h>

int main(void);
int main() {
printf("質問まだー\n");

main();
return 0;
}


874 :デフォルトの名無しさん:2006/10/13(金) 00:16:58
>>873
無限ループ乙

875 :デフォルトの名無しさん:2006/10/13(金) 00:20:28
>>874
あんたあふぉ?

876 :デフォルトの名無しさん:2006/10/13(金) 00:30:14
うむ、スタックを消費しきって止まるな。

877 :1/2:2006/10/13(金) 00:51:37
設計について質問させてください

現在、再利用可能にしようと思い、ウィンドウをクラス化してます
次の状態で、ウィンドウA以下を再利用したいんですが
まだ、ウィンドウメッセージのやり取りに関する知識が少なく
どのようにすべきか悩んでいます

メインウィンドウmain
 子ウィンドウchildA (mainと同じサイズ)
  子ウィンドウchildB (childAの左半分に配置)
   自作コントロールCtrlA (childBと同じサイズ)
  子ウィンドウchildC (childAの右半分に配置)
   自作コントロールCtrlB (childCと同じサイズ)

現在、ウィンドウは配置したところまで出来ており
main以下全てのクラスはそれぞれのウィンドウのプロシージャを持ってます

878 :2/2:2006/10/13(金) 00:53:09
childAのプロシージャにchildB&C,CtrlB&Cの関連を記述すれば
childAを他プロジェクトでそのまま再利用できると思ったんですが
例えばCtrlキー+TabキーでCtrlA→CtrlBにフォーカス移動するという処理は
フォーカスがあるCtrlAにウィンドウメッセージが行きますよね
ChildAで情報を管理したいのに
CtrlAにメッセージが行くのでどうやっていいかわからず
手が止まっています
この場合、どうすればchildAでメッセージ処理できるのでしょうか
後言い忘れましたが環境はwindows2000,VC8です
長文ですいません


879 :デフォルトの名無しさん:2006/10/13(金) 01:14:26
>>876
あんたもあふぉ

880 :デフォルトの名無しさん:2006/10/13(金) 01:14:34
>>876
未だにCコンパイラは未到達コードの除去や末尾再帰のループ展開をしないのか?

881 :デフォルトの名無しさん:2006/10/13(金) 01:15:55
>>880
最適化しなきゃそうだろう

882 :デフォルトの名無しさん:2006/10/13(金) 01:19:57
こんなのもできないのかと
思われそうですがファイル名から拡張子を抜くような
処理を作りたいのですがどうすればよいでしょうか・・・

ahoaho.txt → ahoaho

のようにです。

883 :デフォルトの名無しさん:2006/10/13(金) 01:23:30
最後に見つかったピリオドを'\0'に置き換える。
WindowsならそれやってくれるAPIがある。

884 :デフォルトの名無しさん:2006/10/13(金) 01:24:38
char abc[]にahoaho.txtが入っているとする。

*strchr(abc, '.') = '\0';

885 :デフォルトの名無しさん:2006/10/13(金) 01:26:24
あ、見つからないとNULLを返すので

char *p;
if (p = strchr(abc, '.'))
 *p = '\0';

の方がいいか。

886 :デフォルトの名無しさん:2006/10/13(金) 01:26:32
cygwinの更新インストールってそのまま何もいじらないでOK押していけばいいんだよね?

887 :デフォルトの名無しさん:2006/10/13(金) 01:35:02
>884
strchrだと最初のを見るから
hoge.tar.gzとかの扱いはどうなるだろう。

882がhoge.tar.gzからhogeにしたいのかhoge.tarにしたいのかよくわからんけど。

888 :デフォルトの名無しさん:2006/10/13(金) 01:38:18
strrchrだっけ?

889 :デフォルトの名無しさん:2006/10/13(金) 01:57:59
関数に纏めるとこうなるかな。
char * basename(const char * path)
{
if (path == NULL) return NULL;
const char * dot = strrchr(path, '.');
if (dot == NULL || dot == path) return path;
* dot = '\0';
return path;
}

890 :デフォルトの名無しさん:2006/10/13(金) 02:04:00
(゚Д゚;)

891 :デフォルトの名無しさん:2006/10/13(金) 02:05:51
Iteratorが使いにくいです。
Javaの方がいいぞ。

892 :デフォルトの名無しさん:2006/10/13(金) 02:13:12
>>891
そうですか
いい発見ができてよかったですね

893 :デフォルトの名無しさん:2006/10/13(金) 02:19:08
>>892

返信がつまらん。
やり直し


894 :デフォルトの名無しさん:2006/10/13(金) 03:22:04
質問です。nanosleepより短いスリープについてです。

環境:Linux(GCC)

Linuxのタイマの分解能は10msecで、nanosleepの引数
timespecのtv_secに0、tv_nsecに10を入れても10msec+プロセス復帰のための
10msecで合計20msecがスリープの最短だと聞きました。

また同時に、この制限を取り払うハイレゾタイマというのを聞きました。

ぐぐったところclock_nanosleepというシステムコールとlibposixtime.soをリンク
させれば良いらしいというところまでは分かりました。

このclock_nanosleepについて教えて下さい。

4つの引数のうち後半2個はnanosleepと同じだと思いますが、前半二個
特に1個目がどうにも分かりません。

友人はCLOCK_REALTIME_HRでと言ったのですが、未定義になります。
ぐぐるとCLOCK_REALTIMEかCLOCK_MONOTONICしか指定するなと
書いてある気がします。

二個目の引数も良く分かりませんが、二個目はTIMER_ABSTIMEで良いような気がします。


1個目と二個目について何が正しいのかご教授下さい。

895 :デフォルトの名無しさん:2006/10/13(金) 03:44:01
CLOCK_REALTIME_HRは削除された模様。
代わりにCLOCK_MONOTONIC_HRを使用するよろし。

二個目はその通り。
TIMER_ABSTIMEを入れなされ。

896 :デフォルトの名無しさん:2006/10/13(金) 11:38:28
上のfor文と下のwhile文で同じものを作ったつもりなのですが、コンパイルしたら違う値になってしまいました。
作ろうとしたのは0〜100までの偶数を表示するプログラムです。
どこが違うのか教えてください。


#include <stdio.h>

int main<void>
{
int s;

for(s=0;s<=100;s=s+2)
{
printf("%d\n",s);
}

printf("\n");
s=0;
while(s <= 100)
{
s=s+2;
printf("%d\n",s);
}

return 0;
}

Cは本当に始めたばかりの初心者です。お願いします。

897 :デフォルトの名無しさん:2006/10/13(金) 12:08:15
for (初期化部; 継続条件; 更新部) {
複文
}
と等価にするには、
初期化部
while (継続条件) {
複文
更新部
}
とすればよい。つまり、
s = 0;
while (s <= 100) {
printf("%d\n", s);
s += 2;
}
となる。

898 :デフォルトの名無しさん:2006/10/13(金) 12:09:18
while(s <= 100)
{
printf("%d\n",s);
s=s+2;
}

だと思う
Cは本当に始めたばかりの初心者です。実はよく分かりません。

899 :デフォルトの名無しさん:2006/10/13(金) 12:12:31
>int main<void>


900 :デフォルトの名無しさん:2006/10/13(金) 12:32:08
ワロス

901 :デフォルトの名無しさん:2006/10/13(金) 13:34:23
msvcrtd.lib;msvcprtd.libを無視すると randが使えなくなり
無視しないと、別のライブラリと衝突するのです
どうしたらいいですか?


902 :デフォルトの名無しさん:2006/10/13(金) 13:37:45
もるすあ

マルチスレッドDLLをマルチスレッドにしたら良かったン

何故 VCのデフォルトは、マルチスレッドDLLですか?

903 :デフォルトの名無しさん:2006/10/13(金) 13:40:53
>>902
そういう問題ではないと思う。

904 :デフォルトの名無しさん:2006/10/13(金) 13:42:37
ミリ秒時間から乱数を発生させるとか

my_rand(int max)
{
return clock() % (max + 1);
}

905 :デフォルトの名無しさん:2006/10/13(金) 13:48:39
boost::random

906 :デフォルトの名無しさん:2006/10/13(金) 14:19:10
>>897-898
ありがとうございます。できました。

>>899
ここはいつもvoidじゃないんですか?知らずにいつも入れていましたが…
( )と(void)の違いってなんですか?

907 :デフォルトの名無しさん:2006/10/13(金) 14:28:33
丸括弧を使えってこった。タイプミスだろうけど。(というかコピペしろ)
あといつもvoidなわけじゃない。コマンドライン等から引数を取るプログラムは

int main(int argc, char *argv[]){
/* 略 */
}

等となる。

908 :デフォルトの名無しさん:2006/10/13(金) 14:29:15
>>904
そんな君にお勧めな実装

int real_rand()
{
static int x = 0 ;
return x ;
}

もし、アルファ線や中性子線が、たまたまxの部分のメモリにぶつかれば、値が変わる。
これぞ真の乱数といえる。

909 :デフォルトの名無しさん:2006/10/13(金) 14:56:57
頭が痛くなってきた

910 :デフォルトの名無しさん:2006/10/13(金) 15:18:45
>>908
あほか
そんな強い放射線が当たったら、CPUやメモリやチップセットが全部壊れるわ

911 :デフォルトの名無しさん:2006/10/13(金) 15:21:55
マルチスレッドDLLをマルチスレッドにしたら
randつかえたんのんよ

912 :デフォルトの名無しさん:2006/10/13(金) 16:09:15
>>910
いや、まあ、起こりえない確率じゃないんだよ。
ttp://en.wikipedia.org/wiki/Soft_error
宇宙船の影響でね。

913 :912:2006/10/13(金) 16:09:47
×宇宙船
○宇宙線

914 :デフォルトの名無しさん:2006/10/13(金) 16:36:47
#define TMP_SIZE 256

として、文中に

int i = TMP_SIZE-1;

とあった場合、コンパイルの時に“TMP_SIZE-1”の部分は
“255”と最適化される“可能性”はあるのでしょうか?
(コンパイラによりけりという話は置いておくとして)
それとも、こういう時は“256-1”にしておかなければ
いけないなどの決まりなどがあるのでしょうか?

常識なのかもしれませんが、勉強したてで解りません。
調べたサイトなどを見つける事がきませんでした。
すみませんがお教えください。

915 :デフォルトの名無しさん:2006/10/13(金) 16:39:37
最適化も何も、定数の展開・計算はコンパイル時に普通に行われることだが・・

916 :デフォルトの名無しさん:2006/10/13(金) 16:41:43
http://e-words.jp/w/E382BDE38395E38388E382A8E383A9E383BC.html

917 :デフォルトの名無しさん:2006/10/13(金) 16:43:47
>>915
ありがとうございます。
気になっていたモヤモヤが取れました。

918 :デフォルトの名無しさん:2006/10/13(金) 16:51:40
関数の呼び足しにぶつかったら
できのわるい乱数になるなw

919 :デフォルトの名無しさん:2006/10/13(金) 17:12:21
すみません 教えてください
VC6.0+WINです

struct info
{
info ()
{
pBody = new char [255];
}
int iType;
char* pBody;
}

こんな感じで構造体を定義ていおいて
void test (info* p)
{
strcpy (p->pBody,"kk");
}
関数内で使おうとすると例外エラーがでます
これは どのように解決すればよいのでしょうか?
おねがい いたします


920 :デフォルトの名無しさん:2006/10/13(金) 17:16:14
>>907
なるほど、ありがとうございました。

921 :デフォルトの名無しさん:2006/10/13(金) 17:25:16
struct info
{
char* pBody;
info ()
{
pBody = new char [255];
}
int iType;
}

だと思う。
Cは本当に始めたばかりの初心者です。実はよく分かりません。

922 :デフォルトの名無しさん:2006/10/13(金) 17:28:39
info*に実体が無いのでは?

923 :デフォルトの名無しさん:2006/10/13(金) 17:31:01
>>919
構造体宣言の{}の最後に「;」がついてない
あとvoid test (info* p)じゃなくてvoid test (struct info* p)?じゃね?
あと構造体はちゃんとインスタンス化したか?

924 :デフォルトの名無しさん:2006/10/13(金) 17:31:57
擬似乱数でいいならVCのCRTソースをパクってくればいいのに

925 :923:2006/10/13(金) 17:46:50
ごめん
>あとvoid test (info* p)じゃなくてvoid test (struct info* p)?じゃね?
これはいらなかった

926 :919:2006/10/13(金) 18:07:13
ありがとうございます
書式に関しましては申し訳ありません・・

void test (char* p)
{
p = new char [255];
}

この形はできないのは承知してるのですが
これに類する問題なのでしょうか?

void test (char** p)
{
*p = new char [255];
}


927 :デフォルトの名無しさん:2006/10/13(金) 18:13:38
>>919
info* p;
test(p);
上のようにしているならダウト。実体を用意しろ。
info infomation;
test(&infomation);

ここでは、926は関係ない。
あと、pBodyがきちんと解放されるように対策を講ずるべき。

928 :デフォルトの名無しさん:2006/10/13(金) 19:15:32
ダウトって 「間違い」 じゃなくて 「疑惑」 って意味だよな?

929 :919:2006/10/13(金) 19:39:56
>>927
はい 実際はそのようにおこなってます
また、構造体のiTypeに与えてある値はきっちりとれます
開放はデストラクタで行っています
説明不足ですみません。


930 :デフォルトの名無しさん:2006/10/13(金) 19:41:17
>>928
しーーーっ、ちょっとこちに来て、そんなこと、言っちゃだめよ、ヒソヒソ。

931 :デフォルトの名無しさん:2006/10/13(金) 20:16:46
>>919
1.info(){printf("コンストラクタ");} とかしてみて本当にコンストラクタが実行されてるか確認する
2.本当にstrcpy実行時にエラーが出ているのか確認する
3.それだけの情報じゃエラー原因がわからないかもしれないので他の情報もここに書き込んでみる

932 :デフォルトの名無しさん:2006/10/13(金) 20:23:09
cで
FILE *a,*b,*c;
a=fopen("hogehoge1.txt","r");
b=fopen("hogehoge2.txt","r");
c=fopen("hogehoge3.txt","w");

と3つのファイルを開きたいのですがhogehoge3.txtが開けません
c==NULLです

これはアクセスできるファイルの数に限りがあるということですか?

933 :デフォルトの名無しさん:2006/10/13(金) 20:26:35
>>932
3つがMAXということはない


934 :デフォルトの名無しさん:2006/10/13(金) 20:29:58
文字列をクイックソートで並べ替える関数です。
サンプルを移したものなんですが、ときどきバグって変な文字列を返してきます。
どこが悪いんでしょうか?

char *quicksort(char *pa,int len){
char t;
int i,j;
if(len == 2){
if(*pa > *(pa+1)) swap(pa,pa+1);
}else if(len > 2){
t = *(pa+len / 2);
i = -1;
j = len;
while(i < j){
while (*(pa+(++i)) < t);
while (*(pa+(--j)) > t);
if (i < j ) swap(pa + i,pa + j);
else if (i == j){
quicksort(pa,i);
quicksort(pa+i+1,len-i-1);
}else{
quicksort(pa,j+1);
quicksort(pa+i,len-1);
}
}
}
return pa;
}

935 :デフォルトの名無しさん:2006/10/13(金) 20:31:57
>>933
トン。ほかにエラーがあるということですね、調べてみます

936 :デフォルトの名無しさん:2006/10/13(金) 20:42:16
>>935
perror() とか使ってみるといいよ。

937 :デフォルトの名無しさん:2006/10/13(金) 20:58:39
>>934
「ときどき」 って事は、正常に動作する場合もあるんだな?
どんな文字列を与えた時にバグるのか教えてくれ。
それとも、同じ文字列を与えてるのに動いたりバグったりするのか?

938 :デフォルトの名無しさん:2006/10/13(金) 21:22:17
>>932
読み込み専用のhogehoge3.txtが存在しているとか。


939 :デフォルトの名無しさん:2006/10/13(金) 21:23:58
>>934
ここじゃね?
quicksort(pa+i,len-1);
たぶん
quicksort(pa+i,len-j-1);

940 :デフォルトの名無しさん:2006/10/13(金) 21:45:10
>>939
どうもありがとうございます。
ちゃんと動きました。

941 :デフォルトの名無しさん:2006/10/13(金) 23:01:14
>>932
ディレクトリに書き込み権限がないとか。

942 :デフォルトの名無しさん:2006/10/14(土) 00:44:38
「〜はダウト」って使う奴って、かなり昔にはやってたよな。
奴の流行では、時間は昔のまま進んでないんだろうな。

943 :デフォルトの名無しさん:2006/10/14(土) 01:03:55
コード1
#include <stdio.h>
int main(void)
{
int i,ia[6]={2,1,2,3,4,100},*pt=ia;
for(i=0;i<5;i++)*++pt=*pt**pt;
pt=ia;
for(i=0;i<6;i++)printf("%d\n",*pt++);
return 0;
}
実行結果
2
1
4
9
16
10000

944 :943:2006/10/14(土) 01:04:31
コード2
#include <stdio.h>
int main(void)
{
int i,ia[6]={2,1,2,3,4,100},*pt=ia;
for(i=0;i<5;i++)*pt++=*pt**pt;
pt=ia;
for(i=0;i<6;i++)printf("%d\n",*pt++);
return 0;
}
実行結果
4
1
4
9
16
100

945 :943:2006/10/14(土) 01:05:53
コード3
#include <stdio.h>
int main(void)
{
int i,ia[6]={2,1,2,3,4,100},*pt=ia;
for(i=0;i<5;i++)printf("%d\n",*pt**++pt);
return 0;
}
実行結果
1
4
9
16
10000

946 :943:2006/10/14(土) 01:06:36
コード4
#include <stdio.h>
int main(void)
{
int i,ia[6]={2,1,2,3,4,100},*pt=ia;
for(i=0;i<5;i++)printf("%d\n",*pt**pt++);
return 0;
}
実行結果
2
2
6
12
400
Cを勉強し始めてもうすぐで1月になるものですが、質問させてください。
この4つのコードなのですが、ポインタと前置・後置インクリメントを理解するために
作成しました。
コード3までは自分の考え方と実行結果が一致したのですが、コード4の実行結果が
自分の考えと違いちょっと混乱しています。
自分の考えでは
5行目のprintf関数の引数となっている*pt**pt++の「*pt++」の部分が、今回の場合後置インクリメント
なので、*pt * *ptの結果を%dに返した後でpt+1されると思っていましたが、実行結果を見てみると
*pt * *(pt+1)となっているようです。(計算中にすでにpt++の部分が演算されているのかな?)
この結果は前置インクリメントの場合とも違っていていったいどうなっているのかが理解できません。
(前置インクリメントの場合は*(pt+1) * *(pt+1)になると思ってます)
このあたりに詳しい方、なぜこのようになるのかを教えてください。お願いします。


947 :デフォルトの名無しさん:2006/10/14(土) 01:17:16
>>946
> *pt**pt++

鼻から悪魔

948 :デフォルトの名無しさん:2006/10/14(土) 01:20:05
>>946
普通はそんなの悩まないで括弧をつける

前置インクリメントと単項*は左から右へ結合、同じ優先順位
後置インクリメントはそれよりも優先順位が高い右から左への結合
演算子の優先順位で調べてみな

949 :デフォルトの名無しさん:2006/10/14(土) 01:46:03
VC8だと、>>943のケース4の最初の結果が4になった。
>>943の使っているコンパイラの結果のほうが、個人的には分かりやすいのだけれど。

評価順序は、
(*pt) * (*(pt**))
こうだと思うけれどあっているかな。
乗算の左側と右側のどちらが先に評価されるかで、結果が変わると思うのだけれど、
この順序が未定義?

950 :949:2006/10/14(土) 01:46:43
インクリメント演算子typo

951 :デフォルトの名無しさん:2006/10/14(土) 02:25:00
環境 Linux(gcc)

fprintf(stdout, *****)の構文を見る限り、stdoutもある種のFILE*だと思うのですが、
fclose(stdout)って出来ますか?

また、その後別のファイル名でstdout = fopen(別のファイル名,"w")とか出来ますか?

952 :デフォルトの名無しさん:2006/10/14(土) 02:47:04
普通、stdoutとかの再割り当てにはfreopen()を使うような気がする

953 :943:2006/10/14(土) 04:14:57
>>948,949
レスありがとうございます。
>>948
一応カッコをつけなかったのはつけなかったときにどういう動作をするか見てみたかったからです。
優先順位と結合法則については手持ちの参考書に書いてあるのですが、
間接参照の*も++も--もすべて同じ優先順位で右→左の結合(右結合)とかかれていました。
(++と--は前置とか後置とか区別されてませんでした)
たとえばコード1の5行目のfor文*++pt=*pt**ptで考えてみると、
間接参照の*と前置インクリメントが優先順位が高くなりますよね。
で、二つとも右結合だから一番右端の*ptそして乗算*をはさんで左にある*pt、
最後に*++ptの順番に演算していくことになります。つまり
(*(pt+1))=(*pt)*(*pt)
配列のアドレスに直すと、
(*&ia[1])=(*&ia[0])*(*&ia[0])
になり、結果が合いません…。
おっしゃるように「前置インクリメントと間接参照の*は同じ優先順位で左結合
後置インクリメントが前者二つより優先順位が高く右結合」が正しく参考書が
間違えているぽいですね。ただ、同じようにコード1でやってみると、
*++pt=*pt**ptなので
参考書の考え方と同じく優先順位は間接参照の*と前置インクリメントが高くなります。
ただし結合法則が左結合になるため、まず++pt→*(++pt)→代入演算子の右にある*pt
→右端の*ptの順で演算していくとこになります。つまり
(*(pt+1))=(*(pt+1))*(*(pt+1))になって、配列の形にすると
(*&ia[1])=(*&ia[1])*(*&ia[1])になり、結果が合います。
ただこの場合は、式にカッコをつけて*++pt=(*pt)*(*pt)とした場合でも、
実行結果がカッコをつけなかった場合と同じになってしまいます…orz
もうわけがわかりません…

954 :943:2006/10/14(土) 04:16:10
>>949
(*pt)*(*(pt++))の場合
もし乗算演算子*の右側から評価されれば
(*(pt+1))*(*(pt+1))になって
乗算演算子*の左側から評価されれば
(*pt)*(*(pt+1))になるってことでしょうか?
そもそも後置インクリメントは式の値を返した後に代入するものだとおもってました。

955 :デフォルトの名無しさん:2006/10/14(土) 09:33:36
>>953
演算子の優先順位と結合法則から、(*(++pt))=(*pt)*(*pt) となることについての理解は正しい。

>二つとも右結合だから一番右端の*ptそして乗算*をはさんで左にある*pt、
>最後に*++ptの順番に演算していくことになります。

これは正しくない。
右結合というのはたとえば a=b=c=d が a=(b=(c=d)) と右側から順に結合するということ。

2項(or3項)演算子の非演算子が、どれから順に評価されるかは(一部の例外を除き)未定義。
つまり、A=B*C という式のA, B, C それぞれの部分がどの順序で評価されるかは決まっていない。
++pt と *pt のどっちが先に評価されるかで、結果は変わる。

上で書いた一部の例外というのは &&, ||, ,(カンマ演算子)の3つ。
これらは非演算子が左、右の順で評価されることが決まっている。

>>954
これも、
>そもそも後置インクリメントは式の値を返した後に代入するものだとおもってました。
pt++ を評価するとその値は pt であり、pt自身はインクリメント(+1)される。
ただし、ptがインクリメントされるタイミングは、pt++の評価後であって、
式全体(*pt)*(*(pt++))の評価後ではない。
pt++が評価されるのが*ptより先かもしれないし、後かもしれない。




956 :デフォルトの名無しさん:2006/10/14(土) 13:37:45
>953
まずは↓読め
http://www.kouno.jp/home/c_faq/c3.html#0

>955
未定義だと鼻から悪魔を思い浮かべるので、評価順序の場合は未規定か不定と書くのが望ましいと思う。

957 :デフォルトの名無しさん:2006/10/14(土) 13:52:29
>>956
「不定」は違うだろ。

958 :デフォルトの名無しさん:2006/10/14(土) 14:55:56
未規定 コンパイラの好きにしろ 
未定義 HDD消されても知らんぞ

とかの方がわかりやすいよね



959 :デフォルトの名無しさん:2006/10/14(土) 16:05:50
未定義 ツンデレAI美少女がPCから出てきても知らんぞ

960 :943:2006/10/14(土) 16:57:33
>>955>>956
レスありがとうございます。
お恥ずかしいことに色々と勘違いしていたようです。
>>955
なるほど、右結合や左結合の捉え方を誤っていたようですね。
よくわかりました。

皆様ご丁寧にありがとうございました。

961 :デフォルトの名無しさん:2006/10/14(土) 17:45:39
class foo;

class hoge
{
private:
foo* mpFoo;
public:
(略)
void set( int val) { if (mpFoo) mpFoo->set(val); }
void set( double val) { if (mpFoo) mpFoo->set(val);}
};

class fooはintとdoubleのどちらの型のデータを持っているか判る
数値情報を持つクラスです。

hoge::set()の場合は1行で書けますが、
他にもまったく同じ処理なのに、
引数の型が違うだけのメソッドがいます。
これをint,doubleで2回づつ書くのではなく、
1回で済ます方法は無いでしょうか?


962 :デフォルトの名無しさん:2006/10/14(土) 17:50:21
>>961
template

963 :デフォルトの名無しさん:2006/10/14(土) 18:01:57
>>961
設計を見直す。

964 :デフォルトの名無しさん:2006/10/14(土) 18:11:42
質問です
自分のサイズよりも大きな構造体のポインタに対するキャストが
うまく動くかどうかは実装依存でしょうか?

例えばこんなコードです
#include<stdio.h>
struct mydata{int a,b,c,d;};
int main(){
int *p;
mydata da={1,2,3,4};
p = (int *)&da;
printf("%d %d %d %d\n",((mydata*)p)->a,((mydata*)p)->b,((mydata*)p)->c,((mydata*)p)->d);
return 0;
}



965 :デフォルトの名無しさん:2006/10/14(土) 18:16:29
それでうまくいかない処理系を知らない

966 :961:2006/10/14(土) 18:38:30
>>962
具体的にどう書けばいいんでしょうか?
プログラミング言語c++を読んでみたのですが、自分には書き方が判りませんでした。

>>963
やっぱり設計を変えたほうがいいですか。

int,doubleを受け取るんじゃなくて、fooのようなクラスfooArgを受け取るようにして、
hoge::set(1) が hoge::set( fooArg(1)) に自動変換するようにすればいいとか?


967 :962:2006/10/14(土) 18:50:48
>>966
class hoge {
private:
foo* mpFoo;
public:
template<class T>
void set(T val) { if (mpFoo!=NULL) mpFoo->set(val); }
};

968 :961:2006/10/14(土) 19:18:59
>>967
ありがとうございます。動きました。

class hogeの前にtemplate書いてみたり、メソッドの宣言は普通に型を指定して、
実体の方だけだけtemplateをつけて動かなかったのです…


969 :964:2006/10/14(土) 20:46:02
>>965
ありがとうございます
こういったコードが必要になったので悩んでいたのですが
気にせず使うことにしました

970 :デフォルトの名無しさん:2006/10/14(土) 21:00:25
>>969
その例だとキャストする意味が分からん。
キャストしないで済ませられないか、よく考えてから使えよ。

971 :デフォルトの名無しさん:2006/10/14(土) 21:08:57
>>970
>>964は「自分のサイズよりも大きな構造体」
って書いてるから例が今ひとつなだけで、こういうことを言いたいのでは?

#include<stdio.h>
struct mydata{int a,b,c,d;};
struct mydata2{int a,b,c,d,e;}
int main(){
mydata2 *p;
mydata da={1,2,3,4};
p = (mydata2 *)&da;
printf("%d %d %d %d\n",p->a,p->b,p->c,p->d);
return 0;
}

まあWindowsではこれが出来なかったらメッセージのやり取りが出来ないけどな。


972 :デフォルトの名無しさん:2006/10/14(土) 21:15:50
>>971
それは実装依存かな。少なくとも正しく動作する保証は無いだろう。

973 :971:2006/10/14(土) 21:20:57
>>972
PSなんかではアライントメントの関係でおかしくなる場合があるってfj.comp.lang.cで話題になったことがあったと思う。

974 :デフォルトの名無しさん:2006/10/14(土) 21:24:28
>>973
アライメントが不正な場合に未定義動作となることは規格に明記されている。

975 :971:2006/10/14(土) 21:26:56
>>974
だとすると>>971はやっぱ未定義だな。
本当に>>964がこういうのを意図してたかどうかはわからんが。

976 :デフォルトの名無しさん:2006/10/14(土) 21:32:58
VC++.net、C言語にてUDPのプログラムを作っています。
現在、サーバ側がどうにかしてIPを調べクライアント側に伝え、
クライアントがサーバのIP・ポートを手入力して繋いています。
それをサーバ側がロビーサーバに登録し、クライアントがロビーサーバにアクセスしてクリックだけで接続できるようにしたいと考えています。
その際、サーバ側のグローバルIPをプログラムで取得してロビーサーバに保存させたいのですが、
どうすればグローバルIPを取得することが出来るのでしょうか。


977 :デフォルトの名無しさん:2006/10/14(土) 21:47:30
971はわからないが、964は平気であるはず。
構造体へのポインタは先頭要素の型へのポインタにキャストして平気であるという規定があったはず。

978 :デフォルトの名無しさん:2006/10/14(土) 21:49:56
>>977
964 はその規定にかかわらず、元の型に戻してから使ってるので問題ない。

979 :964:2006/10/14(土) 21:54:22
>>970-975
レスありがとうございます
すみません、例が悪かったですね
971さんの仰るとおりウィンドウメッセージ関連です
規格上は未定義なんですねorz

必要になった状況というのは
ユーザ定義メッセージを送るPostMessageの引数です
自作コントロールでWM_APP_HOGEHOGEを定義して
PostMessageの引数のLPARAMに受け渡すデータを
パックして送ろうとしたんですが
私の環境では、LPARAMはlong型なので
mydata(受け渡し用データ)のほうがかなりサイズが大きく、
こういったキャストを利用してよいものかと思い質問しました

WEBでWM_USERやWM_APPの使い方を調べても、
WPARAMやLPARAMにデータを入れて送っている例がなかなか見つからないので
直接キャストしてみたらとりあえずは動いているようです
けど不備があったら嫌だな^^;
もしかしてLPARAMがlongなのは、ポインタのサイズと関係があるんですかね

980 :964:2006/10/14(土) 21:59:17
>>977
>構造体へのポインタは先頭要素の型へのポインタにキャストして平気であるという規定があったはず。
なるほど、参考になります

(LPCREATESTRUCT)lParamといったコードがあるので
LPCREATESTRUCTについて調べてみたところ
tagCREATESTRUCTの最初の引数はLPVOID (void *)でした
ということは、データを受け渡しを考えた時は
構造体の最初のメンバに気を配らないとダメなのでしょうか?

981 :964:2006/10/14(土) 22:03:40
>>978
ということは大丈夫っぽいですね
色々ありがとうございました

982 :デフォルトの名無しさん:2006/10/14(土) 23:00:01
>>976
ロビーサーバに訊いたら駄目なのか

983 :デフォルトの名無しさん:2006/10/14(土) 23:21:12
>>979
LPARAMは単なる整数型だ。
ポインタ型をポインタ型以上の大きさを持つ整数型に変換して、また元のポインタ型に戻して使うのは問題ない。

現在LPARAMは、ポインタ型と同じ大きさを持つ符号有り整数型と定義されている。

984 :976:2006/10/14(土) 23:25:25
>>982
 サーバA   サーバB   サーバになる人がロビーサーバで登録
  登録↓   ↓登録    
    [ロビーサーバ]    ロビーサーバがサーバのIP・ポートを保持し、クライアントに表示させる(名前+ボタンとか)
  参照↑ ↑↑ ↑参照
   クラA || クラD  クライアントはロビーサーバにアクセスし、 
     クラB クラC     行きたいサーバのボタンを押して接続

ロビーサーバに聞くとしても、サーバ側のIPを受け取らないといけませんよね。
サーバ側のグローバルIPの取得方法がわからず、IPを渡すという作業が出来ずに詰まっていて躓いている状態です。


985 :デフォルトの名無しさん:2006/10/15(日) 00:33:37
ロビーサーバがサーバA・Bから接続を受けた時点でグローバルIPは分かるだろ。

986 :デフォルトの名無しさん:2006/10/15(日) 00:39:32
あ、サーバ登録時もUDP使ってるのか?

987 :デフォルトの名無しさん:2006/10/15(日) 00:45:41
CもC++も全く関係ないな

988 :デフォルトの名無しさん:2006/10/15(日) 00:53:16
ネットワークプログラミング相談室 Port18
http://pc8.2ch.net/test/read.cgi/tech/1159692799/l50


989 :デフォルトの名無しさん:2006/10/15(日) 01:40:18
『宣言が正しく終了していない』とエラーがでました。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define SIZE 20
int Scores[SIZE]; /*グローバル変数宣言*/
int max(int a, int b)
{
if(a<b) return b;else return a;
}
int min(int a, int b){
if(a<b) return b;else return a;
}
int main(void){
int i;double ave,sum;
srand(894u);
for (i=0; i<SIZE; i++)
Scores[i] = (int)(rand()/(RAND_MAX+1.0)*301)-100;
for (i=0; i<SIZE; i++){
Scores[i]=min(Scores[i],0);
Scores[i]=max(Scores[i],100);}
for (i=0; i<SIZE; i++){
sum += (double)Scores[i];}
ave =sum/SIZE;
printf("Answer is %6.2f.\n",ave);
return 0;}
バクがわかりません。教えていただけないでしょうか?


990 :デフォルトの名無しさん:2006/10/15(日) 01:48:46
ここまで堂々としたマルチもめずらしいな

991 :デフォルトの名無しさん:2006/10/15(日) 01:51:31
max、minマクロは既に定義されてるのでエラーになる。
max、min関数を宣言する前に

#undef max
#undef min

と追加するか、max関数とmin関数自体を削ると通るはず。(bcc5.5なら)


しかしそのコーディングスタイルはなんかの苦行か?

992 :デフォルトの名無しさん:2006/10/15(日) 01:57:37
gcc(オプション-Wall)で試したけどエラーでないよ。

993 :デフォルトの名無しさん:2006/10/15(日) 02:02:58
>>991の言うとおりbccで試したらエラー出たよ
#undef追加したらエラー出なくなったよ

994 :デフォルトの名無しさん:2006/10/15(日) 02:12:31
>>991 有難うございました。
   追加した所、通りました。
   関数名を変えても通りました(^^)v
   このコーディングは、掲示板が生み出したて感じですねw。

>> 驚きです(゜o゜)。

995 :デフォルトの名無しさん:2006/10/15(日) 02:19:08
激しい電波をキャッチしました。

996 :デフォルトの名無しさん:2006/10/15(日) 02:34:26
bccってそんなに腐っていたのか。
Windows.hをincludeすると、min, maxというマクロがあるのは知っていたが。
でも何故なんだろう。
STLならnamespaceに入っているはずだし。

997 :デフォルトの名無しさん:2006/10/15(日) 04:29:00
質問です。

initされ、unlock状態のmutexをlockしようとするとプロセスが落ちるのですが、
理由は何が考えられるでしょうか。

siginfo.txtによると、SIGSEGV(BADADRS:0x00000000)です・・・

998 :デフォルトの名無しさん:2006/10/15(日) 05:09:23
コードが間違ってる

999 :デフォルトの名無しさん:2006/10/15(日) 06:30:54
h


1000 :小倉優子 ◆en0rG2J.f6 :2006/10/15(日) 06:31:25
1000ならジュースでも飲むか

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

247 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)