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

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

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

1 :デフォルトの名無しさん:2006/08/21(月) 16:32:04
エスケープシーケンスや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:40:12
また双子スレか

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

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


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

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

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

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

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

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

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

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


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

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

15 :【初心者歓迎】C/C++室 Ver.31【環境依存OK】:2006/08/21(月) 21:37:16
☆★☆ここは 【初心者歓迎】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.30【環境依存OK】:2006/08/21(月) 21:37:35
☆★☆ここは 【初心者歓迎】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:39:12
>>15
判らなくなるだろw

18 :デフォルトの名無しさん:2006/08/21(月) 22:08:10
C言語に興味を持つ

解説書購入

printfやifを一通り使えるようになるレベル ←いまココ


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

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

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

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

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



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

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

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

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

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

27 :デフォルトの名無しさん:2006/08/21(月) 22:49:28
それにしてもどっちを本スレとするかという問題は残るわけで。

28 :デフォルトの名無しさん:2006/08/21(月) 22:51:21
>>27 早いほうが本スレに決まってるだろ。

29 :デフォルトの名無しさん:2006/08/21(月) 22:58:36
そんなに暇じゃあありません。

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

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



まさに マルチスレッド

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

33 :デフォルトの名無しさん:2006/08/21(月) 23:13:20
30秒の壁は結構危ないな。

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

35 :デフォルトの名無しさん:2006/08/21(月) 23:15:53
あほか

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



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

38 :デフォルトの名無しさん:2006/08/21(月) 23:17:15
同期が外れました。リビルドをおながいします。

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

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

41 :デフォルトの名無しさん:2006/08/21(月) 23:42:35
よし次はストライピングだ

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


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

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


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

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


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


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

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

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

50 :デフォルトの名無しさん:2006/08/22(火) 09:27:23
なめんな

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

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

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

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

55 :デフォルトの名無しさん:2006/08/22(火) 13:54:57
こちらの>>1のタイムスタンプが2006/08/21(月) 16:32:04でもうひとつのスレより早いので
こちらが本スレということで、こちらで質問していいのでしょうか?

56 :55:2006/08/22(火) 14:13:34
ありがとうございます、自己解決しました。

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

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

59 :デフォルトの名無しさん:2006/08/22(火) 14:58:42
>>58
%pでは無理なのですね。
整数型にキャストするのが簡単そうなのでキャストでいこうと思います。
どうもありがとうございました。

60 :デフォルトの名無しさん:2006/08/22(火) 15:32:30
可変引数だから型は関係なく、キャストしてもダメだと思うぞ。
%dでいいんじゃね。

61 :デフォルトの名無しさん:2006/08/22(火) 15:54:17 ?2BP(200)
>>60
bccはどうだか知らんが、gccとvc7ではprintfの書式と型の対応をチェックする。

62 :デフォルトの名無しさん:2006/08/22(火) 16:07:37
>>61
でも%pでの出力形式には影響しないでしょ。

63 :デフォルトの名無しさん:2006/08/22(火) 16:10:27 ?2BP(200)
>>62
だから、整数型にキャストした時点で"%p"は使えなくなるっつー話なんだけど。

64 :デフォルトの名無しさん:2006/08/22(火) 16:46:57
57です。
整数型にキャストしたので当然%dで書式を指定しました。
%pは63さんが仰るようにポインタに対する書式だと思っていましたので。
それでやりたかったことがうまくできたのですが、
実は何か潜在的な問題があるのでしょうか?

65 :デフォルトの名無しさん:2006/08/22(火) 17:11:43 ?2BP(200)
>>64
別にない。

66 :デフォルトの名無しさん:2006/08/22(火) 17:42:19
あるとしたら、ポインタ型と同じ大きさの整数型が環境に依存すること。
(u)intptr_tを使うにしても、printfには(u)intptr_tに対応する長さ修飾子が存在しないこと。

67 :デフォルトの名無しさん:2006/08/22(火) 17:59:24
57です。
問題が起こるとすれば環境依存性がある点なのですね。
今のところ%dだけでprintfがよしなにやってくれているようなので、
とりあえずこれでいこうと思います。
相談に乗っていただいて、ありがとうございました。

68 :デフォルトの名無しさん:2006/08/22(火) 20:55:14
>>69
オレは%uをお勧めする。
って言うか、普通に16進の方がわかりやすいと思うが?

69 :68:2006/08/22(火) 20:56:28
×>>69
>>67


orz

70 :デフォルトの名無しさん:2006/08/23(水) 17:11:16
本スレage

71 :デフォルトの名無しさん:2006/08/23(水) 17:13:47
重複のほうが勢いがある件

72 :デフォルトの名無しさん:2006/08/23(水) 17:28:16
双子の弟の方が人気があるって感じだな

73 :京大生www:2006/08/23(水) 17:59:20
プログラムで素数をモノすごい勢いで計算させようという考えにいたり以下のようなプログラムを作りました。
でもmax >= 17ではプログラムが動きません。
どうしてでしょうか?

http://www.uploda.org/uporg489202.cpp.html

環境はbcc32
windows xp
1.3Ghz 512MB

これより処理を早くする方法は分かるのですが、それにしても17以上で動かなくなるのは解せません。

74 :京大生www:2006/08/23(水) 18:04:10
あれ、よくみると結果が狂ってる・・・・どうしてですか;;

75 :デフォルトの名無しさん:2006/08/23(水) 18:06:45
>>74
は解決しました。iになってたw
でも>>73は・・・あれ?20では出来てる。でも50じゃ出来ないw

76 :京大生www:2006/08/23(水) 18:07:57
20までしか出来ないようです。
何ででしょう

77 :京大生www:2006/08/23(水) 18:26:20
プログラムを改善したら21までいけるようになった。
けどなんで・・・・1000までやりたい。

78 :京大生www:2006/08/23(水) 18:29:51
これが新しいやつです
http://www.uploda.org/uporg489242.cpp.html
どうしてか早く教えてください。

79 :デフォルトの名無しさん:2006/08/23(水) 18:30:01
いろいろあれだがとりあえず
int prime[] = {2, 3};
これは
int prime[2] ...と同じだからな

80 :デフォルトの名無しさん:2006/08/23(水) 18:32:38
//関数を作らず直に作ってしまいましょう

関数作れ

81 :京大生www:2006/08/23(水) 18:44:48
>>79
知ってます。
だから要素数record_num = 2になってるでしょ。

いろいろとアレっていうのはどこですか。
おれにはver.2以上早いアルゴリズムが思い浮かびません。

>>80
やろうとしたらポインタとか意味不明になってキレた。
短いからいいやみたいな。
プログラムが読みにくいのは察しますが^^;

82 :デフォルトの名無しさん:2006/08/23(水) 18:53:39 ?2BP(200)
>>81
>知ってます。

京大をブラックリストに…あ、もう入ってたわ。

83 :デフォルトの名無しさん:2006/08/23(水) 18:54:11
>>81
じゃあ、要素数2個の配列に3個以上の要素を入れんなや

ttp://www.uploda.org/uporg489268.cpp.html

84 :83:2006/08/23(水) 18:55:26
>>81
100年ROMってろ

85 :デフォルトの名無しさん:2006/08/23(水) 18:56:58
100年とは言わないけど100時間くらいはROMって欲しいかも

86 :83:2006/08/23(水) 19:00:43
1行目の
#include <iostream>
がなぜか見えない
こぴぺでなくファイルのアップロードなのになぜだ

87 :京大生www:2006/08/23(水) 19:30:56
>>83
どういう意味ですか、ソースはちゃんと読んでもらえたでしょうか?

88 :京大生www:2006/08/23(水) 19:33:33
>>81
どうしてだ・・・これだといくらでもでる。
でもおれのも21まではいける。どうしてだ。

89 :83:2006/08/23(水) 19:34:55
このアップローダ、1行目は抜ける仕様なのか
ttp://www.uploda.org/uporg489292.cpp.html

90 :京大生www:2006/08/23(水) 19:36:51
いや、これは出来ていますが、アルゴとしては低脳です。
なぜなら、素数は6n±1の形であるというところまでは最低絞りこんだほうが格段に速度があがるのは明確だから

91 :京大生www:2006/08/23(水) 19:38:30
改善しやがった

92 :京大生www:2006/08/23(水) 19:41:12
最初にポインタで動的確保の時の/2は何?
説明せよ

93 :デフォルトの名無しさん:2006/08/23(水) 19:43:45
京大生wwwってのが低脳なのはわかった

94 :デフォルトの名無しさん:2006/08/23(水) 19:49:51
アルゴリズムの優劣以前の問題
もう一回CでもC++でもいいから勉強し直して
なおかつ人の意見をちゃんと聞けるようになったらここにおいで

ヒント、偶数の素数は1個しかない。だからmax=0はエラーになる。

95 :京大生www:2006/08/23(水) 19:59:24
つまり素数はかならず奇数だから半分にしたってか。
笑わせるぜ、6n周期の中で2つしか調べてないんだから割る3くらいではいけるんじゃねーの?
今C勉強してんだよ、てゆうかなんか忘れたからC++勉強したついでに復習しておくかってカンジ。
おれは人の意見はきくよ、ただしまともな意見ならね。間違ったことは徹底的に批判する、それだけ。
おれのプログラムの間違いは、最初に要領確保しなかったこと。
それでも21までできてしまったのはなぜか、本来ならできんはず、なぜか答えてくれ。

96 :デフォルトの名無しさん:2006/08/23(水) 20:06:28
>>95
ママに聞けば?

97 :デフォルトの名無しさん:2006/08/23(水) 20:10:46
C/C++は基本的に配列の添え字が範囲外かどうかを確かめない。
そしてたとえ範囲外の要素を使おうとしても、そこに対応するメモリが特に使われていない場合、
まるで何事も無いかのように使えることはよくある。
ただ、それは偶然何事も無く動いているのであり、決してそれに頼ってはいけない。

京大生のプログラムもまさにそうなっていた。

98 :京大生www:2006/08/23(水) 20:24:14
なるほど。
わかったぜ。
あと演算時間を計算したいんだが、どうすればいい。
time()とdifftime()か?
これだと秒までしかでねーんだけどwwww

99 :京大生www:2006/08/23(水) 20:35:00
べ、別に感謝なんてしてないんだからね!

100 :デフォルトの名無しさん:2006/08/23(水) 20:36:01
秒より細かい精度を扱いたければ、WindowsやPOSIXなどの環境固有の関数を使うのが確実。

で、お前は何を使っていると書こうとしたが、既にWindowsと書いてあるな、よし。
Windowsなら<windows.h>をインクルードすればGetTickCountが使える。
一番お手軽で、ミリ秒単位の数値が返ってくる。(ただし実際の精度は数ミリ〜数十ミリ秒のはず)

使い方はtimeとあまり変わらない。大雑把に言ってGetTickCountには引数がなく、またtime_tの代わりにDWORDを使うだけ。
difftimeに相当するものはなく、ただの整数なので直に減算して構わない。

101 :デフォルトの名無しさん:2006/08/23(水) 20:36:59
少しは感謝しろよ
clock()あたりでいいんじゃないか?

102 :京大生www:2006/08/23(水) 20:42:26
clock()は秒単位じゃねーの?

>>100
やってみる

103 :デフォルトの名無しさん:2006/08/23(水) 20:43:08
だが、clockも単位が一定でなく、まともに使うには結局CLOCKS_PER_SECで割って秒単位にするしかないと思う。

104 :デフォルトの名無しさん:2006/08/23(水) 20:46:20
一番お手軽だと思ったんだけど
数十_秒くらいの精度で計れなかったかな

105 :デフォルトの名無しさん:2006/08/23(水) 20:47:41
初心者は歓迎しても、こう言うバカは歓迎しないで欲しいと思った

106 :デフォルトの名無しさん:2006/08/23(水) 20:51:51
まぁ重複より進んだしいいんじゃね?

107 :京大生www:2006/08/23(水) 20:52:37
出来なかったw
変な数値でたけど単位不明w
でusing namespace std;って何?


108 :デフォルトの名無しさん:2006/08/23(水) 20:57:18
>>107
std::cin >> max;って書くべきところを
cin >> max;って省略して書けるおまじない

109 :京大生www:2006/08/23(水) 21:01:58
それ書かなくても出来ますよ。
一番最初の使用ではそうだったけど、以降デフォで大丈夫になったと読んだ気がする。

110 :デフォルトの名無しさん:2006/08/23(水) 21:01:59
すごい釣り能力に嫉妬

111 :デフォルトの名無しさん:2006/08/23(水) 21:04:08
>>106
そんな悠長な事を言ってるから、調子にのってるじゃねぇか!


>>京大生

いい加減、本買って来て嫁

112 :京大生www:2006/08/23(水) 21:12:10
本はあります。
林ハルヒコ先生の新C言語入門シニア編は大体読みました。
が、実戦経験が少ないのでミスが多いのです。
言われれば理解は出来ます。
あとはクラスと継承完全制覇って本を読みましたがこれは意味が分かりませんでした。
クラスは用途がよく分かりません;;

君たちは京大生に教えてるのですよ、誇りに思わないのですか。

113 :デフォルトの名無しさん:2006/08/23(水) 21:14:26
「京大生の埃に教えてる」の間違いだろ

114 :デフォルトの名無しさん:2006/08/23(水) 21:16:36
>>112
全く理解出来ていない。
100万回位読み返せ。

115 :デフォルトの名無しさん:2006/08/23(水) 21:21:17
>>113
上手いなww

116 :デフォルトの名無しさん:2006/08/23(水) 21:33:53
ねえねえ京大生くん
CとC++の違いってなに?

117 :デフォルトの名無しさん:2006/08/23(水) 21:35:01
学歴コンプの奴が多いな

118 :デフォルトの名無しさん:2006/08/23(水) 21:37:23
学歴複素数

119 :デフォルトの名無しさん:2006/08/23(水) 21:38:18
ハイハイ、荒らしは無視で。

120 :京大生www:2006/08/23(水) 21:38:42
>>116
クラスを使えばC++と書いてあった。
C with Class = C++

>>117
大変失礼な発言です。取り消しなさい

121 :デフォルトの名無しさん:2006/08/23(水) 21:43:40
あれ、埃はいいのか?

122 :デフォルトの名無しさん:2006/08/23(水) 21:45:43
>>95
別に3で割っても俺はかまわないがmax=4以下では使えない
max=100000より小さい値は指定しないことにして14で割っちゃえよ

123 :デフォルトの名無しさん:2006/08/23(水) 21:45:51
>>121
きっと読めなかったんだよ(w

124 :デフォルトの名無しさん:2006/08/23(水) 21:48:44
>>120
C++の本も読んでみるといいお

125 :デフォルトの名無しさん:2006/08/23(水) 21:57:01
指数の積分計算をしたいのですが、さっぱり分かりません。

現在、次のページを写してY = x^2 ぐらいの簡単な計算は出来るようになりました。
ttp://www.h7.dion.ne.jp/~matsu/pc_cluster/mpi/intro/daikei.html
しかし、このプログラムでは指数exp()の計算が出来ないのです。

このプログラムのどこをどう直したら指数の積分が出来るようになるのか、またはもっと良い方法があったら教えてください。。


126 :デフォルトの名無しさん:2006/08/23(水) 22:50:33
昼に間違えてJAVAスレに書き込んでしまった者です。
XPで、BCCとフリーのエディタで作業しております。

Dドライブ内のフォルダ D:\hoge に作ったプログラムを置いて、出力されるファイルを
そのフォルダ内の小フォルダに出力しようと思いまして
D:\hoge\hogedat というフォルダを作ってから、D:\hoge内に以下のようなコードのプログラム
を置きました

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
FILE *fp1;
int i;
char *fn;

fn=(char*)malloc(30*sizeof(char));

sprintf(fn,"D:\\hoge\\hogedat\\dat1.dat");
fp1=fopen(fn,"w");

for(i=0;i<10;i++)
{
fprintf(fp1,"write%d\n",i);
}
fclose(fp1);
free(fn);
return 0;
}
しかし、出力できませんでした。どのようにすべきか、ご教示願います

127 :デフォルトの名無しさん:2006/08/23(水) 23:21:31
>>125-126
デバッグは自分でやれ。


>>126
せめて、fopenのエラーチェック位入れれ。


128 :デフォルトの名無しさん:2006/08/23(水) 23:54:59
デバッグできない子はゆとり世代かな?

129 :デフォルトの名無しさん:2006/08/23(水) 23:55:41
どっかにi#include<math.h>ぶち込んで

float
function (float x)
{
float result;

result = x;

return result;
}



float* function(float *x)
{
float* result;
result = &exp(x);
return result;
}

で、ポインタ型の返り値にして逃げといて
関数daikei_integral ではfloat daikei_integral (float (*)(float), float, float, int);
がfloat* (*)(float),とかになって
中も改造してどうたらこうたら

関数ブロック{}抜けて値消えてるなと思ったらポインタ返しにしとけ!と脊髄反射

130 :デフォルトの名無しさん:2006/08/24(木) 00:09:36
>>129
レスありがとうございます
分かりました、明日朝一で試してみます!

>>127-128
プログラムとは無縁の世界で生きていたのですが、上司に「プログラムできるの?」と聞かれて、「コンニチワって表示させるぐらいなら出来ますよ^^」と答えたのが運の尽きでした
やったこともないのに、こんな仕事が回ってくるとは思いもしませんでした


131 :デフォルトの名無しさん:2006/08/24(木) 00:19:34
>プログラムとは無縁の世界で生きていたのですが、上司に「プログラムできるの?」と
聞かれて、「コンニチワって表示させるぐらいなら出来ますよ^^」と答えたのが運の尽きでした

その状態ならはっきり言って、あれ改造するの結構しんどいかもなw
関数内に関数ポインタとかあるし

柴田本とか朝井本とか読んで頑張る時間があれば良いけど。
main関数内でもっとゴチャゴチャと積分計算する方針にするのはダメなのか?

132 :デフォルトの名無しさん:2006/08/24(木) 00:33:15
>>131
はい、朝一でやってみますとは言いましたが、はっきり言って地獄ですw
#include<math.h>を加えることぐらいはさすがに分かったので、それだけは既にしてあります
本読んで勉強する時間もありませんし、実は最終締め切りは金曜の午前中だそうです
現在、Cでやるのを諦めて自宅のPCのエクセルで何とかならないものか試している最中です

>main関数内でもっとゴチャゴチャと積分計算する方針にするのはダメなのか?
僕としては計算さえできれば、プログラムの文の美しさは求めていません

133 :デフォルトの名無しさん:2006/08/24(木) 00:42:54
ならVBAスレに移動だなw

134 :デフォルトの名無しさん:2006/08/24(木) 00:49:17
スイマセン、この板は初めてなもので、VBAスレというものはここで良いのでしょうか?
ttp://pc8.2ch.net/test/read.cgi/tech/1151412015/205-305

軽く流し見したのですが、上記のところで質問していいのか分からなかったので聞きました

135 :デフォルトの名無しさん:2006/08/24(木) 00:51:19
>僕としては計算さえできれば、プログラムの文の美しさは求めていません
美しさはともかく、「理解しやすさ」は保守管理に必要だぞ

3ヵ月後の自分は他人〜

136 :デフォルトの名無しさん:2006/08/24(木) 01:03:56
long long int型を使ってみようと思って65536*65536を
計算してみたのですが、結果がおかしいです。
これはコンパイラのバグでしょうか?

#include<limits.h>
#include<iostream>
using namespace std;
int main(){
 long long int x,y;
 x = 65536 * 65536;
 y = 4294967296 * 65536;
 cout << x << " "<< y << endl;
 return 0;
}

実行結果:
0 281474976710656
コンパイラ:Microsoft Visual Studio 2005
OS:windows xp home
CPU:鱈セレ1.4GHz
メモリ:512MB

137 :デフォルトの名無しさん:2006/08/24(木) 01:10:00
 x = 65536LL * 65536LL;
 y = 4294967296LL * 65536LL;


138 :デフォルトの名無しさん:2006/08/24(木) 01:15:12
>>137
ああ、出来ました。ありがとうございます。
お手数ですが、どうして私のプログラムでは
このような結果になったのか、教えていただけますか?

139 :デフォルトの名無しさん:2006/08/24(木) 01:23:54
65536 * 65536           // 32bit ← 32bit * 32bit;
4294967296 * 65536;  // 64bit ← 64bit * 32bit;

65536LL * 65536LL;          // 64bit ← 64bit * 64bit;
4294967296LL * 65536LL;  // 64bit ← 64bit * 64bit;

65536 * 65536LL; // 64bit ← 32bit * 64bit;
65536LL * 65536; // 64bit ← 64bit * 32bit;
4294967296 * 65536; // 64bit ← 64bit * 32bit;


140 :136:2006/08/24(木) 01:34:23
>>139
分かりやすい説明、ありがとうございました。
よく理解できました。

141 :デフォルトの名無しさん:2006/08/24(木) 01:42:11


142 :デフォルトの名無しさん:2006/08/24(木) 03:24:08
126です。
自己解決しました。自分の実際のプログラムでは
別のディレクトリだったのですが、パスの書き方を間違えていました。

ご迷惑をおかけしました。

143 :デフォルトの名無しさん:2006/08/24(木) 03:31:55
>>125氏へ

これ関数返り値をポインタにしなくても、そのままで動く
#include <stdio.h>
#include<math.h>

#define X_MIN 0.0/* 閾値の最小値 */
#define X_MAX 100.0/* 閾値の最大値 */
#define DIV_NUM 120/* 閾値の分割数 */

float function (float);

daikei_integral (float (*function) (float), float x_min, float x_max, int n);

int main (int argc, char **argv)
{
float result;/* 積分結果 */
fprintf (stdout, "x = [%f,%f] n = %d\n", X_MIN, X_MAX, DIV_NUM);
result = daikei_integral (function, X_MIN, X_MAX, DIV_NUM);

fprintf (stdout, "S = %f\n", result);
}

float function (float x)
{
return exp(x);
}




144 :デフォルトの名無しさん:2006/08/24(木) 03:35:19
続き
float daikei_integral (float (*function) (float), float x_min, float x_max, int n)
{
float integral;/* 積分値 */
float h;/* 閾値をn個に分割したときの幅 */
float x;
int i;

h = (x_max - x_min) / n;
integral = ((function (x_min)) + (function (x_max))) / 2.0;
x = x_min;
for (i = 1; i <= n - 1; i++)
{
x += h;
integral += (function (x));
}
integral *= h;
return integral;
}

日刊工業新聞社「Visual C++による理工学問題の解法」に殆ど同じ問題あった。
このスレに戻ってくるかどうか知らんが念のため
(しかしウィンドウズ時代以降の初心者がint argc,char** argvタイプのmain関数を使いこなせるか)

145 :デフォルトの名無しさん:2006/08/24(木) 08:10:52
>>143
ありがとうございます!
今から仕事場いくんで、やってみます!

146 :デフォルトの名無しさん:2006/08/24(木) 10:26:43
>>129 オメー関数ポインタ分かってねえだろ!
柴田のポインタ極意でも100回写して変数あれこれ変えて
型変えてprintfで出力して見直して来い!

147 :デフォルトの名無しさん:2006/08/24(木) 18:12:05
クイックソートのアルゴリズムを本で読んで書いてみたのですが、
void quick(int a[],int top,int end)
{
int lp=top;
int rp=end;
int tmp;
int axis=a[(top+end)/2];
do{
while(a[lp]<axis)lp++;
while(a[rp]>axis)rp--;
if(lp<=rp){tmp=a[lp];a[lp]=a[rp];a[rp]=tmp;
lp++;rp--;}
}while(lp<=rp);
if(rp>top)quick(a,top,rp);
if(lp<end)quick(a,lp,end);
}

このように書くとちゃんとソートできるのですが、
axis=a[(top+end)/2]の部分をaxis=(top+end)/2
として以下のように書くとちゃんとソートされません。

148 :147:2006/08/24(木) 18:12:54

void quick(int a[],int top,int end)
{
int lp=top;
int rp=end;
int tmp;
int axis=(top+end)/2;
do{
while(a[lp]<a[axis])lp++;
while(a[rp]>a[axis])rp--;
if(lp<=rp){tmp=a[lp];a[lp]=a[rp];a[rp]=tmp;
lp++;rp--;}
}while(lp<=rp);
if(rp>top)quick(a,top,rp);
if(lp<end)quick(a,lp,end);
}

勉強始めたばかりなので初心者な質問だと思いますが、
どなたか悪いところを教えてください。

149 :デフォルトの名無しさん:2006/08/24(木) 18:21:39
a[axis]は変動するだろ。

150 :麻布卒www:2006/08/24(木) 18:39:38
クイックソートって関数にあるじゃんqsortだっけ。
なんでそんなもん作ろうとするの?勉強のため?
じゃ、おれもやってみようかなw
今日生協にアルゴの本買いにいったらよさそうなのが7600円もして死んだ。
アルゴはひとつの学問だからなー、面白いからいろいろ勉強してみたいや。数学とかパズル好きだし。

151 :デフォルトの名無しさん:2006/08/24(木) 18:40:39
>>149
あぁ、なるほど!
lpかrpが=axisの時にaxisの位置との交換になるからその位置の値が変わるんですね><
こんなのに気付かなかった自分の馬鹿さにガッカリでした・・・orz

152 :デフォルトの名無しさん:2006/08/24(木) 20:51:18
指数関数の積分について質問していた者です。
結局うまくプログラムを動かすことは出来ませんでした。
しかし、エクセルで同様の台形公式を用いた積分を考えることにより、指数関数が複雑に絡み合う式だったのですが、計算に成功し締め切りも守れました。

プログラムはうまくいきませんでしたがお世話になりました、ありがとうございました。




153 :デフォルトの名無しさん:2006/08/24(木) 21:05:36
それは良かった。
また、何よりプログラムを書かないことはプログラミングの基本だ。

154 :誰か助けて!:2006/08/25(金) 00:01:06

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

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

155 :デフォルトの名無しさん:2006/08/25(金) 00:15:17
>>154 エラーメッセージ貼れ。

156 :デフォルトの名無しさん:2006/08/25(金) 01:07:45
printf に指定した 2 番目の argument が表示されません。
環境は VC++ 8.0 Express で、C ランタイムは MSVCR80.dll です。
OS は Windows XP SP2 と Windows Server 2003 で試しました。


http://www.kumei.ne.jp/c_lang/intro/no_13.htm を見て、次のプログラムを入力しました。

#include <stdio.h>
#include <time.h>

void main()
{
int i = 1;
time_t t1, t2;
time(&t1);
while(i <= 10000)
printf("%d,", i++);

time(&t2);
printf("\n");
printf("time1=%ld time2=%ld\n", t1, t2);
printf("time2=%ld time1=%ld\n", t2, t1);

printf("It takes %ld sec.\n", t2 - t1);
return;
}
(続く)

157 :デフォルトの名無しさん:2006/08/25(金) 01:09:30
>>156 の続き
結果は次のとおりです。

time1=1156435112 time2=0
time2=1156435116 time1=0
It takes 4 sec.

次のような結果を期待していました。

time1=1156435112 time2=1156435116// t2 が 0 でなく表示される。
time2=1156435116 time1=1156435112// t1 が 0 でなく表示される。
It takes 4 sec.

format に対する 2 番目の argument(printf の第 3 引数)に指定した値が表示されません。
何がよくないのでしょう?私が思いついたのは次の 2 つです。

a) printf の引数の指定の仕方が正しくない
b) MSVCR80.dll の printf に問題がある。

アドバイスいただけるとありがたいです。


158 :デフォルトの名無しさん:2006/08/25(金) 01:17:17
>>157
time_tの型がlongであると期待したのが敗因。
実際最近のVCではtime_tはlongではなくlong longになっている。
また、time_tは秒単位で実装されているはずなので、
高々10000回程度の標準出力で1秒掛かることを期待するのも問題あり。

159 :デフォルトの名無しさん:2006/08/25(金) 01:24:16
>>155
>>154は重複のほうで答えてもらったみたいだぞ

>>154
向こうで答えてもらったならちゃんとそう書けよ

160 :デフォルトの名無しさん:2006/08/25(金) 02:22:22
>>150
クヌース先生に喧嘩売ってんのか?

161 :デフォルトの名無しさん:2006/08/25(金) 02:32:30
ここの人達のソースは全く美しくない。
変数は意味深でやたらに長い名前を付けている。恥ずかしくないのかと思う。
私のすすめはこれ。3文字変数。そしてフォント、Verdana。
この殺風景さが良い。よく思えば、これ以上に美しいソースは存在するのかと不思議に思う。
それを、わざわざ食事の時間や昼寝をする時間を削ってまで改悪するのは私には理解できない。
そこまでするなら、その時間を勉強や仕事などの有意義なことに消費すべきではないか。
そもそも、人間というのは時々つまらないことに時間を費やしてしまいがちな変わった唯一の動物である。
もし、それが長引いている場合は、人間性がよくよく変わってきていることなのであろう。
自分の考えが昔の自分と違ったり、やたらと意見に反対したりされたりするのは、まさにそれである。
しかし、それがある日突然問題を引き起こすかもしれない。

162 :156:2006/08/25(金) 02:37:29
>>158
ありがとうございます。次のように変更することで期待通りに動きました。

printf("time1=%lld time2=%lld\n", t1, t2);
printf("time2=%lld time1=%lld\n", t2, t1);

163 :デフォルトの名無しさん:2006/08/25(金) 03:07:45











164 :デフォルトの名無しさん:2006/08/25(金) 03:27:26

 数
 の


 こ



エロいな!

165 :デフォルトの名無しさん:2006/08/25(金) 04:16:11


  殺





  し


166 :デフォルトの名無しさん:2006/08/25(金) 04:47:19
>>162
そして非互換コードをばら撒くと。
本質的な解決になってないことにご用心。

167 :デフォルトの名無しさん:2006/08/25(金) 10:06:15
>153
そうだな
書かなければバグらないしな

168 :デフォルトの名無しさん:2006/08/25(金) 10:15:22
windows
vc60
入力された日付又は時刻が存在しているのか確認する方法を教えてください

169 :デフォルトの名無しさん:2006/08/25(金) 10:25:10
うるう秒も?

170 :デフォルトの名無しさん:2006/08/25(金) 11:53:01
 /l、
(゚、 。 7 ハァ?
 l、 ~ヽ
 じしf_, )ノ

171 :デフォルトの名無しさん:2006/08/25(金) 11:53:42
>>169
マジ捻くれてるよなw
お前って馬鹿の典型例だなw

172 :デフォルトの名無しさん:2006/08/25(金) 11:56:26
>>171
お褒めに預かり光栄です

173 :デフォルトの名無しさん:2006/08/25(金) 12:23:46
>>168
日本語でおk

174 :デフォルトの名無しさん:2006/08/25(金) 12:57:00
>>171
そうか?俺は普通だと思った。
仕様にあいまいな部分があると気持ち悪いし。

175 :デフォルトの名無しさん:2006/08/25(金) 13:18:49
だよな。
仕様は明確にしてもらわないと、あとでちょっと違いましたなんて言われると殴りたくなるからな。

176 :デフォルトの名無しさん:2006/08/25(金) 13:29:06
俺なんかちょっとでも仕様に違いがあったら実際に殴るからな。

177 :デフォルトの名無しさん:2006/08/25(金) 14:46:15
環境、OS:Linux、コンパイラ:CC
ttp://www.geocities.jp/ky_webid/algorithm/012.html
ここのソースにある
「void addlist(void)」部分で
● 構造体に新たなデータNoを追加して1件登録するごとに
  Noを現在の最大値+1を割り振りたいです。
例:
最初に登録時、Noには1を割り当てる。その後登録する度に+1ずつ増加

● 途中のデータを削除しても、
  常に今までつけた連番の最大値+1を割り振りたいです。
例:
No.1〜10まで登録されていてNo.5を削除した場合
次に登録されるNo.は11にしたい。

No.1〜10まで登録されていてNo.1〜10まで削除した後に
割り振られるNo.は11にしたい。

「void showlist(void)」の部分で
● データが登録されていない場合は「データ未登録」と表示。

● 登録したものを10件ずつ表示、
10件以上ある場合は「1」を押せば新たに10件ずつ表示
(表示されていた前のリストは画面から消して新たに10件を表示)
「9」を押せば前ページに戻るようにしたいです

ヒント・アドバイスでも構いませんのでよろしくお願いします。

178 :デフォルトの名無しさん:2006/08/25(金) 14:52:55
>>177
書いてあるとおり改造すればいいじゃん。
何が分からないのかが分からない。

179 :品質保証屋:2006/08/25(金) 15:18:49
まあ漏れは実際ガチで殴るけどね

180 :デフォルトの名無しさん:2006/08/25(金) 16:09:43
>>178
>>179にガチで殴り頃してもらって二度とくるな

181 :デフォルトの名無しさん:2006/08/25(金) 16:16:19
>>177
なにをしてほしいのかわからんな
その仕様を満たすコードを書いてほしいのか?

182 :京大生www:2006/08/25(金) 16:36:37
正多角形を角数増やしていくと円に近づくのでそれを利用してパイを求めようとしましたが、再帰形になりました。
誰かプログラムをかけませんか?

183 :デフォルトの名無しさん:2006/08/25(金) 16:38:52
漏れが入学したとき、実際そんな問題が出たなw

184 :デフォルトの名無しさん:2006/08/25(金) 16:58:31
まだ高1だから数学はよくわからないがこんな感じか?
サイン求めるのにラジアン値が必要なせいですげえ意味ないプログラムになった

#include <stdio.h>
#include <math.h>

#define MPI 3.14159265358979323846

main(){
double n_sin, area;

for(double i = 3.0; i < 1000.0; i++){
n_sin = sin(360.0 / i * MPI / 180.0);
area = n_sin * 1 * 1 * 1/2 * i;
printf("半径1の円に内接する正%f角形の面積は%f (sin:%f)\n", i, area, n_sin);
}
}

185 :177:2006/08/25(金) 17:02:38
>>181
>その仕様を満たすコードを書いてほしいのか?
はい、そうです。よろしくお願いします。

186 :デフォルトの名無しさん:2006/08/25(金) 17:24:27
>>185
ならスレ違い

187 :京大生www:2006/08/25(金) 17:56:24
>>184
お前ばかだろ、最初にパイを定義してどうすんだよ。
そのパイを求めたいんだよ。

188 :デフォルトの名無しさん:2006/08/25(金) 18:09:23
>>187
ラマヌジャンの式でも参照してろカス

189 :デフォルトの名無しさん:2006/08/25(金) 18:19:47
型として自分自身の関数へのポインタを返す関数の宣言(引数は無しとして)
 ret_type Foo(void);
は C/C++ で直接的に宣言できず?

 ret_type ptr = Foo;
 ptr = (*ptr)();   // 型的に 左辺 & 右辺 が等価となる


190 :デフォルトの名無しさん:2006/08/25(金) 18:31:24
>>189
自分自身のポインタを返す関数は宣言できないよ。

191 :189:2006/08/25(金) 18:38:47
>>190 THX
void* 戻しで 呼び出し時キャスト か
struct foo { struct foo* (*func)(void); }; のような構造体経由でないと表現できない
ってことですね。

192 :デフォルトの名無しさん:2006/08/25(金) 18:47:09
一応忠告しとくとvoid*から関数ポインタへの変換は
Cでは保障されていない(C++は規格書真面目に読んだことないから知らん)
だから標準を遵守する気ならやめといたほうが良い。

関数ポインタから関数ポインタへの変換はありだから
typedef void(*void_fun)(void);
void_fun f(void){return (void_fun)f;}
ならC言語の仕様的にはあり。

193 :189:2006/08/25(金) 18:52:50
>>192
重ね重ね感謝
void* <-> 関数のポインタ のポータビリティ(?) は保証外だったのは知りませんでした。

標準枠内で書くか環境枠内で書くかは、それぞれあるので
今度真面目に規格書に目を通してみよう。

194 :京大生www:2006/08/25(金) 19:15:29
>>188
やってみる。

195 :京大生www:2006/08/25(金) 22:05:46
できん

196 :デフォルトの名無しさん:2006/08/25(金) 22:58:13
質問です
進行を一時ストップさせるのに
cin.sync();
cin.get();
を使うみたいなのですが、停止しません
これを使った例文をコピペしてみたのですが
それでもダメでした
環境が問題なのでしょうか?
環境はbcc32 windows xp
1.86Ghz 1Gです

197 :デフォルトの名無しさん:2006/08/25(金) 23:55:08
πは普通マチンの公式とか使って求めるもんだ。

198 :デフォルトの名無しさん:2006/08/26(土) 00:11:08
>>196
進行とか停止とかの意味がわからん。
ソースと、期待している動作の説明が必要。

199 :196:2006/08/26(土) 00:18:15
>>198
すみません、言葉足らずでした。
ttp://www.asahi-net.or.jp/~yf8k-kbys/newcpp9.html
ここを参考にやっているんですが、
プログラムの進行を一時ストップし、エンターキー(リターンキー)で進行を再開とならないのです。
ご教授お願いします。

200 :デフォルトの名無しさん:2006/08/26(土) 01:13:14
>>199
#include <iostream>
int main()
{
  using std::cin; using std::cout;
  do { cout << '*'; cin.sync(); cin.get(); } while(cin.good());
}

こんなんでテストできることだと思ってやってみたんだが、
cygwin g++ 3.4.4 では * が連続して数文字続くことがある。
VC2005EE ではどんだけ文字打っても * は1文字ずつしか出ない。

201 :196:2006/08/26(土) 14:41:36
>>200
VC2005EEで試したところうまくいきました。
ありがとうございました。

202 :デフォルトの名無しさん:2006/08/26(土) 15:24:14
>>182
ポインタか配列でどうにかならないか?

203 :デフォルトの名無しさん:2006/08/26(土) 20:42:37
コマンドライン引数を取得するにはGetCommandLine関数を使えばいいですが、
引数の数を取得するような関数はないのでしょうか。



204 :デフォルトの名無しさん:2006/08/26(土) 20:55:38
標準には無いと思うよ

205 :デフォルトの名無しさん:2006/08/26(土) 21:03:30
ありがとうございます
無いのか(´・ω・`)

206 :デフォルトの名無しさん:2006/08/26(土) 21:13:59
argcじゃなくて?

207 :元気になれるデバッグ支援ソフト:2006/08/26(土) 21:31:33
OutputDebugStringとかを表示してくれるやつないかな

208 :デフォルトの名無しさん:2006/08/26(土) 21:34:00
enumに関する話題ですけど
http://www.geocities.jp/bleis_tift/cpp/typesafeenum.html
の最下部の最終バージョンってやつ動くの?

209 :デフォルトの名無しさん:2006/08/26(土) 21:34:05
>>207
stream_bufをカスタマイズするとか
http://homepage2.nifty.com/well/Stream.html

ツールもあるよ
http://www.vector.co.jp/vpack/filearea/win/prog/debug/

210 :209:2006/08/26(土) 21:36:25
しまったマジレスしてしまった

211 :デフォルトの名無しさん:2006/08/26(土) 22:05:28
>>208 動かないの?

212 :208:2006/08/26(土) 22:29:03
そのままではoperator newでエラーがでる。
そこをコメントアウトしてもリンクでこける。
例えば
undefined reference to `Suit::clubs'
とか。

213 :デフォルトの名無しさん:2006/08/26(土) 22:35:55
>>212
じゃ、動かないんじゃね?

214 :208:2006/08/26(土) 22:36:53
Suit::LiteralがSuitで前方参照されてるのにSuitのstaticメンバに
なれるの?ポインタで扱うならわかるけど。

それとLiteralがSuitをprivate継承してるけどLiteralはSuitのメンバ。
ひよこが先か卵が先か。

215 :デフォルトの名無しさん:2006/08/26(土) 22:46:49
>>214
クラスの static データメンバの宣言では型が不完全型でもいい。

216 :デフォルトの名無しさん:2006/08/26(土) 22:57:31
>212
完全なソースコードがダウンロード出来ないから勘で答えるけど
その部分はエラーテストコードじゃないのか?

217 :208:2006/08/26(土) 23:04:41
それは違う。
newできないようにoperator newをprivateにしている。

218 :デフォルトの名無しさん:2006/08/26(土) 23:10:00
>>212
エラーが出てるんなら直せばいいんじゃないのか?

219 :デフォルトの名無しさん:2006/08/26(土) 23:11:19
>>218
スレタイ嫁

220 :208:2006/08/26(土) 23:23:29
だいたいstaticメンバって定義が別にいるよね。
この場合Literalの定義の後にしないと駄目だ。

221 :デフォルトの名無しさん:2006/08/26(土) 23:28:57
>>220
undefine reference のほうは、それだろうな。
operator new のほうはどんなエラーが出るのさ?

222 :208:2006/08/26(土) 23:33:57
variable declaration is not allowed here
変数の宣言なんてしてねえっつーのw


223 :デフォルトの名無しさん:2006/08/26(土) 23:39:41
>>222
size_t が見えてないんじゃないかな?
#include <cstddef> の追加で通る?

224 :208:2006/08/26(土) 23:47:16
そういえばsize_tって組み込みじゃないでしたね。
確か適切なヘッダーをincludeする必要があった。
ちなみにnewでもOKですね。当然ですけど。

225 :208:2006/08/26(土) 23:56:51
結局最下部に
const Suit::Literal<Suit::CLUBS> Suit::clubs;
const Suit::Literal<Suit::DIAMONDS> Suit::diamonds;
const Suit::Literal<Suit::HEARTS> Suit::hearts;
const Suit::Literal<Suit::SPADES> Suit::spades;
追加すればOKでした。

226 :デフォルトの名無しさん:2006/08/27(日) 03:16:48
printf("%d%",300);
300%と表示したい場合%がエスケープシーケンスになって壊れる。
どうしたらいいんでしょうか?
\x25とかやれば表示できるんですかね?

227 :デフォルトの名無しさん:2006/08/27(日) 03:19:59
%d%%

228 :デフォルトの名無しさん:2006/08/27(日) 03:24:15
ありがとうございます。これで寝れる。

229 :京大生www:2006/08/28(月) 20:16:23
qsortがうまくいかないんですが、原因が分かりません。
http://www.uploda.org/uporg496204.cpp.html

うpしました。
これからどうやって円周率を求めるかはあとでお見せします。
芸術的な方法だと自分では思っています。

230 :デフォルトの名無しさん:2006/08/28(月) 20:36:17
qsort関数なんか使ったことないから知らんけど、stdlib.hインクルードしなくていいの?
ttp://www.kyoto-su.ac.jp/~yamada/ap/qsort.html
>標準ライブラリ関数 qsort は, stdlib.h の中で次のように宣言されており,

231 :デフォルトの名無しさん:2006/08/28(月) 20:42:46
つーかC++ならstd::sort使えよ。std::qsort()ならcstdlibな。

232 :デフォルトの名無しさん:2006/08/28(月) 20:48:59
>>230
そこじゃ無くてcompareの返り値じゃね?

233 :デフォルトの名無しさん:2006/08/28(月) 20:50:45
って回答しちまったけど、別に>>229は質問して無いんだよな。「原因が分らない」っていってるだけで。

234 :京大生www:2006/08/28(月) 20:57:19
出来ない・・・・。
ようするに.xの成分で並び替えたいんです。
原因を追求してもらえませんか?

235 :デフォルトの名無しさん:2006/08/28(月) 21:01:52
頭が悪いからじゃね?

236 :デフォルトの名無しさん:2006/08/28(月) 21:02:54
>>234
return (p1->x - p2->x) ? (p1->x < p2->x) ? -1 : 1 : 0;

doubleがintに変換される際に小数点以下が切り捨てられてしまってるぞ。

237 :デフォルトの名無しさん:2006/08/28(月) 21:08:07
なんつうか意味なく三項演算子とか使って背伸びしてるのが

238 :デフォルトの名無しさん:2006/08/28(月) 21:10:44
別に無理してねーよ。最初の書き方から出来るだけ少ないタイプ量で
直しただけで。

239 :京大生www:2006/08/28(月) 21:37:21
>>236
意味がわかりません。
ちゃんと書いてください。

240 :デフォルトの名無しさん:2006/08/28(月) 21:39:03
>>239

if (p1->x < p2->x)
return -1;
else if (p1->x > p2->x)
return 1;
else
return 0;

と等価です。

241 :デフォルトの名無しさん:2006/08/28(月) 21:48:41
本当に京大生か?頭悪そう・・・・

242 :京大生www:2006/08/28(月) 21:50:55
あー。なるほど、正(負)の整数じゃなきゃだめなのか。
おkwwwwwwww

あとはー、どうやってパイ計算するか分かるか。
いや、おれにも出来るかどうかの確信はないのだがな。

243 :デフォルトの名無しさん:2006/08/28(月) 21:54:21
そりゃ多角形の面積を求めればπも出てくるだろ・・・・
昔の数学者が初めて円周率を求めたのと同じ方法だ。

244 :デフォルトの名無しさん:2006/08/28(月) 22:17:02
π=3

245 :デフォルトの名無しさん:2006/08/28(月) 22:32:21
>>241
きっと京都学園大生かと。

246 :京大生www:2006/08/28(月) 22:50:46
>>243
まぁそういうことなんだけど、ただどうしておれがこんなややこしい変数のとり方をしているのかが分からないかな。
いや、ただしいという確証はないんだよ、でもおれのカンが正しければきっとsampleをあげれば正しいパイに収束するはずなんだ。
違うかな、なんとなくのカンなんだけど。
片方だけの取り方だと分布が一定じゃないんだけど、両方から攻めると分布が一定じゃないにしろ対称になる。(もちろん無限個とれば完全対称)
基本的には角度をとってやりたいんだけどパイが入るから出来ない。(求めるパイを使ってやるから)
なので無理やりにでも角度の分布とこの場合に同じ条件のものを作ろうと考えた結果、逆の分布を足して非対称を対称にしたらどうかと考えた。
ちょっとやってみるかな・・・出来なかったらちょっと頭が悪かったってことでw

247 :デフォルトの名無しさん:2006/08/28(月) 23:01:21
ちょっとじゃなくてかなりだろ

248 :デフォルトの名無しさん:2006/08/28(月) 23:06:20
無理せずにマチンの公式でも使っておけば?
テーラー展開すれば多倍長演算だけでできるぞ。

249 :京大生www:2006/08/28(月) 23:13:35
頭が悪かったようだ・・・

250 :デフォルトの名無しさん:2006/08/28(月) 23:15:15
>>249
秋刀魚食え。頭が良くなるぞ。

251 :デフォルトの名無しさん:2006/08/28(月) 23:26:30
質問です。
汎用レジスタ(ER0)の値をプログラムで判定したいのですが、
アセンブラ内でしかER0をいじれません。
C上で動かすにはどうしたらいいのでしょうか?
環境はHEW、CPUはH8Sです。お願いします。

252 :京大生www:2006/08/28(月) 23:29:13
やったぁああああああああああああ
キタ━━━━━━(゜∀゜)━━━━━━!!!!

やべ・・・・・天才。
今から論文かこ、超画期的なアイデアだ・・・・
ちなみに
3.14159
までちゃんとでた。


253 :デフォルトの名無しさん:2006/08/28(月) 23:33:54
>>251
EROはマン・コマンド といってみるレイヤー

254 :デフォルトの名無しさん:2006/08/28(月) 23:38:03
>>251
コンパイラのマニュアル嫁。

255 :デフォルトの名無しさん:2006/08/29(火) 00:08:55
>>251
http://pc8.2ch.net/test/read.cgi/tech/1125994426/919
???

256 :デフォルトの名無しさん:2006/08/29(火) 01:19:56
>>252

スレ違い。
↓こちらへどうぞ。
ttp://c-au.2ch.net/test/-/tech/1148297648/i

257 :デフォルトの名無しさん:2006/08/29(火) 08:11:31
たぶんライブラリ関数の帰り値がER0と書かれているんだろな。

ER0はCの関数の帰り値
つまり、C上で使えないどころか、その関数を呼んで
やりたい判定とやらをやればいいのであって

258 :デフォルトの名無しさん:2006/08/29(火) 09:06:07
>>257
コンパイラのマニュアル
(M8S2378なら
ttp://japan.renesas.com/fmwk.jsp?cnt=h8s2378_h8s2378r_root.jsp&fp=/products/mpumcu/h8s_family/h8s2300_series/h8s2378_h8s2378r_group/
のドキュメント内
「H8S H8/300シリーズ C/C++コンパイラパッケージ V.6.01 ユーザーズマニュアル」)
の「9.3C/C++プログラムとアセンブリプログラムとの結合」

...と書いても仕方がない気がした。

259 :デフォルトの名無しさん:2006/08/29(火) 18:05:39
ある変数が、ヒープ上にあるか、そうでないかを判定する方法があれば教えてください。

260 :デフォルトの名無しさん:2006/08/29(火) 18:37:06
>>259
標準には無い。環境を特定して移植性を無視すれば、なんとかなるかもしれない。

261 :デフォルトの名無しさん:2006/08/30(水) 03:13:39
大抵の環境ならアドレス範囲見れば大体分かる。

262 :京大生www:2006/08/30(水) 13:19:49
#include <math.h>
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>

#define max 300

int main (void) {
int i;
int sum = 1;

for (i=1; i<max; i++) {
sum = sum * i;
}

cout << sum << endl;

return 0;
}
なぜ答えが0になる?
教えてくれよ

263 :デフォルトの名無しさん:2006/08/30(水) 13:22:17
>>262
途中でsumがオーバーフローして結果がおかしくなってる。
intの代わりにdouble使ってみろよ。

264 :デフォルトの名無しさん:2006/08/30(水) 13:24:02
いやdoubleでもオーバーフローするな。
long double(80ビット)を使ってようやく

1.02019e+612

という答えを得た。

265 :デフォルトの名無しさん:2006/08/30(水) 13:27:24
オーバーフローしたからといって必ず0になるわけではない。
1*2*3*4*5*6*7*...*300
という計算をする途中 6=2*3 4*2*2 8=2*2*2
と2倍が1つある毎に下の桁が0に固定されてゆく

だからこの計算の結果は0になるわけだ

266 :デフォルトの名無しさん:2006/08/30(水) 13:31:03
「答え」というのなら戻り値が0だからいいんじゃん。

267 :デフォルトの名無しさん:2006/08/30(水) 13:32:25
>>266
そろそろ恥ずかしくなってきたんじゃないか?

268 :京大生www:2006/08/30(水) 13:42:55
300だと演算が遅くてずっと計算中になった。
100だと一瞬で終わったがまぁ、元にかけるものも増えるから演算にかかる時間が爆発的に上がるんだろう。
足し算だと速い。
つまり足し算と掛け算の入り組む計算ではなるべく掛け算を減らした方が一般的に演算速度が早くなるということがいえる。

でおk?

269 :デフォルトの名無しさん:2006/08/30(水) 13:43:40
そもそも、sum?

270 :京大生www:2006/08/30(水) 13:44:44
別にいいじゃん。

271 :デフォルトの名無しさん:2006/08/30(水) 13:47:22
どんなPC使ってんだよw

long doubleで300!を求めても一瞬だぞ。それともオーバーフローに
何らかの処理をする処理系なのか。

272 :京大生www:2006/08/30(水) 13:50:52
え、そんなに性能悪くないと思うけど。
1,3Ghzあるし、メモリも512MB、何か問題があるのか。
300までの掛け算は諦めた、これ答えでねーよ。永遠の謎ってことでおk?

273 :デフォルトの名無しさん:2006/08/30(水) 13:51:37
O(n) のアルゴリズムで n が 3倍になったら おおよそ3倍の時間コストかかるのは良いとしてだな
それ以上の時間差があったように見受けられるが、
オーバーフロー発生するごとにペナルティかかっているのか?

274 :京大生www:2006/08/30(水) 13:51:40
ちなみにlong doubleはdoubleと等価でしょ?

275 :デフォルトの名無しさん:2006/08/30(水) 13:52:59
とりあえずコテハンがウザイ

276 :京大生www:2006/08/30(水) 13:53:08
>>273
なんで3倍なんだよ。もっとかかるだろ。
元の桁数が爆発的に増えすぎる。

277 :デフォルトの名無しさん:2006/08/30(水) 13:53:17
>>274
処理系による。規格ではsizeof(double)==sizeof(long double)でも
一向に構わない。

俺はBCC使ってるから。VCだと同じ。
gccだとなぜかsizeof(long double) == 10になる。

278 :デフォルトの名無しさん:2006/08/30(水) 13:53:48
>>276
あのう・・・・浮動小数点ってご存じですか?

279 :麻布卒www:2006/08/30(水) 13:53:48
>>275
これもある

280 :デフォルトの名無しさん:2006/08/30(水) 13:54:15
>>276
固定小数点演算してるのか? どういう処理系だよそれ

281 :デフォルトの名無しさん:2006/08/30(水) 13:58:19
整数だけなんだから、多倍長演算もいいかもね。これなら
きちんと1の位まで求められる。

282 :京大生www:2006/08/30(水) 14:08:05
#include <iostream.h>
#include <math.h>
#include <windows.h>

#define max 6

int main (void) {
int i;
double ans[max];
DWORD start, end;

start = timeGetTime();

for(i=1;i<=max;i++) {
ans[i] = pow(2, i*100)* pow(2, i*100);
}

end = timeGetTime();

for(i=1; i<=max; i++) {
cout << ans[i]<<endl;
}

cout << start-end << endl;

return 0;
}

283 :京大生www:2006/08/30(水) 14:09:20
max = 6でとまるんだが。

284 :デフォルトの名無しさん:2006/08/30(水) 14:09:43
以前から思っていたが、京大生wwwは無知から来る謎の思い込みで
問題を無理矢理解釈しようとすることが多すぎだ。
前提知識が圧倒的に足りない。人に聞く前に勉強した方が早いと思う。

285 :京大生www:2006/08/30(水) 14:10:46
京大生に教えるチャンスなんか滅多にないぞ

286 :デフォルトの名無しさん:2006/08/30(水) 14:13:28
取り敢えずBCC用にこう直した。

#include <iostream.h>
#include <math.h>
#include <windows.h>

#define max 6

int main (void) {
int i;
long double ans[max+1];
DWORD start, end;

start = timeGetTime();

for(i=1;i<=max;i++) {
ans[i] = powl(2, i*100) * powl(2, i*100);
}

end = timeGetTime();

for(i=1; i<=max; i++) {
cout << ans[i]<<endl;
}

cout << end-start << endl;

return 0;
}


287 :デフォルトの名無しさん:2006/08/30(水) 14:14:11
1.60694e+60
2.58225e+120
4.14952e+180
6.66801e+240
1.07151e+301
1.72185e+361
0

結果はこう。

288 :デフォルトの名無しさん:2006/08/30(水) 14:20:08
ちなみにVC8で

#include "stdafx.h"
#include <iostream>
#include <limits>

int main()
{
std::cout << std::numeric_limits<double>::max() << std::endl;
}

を実行すると

1.79769e+308

なので、そのままでは途中でオーバーフローを起こすのが目に見えている。

289 :デフォルトの名無しさん:2006/08/30(水) 14:20:59
そこでBigInt

290 :京大生www:2006/08/30(水) 14:31:26
>>287
おれはプログラムが止まった。
途中まではもちろん0
仕様?

今BCCのコンパイラ使ってるんだけど、これから

C++ builderを買うのと
VCの新しいやつ買うのとどっちがオススメ?なんかBorland悪名高いんだけど。

291 :デフォルトの名無しさん:2006/08/30(水) 14:34:48
>>290
用途によるだろ。BDSは仕事にも勉強にも向かない。どちらかと言うと
趣味用。
VC8は仕事にも勉強にも多用されるし、参考書も参考サイトもいっぱいある。

途中で止まるのは、オーバーフローを起こした結果トラップでもかかったから。
そういう場合は、DBL_MAX以上の小数を扱えるクラスを作るしかない。

292 :デフォルトの名無しさん:2006/08/30(水) 14:35:00
VC8のExpress Editionは無料なんでまずそれにしとけ

293 :京大生www:2006/08/30(水) 14:36:34
BDSって何だよ

294 :デフォルトの名無しさん:2006/08/30(水) 14:43:26
BDS=Borland Developer Studio

Borland Developer Studio 2006 No.07
http://pc8.2ch.net/test/read.cgi/tech/1154069526/

Turbo Free版をDLすれば、C++Builderのサブセットのような事もできる。
おまけとしてBCCの最新版も付いている。

295 :デフォルトの名無しさん:2006/08/30(水) 14:44:45
このスレだけ見てると京大の先生ってものすごく大変そうだな

296 :デフォルトの名無しさん:2006/08/30(水) 15:00:17
そんな遠まわしじゃなくていいから、こういうやつには素直に言ってやれよ!

297 :デフォルトの名無しさん:2006/08/30(水) 15:01:06
京大生はバカ

298 :デフォルトの名無しさん:2006/08/30(水) 15:06:57
京大生wwwは、やればできる子。


299 :デフォルトの名無しさん:2006/08/30(水) 15:11:19
京大生wwwに対して親切にレスしている奴は
何か親近感でも持っちゃってるの?

300 :デフォルトの名無しさん:2006/08/30(水) 16:28:54
ヒント:ここは初心者歓迎

301 :デフォルトの名無しさん:2006/08/30(水) 16:31:08
初心者以前はいかがいたしましょう

302 :デフォルトの名無しさん:2006/08/30(水) 16:35:02
論外

303 :デフォルトの名無しさん:2006/08/30(水) 17:00:43
きっと「俺もこんな時期あったなぁ」とほほえましく思って、
親切なレスをしてしまうのではないだろうか。

京大生wwwくんの中身予想

勉強がけっこうできる中学生か高校生。日本史苦手。
容姿普通。モテるほうではない。
特別な苦労をせずにいままで勉強ができていたのに、プログラミングで詰まっている。
将来京大に入りたいと思っていて、入れるくらいの成績もいまのところ取っている。
クラスでは頭がよくて嫌味なやつ、と思われているが、仲の良い友達はいる。
犬にかまれたのがトラウマ。動物全般が嫌い。
親にはついつい憎まれ口をたたいてしまう。
年の離れた兄とは仲がいい。妹をよくからかっている。


304 :デフォルトの名無しさん:2006/08/30(水) 17:11:13
多次元ポインタのメモリの確保、開放は
以下のやり方でいいでしょうか。

int main(void)
{
enum {x = 20, y = 10};
char **strs = new char *[y, x];
int i;

for(i = 0; i < y; i++){
delete[] strs[i];}
delete[] strs;

return 0;
}

305 :デフォルトの名無しさん:2006/08/30(水) 17:19:44
配列の勉強やり直した方がいいと思うよ

306 :304:2006/08/30(水) 17:33:32
ダメみたいですね。

Cでは、以下のようにできたんですが、
c++は直前に型の名前自体を付けないといけないので、
MallocTwoInt、MallocTwoCharとか
型の種類分作らないといけなくなるので、
変なやり方を試していました。

void **MallocTwo(size_t size, int X, int Y)
{
int y;
void **data;

if((data = malloc(sizeof(void *) * Y)) == NULL)
return NULL;

for(y=0; y<Y; y++)
if((data[y] = malloc(size * X)) == NULL)
{
FreeTwoTwo(data);
return NULL;
}

return data;
}

307 :デフォルトの名無しさん:2006/08/30(水) 17:37:09
どうやら君は初心者未満のようだ。
C言語なら俺に聞けの入門編スレにも行きなさい。

308 :304:2006/08/30(水) 17:37:27
int **NewTwoInt(int X, int Y)
{
int y;
int **data;

data = new int *[Y];

for(y=0; y<Y; y++)
data[y] = new int[X];

return data;
}

char **NewTwoChar(int X, int Y)
{
int y;
char **data;

data = new char *[Y];

for(y=0; y<Y; y++)
data[y] = new char[X];

return data;
}

309 :デフォルトの名無しさん:2006/08/30(水) 17:37:54
それいぜんにその二次元配列の宣言の仕方は C# のもので、
C/C++ ではあなたの意図とはまったく違う。

310 :304:2006/08/30(水) 17:42:26
まじですか?
ずっと、これでやっていました。
講座にも書いてありますし。
ttp://www.clip.gr.jp/~imai/PukiImaiWiki/index.php?C%2B%2B%2F%C2%BF%BC%A1%B8%B5%C7%DB%CE%F3%A4%CE%C6%B0%C5%AA%BA%EE%C0%AE

311 :デフォルトの名無しさん:2006/08/30(水) 17:46:25
ページに書いてあることと、>>304のソースが同じに見える?
ちゃんとすみっこまで数字が格納できるか試してないでしょう。


312 :デフォルトの名無しさん:2006/08/30(水) 17:49:36
今日からプログラムを勉強してみようと思ってるんですが 
CとC++ どちらからはじめたほうがいいですか?

313 :304:2006/08/30(水) 17:52:28
あっ、C#のやり方というのは>>304の事で、
>>306>>308のやり方の方ではないのですね。

>>304のは、始めはうまく起動されたのですが、
何度かやると、強制終了されてうまくいかなくなっていました。

314 :デフォルトの名無しさん:2006/08/30(水) 18:06:56
「わかったつもり」になる前に
どんな入門書にも書いてある「文法」を学べよ。

315 :京大生www:2006/08/30(水) 18:11:11
おれはふつうにプログラムを勉強中の京大生です。
この前円周率の出し方をプログラムしたけど下10桁くらいでズレた。
たぶん精度の問題だと思うし、doubleとかintとかの違いを勉強してる。
あと演算速度とか、最適化っていうのかな。
基本的に頭はいいです。分かってるだろうけど。
教えてもらえば理解はするし、頼むからいろいろ教えてくれ。

BDSはわかった。
IDEという言葉は知ってたが、borland C++ builderという呼び名しか知らなかったし。
おれが言ったふたつのソフトの差は何?
どっちが優れてるんだ、ソフトを作るにはどっちがいいんだ。
borlandは倒産したんじゃねーの?

316 :デフォルトの名無しさん:2006/08/30(水) 18:30:21
> 基本的に頭はいいです。分かってるだろうけど。
すまんが後半読んだだけで頭悪いこと丸わかりだから。

317 :京大生www:2006/08/30(水) 18:34:10
才能をねたまれるのは慣れてます。

318 :デフォルトの名無しさん:2006/08/30(水) 18:41:03
京大ってのは、なんでも手取り足取り教えてくれる大学なのかい?
自分で学ぶことの大切さを学ばなかったのかい?
そのへんが京大ぽくない。あくまでイメージだけど。


319 :デフォルトの名無しさん:2006/08/30(水) 18:43:24
院卒がいるんだが(現在休職中)、そいつと似たり寄ったりで なんだかなーと思う次第。
# サンプルが極少数と限られているので一般化するのは危ないが。

320 :デフォルトの名無しさん:2006/08/30(水) 18:45:12
自分で学ぼうとしない人にプログラミングは向いてないね。

321 :デフォルトの名無しさん:2006/08/30(水) 18:49:02
というか自分で学ぼうとしない人に大学は向いてない罠。

322 :京大生www:2006/08/30(水) 18:52:50
授業にはでません。
でも単位はとれます、なぜなら図書館で勉強するからです。
プログラムは授業ではやりましたが、足りません。だから自分でももっと深く踏み込んでいます。
これを自学自習といい、これこそが京大の掲げる教育理念であります。
だが、しかしプログラムは調べても分からないことが多すぎる。
なのであなた方に直接、ソースを見てミスを直してもらうという道をとっているだけ。
いってみれば2ちゃんはテキスト。
聞けば答えてくれるテキスト。
だけどあなた方から問題を出されたりすることはないでしょう。だからこれは自学自習です。

323 :デフォルトの名無しさん:2006/08/30(水) 19:04:55
踏み込んでるじゃなくて迷い込んでるの間違いだろうw

324 :京大生www:2006/08/30(水) 19:11:02
迷うことを怖れて踏み込まなかったのは誰だ?

325 :デフォルトの名無しさん:2006/08/30(水) 19:16:45
>>315
よくわからないならとりあえずVisual Studio買っておけ
学生なら安いだろ

326 :京大生www:2006/08/30(水) 19:19:05
安いが、いらないものを買ってもしゃーない。
それぞれに長所短所をまとめてくれ。

327 :デフォルトの名無しさん:2006/08/30(水) 19:30:11
>>326
自分で長所短所を調べられないようなやつは
とりあえずVisual Studio買っておけ

328 :デフォルトの名無しさん:2006/08/30(水) 19:42:35
分割コンパイルについて初歩的な質問をさせて下さい。
a.cppとb.cppに
#ifndef _TMP_H_
#define _TMP_H_
extern int tmp_for_save;
#else
int tmp_for_save;
#endif
と書くと
error LNK2001: 外部シンボル ""int tmp_for_save" (?tmp_for_save@@3HA)" は未解決です。
というエラーがでます。
また両方のcppに
#ifndef _TMP_H_
#define _TMP_H_
int tmp_for_save;
#else
extern int tmp_for_save;
#endif
とextern宣言を入れ替えると
error LNK2005: "int tmp_for_save" (?tmp_for_save@@3HA) は既に定義されています。
と怒られます。
#define _TMP_H_ が効いていない様なのですが、
どうすればビルド出来るでしょうか。
環境はVC.net2003です。
よろしくお願いいたします。

329 :麻布卒www:2006/08/30(水) 19:47:13
>>327
とりあえずVisualを買うと、現在の環境(borland complierとbcpad)から何が変わるか教えてくれ。
IDEを買うとGUIのソフト作るの楽て聞いたけど、じゃあなぜVisualが売れるんだ、これでもソフトが作れるのか?

330 :デフォルトの名無しさん:2006/08/30(水) 20:07:26
とりあえずデバッグが楽になるぞって書こうと思ったんだけど、
冷静に考えたら自分でデバッグとかしそうにないよね・・・

331 :デフォルトの名無しさん:2006/08/30(水) 20:08:35
>>329
とりあえずIDEという言葉について少し用語集で検索して来い。

332 :デフォルトの名無しさん:2006/08/30(水) 20:08:47
>>328
何のために
#ifndef _TMP_H_
#define _TMP_H_
をしているのか、よーく考えてみなさい。

333 :デフォルトの名無しさん:2006/08/30(水) 20:08:48
馬鹿は意味も知らずにすぐ知ってる略語を使いたがるから困る

334 :デフォルトの名無しさん:2006/08/30(水) 20:13:13
つられちゃダメだぞ!

335 :京大生www:2006/08/30(水) 20:17:08
バカにしてんの?
デバックが楽になるってどういうことー?

336 :デフォルトの名無しさん:2006/08/30(水) 20:18:05
おまえらそろそろ池沼STOP

337 :デフォルトの名無しさん:2006/08/30(水) 20:44:01
初めて質問します。
現在、C++(a.cpp)のソースの中で、C(b.c)のソースの関数を呼び出そうとしています。
Cのソースはgccのみでコンパイル可能です(g++では不可)
又、C++のソースはg++でコンパイル可能でした。
そのため、

g++ a.cpp b.c

でコンパイルしようとすると、大量のエラーが発生してしまいます。
cのソースをc++に移植しようとしたのですが、ソースコードが大量で移植しきれません。
又、gccでb.cをコンパイルして、a.cppの中で、b.cのオブジェクトファイル
を呼び出せば良いのですが、リソースの問題上、裏でシェルを走らせる
事は出来ない状態です。

この解決法として、b.cのdllを生成し、a.cpp内からb.cの関数を呼び出すと言った
方法が適切なのでしょうか?




338 :デフォルトの名無しさん:2006/08/30(水) 20:46:06
>>337
g++ -c a.cpp -o a.o
gcc -c b.c -o b.o
g++ a.o b.o -o a.exe

339 :デフォルトの名無しさん:2006/08/30(水) 20:46:30
/tmpにa.oとb.oを吐き出せばいいじゃん。

340 :デフォルトの名無しさん:2006/08/30(水) 20:46:43
>>338
extern "C"を忘れずにね!

341 :東大生www:2006/08/30(水) 20:55:01
>>337
gcc -c b.c
g++ b.o a.cpp

b.cの関数の宣言を下記のようにextern "C" { }で囲むこと。

#ifdef __cplusplus
extern "C" {
#endif

// 関数宣言
void TestFunc();

#ifdef __cplusplus
}
#endif

342 :デフォルトの名無しさん:2006/08/30(水) 21:01:57
ありがとうございます。
やってみます!

343 :デフォルトの名無しさん:2006/08/30(水) 21:03:12
一番簡単なのは拡張子を・・・・
(完全アッパーコンパチではないから場合によっては無理だけど。)

344 :京大生www:2006/08/30(水) 21:05:14
東大生がきたwww

345 :デフォルトの名無しさん:2006/08/30(水) 21:06:06
だから、京大生じゃないんだって
いつまでマジレスしてんだか・・

346 :デフォルトの名無しさん:2006/08/30(水) 22:13:52
>>337です。
皆さんアドバイスありがとうございました。
>>341さんの方法でやってみたところ、コンパイルすることが出来ました。

簡易化のためにcのソースが一つの場合で質問しましたが、実際には
一つのcの関数を呼ぶために、20個くらいの.cファイルを用いていたので、
gcc -c a1.c a2.c a3.c ...
としてそれぞれのオブジェクトファイルを生成して、
g++ -o b.o b.c a1.o a2.o a3.o ...
という感じになりました。

本当に助かりました。有難う御座いました。

347 :デフォルトの名無しさん:2006/08/30(水) 22:29:51
makeファイル書けよ・・・・

348 :デフォルトの名無しさん:2006/08/30(水) 22:34:20
>>347
makefileを書くと負けだと思っている

349 :デフォルトの名無しさん:2006/08/30(水) 23:02:46
automake使えよ


350 :デフォルトの名無しさん:2006/08/30(水) 23:43:16
mkmfでいいじゃん

351 :デフォルトの名無しさん:2006/08/31(木) 10:29:14
京大生ってなんて読むの?
きょん・でじゅん?

352 :デフォルトの名無しさん:2006/08/31(木) 10:32:12
京大生www = 
×京都大学
○京城帝国大学(現ソウル大学)

353 :デフォルトの名無しさん:2006/08/31(木) 10:42:49
うはwこっちのスレも京大生に感染したwww

354 :京大生www:2006/08/31(木) 10:56:35
呼んだ?

355 :デフォルトの名無しさん:2006/08/31(木) 15:53:24
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)でも同じと思って間違いないでしょうか。

新着レス 2006/08/31(木) 15:42
>>109 名前: デフォルトの名無しさん [sage] 投稿日: 2006/08/31(木) 15:27:21
1,OS依存ではなくコンパイラ依存
2.コンパイラによる
3.エンディアンはCPU依存

そしてここは重複スレだ

すみませんでした。
そうですよね、なんで値があわないんだろう。


356 :デフォルトの名無しさん:2006/08/31(木) 15:58:22
>>355
なにをどうしたいんだ、おまいさんは?

357 :355:2006/08/31(木) 16:25:52
重複すれの108です。

>>356
重複すれだと言われたので、移動して、最後に返答しました。

「すみませんでした。
そうですよね、なんで値があわないんだろう。」

が最後の返答でした。


358 :355:2006/08/31(木) 16:37:08
>>109
2.コンパイラによる

というのは、コンパイラによってはOS依存になりえるということでしょうか。

32bit整数はos依存とかいう記載もいくつかあったもので・・・・・

359 :337:2006/08/31(木) 21:34:13
>>337です。
c++のソースの中で他のファイル(c言語)の関数を実行するプログラムを書いています。

System関数を用いて、cのオブジェクトファイルを実行すると何度でも問題なく動くのですが、
c++のソース内から直接cの関数を呼び出そうとすると、1度目は成功するのですが、2度目からSegmentationFaultに
なってしまう現象が発生してしまいます。(cの関数内では、システム情報を
取得し、ファイルに書き出す処理をしています。)

System関数で呼び出す方法と、直接呼び出す方法では何か大きな違いがあるのでしょうか?
cの関数内でfreeを行っているのでメモリの問題は無いと思っているのですが...

360 :デフォルトの名無しさん:2006/08/31(木) 21:56:50
>>359
Cのソースが一度の呼び出ししか想定していない、とか。
static変数の初期値に依存していたりしないか?

361 :デフォルトの名無しさん:2006/09/01(金) 01:46:47
>>355
x86系のWin98とXPなら、そのへんは環境による差はないよ。
本当に同じプログラムを実行しているのか確認せよ。

これ以上は、実際のコードを出さないとアドバイスは得られないと思う。


362 :デフォルトの名無しさん:2006/09/01(金) 01:49:49
どうせwin98でサポートしてないAPIでも呼び出したのでわ?

363 :デフォルトの名無しさん:2006/09/01(金) 02:09:34
>>362
それは、起動できないか落ちるのでは?

364 :デフォルトの名無しさん:2006/09/01(金) 04:16:42
>>359
>System関数で呼び出す方法と、直接呼び出す方法では何か大きな違い

ありすぎですわ。
多分>>360の指摘するとおり。

365 :355:2006/09/01(金) 10:02:50
>>361-363
関係ないところでミスしてました。
お騒がせして申し訳ありませんでした。

API使ってないと云ってましたが、ユーザ名とコンピュータ名の呼び出ししてて、
コンピュータ名の呼び出しで、第2引数のバッファの大きさの値が、ユーザ名の呼び出しの
ときに小さい値に変えられてて、それを直すの忘れてたからでした。
win98のPCのユーザ名がコンピュータ名より短くなっててコンピュータ名が取れて無かった
せいでした。
本当にごめんなさい。

366 :デフォルトの名無しさん:2006/09/01(金) 19:20:03
最近C言語に興味をもった初心者以前の者です。
お薦めな入門書とかあったら教えていただけないでしょうか?

367 :京大生www:2006/09/01(金) 19:22:26
ネットで十分

368 :デフォルトの名無しさん:2006/09/01(金) 22:39:59
>>366
最近はアセンブラの良い本が出てるらしいな
それを読め
C言語の入門書で正確にマシンアーキテクチャの概念を
定義している本はないので読んでも無駄
メモリやアドレスの定義がないので絶対わからん

369 :デフォルトの名無しさん:2006/09/01(金) 22:50:34
あー、そうかそうか!
実際のメモリがどうなってるか知らなければ、そりゃポインタわからないよな。
何かすごい納得した。今日はいい日だった。

370 :デフォルトの名無しさん:2006/09/01(金) 23:32:01
はじめまして。最近C++を勉強しだしたものです。
OOPの本を読んで、基底クラスの属性を、派生クラスは
継承するもんだと思ってたのですが、
実際にコードを打ってみた所、理解できない現象が起きて困っています。

class Base{
private:
int iMember;
};

class Derived:public Base{
public:
Derived(int aInput)
{
iMember = aInput;
} 
void show_iMember()
{
cout << iMember << endl;
}
};

int main(){
Derived obj;
obj.show_iMember();
}


371 :デフォルトの名無しさん:2006/09/01(金) 23:32:32
↑の続き。


publicで継承した場合、派生クラスは基底クラスのprivateメンバ変数と同じ変数を自分で持っているんじゃないんでしょうか?
このプログラムだとエラーが起きて、Base::iMemberの宣言を確かめろ、みたいに言われてしまいます。


protectedに指定すれば、privateでもちゃんと継承しますよね。
protectedに指定するしかないんでしょうか。


372 :デフォルトの名無しさん:2006/09/01(金) 23:33:56
>>371
private宣言のプロパティは子クラスからは参照できない

373 :デフォルトの名無しさん:2006/09/01(金) 23:49:56
>>372
ありがとうございます。ちょっと理解できました。
すみません、少し違う質問をしたいのですがいいですか?
派生クラスのオブジェクトを生成すると、自動的に基底クラスも生成されるんですよね?

374 :京大生www:2006/09/01(金) 23:50:49
継承は
::publicではなかったか。


375 :デフォルトの名無しさん:2006/09/01(金) 23:54:54
>>373
派生クラスのオブジェクトの中に基底クラス部分が含まれるという
意味なら合っている。

376 :デフォルトの名無しさん:2006/09/01(金) 23:56:32
>>374
それはソースのどの部分のことを言っているんですか?
スコープ演算子は継承と直接的にはあまり関係ないような気がするのですが・・・。

377 :デフォルトの名無しさん:2006/09/01(金) 23:58:04
>>376
スルーしる

378 :デフォルトの名無しさん:2006/09/02(土) 00:08:35
>>375
ありがとうございます。最後の質問をさせてください><
派生クラスのオブジェクトを作った際に、基底クラスのpublic宣言したメソッドを利用して
基底クラスのprivate変数にアクセスすることはできないのでしょうか。
派生クラスの部分として基底クラスも生成されているのだとしたら、
できそうな気がするのですが・・・。

>>377
了解しました。

379 :デフォルトの名無しさん:2006/09/02(土) 00:09:58
>>378
それはやってみれば分かるんじゃないか?
書くのがそんなに難しいコードになるとは思えんが。

380 :デフォルトの名無しさん:2006/09/02(土) 00:12:22
>>378
すみません、一応書いて実行したらエラーが出た所まではやってみました。
ただこれをどう理解すればいいかで、ちょっと解らなくて聞いてしまいました^^;

381 :デフォルトの名無しさん:2006/09/02(土) 00:17:20
Java使いがC/C++言語を学ぶ上で特に気をつける点はなんですか?

382 :デフォルトの名無しさん:2006/09/02(土) 00:22:24
>>381 転んでも泣かない。

383 :デフォルトの名無しさん:2006/09/02(土) 00:22:55
>>380
コード載せてみろ。

384 :デフォルトの名無しさん:2006/09/02(土) 00:24:26
>381
Bjarne Stroustrupのギャグには大爆笑する。

385 :デフォルトの名無しさん:2006/09/02(土) 00:26:19
>>381
禿げた頭は残さずなでる。

386 :デフォルトの名無しさん:2006/09/02(土) 00:27:48
>>381

読んどけ
ttp://www.ogis-ri.co.jp/otc/hiroba/technical/CppForJava/1/index.html

387 :デフォルトの名無しさん:2006/09/02(土) 00:32:32
質問です、DLLを作ろうと思うのですが
・実行時ロードでクラスをDLLに含む事は可能でしょうか?
・A.dllを作成した時、A.dll内に本体(仮にB.exeとする)の関数(B.exe内のHoge()とか)を呼び出す事は可能でしょうか?

388 :デフォルトの名無しさん:2006/09/02(土) 00:38:33
>>387
「クラスをDLLに含む」の意味がわからん。
B.exe から Hoge() がエクスポートされていれば呼び出すことは可能なはず。

389 :デフォルトの名無しさん:2006/09/02(土) 00:43:34
>>387
前者は無理だ。
オブジェクトを作って返す関数を公開するなどの間接的な手段を取る必要がある。

後者は388の言うとおりだが、EXEからDLLへ関数へのポインタを引き渡すのが一般的だと思う。

390 :387:2006/09/02(土) 00:44:43
>388
ありがとうございます、「・実行時ロードでクラスをDLLに含む事は可能でしょうか?」は
DLL内に関数のようにクラスが記述できるかということです。DLLはクラス非対応と聞いたのですが、
とはいえクラスだけの為にCOMを使うのも………どうにか使う手段があるのでしょうか、といった感じです。

391 :デフォルトの名無しさん:2006/09/02(土) 00:50:42
純粋仮想関数のみで構成されたインターフェースクラスを利用するとか。
言語的な保証は無いがCOMも同じ様な仕組みだし、注意深くやれば大丈夫だと思う。

392 :デフォルトの名無しさん:2006/09/02(土) 00:52:05
これか?
http://msdn.microsoft.com/library/ja/vccore/html/_core_export_from_a_dll_using___declspec.28.dllexport.29.asp

393 :デフォルトの名無しさん:2006/09/02(土) 00:59:27
ロケールについて質問なんですが、
std::locale::global(std::locale("japanese"));
ofstream file("ほげ.txt");
file << 12345 << endl;
とやると、ほげ.txtには"12,345"みたいに、
整数文字列中にカンマが入っちゃうんですが、
これを"12345"と出すにはどうすればいいんでしょうか?

環境はVC2005です。

394 :デフォルトの名無しさん:2006/09/02(土) 01:01:54
>389
ありがとうございます、やはり無理ですかorz
「EXEからDLLへ関数へのポインタを引き渡す」とは、どんな感じでしょうか?
プロトタイプ宣言とかでしょうか?
>391
FactoryMethodとインターフェースクラスとかでしょうか?
何と無く理解出来た気が、ありがとうございます。



395 :デフォルトの名無しさん:2006/09/02(土) 01:28:28
TTBaseっていうオープンソースのフリーソフトがexe本体からdllに関数をエクスポートしていた記憶がある

396 :デフォルトの名無しさん:2006/09/02(土) 01:30:29
>>393
これでどう?

// japanese ロケールのうち numeric カテゴリのファセットを
// C ロケールのファセットで置き換えたロケールをグローバルにセット
using std::locale;
locale::global(locale(locale("japanese"), "C", locale::numeric));

397 :デフォルトの名無しさん:2006/09/02(土) 01:40:18
>>396
やってみると、出力は12345になってくれるんですが、
出力ファイルのファイル名が化けてしまいます("ほげ"のところ)。
ロケール関連は情報が少なくて困る・・・


398 :デフォルトの名無しさん:2006/09/02(土) 01:51:25
>>397
>>393 のままならファイル名は化けないの?
numeric カテゴリ以外は japanese が使われるはずなんで、
そんなことは無いと思うんだけど。

VC2005 のロケールにはバグがあったような覚えがあるんだけど、
これも関係あるのかな?

399 :デフォルトの名無しさん:2006/09/02(土) 01:56:03
そもそもファイル名はマルチバイト文字だし、ロケールは関係ないはず。

400 :デフォルトの名無しさん:2006/09/02(土) 02:06:06
ofstream file("ほげ.txt");
のところを
ofstream file(L"ほげ.txt");
としたら、出力ファイル名OKでカンマもなくなりました。
なんか結局ロケール設定はいらなかったぽいです。
でも、ofstreamにwchar_t *渡してコンパイル通るのっていいのかな・・・

>>398
>>393のままならファイル名は化けませんでした。
なんかここら辺の関連性が良くわからない・・・
ちなみに、ロケール設定なしでofstream file("ほげ.txt")にすると、
ファイル名化けました。


401 :400:2006/09/02(土) 02:12:41
https://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=262314&SiteID=7
これに関連したような問題?
まあunicode使えば問題なさそうですね。

402 :380:2006/09/02(土) 02:13:04
>>382
すみません、あれから色々試した結果一応解決(?)できたと思います。
最初↓のようなコードを書いて試したらエラーになりました。

#include<iostream>
using namespace std;

class Base{
private:
int iMember;
public:
Base():iMember(10){}
void show()
{
cout << iMember << endl;
}
};

class Derived:public Base{
public:
};

int main(){
Derived obj;
obj.show();
}


403 :380:2006/09/02(土) 02:15:55
でも次のように書いたらちゃんとコンパイル通りました。

#include<iostream>
using namespace std;

class Base{
private:
int iMember;
public:
Base():iMember(10){}
void show()
{
cout << iMember << endl;
}
};

class Derived:public Base{
public:
void show_iMember()
{
show();
}
};

int main(){
Derived obj;
obj.show_iMember();
}

ちゃんと基底クラスのオブジェクトは存在しているんですね。
ただmain関数からアクセスする場合は、派生クラスの関数を利用しないと
駄目なんですね。

404 :デフォルトの名無しさん:2006/09/02(土) 02:20:34
>>403
アクセサについて調べた方が良さそうだな。

405 :380:2006/09/02(土) 02:54:50
>>404
ありがとうございます。調べてみました。↓のように変えればいいのでしょうか?
この方が良いコードなのですか?

#include<iostream>
using namespace std;

class Base{
private:
int iMember;
public:
Base():iMember(10){}
int get_iMember()const //getter
{
return iMember;
}
};

class Derived:public Base{
public:
void show_iMember()
{
cout << get_iMember() << endl;
}
};

int main(){
Derived obj;
obj.show_iMember();
}

406 :デフォルトの名無しさん:2006/09/02(土) 02:56:50
>>405
普通はそういう風に書くね。見通しがいいだろ?

407 :デフォルトの名無しさん:2006/09/02(土) 02:57:01
>>405
そんなサンプルでは良い悪いは判別不能。
そういう方法が使えるということだけ覚えておけばいい。

408 :380:2006/09/02(土) 03:07:37
>>406>>407
ありがとうございます。大体の文法は頭に入れたつもりなんですが、
どういう風に使うのかとかがぜんぜん解らず^^;
デザインパターンを覚えろと言われたので、今度からそれも勉強していきたいと
思っています。

409 :デフォルトの名無しさん:2006/09/02(土) 03:16:14
387
TTBaseについて調べてみました
externでプロトタイプ宣言するといった感じの様に思えますが、合っていますでしょうか?

410 :387:2006/09/02(土) 09:29:49
連レスすみません、どうやらexternではないようですね(汗
GetModuleHandle(NULL)からGetProcAddressするみたいですね。
GetProcAddressは知っていましたが、本体側にコールする方法に使うとは想像出来ませんでしたorz

一応、報告までに。色々教えてくださり、有難う御座いましたm(_ _)m

411 :デフォルトの名無しさん:2006/09/02(土) 11:40:51

C++で書いたプログラムにコマンドラインのユーザーインターフェースを付けたいのですが
どうしたらいいでしょうか? シェルとかgnuplotみたいな感じで履歴とか補完ができるとうれしいです。
一から全部作るべきでしょうか?
八方ふさがりです。助けてください。


412 :デフォルトの名無しさん:2006/09/02(土) 11:44:43
>>411
B-ShellなりGnuPlotなりのソースでも見てみたら?
尤も、1行編集機能は環境に任せられるなら
履歴管理くらいは自分で作っても簡単だろうけど。

413 :デフォルトの名無しさん:2006/09/02(土) 16:44:04
>>411
>ユーザーインターフェース
これをemacsにするとか


414 :デフォルトの名無しさん:2006/09/02(土) 16:48:53
C++ で
sizeof(bool) == sizeof(char)
であることは、保証されていますか?

415 :デフォルトの名無しさん:2006/09/02(土) 16:57:42
>>414
されていない。sizeof(char) == 1 だが、sizeof(bool) は実装依存。
ISO/IEC 14882, Section 5.3.2 参照。

416 :デフォルトの名無しさん:2006/09/02(土) 17:04:41
int サイズのコンパイラも見た事ある。

417 :デフォルトの名無しさん:2006/09/02(土) 18:27:48
>>416
できればコンパイラ名教えて。

418 :デフォルトの名無しさん:2006/09/02(土) 18:40:37
VC++4.2では4byteらしいよ

419 :デフォルトの名無しさん:2006/09/02(土) 20:04:07
>>411
readline(GPL)や、libedit(BSD)というライブラリがあります。使い方は難しくないです。
でもあなたの環境ですんなりリンクできるかは知りません。


420 :デフォルトの名無しさん:2006/09/03(日) 00:25:37
C++は、ANSI-CでどのC (C89、C99とか)と互換があるんですか?

421 :デフォルトの名無しさん:2006/09/03(日) 00:30:42
C言語勉強中です。
float array[3][2] = {1.1 , 2.2 , 3.3 , 4.4, 5.5 , 6.6 };
float *p;
p=(float *)array;
ここでfloat *型にキャストしないとエラーになるのはどういう理屈なんでしょうか。
p=array;でもいいような?


422 :デフォルトの名無しさん:2006/09/03(日) 00:39:30
float array[3][2] = {{1.1 , 2.2 , 3.3}, {4.4, 5.5 , 6.6 }};

float *row0=array[0]
float *row1=array[1]

だから。

p=(float *)array;
は、
float array[3*2]
と同じようなもので、float array[][]ではないからキャストが必要。

423 :デフォルトの名無しさん:2006/09/03(日) 00:41:32
arrayの方は float (*)[2] であって、float * ではないから。

424 :デフォルトの名無しさん:2006/09/03(日) 00:41:38
>>420
どれとも完全な互換性はない。
非互換になっているところは型安全性のためというのが主な理由。

>>421
そのarrayはfloat [2]の配列という型。
T型の配列のオブジェクトは式内でTへのポインタ型に変換されるという規則を当てはめると、
arrayはfloat [2]へのポインタ型になる。

ようするにfloat [2]へのポインタ型へならキャストなしで代入できる。
typedef float hoge_t [2];
hoge_t *ptr = array;

また、大抵は次のようにしても問題はない。(規格に照らし合わせて問題ないかは微妙だったはず)
float *p = &array[0][0]

425 :デフォルトの名無しさん:2006/09/03(日) 01:03:57
>>421
2次元配列ならダブルポインタ(float **p)にしないとだめなのよ
ポインタの配列を示すポインタってことになるかな

426 :デフォルトの名無しさん:2006/09/03(日) 01:07:04
>>425
デタラメ書くなハゲ

427 :デフォルトの名無しさん:2006/09/03(日) 01:09:30
いや、実際の処理系がどうこうじゃなく、そう考えた方が理解しやすいという話

428 :デフォルトの名無しさん:2006/09/03(日) 01:18:00
>>426
理解しやすいとかじゃなくて完全な間違いだボケ。

429 :デフォルトの名無しさん:2006/09/03(日) 01:22:42
gccにC++のISO規格に準拠できていない機能ってありますか?

430 :デフォルトの名無しさん:2006/09/03(日) 01:23:23
>>42
完全な間違いではないよ
アセンブラでは結局アドレスに1次元のサイズをn倍したアドレスを計算で求めてるだけでそれをテーブルに展開していれば同じこと
君インデックスレジスタとかオフセットアドレッシングとかはわかってるかな?

431 :デフォルトの名無しさん:2006/09/03(日) 01:26:58
>>430
float[][] の配列にアドレスのテーブルなど無い。

432 :デフォルトの名無しさん:2006/09/03(日) 01:27:30
>>429 export

433 :デフォルトの名無しさん:2006/09/03(日) 01:31:04
>>431
テーブルがあるかないかではないんだけど
ま、いいけどね
アセンブラ勉強してみ

434 :デフォルトの名無しさん:2006/09/03(日) 01:32:06
アセンブラ云々言う前に
配列の配列
ポインタの配列
の違いはわかってるのかね。

アセンブラでの扱いだって全然違うよ。
(x86の場合)、配列はleaでアドレスを得るもので
ポインタはmovでアドレスを得るもの。(この場合はロードの意のmov)

435 :デフォルトの名無しさん:2006/09/03(日) 01:33:29
>>430
もう見ていて痛すぎるので知ったかぶりはやめろ

436 :デフォルトの名無しさん:2006/09/03(日) 01:33:58
また新しいのが湧いたな。たのむからコテハン使ってくれよ。

437 :デフォルトの名無しさん:2006/09/03(日) 01:35:32
>>432
噸クス

438 :デフォルトの名無しさん:2006/09/03(日) 01:35:49
アセンブラ君はコテハンとトリップ付けてよ。君の発言面白いから。

439 :デフォルトの名無しさん:2006/09/03(日) 01:40:22
>>434
いや多分>>430の本来言いたいことは、配列が*になるならば、配列の配列は**になる
という摩訶不思議なCの法則(ってか初心者が挫折しやすいところかな?)を理解するにはそう考えるといいのかな?
って事なんじゃない貝?

よくわからんけど

440 :デフォルトの名無しさん:2006/09/03(日) 01:44:24
>>439
なぜ配列の配列が ** になるんだ馬鹿か?

441 :デフォルトの名無しさん:2006/09/03(日) 01:44:40
配列が*になるならば、配列の配列は**になるという摩訶不思議な法則などありません。

442 :デフォルトの名無しさん:2006/09/03(日) 01:46:40
「ポインタ配列」なら ** に変換できるかもしれないが、配列の配列は
[]の数が増えるだけですよ。

443 :デフォルトの名無しさん:2006/09/03(日) 01:49:27
飽きた

444 :デフォルトの名無しさん:2006/09/03(日) 01:51:09
たぶん分かっててわざと間違えたふりをしてるんだろ。そうだろ?

445 :デフォルトの名無しさん:2006/09/03(日) 01:51:26
皆さんレスありがとうございます。なかなか難しいですね。
ポインタをみっちりやったら充分な理解ができるでしょうか…
とりあえず
・float array[x][y]は【float [y]の配列】という型
という認識を胸に刻んでおきます。


446 :デフォルトの名無しさん:2006/09/03(日) 01:52:19
あ、445は421です。

447 :デフォルトの名無しさん:2006/09/03(日) 01:54:37
>>445
ちなみに、Cの多次元配列は、最初の次元に限りポインタ化する事ができる。

float[1][2][3]なら、float (*)[2][3]に変換できる。というかされる。

448 :デフォルトの名無しさん:2006/09/03(日) 02:20:56
あ〜ごめん
**じゃなくて*[]の話してたみたいだ俺w
元レス読んでなかったわ
酔ってるし寝るわ

449 :デフォルトの名無しさん:2006/09/03(日) 02:25:33
>>422で分からなかった?
いつまでもつまらんけど、やっぱ初心者が集まってるんだなと思った。
>>424規格(C)がどうのなら、float * p = &**arrayかな

450 :デフォルトの名無しさん:2006/09/03(日) 02:43:36
>>449
>規格(C)がどうのなら、float * p = &**arrayかな

またわけのわからん事を言う。

451 :デフォルトの名無しさん:2006/09/03(日) 07:52:22
スレ違いと言われこちらに来ました。
環境はLinux Plamo(2.6.15.7)でgccを使用。
2バイトコード(日本語)を出力させるようなプログラムで
printfの出力がおかしくなります。 勉強不足ですいませんが
よろしくお願いします。

#include <stdio.h>
#define MAX 8

int main()
{
int i;
unsigned short CODE;
unsigned char hi,lo;
CODE=0x7888;

for (i=1; i<=MAX; i++)
{
lo = CODE & 0xFF;
hi = CODE >> 8 & 0xFF;

printf("0x%x:%c%c ",CODE,hi,lo);
if ( (i % 4) == 0 )
printf("\n");
CODE++;
}
printf("\n");
}

452 :だからおかしいのはあんただって:2006/09/03(日) 08:03:31
>>451
%cは何を出力するかわかっている?
つーか、0x7888の文字って何の積もりよ。

453 :デフォルトの名無しさん:2006/09/03(日) 08:07:44
>> 452
%c は文字を出力。
その(0x7888)は、どの文字に該当するかを知りたい
だけ、初期値はなんでもよいと考えました。


454 :デフォルトの名無しさん:2006/09/03(日) 08:40:08
>>453
そんな文字はない。だから何が見えるかは環境依存。

455 :デフォルトの名無しさん:2006/09/03(日) 09:19:00
文字というか1キャラクタじゃないの?
シングルバイト文字。

マルチバイト文字を%cで表示しようとしてるならアフォでは?

456 :デフォルトの名無しさん:2006/09/03(日) 10:04:12
>>455
んなこたーない。マルチバイト文字列は一バイトずつ出力してもいい筈だ。
#環境によるカも知れない。

457 :デフォルトの名無しさん:2006/09/03(日) 10:46:29
みなんさんご支援ありがとうございます。451です。
ん〜、マルチバイトコードを表示させるには
どうすればよいのか? %cではNG?

458 :デフォルトの名無しさん:2006/09/03(日) 11:16:24
取り敢えず素直に既存文字を出力することを考えてみたらどうだろう。
Ex.

char code1 = "糞"[0];
char code2 = "糞"[1];
unsigend code = code1 << 8 | code2;
printf("%x:%c%c\n", code, code1, code2);

459 :デフォルトの名無しさん:2006/09/03(日) 11:21:10
ターミナルのコードページがあってないだけだったりして

460 :デフォルトの名無しさん:2006/09/03(日) 11:23:38
大丈夫、>451はそれ以前に全く理解ができていないから。

461 :デフォルトの名無しさん:2006/09/03(日) 11:38:04
tera termの設定でECUに設定しますよ。
>>460
本来と逆(逆引きに)なりますが、"日本" というコードは、
EUC または、SJISではどのような16進数になりますか?
としたら?



462 :デフォルトの名無しさん:2006/09/03(日) 11:46:06
日本語でおk

463 :デフォルトの名無しさん:2006/09/03(日) 11:50:29
バイナリエディタで見るなりコード書くなりで調べろカス

464 :デフォルトの名無しさん:2006/09/03(日) 11:52:28
>>461
>458をやってみて納得できてから先へ進め。

465 :デフォルトの名無しさん:2006/09/03(日) 11:59:05
どうもありがとう。> 463 調べる大元を対応表みたいなものを
コードで書こうとした結果です。コメントが厳しいね。

> 464 どうもありがとう。そうします。


466 :デフォルトの名無しさん:2006/09/03(日) 13:46:39
もうしわけない。

> 464 "糞" -> "日" に変更して実機でやってみた。
0xfffffffc:日
16進の表示がおかしくないですかね。

EUCの場合は、0xc6fc ぽい表示でないと。

467 :デフォルトの名無しさん:2006/09/03(日) 14:05:20
ヒント:補数

468 :デフォルトの名無しさん:2006/09/03(日) 14:15:50
> 467
補数? わからない。です。
2の補数は引き算を加算にする場合に使用するものだが。


469 :デフォルトの名無しさん:2006/09/03(日) 14:21:26
468からはエキサイト翻訳の香りがする

470 :デフォルトの名無しさん:2006/09/03(日) 14:38:07
Excite翻訳って「ん〜」とか出るのかよw

471 :デフォルトの名無しさん:2006/09/03(日) 14:44:50
符号拡張。
つうか、文字コード確認せずに表示おかしいって、釣りだろ、これ。

472 :デフォルトの名無しさん:2006/09/03(日) 14:49:18
>458はcharじゃなくてunsigned charだな。

473 :デフォルトの名無しさん:2006/09/03(日) 15:07:14
> 472
0xc6fc:日

unsigned char に変更したら、期待したコードが表示されました。



474 :デフォルトの名無しさん:2006/09/03(日) 15:52:21
EUCコード表にないコード(0xc6ff)を表示は、表示できない?
たとえば、以下のコードの順番で、0xc6ff は?

0xc6fc:日 0xc6fd:乳 0xc6fe:入 0xc6ff:
動xc700: 念xc701: 念xc702: 念xc703:

475 :デフォルトの名無しさん:2006/09/03(日) 15:54:16
>>474
自分でやってみろよ。

476 :デフォルトの名無しさん:2006/09/03(日) 15:59:52
>> 475 やった結果なんですが。

477 :デフォルトの名無しさん:2006/09/03(日) 16:01:47
>>476
何をしたくて何をやったらどうなったのか、 >>474 ではわからん。

478 :デフォルトの名無しさん:2006/09/03(日) 16:06:27
>> 477 すいません。

>451 のサンプルコードで、CODE=0x7888; を CODE=0xc6fc
に変更してコンパイル実行した結果。 >474 の結果になりました。

479 :デフォルトの名無しさん:2006/09/03(日) 16:10:56
>>478
じゃぁ答えは出てるんじゃないか?

480 :デフォルトの名無しさん:2006/09/03(日) 16:17:12
>> 479
いやいや、そのあとのコード(0xc6ff 以降が)表示が
おかしくなるのです。


481 :デフォルトの名無しさん:2006/09/03(日) 16:19:09
>>480
だから、 >>474 の質問だとそれが答えになるだろ?

482 :デフォルトの名無しさん:2006/09/03(日) 17:01:04
>>480
ない文字を表示しようとしてどうするの?

483 :デフォルトの名無しさん:2006/09/03(日) 17:42:25
>> 481 482
そういうことですか。割り当てられていないコードは
なにか、空でもよいから表示されるものかと思いました。

484 :デフォルトの名無しさん:2006/09/03(日) 20:18:15
C++ で次のようなことはできないの?
#if sizeof(bool) == sizeof(char)
同じようなことをしたいとき、どうやればいい?

485 :デフォルトの名無しさん:2006/09/03(日) 20:19:59
>>484
プリプロセッサで sizeof は評価されない。
template メタプログラミングの手法を使えば、大体のことはできる。

486 :デフォルトの名無しさん:2006/09/03(日) 20:21:32
一体何がしたくてそんな事をするのか

487 :デフォルトの名無しさん:2006/09/03(日) 20:24:14
>>485
やっぱそれしかないかー。

>>486
bool 型のサイズに等しい符号付き整数型 (仮に BoolInt とする) を使って、
bool バッファを BoolInt バッファに変換した上で、
負の数を格納したいのら。

void Func1(bool* pBool)
{
BoolInt* pInt = (BoolInt*) pBool;
pInt[0] = -1;
... ごにょごにょ ...
最後はバッファには 0, 1 しか格納されていないことを保証する
}


488 :デフォルトの名無しさん:2006/09/03(日) 20:51:27
>>487
何がしたいのかさっぱりわからん。

489 :デフォルトの名無しさん:2006/09/03(日) 20:51:57
何かの研究でやってるのか?
BOOL使う時って、0かそれ以外の理論値判断なんだから普通気にしないだろ。
メモリを爪に火をともすように頑張っていた昔と違って、PCスペックの余裕がある今
BOOLで真偽以外の数値を扱うって見にくいプログラムになりやすいと思うけど。

490 :デフォルトの名無しさん:2006/09/03(日) 20:52:32
>>487
> 負の数を格納したいのら。
> ...
> 最後はバッファには 0, 1 しか格納されていないことを保証する

おかしくね?

491 :デフォルトの名無しさん:2006/09/03(日) 20:59:35
>>489
>何かの研究でやってるのか?
まあ、そうだね。
画像処理のアルゴリズムでよく出てくるのだが、
一時的に 0,1 以外の値を入れたいことがある。

>>490
計算の途中だけ -1 をいれたいのら。

492 :デフォルトの名無しさん:2006/09/03(日) 21:04:47
>>491
そんなもんは最初っから signed char か適切な enum の配列にしておけ。
計算の途中だけというのが重要なら Func1() の前後で変換しろ。

493 :ららら:2006/09/03(日) 21:11:50
>>492
二値画像は、デフォルトで bool 型にしたいのら。
char と相互変換するのはコストが高いのら。

494 :ららら:2006/09/03(日) 21:13:15
>>485
とりあえず、テンプレート メタで実装しといた。
Generative Programming に書いてある IF テンプレートで。

495 :デフォルトの名無しさん:2006/09/03(日) 21:15:02
そんなに気になるならOSとコンパイラの中身チェックしないと駄目だろ
ユーザがその気でも中身では違う事やってますとかあるし

496 :デフォルトの名無しさん:2006/09/03(日) 21:16:28
移植性が要らないなら好きにすればよかろう。

497 :ららら:2006/09/03(日) 21:17:03
>>495
私にいってんの?意味がよく分からないのだけど。

498 :ららら:2006/09/03(日) 21:17:42
>>496
なにいってんの。移植性を保ちたいから sizeof で判断してんじゃない。

499 :デフォルトの名無しさん:2006/09/03(日) 21:18:21
>>493
二値画像は、デフォルトで bool 型にしたいのら。
これが間違いだな。余計にコストがかかってる可能性もある。

500 :デフォルトの名無しさん:2006/09/03(日) 21:19:12
>>498
移植性が要るなら無茶なキャスト挟んだ時点でアウトだろ。

501 :ららら:2006/09/03(日) 21:19:20
>>499
じゃあ、何型にすればいいのら?
一時的に bool 型と同じサイズの整数型に変換できるなら、何もコストかからないだろう。

502 :デフォルトの名無しさん:2006/09/03(日) 21:19:47
どうしてこう、次から次へと逸材が現れるんだろう?

503 :ららら:2006/09/03(日) 21:20:10
>>500
どうして無茶なのら?サイズが同じなら、いいだろ?

504 :ららら:2006/09/03(日) 21:20:18
わたし ファンキーーララー

505 :ららら:2006/09/03(日) 21:21:14
>>504
偽者はあっち行って。

506 :ららら:2006/09/03(日) 21:21:51
>>505
後からきたくせに生意気なやつら

507 :ららら:2006/09/03(日) 21:22:11
ららら〜♪

508 :ららら ◆KFIzlPh4XQ :2006/09/03(日) 21:22:42
以降私が本物ですので。

509 :ららら ◆Qf4QxB6kQE :2006/09/03(日) 21:23:29
偽物ずうずうしい

510 :ららら ◆KFIzlPh4XQ :2006/09/03(日) 21:23:48
>>509
何だと?偽物の癖に。

511 :ららら ◆Qf4QxB6kQE :2006/09/03(日) 21:25:23
偽物は余裕が無くてこまるら

512 :デフォルトの名無しさん:2006/09/03(日) 21:25:32
>>501
例えば、

int i = ...;
bool b = i; // (i != 0) がテストされる。
signed char c = i; // 単純に上位ビットが切り捨てられる。
i = b; // b に対応するメモリから読み出した値が 0 かどうかによって 1 と 0 に変換される。
i = c; // 単純に符号拡張された値が入る。

こんな違いが考えられる。最適化で消えることもあるだろうけどね。

513 :ららら ◆KFIzlPh4XQ :2006/09/03(日) 21:25:55
偽物は消えてください。

514 :ららら:2006/09/03(日) 21:28:36
>>512
かかるコストはいっしょだろう。

515 :デフォルトの名無しさん:2006/09/03(日) 21:28:50
>>503
移植性は失っている。
整数 1 のメモリ上の表現と true のメモリ上の表現とに互換性があるという保証は無い。

516 :ららら:2006/09/03(日) 21:29:24
2人も偽者がいるようなのら。本物はトリップつけておりませんので。
>>512
論点が分からないなー。それで何かコストがかかっているの?

517 :デフォルトの名無しさん:2006/09/03(日) 21:30:06
>>514
何を根拠に言っている?

518 :ららら:2006/09/03(日) 21:30:12
>>514
また偽物か

519 :ららら:2006/09/03(日) 21:34:03
>>516
よぉ偽物。

520 :デフォルトの名無しさん:2006/09/03(日) 21:34:17
>>516
この違いが気にならないなら、コストでんでんを語る必要は無い。

521 :ららら:2006/09/03(日) 21:34:39
>>515
> 整数 1 のメモリ上の表現と true のメモリ上の表現とに互換性があるという保証は無い。
ふむー。たしかになー。
何かうまい方法はないかなー。

522 :デフォルトの名無しさん:2006/09/03(日) 21:35:22
>>521 >>492

523 :ららら:2006/09/03(日) 21:36:43
>>522
その方法しかない?
bool 型は変えたくないんだけど。。

524 :デフォルトの名無しさん:2006/09/03(日) 21:39:35
リストを用いてファイル名を表示させるプログラムを作りました。
以下のような構造体を作りました

typedefstructFILEINFO {
HGLOBALhMem;
structFILEINFO *prev;
structFILEINFO *next;
WIN32_FIND_DATAw32fd;
}fileinfo;

FILEINFO fileinfo;

メイン関数よりも前のグローバル領域で構造体の宣言をすると

ex.cpp(17) : error C2377: 'fileinfo' : typedef 識別子が再定義されています。
ex.cpp(14) : 'fileinfo' の宣言を確認してください。
のエラーがでます。関数内で構造体の宣言をするとエラーはでませんでした。

しかし、他の関数からも参照したいのでグローバル領域で宣言する方法はありますか?
どなたか教えてください。

525 :デフォルトの名無しさん:2006/09/03(日) 21:39:43
>>523
bool にしてる利点は何だ?

526 :デフォルトの名無しさん:2006/09/03(日) 21:40:53
>>524
最初の typedef が要らないんじゃね?

527 :ららら:2006/09/03(日) 21:43:07
>>525
0-画素か 1-画素かの判定に、ブール演算で記述できること。
if (img(0,0)) とか。
これを char 型にしてしまうと、
if (img(0,0) == 1) とか書かないと、意味がはっきりしないよね。
つまり、二値画像において、-1 という値は通常有り得ないんだけど、
計算の都合上、ちょっとだけマークをつけたいときにだけ使いたい。

528 :ららら:2006/09/03(日) 21:46:32
>>524
変な定義の仕方だねー。普通こんなにするだろ。

typedef struct FILEINFO_ {
HGLOBALhMem;
structFILEINFO *prev;
structFILEINFO *next;
WIN32_FIND_DATAw32fd;
} FILEINFO

FILEINFO fileinfo;


529 :デフォルトの名無しさん:2006/09/03(日) 21:48:34
>>528
タグ名に意味の無いアンダースコアつけるのやめてくれ。

530 :ららら:2006/09/03(日) 21:49:39
>>529
いいじゃん別にー。なんでだめなのら?

531 :デフォルトの名無しさん:2006/09/03(日) 21:52:30
>>530
意味が無いうえに使いにくい。

532 :ららら:2006/09/03(日) 21:54:31
>>531
使うのは FILEINFO のほうだけだから、いいだろ。

533 :ららら:2006/09/03(日) 21:55:13
FILEINFO *fileinfo; だよ。

534 :デフォルトの名無しさん:2006/09/03(日) 21:55:59
>>532
あくまで一般論だが、アンダースコアはタグ名の頭か、または両方だろう。

535 :デフォルトの名無しさん:2006/09/03(日) 21:56:08
>>532
自分で >>528 で使って、しっかり失敗しているわけだが。

536 :デフォルトの名無しさん:2006/09/03(日) 21:56:37
>>520
>コストでんでん
突っ込んで欲しかった?

537 :ららら:2006/09/03(日) 21:57:31
でんでんむしむしららららら〜♪

538 :デフォルトの名無しさん:2006/09/03(日) 21:57:41
>>534
頭に付けるのは尚悪い。

539 :ららら:2006/09/03(日) 21:58:31
>>535
すんません。構造体の中で使っているんだな。気がつかんかった。

typedef struct FILEINFO_ {
HGLOBALh Mem;
struct FILEINFO_ *prev;
struct FILEINFO_ *next;
WIN32_FIND_DATAw32fd;
} FILEINFO;

FILEINFO fileinfo;

540 :ららら:2006/09/03(日) 21:59:27
>>535
すんません。構造体の中で使っているんだな。気がつかんかった

typedef struct FILEINPO_ {
HGLOBALOSww Mem;
struct FILEINPO_ *prev;
struct FILEINPO_ *next;
WIN32_FIND_DATAw32fd;
} FILEINPO;

FILEINPO fileinpo;

541 :ららら:2006/09/03(日) 22:00:10
>>535
すんません。構造体の中で使っているんだな。気がつかんかった

typedef struct FILEINPO_ {
HGLOBALOSww Mem;
struct FILEINPO_ *prev;
struct FILEINPO_ *next;
WIN32_FIND_DATAw32fd;
} FILEINPO;

FILEINPO fileinpo;

542 :デフォルトの名無しさん:2006/09/03(日) 22:00:23
>>527
その記述上の利点と、移植性を失うことおよび template メタ IF まで
担ぎ出す破目になったことを秤にかけて、あとは自分で選べ。

543 :ららら:2006/09/03(日) 22:01:34
>>542
ありがと。よく考えてみる。

544 :デフォルトの名無しさん:2006/09/03(日) 22:02:35
>>539
やめてくれって言ってるのに、そっちを直すのか。何の宗教かねまったく。

545 :ららら:2006/09/03(日) 22:02:44
>>542
いや、それは違うと思う。自分でやるなのら。

546 :デフォルトの名無しさん:2006/09/03(日) 22:02:53
ちょっと目を離した隙に随分進んでますね

547 :デフォルトの名無しさん:2006/09/03(日) 22:04:01
早々にコテハン付いたんで被害は少ないな。

548 :ららら:2006/09/03(日) 22:04:05
偽物がたくさん湧いて困るのら

549 :524:2006/09/03(日) 22:05:41
ありゃ、どうも徹夜で頭が混乱してました。定義自体そのものが
間違ってました。(^^;)
皆様ありがとうございました

550 :デフォルトの名無しさん:2006/09/03(日) 22:13:04
>>538
ごめん、吊ってくる

551 :デフォルトの名無しさん:2006/09/03(日) 22:34:54
デストラクタが例外を投げてはいけないと聞いたのですが、
なぜですか?

552 :デフォルトの名無しさん:2006/09/03(日) 22:36:31
>>551
デストラクタは例外が投げられたときによく使われるからです。

553 :デフォルトの名無しさん:2006/09/03(日) 22:51:09
>>552
retgkregkre:kg3^4−0ti5tすきすいせまきいすりれきまふれまけすき

554 :デフォルトの名無しさん:2006/09/03(日) 23:02:38
重複スレでようやるわ

555 :デフォルトの名無しさん:2006/09/04(月) 07:04:55
リアルタイムで必要なデータの量が多く、
頻繁にソートやデータのコピーをする場合
一般的にどのような方法で保持するんでしょうか?
例えば
typedef struct{    typedef struct{
 int a;           char str[128];
 int b;           int c,d,e;
{ Hoge;           Hoge hoge[30];
             } Piyo;
こんな感じの構造体があって、Piyoが数万件ある場合などです。

556 :デフォルトの名無しさん:2006/09/04(月) 07:14:05
ポインタの配列でも持っておけばいい。

557 :デフォルトの名無しさん:2006/09/04(月) 17:53:33
質問です。Perlの配列のように、各要素が型を限定しないようなリスト構造をC言語で作りたいと思っています。
リストの構造は線形リストを使えばそんなに難しくないと思うのですが、データを保持する方法で悩んでいます。
基本的には格納するデータへのポインタをリストの要素に保持すれば良いと思うのですが、どのような手法を使うか悩んでいます。
現時点で思いついたのは
1.
リストの要素に格納する時点でポインタに型を持たせる
2.格納しているときはvoidにしておいて要素を参照するときに型を変換する
です。どちらにしてもそのポインタがどんな型のオブジェクトへのポインタであるか判定して、適切に型変換をしないといけませんよね。
その「どんな型のオブジェクトへのポインタか判定する」方法がなかなか思いつきません。
よろしければアドバイスをお願い致します。

558 :デフォルトの名無しさん:2006/09/04(月) 18:02:33
Cなら配列要素に型情報も含める enum が適当か? Set 時は自己責任だな。

C++ ならオブジェクトを基底クラスにして、そのポインタを保持。
Set時は new 派生クラス ってな感じか。

559 :デフォルトの名無しさん:2006/09/04(月) 18:32:53
>>557 格納するときに、(フラグとして)中身の型を示す変数も格納しておくとよい。

560 :デフォルトの名無しさん:2006/09/04(月) 20:23:05
std::list<boost::any>

561 :デフォルトの名無しさん:2006/09/04(月) 23:34:28
>>560
俺もそう書こうとしたが、557はCでと書いている。

562 :デフォルトの名無しさん:2006/09/04(月) 23:38:23
面倒だから union 使ってしまうなぁ。

563 :デフォルトの名無しさん:2006/09/05(火) 02:56:21
上に同じ。
union大好きー。

564 :デフォルトの名無しさん:2006/09/05(火) 14:30:24
C言語を勉強したばかりの頃(いや、今も初心者脱出できてないけど)は
unionを何に使うのかサッパリ思いつきもしなかったなあ。


565 :デフォルトの名無しさん:2006/09/05(火) 15:35:30
いまだにわざわざ使う必要性が理解できません。

566 :デフォルトの名無しさん:2006/09/05(火) 17:06:01
ファイルヘッダとか通信で使う事はある。

567 :デフォルトの名無しさん:2006/09/05(火) 17:53:02
unionとgotoはソースに打ったことがない。

568 :デフォルトの名無しさん:2006/09/05(火) 18:20:27
goto は使うだろ。普通。


569 :デフォルトの名無しさん:2006/09/05(火) 18:22:50
使わねぇよ

570 :デフォルトの名無しさん:2006/09/05(火) 18:27:11
BASIC使ったこと無いやつが居るらしいな

571 :デフォルトの名無しさん:2006/09/05(火) 18:38:12
BASICの話なんかしてねーよボケ

572 :デフォルトの名無しさん:2006/09/05(火) 19:37:02
俺はgotoよりunionを使ったことの方が多い。

573 :デフォルトの名無しさん:2006/09/05(火) 19:51:59
goto 使わない奴は多段ループをどうやって抜けるのかな
まさかループを細かく切り取って関数にしてないだろうな

574 :デフォルトの名無しさん:2006/09/05(火) 20:06:53
returnでいいじゃん

575 :デフォルトの名無しさん:2006/09/05(火) 20:14:11
沢山 return使うと、アセンブラが読みにくいから止めてくれと、まあ、昔はそう言われたんですよ。


576 :デフォルトの名無しさん:2006/09/05(火) 20:15:26
goto擁護はいつも多段ループ多段ループって五月蝿いけど
多段ループから抜けなきゃならないようなプログラムを
しょっちゅう書いているのか?
だとしたらその糞プログラム構成をまずどうにかしろよ。

577 :デフォルトの名無しさん:2006/09/05(火) 20:16:53
無駄に関数に分けたり後始末を分散させるよりまし。

578 :デフォルトの名無しさん:2006/09/05(火) 20:20:03
多段ループから抜ける必要のないプログラムなら
まず関数に分ける必要もないわけだが

579 :デフォルトの名無しさん:2006/09/05(火) 20:20:12
多段ループよりエラー処理に使うな
C++じゃ使わないけど

580 :デフォルトの名無しさん:2006/09/05(火) 20:22:14
多段ループからの脱出なら、goto使って悪いとは思わないし、
むしろ唯一といってよいほどのgotoの使いどころだと思っている。

581 :デフォルトの名無しさん:2006/09/05(火) 20:24:11
goto で脱けなきゃならない多段ループなんてのは実装に問題ありだろ。
まあ、エラー処理で使うのがもっとも妥当。


582 :デフォルトの名無しさん:2006/09/05(火) 20:25:35
ええい、ごとごとうるせい。
むしろunionについて熱く語れよ。

583 :デフォルトの名無しさん:2006/09/05(火) 20:25:55
>>582はunion

584 :デフォルトの名無しさん:2006/09/05(火) 20:36:51
>>582
先に語ってから言えよ

585 :デフォルトの名無しさん:2006/09/05(火) 20:40:01
俺が読んだ入門書にはunionの使い方として
x86のレジスタをエミュレーションする例が載ってた
axとeaxをunionのメンバにしたりして

おいおいえらい限定的な使い方だなと突っ込みつつ読んだ記憶が


586 :デフォルトの名無しさん:2006/09/05(火) 20:44:42
全銀手順とか郵政手順とか、固定レコード長でフラグによって内容が
変わるようなデータに使ったよ。

587 :デフォルトの名無しさん:2006/09/05(火) 20:48:02
ハードウエアのレジスタ触る時はunion便利。
windows上のアプリ作成等ではほとんど不要なのかね。

588 :デフォルトの名無しさん:2006/09/05(火) 21:00:26
C言語を
アセンブラの延長と見るか
OSのAPI操作の一貫と見るか
その差じゃないか

589 :デフォルトの名無しさん:2006/09/05(火) 22:17:12
UNDO/REDOのリスト構造で union 使ってるのは見たことがあるな。
C++ なら仮想関数でやるんだろうけど、C だと enum で適当に判断してやるしかない。

590 :デフォルトの名無しさん:2006/09/05(火) 22:50:08
557です。お答え頂いた皆様どうも有り難うございます。
ちょっとスレが進んでしまったので場違いみたいですがお礼申し上げます。
私が思いつかなかったアイデアがあって参考になりました。
チャレンジしてみようと思います。

591 :デフォルトの名無しさん:2006/09/05(火) 22:58:49
unionは組み込み系の実験の時多用したな。
gotoはこの間初めて使ったけど、多分2度と使わないな。

592 :デフォルトの名無しさん:2006/09/05(火) 22:59:45
実は一番gotoを使ったのはVBだったのは内緒だ
もちろんエラー処理でね

593 :デフォルトの名無しさん:2006/09/05(火) 23:06:37
how many filesの時代はgotoだらけだった

594 :デフォルトの名無しさん:2006/09/05(火) 23:07:20
unionと言えば、下の関数のCHAR_INFOのメンバーに
unionのメンバー変数があるみたいだが、使い方が分からん。
どなたか知っている方がいたら、ご教授よろしく。

BOOL ScrollConsoleScreenBuffer(
HANDLE hConsoleOutput, // コンソールスクリーンバッファのハンドル
CONST SMALL_RECT *lpScrollRectangle,
// 移動対象のデータブロックを表す長方形のアドレス
CONST SMALL_RECT *lpClipRectangle,
// クリッピング長方形のアドレス
COORD dwDestinationOrigin, // スクリーンバッファ長方形の新しい位置
CONST CHAR_INFO *lpFill // 塗りつぶしに使う文字と色のアドレス
);

595 :デフォルトの名無しさん:2006/09/06(水) 00:43:43
MSDNは見ないのか

596 :デフォルトの名無しさん:2006/09/06(水) 00:51:34
WindowsAPIのunionなら、VARIANTが最強だな。

597 :デフォルトの名無しさん:2006/09/06(水) 00:59:44
こんちは、お世話になります。

C++のmap(STL)を使って連想配列のクラスを作ろうと思います。
そこで相談です。keyとなる型にchar[256]を使うか、std::string
を使うか悩みます。stringの方が圧倒的に楽そうなのですが、
charの固定長でもいいかな、と思います。どちらがお勧めですかね?
条件として、
1. なるべく環境非依存にしたい(Linux+gcc,Windows+VCの両方で無難に使えるコード)
2. キーになる文字列はシングルバイト文字だけ。
3. 用途はexpatを使って解析したXMLのデータを収めたい。
char型で作るなら、mapなんか使わず、0から実装してもいいという感じもします。
STLは今日勉強し始めたばかりなので、悩みます。
よろしくお願いします。

598 :デフォルトの名無しさん:2006/09/06(水) 01:03:28
>>597
string の方が楽なんだろ。何を悩んでいる?

599 :デフォルトの名無しさん:2006/09/06(水) 05:13:25
フレンドクラスの使い方について教えてください。
下記のようなクラス定義をしたのですが、funcs::main()が
コンパイルエラーとなってしまいます。
このような使い方は出来ないのでしょうか?
よろしくお願いします。

class base
{
friend class base;
private:
 virtual int foo() = 0;
};

class super : public base
{
private:
 int foo();
};

class funcs
{
 int main(){
  obj.foo();
 };
 super obj;
};



600 :デフォルトの名無しさん:2006/09/06(水) 05:53:10
>>599
>class base
>{
>friend class base;
なにこれ?


601 :599:2006/09/06(水) 07:56:03
書き間違えました。
[正] friend class funcs;

602 :デフォルトの名無しさん:2006/09/06(水) 08:02:41
>>599
static_cast<base&>(obj).foo();

603 :599:2006/09/06(水) 08:19:41
>>602
ありがとうございます。

604 :デフォルトの名無しさん:2006/09/06(水) 13:25:06
>>587
LARGE_INTEGER(64bit整数)でお世話になってます

605 :デフォルトの名無しさん:2006/09/06(水) 13:57:13
>>600
自分だけがお友達なんだよ!

606 :デフォルトの名無しさん:2006/09/06(水) 14:35:25
>>605
俺のこと?

607 :デフォルトの名無しさん:2006/09/06(水) 14:40:32
>>606
そんな君にプレゼント

//これじゃテンプレートが動かないな、困った。
//#define class struct
#define private public
#define protected public

608 :デフォルトの名無しさん:2006/09/06(水) 16:07:10
A というクラスがあります。
A にはデフォルトコンストラクタの他に
コピーコンストラクタと代入演算子が定義されています。
このとき次の二つのコードは同じ意味を持ちますか?
a2 はコンストラクト済みの A のインスタンスです。

イ)A a1(a2);
ロ)A a1 = a2;

609 :デフォルトの名無しさん:2006/09/06(水) 16:13:33 ?2BP(7)
済みません、あと、ハ)も追加させてください。

イ)A a1(a2);
ロ)A a1 = a2;
ハ)A a1 = A(a2);

610 :デフォルトの名無しさん:2006/09/06(水) 17:06:18
int をとるコンストラクタ、コピーコンストラクタ、
デフォルトコンストラクタ、代入演算子を用意して実験。

A a1(0); //コンストラクタが呼ばれる
A a2=0; //コンストラクタが呼ばれる
A a3(a1); //コピーコンストラクタが呼ばれる
A a4=a1; //コピーコンストラクタが呼ばれる
A a5=A(0); //コンストラクタが呼ばれる
A a6=A(a1); //コピーコンストラクタが呼ばれる

a5 とか a6 のケースはちょっと予想外。
一時オブジェクトの生成のためにコンストラクタが呼ばれて、
それを使った a5, a6 の生成のためにもう一度コンストラクタが
呼ばれると思ってたのに。って、こういう挙動って
処理系に拠らず決まっているもの?

a4 がデフォルトコンストラクタで生成され、
続いて代入演算子が呼ばれる、なんてことはない?


611 :デフォルトの名無しさん:2006/09/06(水) 17:34:19
>>610
規格を確認してないけど
それには以外な結果はないな

>a4 がデフォルトコンストラクタで生成され、
>続いて代入演算子が呼ばれる、なんてことはない?
初期化と解されるのでない


612 :デフォルトの名無しさん:2006/09/06(水) 17:57:47
constについてイマイチわかってないんで調べてます
次のコードのcicpとiccpの宣言では
ポインタをconstにはしないのでしょうか

//テスト
int ar[30]={11,12,13,14,15};
int ar2[40]={21,22,23,24,25};

const int const * cicp=ar;
int const const * iccp=ar;
//*cicp=10;
//*iccp=10;
//↑この2つはエラー
cicp=ar2;
iccp=ar2;
//↑しかしこの2つはエラーにならない

613 :デフォルトの名無しさん:2006/09/06(水) 18:00:46
なお、この書式だとどちらのテストもエラー(=求めている動作)になります
const int * const cipc=ar;
int const * const icpc=ar;

614 :デフォルトの名無しさん:2006/09/06(水) 18:00:53
const const ってなんですか?


615 :デフォルトの名無しさん:2006/09/06(水) 18:06:26
const int *p
はポイント先のデータがconst
int * const p
はポインタ自体がconst

616 :デフォルトの名無しさん:2006/09/06(水) 18:10:26
const int == int const

617 :デフォルトの名無しさん:2006/09/06(水) 18:14:16
>>614
なぜか一応コンパイルは通ります
int const hoge;
const int bar;
これら二つが同じものらしいので、
constは隣にくっついてる型をconstにしているのかなと思ったわけです

ある程度法則がつかめないと例としては極端だが
const int * const * const **const hoge;
↑こんなのがどういうものなのかがわからないと思うので。
まぁ実際こんなのは使わないでしょうが
ちゃんと動作を理解したいだけです

618 :デフォルトの名無しさん:2006/09/06(水) 18:18:56
>615
組み合わせ的にはもう一つあります
const int *cip=ar;  //1こめ データがconst
int const * icp=ar; //2こめ テスト結果、データがconst
int * const ipc=ar; //3こめ ポインタがconst

2番目はintと結合するのか*と結合するのかテストしてみたところ
ポインタが指し示す先のint型のデータがconstになりました
ということは、constは左側に優先的に結合するのかな、と。

そこで、612、613の4パターンはすべて同じ型をあらわすのかなと思い
テストした結果、異なる結果となったので
こうして質問してみました

619 :デフォルトの名無しさん:2006/09/06(水) 18:36:30
ヘッダファイルをのけてコンパイルしてみると
この二つは同じ型修飾子が2回以上使われています
と警告が出ました
const int const * cicp=ar;
int const const * iccp=ar;

const→int←const * cicp=ar;
int←const←const * iccp=ar;
こういう修飾のされ方みたいです
<stdio.h>をインクルードしているとなぜか警告がでなかったので・・
スレ汚しすみません

620 :デフォルトの名無しさん:2006/09/06(水) 18:37:51
Microsoft Visual Studio .NETで開発したソースを用いて、
現環境(Microsoft Visual Studio 6.0)で修正開発したいのですが、
コンバートする方法ありますか?

※ワークスペースファイルは、.NETのprojファイルしかありません。

621 :デフォルトの名無しさん:2006/09/06(水) 18:45:35
型からではなく、変数からCV修飾子がどう見えるかを考えるべきだ。

622 :デフォルトの名無しさん:2006/09/06(水) 18:46:41
linux上のc言語でしつもんがあります。
同一の関数func()を持つ aaa.c、bbb.c をコンパイルしてアーカイブしたとして、
あるプログラムでfunc()を呼び出したとき、どちらがのfunc()が呼び出されるのでしょうか?
ちなみに、引数も同じです。
よろしくお願いします。


623 :デフォルトの名無しさん:2006/09/06(水) 18:47:19
>>619
* の右側に const があるか左側にあるかで判別すればよい


624 :デフォルトの名無しさん:2006/09/06(水) 18:47:26
>>620
ttp://www.codeproject.com/tools/prjconverter.asp

625 :デフォルトの名無しさん:2006/09/06(水) 18:50:06
>>622
アーカイブってなに?ar?
リンカに怒られる。
名前空間使うべし。

626 :デフォルトの名無しさん:2006/09/06(水) 18:53:54
>625
Cに名前空間はない

627 :デフォルトの名無しさん:2006/09/06(水) 19:08:43
>>621
ttp://www.tietew.jp/cppll/archive/5132
cvっていうのはこういうやつでしょうか


変数から見るというのは、どういうことなんでしょうか^^;
int * const * const ipcpc=p;
例えばこういうのがあった場合は

一番右のconstをとってきて
(const int ipcpc)
* const *
右のconst *をとってきて
(const *(const int ipcpc))
*
残ったポインタを使って
*(const *(const int ipcpc)))

→const intと、それをさしているポインタがconst

628 :デフォルトの名無しさん:2006/09/06(水) 19:12:53
>>624
ありがとうございます。
度々すみませんが、これって登録しないとダウンロードできませんか?

629 :デフォルトの名無しさん:2006/09/06(水) 19:17:29
>>621,623
もしかして
int * const * const ipcpc=p;

int * const (* const) ipcpc=p;
↑ポインタのポインタはconst
int (* cosnt) * const ipcpc=p;
↑ポインタはconst
(int) * const * const ipcpc=p;
↑データをさしているところはint

そんでもって、一番左側だけは
constとintを入れ替え可能って感じでしょうか
(const int )* const * const *p1;
(int const )* const * const *p2;
p1==p2;
こういうことでしょうか

630 :622:2006/09/06(水) 19:29:06
>>625

アーカイブ=ar の事です。

リンカに怒られない、というか実行形式のファイルができてしまいましたんで、
一体どうなっているのかなぁ、と。
動かしてみたところ、名前順って訳でもなさそうなので、保証されない、
ってところでしょうか?


631 :デフォルトの名無しさん:2006/09/06(水) 21:15:57
>>629
typedef int *pint;

const pint pi1;
pint const pi2;
const int* pi3;  // ?
int* const pi4;

見た目だけでルールを判断すると落とし穴にはまることが多い。

632 :デフォルトの名無しさん:2006/09/06(水) 21:47:33
>629
>>623 の意味は int 等を無視して const と * の順序だけ見るということ

const int* var → const *var → *var は定数
int const* var → const *var → *var は定数
int* const var → * const var → var は定数
const int* const var → const *(const var) → var は定数、*var も定数

633 :デフォルトの名無しさん:2006/09/06(水) 21:51:52
VC++.NETのコンソールアプリケーションで
AsynceSocketクラスを使って
DOSでチャットソフトは作ることが可能ですか?

634 :デフォルトの名無しさん:2006/09/06(水) 21:54:08
VC++.netは16bitDOSコードを吐けないので無理。
ん? そういう問題じゃない?

635 :デフォルトの名無しさん:2006/09/06(水) 22:05:55
>634
コンソールアプリケーションでチャットを作れるか、でお願いします

636 :デフォルトの名無しさん:2006/09/06(水) 22:10:38
牛丼、並一丁でおながいね!

637 :デフォルトの名無しさん:2006/09/06(水) 22:20:38
>>630
リンカは、未解決のシンボルが見つかった時点でその探索を中断するから、illegalなわけではないよ。
$ cc -o foo foo.c aaa.c bbb.c
$ cc -o foo foo.c bbb.c aaa.c
としてみれば、そのようになることがわかると思う。

aaa.oとbbb.oがarchiveになっているときはどうなるのかなぁ?
archive内のファイルの物理順序によるような気もするし、手元の環境では確かにそうなる。

・・・答えになってないね。

638 :デフォルトの名無しさん:2006/09/06(水) 22:24:24
なんだ?また無礼者でも湧いてきたのか??

639 :デフォルトの名無しさん:2006/09/06(水) 22:27:13
>>631>>632
解説ありがとうございます
変数のあるほうから
*の左右で判断し見るというのでいけそうです


実際に次のようなコードを試して実験してみました
int i = 10;
int *const ipc=&i;
int *const ipc2=&i;
int *const*ipcp=&ipc;
int *const*ipcp2=&ipc;
int *const** ipcpp=&ipcp;
int *const** ipcpp2=&ipcp;
int *const***const ipcpppc =&ipcpp;
int *const***const ipcpppc2=&ipcpp;
//エラー ipcpppc=ipcpppc2;
*ipcpppc=ipcpp2;
**ipcpppc=ipcp2;
//エラー ***ipcpppc=ipc2;
****ipcpppc=10;

結論としては右側から見ていって
一番右側にconst
 →宣言したポインタがconst
一番右側の*の左側にconstがあるかどうか
 →あれば、宣言したポインタのさす先がconst
...
一番左側の*の左側に、最終的に指されている型(この例ではint)の
ほかにconstがあるかどうか(順番はconstと入れ替わっても良い)
 →あれば、最終的に指されている型がconst
これで判定できそうです

640 :597:2006/09/06(水) 22:57:33
>>598
関連するプロジェクト全体で文字列の扱いをまだstringにするかcharにするか決めあぐねてたからなんです。
確かにstringの方がすっきりするし、簡単でした。

実装してみました。passは"c++hash"
http://www.uploda.org/uporg506958.cpp.html

コードのコメントにもあるとおり、findで見つからなかった時の処理に悩みますが、とりあえずやりたい事はできました。
ありがとうー。

641 :デフォルトの名無しさん:2006/09/07(木) 00:39:13
C++ですが
領域を確保していない(newしていない)ポインタをdeleteするとどうなりますか?
またNULLの入ったポインタをdeleteするとどうなりますか(同じこと?)

642 :デフォルトの名無しさん:2006/09/07(木) 00:44:08
>>641
ヌルポインタに対する delete は何もしない。
new の戻り値でもヌルでもないポインタに対する delete はすべて未定義動作。

643 :デフォルトの名無しさん:2006/09/07(木) 00:45:58
適当なアドレスを指すポインタを delete すると
何が起こるかは未定義。デバッグ用タイムをリンクしてれば
たいていは止まってくれる。

NULL ポインタを delete すると、何も起こらない。
何も起こらないことが保証されている。

644 :デフォルトの名無しさん:2006/09/07(木) 00:52:39
>>642 >>643
お二人ともありがとうございます。NULLだと何もしないと
普通に宣言しただけのポインタだと危険ですね

645 :デフォルトの名無しさん:2006/09/07(木) 00:57:35
>>643
「デバッグ用タイム」って何?

646 :デフォルトの名無しさん:2006/09/07(木) 01:00:00
まあいいじゃん
わきみちだし

647 :デフォルトの名無しさん:2006/09/07(木) 01:07:00
>>646 ランタイムのまちがい

648 :デフォルトの名無しさん:2006/09/07(木) 01:07:43
VCでプログラムを作っているのですが、
unsigned char型の配列同士を比較しようとするとコンパイルは通るんですが実行した後エラーが起きて強制終了されてしまいます。
上記の型同士の比較はできないんでしょうか?
二つの配列のどちらも0〜255の値が入っています。

649 :デフォルトの名無しさん:2006/09/07(木) 01:07:50
ランタイムライブラリのまちがい

650 :デフォルトの名無しさん:2006/09/07(木) 01:08:28
>>648
コード晒せ。

651 :デフォルトの名無しさん:2006/09/07(木) 01:11:08
>>648 初心者歓迎スレッドと言うことで勝手な憶測だけど、
配列として確保されている領域をオーバーランしているのでは?

652 :デフォルトの名無しさん:2006/09/07(木) 07:10:03
たぶん、こういう間違いしてるんだろうなぁ
unsigned char A[10],B[10];
if(A == B){...}


653 :デフォルトの名無しさん:2006/09/07(木) 08:58:09
strcmpに一票

654 :648:2006/09/07(木) 10:34:32
問題の部分だけですが・・・

unsigned char Temp[3][3]={{0,255,0},{255,0,255},{0,255,0}};
unsigned char Fsobel[480][640];

for(i=0;i<nHeight-3;i++){for(j=0;j<nWidth-3;j++){
if (Fsobel[i][j]==Temp[x][y]){
for(x=0;x<3;x++){for(y=0;y<3;y++){
if (Fsobel[i+x][j+y]==Temp[x][y]){
count++;
}
}}
if (count>=4){
Fsobel[i][j]=100;
}
}
}}


655 :デフォルトの名無しさん:2006/09/07(木) 10:50:37
> if (Fsobel[i][j]==Temp[x][y]){
x, yの初期値が不定。この条件が成立して、次にきた時には範囲外アクセス。

656 :デフォルトの名無しさん:2006/09/07(木) 20:34:26
>>652
それって配列の先頭ポインタの比較だから、必ず偽を返すだけで
実行後エラーにはならないんじゃないか?

657 :デフォルトの名無しさん:2006/09/07(木) 22:02:29
ベクターならベクターなら何とかしてくれるっ

658 :デフォルトの名無しさん:2006/09/07(木) 22:14:31
すいません。お聞きしたいことがあるのですが配列の範囲以外の値ってどうなっているのでしょうか。
例えば x[5][5]の値が全部5という配列があったとしてx[-1][5]やx[5][-1]などの値はどうなっているかいまいち判りません。
どなたかご教示お願いいたします。

659 :デフォルトの名無しさん:2006/09/07(木) 22:18:03
printfとかcoutで表示してみれば分かるよ。

660 :デフォルトの名無しさん:2006/09/07(木) 22:18:39
>>659
その手がありました、ありがとうございます!

661 :デフォルトの名無しさん:2006/09/07(木) 22:42:43
>>660
それを試したところで、その結果はたまたまそうなっただけのもの。
仮に0が表示されたとしても、「配列の範囲外は0になってるんだ!」なんて
思わないようにね。

662 :デフォルトの名無しさん:2006/09/08(金) 00:04:38
>x[-1][5]
大抵は、x[0][0]の値が真っ当に表示される。

>x[5][-1]
恐らくは、x[4][4]の値が真っ当に表示される。

#つーか釣り?

663 :デフォルトの名無しさん:2006/09/08(金) 00:29:16
>>658
x[-1] や x[5] を評価した時点で未定義動作。
値は意味を成さない。

664 :デフォルトの名無しさん:2006/09/08(金) 00:57:49
>>630
リンクできてるなら、先にリンクしたほうが呼ばれてると思う。

665 :デフォルトの名無しさん:2006/09/08(金) 01:17:11
>>664
>>637

666 :デフォルトの名無しさん:2006/09/08(金) 21:38:19
&x[-1]がOSにとって致命的な情報を格納していることってあるの?
x[-1]=~0x00とかやってOSがイッちまったなんて聞いた事ないけど

667 :デフォルトの名無しさん:2006/09/08(金) 21:43:05
for ループが2重になっているところを、最内側から脱出するのに、
goto 使わないためには、フラグ立てるしかないですか?
こういうときは goto 使うのが普通ですか?

for (int i = 0; i < 100; i++) {
 for (int j = 0; j < 100; j++) {
  if (gonyo gonyo) goto LOOP_END;
 }
}
LOOP_END:

668 :デフォルトの名無しさん:2006/09/08(金) 21:59:00
>>667
for (int i = 0; i < 100; i++) {
 for (int j = 0; j < 100; j++) {
  if (gonyo gonyo) {
i = 100;
break;
 }
}

でいいんじゃないすかね。


669 :デフォルトの名無しさん:2006/09/08(金) 22:02:18
他は関数にするぐらいかな。めんどくさいけど。

static int j_loop(int i)
{
int j;
for(j = 0; j < 100; j++)
if(gonyo gonyo) return 1;
return 0;
}
void i_loop(void)
{
int i;
for(i = 0; i < 100; i++)
if(j_loop(i)) break;
}

670 :デフォルトの名無しさん:2006/09/08(金) 22:16:06
>>667
C++なら例外でもいけそう

671 :デフォルトの名無しさん:2006/09/08(金) 22:35:52
>>666
未定義動作だから、何が起ころうと知ったこっちゃない。
メモリ保護違反の例外を起こしてプロセスが終了してもいいし、
たんに無かったことにされてもいいし、
鼻から悪魔が出てきたっていい。

672 :デフォルトの名無しさん:2006/09/08(金) 22:45:16
やってる作業量にもよるけどこんなのダメかな

sub(int i)
{
 for (int j = 0; j < 100; j++)
 {
  if (gonyo gonyo)
   return 100;
 }
 return i;
}

for (int i = 0; i < 100; i++)
{
 i = sub(i);
}

673 :デフォルトの名無しさん:2006/09/08(金) 22:47:23
>>667
多重ループの脱出はgoto使っても良いと思う。Javaとかでも同じような方法使ってるし(ラベルつきbreak)
んで、他の手段としては多重ループ全体を一つの関数に括りだしてreturnを多重ループの脱出に使うってのもある。
これ以外のフラグ立てる方法やそれの亜種形(>>668,669,672とか)は大抵の場合汚くなるからあんまりお勧めできない。
自分は素直にgotoのほうが好き。

674 :デフォルトの名無しさん:2006/09/08(金) 23:03:33
独習C++を勉強しているのですが、そこにのっているコードでわからないものがありまして・・。
参照返し+演算子オーバーロードなんですが、なんでこうなるのか
コンパイルの内部的なこと教えてもらえないでしょうか。

P455^456

class Demo{
double d;
public:
Demo(){d = 0.0;}
Demo(double x){d = x;}
Demo& operator=(double x)
{
d = x; return *this;
}
double getd(){return d;}
};

こういう定義されてるクラスがあったんですが、

なんで演算子オーバーロードの所で、returnでポインタの値を返しているのに、
戻り値が&なのですか?
やろうとしていることは、Demoオブジェクトに小数点の値を代入したら、
オブジェクトのメンバ変数dにその値が代入するようにしているのですよね。

675 :デフォルトの名無しさん:2006/09/08(金) 23:07:45
『*this』はポインタじゃない。

676 :デフォルトの名無しさん:2006/09/08(金) 23:13:06
>>675
ポインタじゃないっていうのはどういうことでしょうか・・・?
thisポインタはこの関数が呼び出されたオブジェクト
つまり、Demoのオブジェクトを指しているポインタじゃないんですか?
どこを調べれば解るようになれますか?

677 :デフォルトの名無しさん:2006/09/08(金) 23:14:03
『this』はポインタだな。
でも返しているのは『this』ではなく『*this』だ。

678 :デフォルトの名無しさん:2006/09/08(金) 23:24:09
>>677
*thisにすると何か変わるんでしょうか・・・。
C的にはポインタの指しているアドレスの中身(値)ですよね?
ってことは戻り値はDemoでもいけるんでしょうか・・。
いま試した所確かにコンパイル通りました。
でも、なんで参照返しにしているんですか?

679 :デフォルトの名無しさん:2006/09/08(金) 23:29:50
戻り値の型をただDemoにしても同じ結果が出るみたいです・・・。
なんで、Demo&なんでしょうか・・・。

680 :デフォルトの名無しさん:2006/09/08(金) 23:31:32
>678
自分自身への参照を返してる。

Demo型を返す理由は、
Demo a(1.0), b, c;
b = c = a; // b、cともに1.0になる

などとできるようにするため。また、参照にすることで無駄な一時オブジェクトが生成されない。


681 :デフォルトの名無しさん:2006/09/08(金) 23:46:33
>>680
ありがとうございます。でも、参照というのがよくわからなくて^^;
その変数の別名。。。?
なんでそれが無駄な一時オブジェクトを生成しないんでしょうか^^;


682 :デフォルトの名無しさん:2006/09/08(金) 23:57:38
そもそも参照を理解してないのか?

int a;
int& func()
{
 return a;
}

これは分かるか?

int* b;
int& func()
{
 return *b;
}

これは?

683 :680:2006/09/09(土) 00:00:32
すまんちょっと間違えた。

Demo a, b;
a = b = 1.0; // a, bともに1.0になる
などというようにできる。


Demo& でなく Demoを返すようにすると,、無名のDemoインスタンスが生成されそれが返される。
Demo&だと、元々存在する自分自身を返す為、一時オブジェクトの生成の手間が要らない。

684 :デフォルトの名無しさん:2006/09/09(土) 00:11:34
>>682
int a;
int& func()
{
 return a;
}

変数aのアドレスみたいなもの(参照?)を返すってことでしょうか・・。
内部的には、int& some = a;みたいな処理がされてるということでしょうか。。。

int* b;
int& func()
{
 return *b;
}

ちょっと解らないです^^;

>>683
>Demo& でなく Demoを返すようにすると,、無名のDemoインスタンスが生成されそれが返される。
>Demo&だと、元々存在する自分自身を返す為、一時オブジェクトの生成の手間が要らない。
解りやすくて嬉しいです。でも上の方の言っている部分が理解できてないようなので、
半分くらいしか理解できません^^;

685 :デフォルトの名無しさん:2006/09/09(土) 00:17:37
>>684
参照はポインタみたいなもの。↓でいろいろ読んでこい。
http://www.google.co.jp/search?q=%e5%8f%82%e7%85%a7+%e3%83%9d%e3%82%a4%e3%83%b3%e3%82%bf

686 :デフォルトの名無しさん:2006/09/09(土) 00:31:41
>>685
>>682のコードを半分理解できるようになりました^^
int a;
int& func()
{
 return a;
}
int& fuc() = a;
みたいに参照の変数名が関数になっているということでしょうか?
つまり、その関数を変数aと同じように扱えるという?
だからその関数に代入すると、aの値が変わるのですね・・・?
int* b;
int& func()
{
 return *b;
}
ポインタの方がちょっと言葉で説明できません^^;

687 :デフォルトの名無しさん:2006/09/09(土) 00:39:58
独習C++に参照載ってるだろ・・・

688 :デフォルトの名無しさん:2006/09/09(土) 00:42:16
>>686
コードに疑問があるなら書き込む前にコンパイルぐらい試せボケ。
説明できませんとか意味の無い報告は要らん。チラシの裏にでも書いとけ。

689 :デフォルトの名無しさん:2006/09/09(土) 01:43:39
>>682
なかなか的確ですね。
教えるのが上手だと思います。

690 :デフォルトの名無しさん:2006/09/09(土) 02:05:09
>>686
> int a;
> int& fuc() = a;
何度見ても、これ、笑える。

きっとアドレス「演算子と同じ」だろうと考えてるんだろうな・・

691 :デフォルトの名無しさん:2006/09/09(土) 02:09:40
変な話、それはストラストラップの人が悪いと言えなくもない・・・か?
C++は初学者がけっつまずく要素満載だ。

692 :デフォルトの名無しさん:2006/09/09(土) 02:15:18
それはC++で始まった事ではなくてCからのはず。
それも、Cだと配列とポインタが曖昧に見えてしまうのが元凶だったねぇ。

693 :デフォルトの名無しさん:2006/09/09(土) 02:17:55
同じ型のポインタ同士の引き算で要素数の差が返るとか、
理屈は通ってるんだが直感的ではないかもだなあ。

694 :デフォルトの名無しさん:2006/09/09(土) 02:26:12
初めはC++はかなりごちゃ混ぜだと感じたけど
最近よく思うことは、Cと同じでC++が見えた人(極めた人?)には、
何でも出来るかなり楽しい「言語」なのかなという事。

といって、現時点でかなり普及しているからという観点だから、
C++が廃れて人がいなくなったら他の言語に目がいくんだろうだけどね・・

関係ないけど、Haskellとかすごいパラダイム持ってるし
http://pc8.2ch.net/test/read.cgi/tech/1157227790/166

695 :デフォルトの名無しさん:2006/09/09(土) 02:39:31
>>693
それは間違わなかった。

要素数の差と書いてあるけど、
きっと、話したいのは、
同じ型っていうのは配列型の事なのか?

ポインタと書いている時点で、もうそれは配列とは限らんぞ。

あー、またポインタと配列からやり直しになるのか?

696 :デフォルトの名無しさん:2006/09/09(土) 02:43:20
>>658
大抵のコンパイラなら、その配列から外れた別メモリを指してるのが普通の動作だろう。

697 :デフォルトの名無しさん:2006/09/09(土) 03:53:02
>>696
大抵のコンパイラなら>>662
x[-1][0]とかx[0][-1]とかx[5][0]なら外れるだろうけどねぇ。

698 :デフォルトの名無しさん:2006/09/09(土) 05:18:01
ちゃんと見てなかった。

699 :デフォルトの名無しさん:2006/09/09(土) 06:45:59
>>692 配列とポインタが似ている、というか、
同じようにいじれるというのは、ややこしいところ、
というよりはむしろ C の利点だよな。

C++ の参照って、Java や C# におけるいわゆる参照型
とは違うものだから、すでに他言語を知っている人には
余計に説明しづいらい。参照がやれることは本質的には
ポインタと変わらないので、シンタックスシュガーだと
言えないこともないけど、それを越えてあまりある
表記の便利さがあるよな。

あ、でも参照は「参照しない」ということが許されないから
ポインタとはその辺の能力が違うか。

700 :デフォルトの名無しさん:2006/09/09(土) 06:58:33
void foo(int& n) { }
foo(*(int*)NULL);

701 :デフォルトの名無しさん:2006/09/09(土) 07:07:34
>>700 まぁたしかにそういうことはできるな。
参照が本当に何らかの有効なオブジェクトを指しているか
否かの判定は &n が NULL か否かを見ることになるから、
やっぱり本質的な能力としてはポインタと同じか。

702 :デフォルトの名無しさん:2006/09/09(土) 07:10:27
普通 NULL なんか渡さないし、やっちゃだめだけどな。

703 :デフォルトの名無しさん:2006/09/09(土) 07:34:41
C++ の参照は他の言語の参照型とは違って、
参照し直せないところがキモだな。

704 :デフォルトの名無しさん:2006/09/09(土) 08:17:17
>>701
ヌルをデリファレンスした時点で未定義動作。
& によるチェックは意味を成さない。

705 :デフォルトの名無しさん:2006/09/09(土) 08:39:38
>>704
a null reference cannot exist in a well-defined program,
because the only way to create such a reference would
be to bind it to the “object” obtained by dereferencing
a null pointer, which causes undefined behavior.

ということだな

706 :デフォルトの名無しさん:2006/09/09(土) 08:40:30
>>705 は Wikipedia から
http://en.wikipedia.org/wiki/Reference_(C++)

707 :デフォルトの名無しさん:2006/09/09(土) 12:32:11
質問です。

自作のDLLとそれを使用する実行ファイルを作成しています。
DLLを使用するには、実行ファイルと同じフォルダにDLLをおかなければエラーになりますが、
DLLを別のフォルダに置いて使用する方法はありますか?
具体的には、C:\Test\Exec.exeからC:\Test\bin\DLL.dllを使用するようにしたいのです。

開発環境はVisualStudio.net2003。言語はCです。

現在、ライブラリは#pragma comment (lib, "DLL.lib")で使用しています。

708 :デフォルトの名無しさん:2006/09/09(土) 12:37:09
PATH

709 :デフォルトの名無しさん:2006/09/09(土) 13:05:07
LoadLibrary

710 :デフォルトの名無しさん:2006/09/10(日) 11:19:56
質問です、可変引数の関数ポインタというのは定義可能でしょうか?
typedef int (*HogeFunc)(unsigned int, ... );
みたいな感じで………。

711 :デフォルトの名無しさん:2006/09/10(日) 11:22:28
試してみた?

712 :デフォルトの名無しさん:2006/09/10(日) 14:37:56
通常scanfでは変数の前に&をつけるが、配列の場合はつけない

とあったのですが、&をつけないのは文字列の場合で、数列の場合は必要でいいのでしょうか?

713 :デフォルトの名無しさん:2006/09/10(日) 14:41:37
その様子だとなぜ&を付けなければいけないか分かってないね。

714 :デフォルトの名無しさん:2006/09/10(日) 14:41:42
>>712
「配列の場合は付けない」でいいです。

715 :デフォルトの名無しさん:2006/09/10(日) 14:46:30
>>712
変数の前に&付けると何を意味するか分かってる?
配列名が何を指しているか分かってる?

716 :デフォルトの名無しさん:2006/09/10(日) 15:09:57
>>667
遅レスだけど、多重ループ抜けるには多重ループ全体を関数化する。

void LoopFunc()
{
 for (int i = 0; i < 100; i++) {
  for (int j = 0; j < 100; j++)
  {
   if (gonyo gonyo) return;
  }
 }
}
そうすればどこでも好きなところから全体を抜けられる。

717 :712:2006/09/10(日) 15:19:24
済みません、よく分からないです

718 :デフォルトの名無しさん:2006/09/10(日) 15:32:27
>>717
どの程度分からないのか言えよな。
一から百まで全く分からないのか、どこか一部が分からないのか。

719 :712:2006/09/10(日) 15:47:12
ポインタが何の事なのかすら教わっていません

720 :デフォルトの名無しさん:2006/09/10(日) 15:54:00
>>717
いや、まあ、その、なんだ。
それなりの再利用性があるなら、そういう選択は有りなんだろうが、
goto憎しでそこまでやる奴は、そもそもCから宗旨替えした方が
自分にとっても周りにとっても幸せな気が。

721 :712:2006/09/10(日) 15:55:44
済みません、よく分からないです

722 :デフォルトの名無しさん:2006/09/10(日) 15:57:00
>>720>>716を指してるから問題ない
寧ろそれが分からないお前には問題がある

習ってないならこれ以上突っ込まずに後回しにしとけ

723 :デフォルトの名無しさん:2006/09/10(日) 16:06:08
ポインタを勉強するまで「おまじない」と思っとけばおk

724 :デフォルトの名無しさん:2006/09/10(日) 18:12:04
なんでポインタも教えないうちにscanfを教えるんだろ?

725 :デフォルトの名無しさん:2006/09/10(日) 18:14:36
ポインタの前にアドレスの概念を教えないと

726 :デフォルトの名無しさん:2006/09/10(日) 18:24:18
>>724
printf()だってポインタを使うじゃない。

727 :デフォルトの名無しさん:2006/09/10(日) 18:33:51
>>724
ポインタを全く使うなと言われるとC言語使えないじゃん。

728 :デフォルトの名無しさん:2006/09/10(日) 18:59:10
順序的にはどんな本でも入出力が先じゃね

変数varにおいて&varは変数varのアドレスを指す
配列arr[]においてarrは配列の先頭アドレスを指す → &(arr[0])と同じ
利便性からそうなっているのか、これはCの決まり事

(配列の各要素は連続したメモリ上にあるので、
配列の先頭アドレスは頻繁に使われる(先頭アドレスから全要素を特定できる)
頻繁に使うんで&arr[0]などという記述は非常にめんどうい)

scanfはこのアドレス(メモリ)に値を取得しろ、って命令
アドレスとは何か、ってのは後で教えてくれるから大丈夫

729 :デフォルトの名無しさん:2006/09/10(日) 19:06:49
>>728の言う事は正しいんだけどね、
Cの関数では引数は値渡しになるとか、いろいろ説明しないと
「アドレスを渡す場合とそうでない場合とどう区別するか」とか
なかなか「&」を付ける理由の説明にならんのいねぇ。

730 :デフォルトの名無しさん:2006/09/10(日) 19:09:48
まあ、それは後で勉強する話

>通常scanfでは変数の前に&をつけるが、配列の場合はつけない
今は↑に対する答えを何となく理解してもらえばいいんじゃないか

731 :デフォルトの名無しさん:2006/09/10(日) 19:15:59
まぁ、最初は仕方ないかなぁという気もする。
でも
「変数の前に&つけるとその変数のアドレスになるんだよー」
「配列の名前だけだと、その先頭の要素のアドレスになるんだよー」
ってのは判ってて欲しいよね。

732 :デフォルトの名無しさん:2006/09/10(日) 19:41:56
VC++6.0です。自分で作ったヘッダーファイルをインクルードするのは
どうすればいいのでしょうか?

#include "ts21tf.h"

とやったのですが「インクルード ファイルがオープンできません。'ts21tf.h':
No such file or directory」と言われます。
多分、"ts21tf.h"のパスを教えてやらなければいけないと思うのですが、
どうやったらいいのでしょうか?

そもそもstdio.hなんかはどこに入っていて、どうして#include "stdio.h"
って書くだけでインクルードできるのか、参考書を何冊読んでも書いてあ
りません。。。って言う初心者なんですが、よろしくお願いします。

733 :デフォルトの名無しさん:2006/09/10(日) 19:55:43
そりゃ、どんなC/C++の参考書にも、ヘッダファイルの位置なんか書いてないさ。
規格では、コンパイラが内部に持っていることすら許されるんだから。

で、VC++の場合は環境変数INCLUDEを参照している。
#include "xxx" で読み込むのは、カレントディレクトリと処理系既定のディレクトリ。

734 :デフォルトの名無しさん:2006/09/10(日) 19:58:36
そういえば、MSは
OS部門では、頑張って「フォルダ」という名前をデフォにしようとしているけど
コンパイラのメッセージはdirectoryのままなのね。

735 :デフォルトの名無しさん:2006/09/10(日) 20:08:53
>>720
アンカーミスったうえにその発言か。
挙げた程度の解決策もでてきてなかったから選択肢として出したんだが。

キミはちょっと被害妄想が過ぎるようだ。

736 :デフォルトの名無しさん:2006/09/10(日) 20:10:13
>>732
プロジェクト
設定
C/C++
カテゴリ:プリプロセッサ
インクルードファイルのパス
ここに書く
複数あるときは;で区切って書く

737 :デフォルトの名無しさん:2006/09/10(日) 20:11:14
>>734
別に頑張ってるわけでもないんじゃね。
フォルダって別にMSが言い始めた言葉でもないし。

738 :デフォルトの名無しさん:2006/09/10(日) 20:11:25
>>728
arrと&(arr[0])は値は一緒だが意味が違う

739 :デフォルトの名無しさん:2006/09/10(日) 20:20:28
>>737
そりゃ、appleとかのが先だが
DOSやWin3.1の頃は、フォルダなんて呼び方は誰一人してなかった。

740 :デフォルトの名無しさん:2006/09/10(日) 20:20:39
そういう意味が分かる人はこんなところでやわな質問はしないよね。
定数だし。

741 :デフォルトの名無しさん:2006/09/10(日) 20:56:29
UNIXでは?

742 :デフォルトの名無しさん:2006/09/10(日) 21:01:14
フォルダとディレクトリの違いが判らない人がいるらしい。

743 :デフォルトの名無しさん:2006/09/10(日) 21:03:12
一緒一緒一緒一緒一緒

744 :732:2006/09/10(日) 21:13:16
そんなところにあったのか。

>>733 >>736 ありがとう

745 :デフォルトの名無しさん:2006/09/10(日) 21:15:42
フォルダの方がより論理的な意味づけがあるものと漠然と思ってたが。

746 :デフォルトの名無しさん:2006/09/10(日) 21:24:10
>>744
漏れは10年以上前からVC使ってるが
ダイアログでの場所は今日初めて発見した


747 :デフォルトの名無しさん:2006/09/10(日) 21:24:43
さよか

748 :デフォルトの名無しさん:2006/09/10(日) 22:17:07
フォルダは概念、ディレクトリは実装。

749 :デフォルトの名無しさん:2006/09/10(日) 22:30:02
>>748
ハァ?

750 :デフォルトの名無しさん:2006/09/10(日) 22:56:25
WTLでCButton作成したんですけど、ボタンの周りが白くなってしまいます。
背景色で塗ることは出来ませんか?

CButton m_button;

m_button.Create(m_hWnd,CRect(50,50,100,80),NULL,WS_CHILD|WS_VISIBLE ,0);




751 :デフォルトの名無しさん:2006/09/10(日) 23:30:05
とりあえず背景色を白にする

752 :デフォルトの名無しさん:2006/09/10(日) 23:37:33
>>738
どんな違い?

753 :デフォルトの名無しさん:2006/09/10(日) 23:42:38
一例

int array[5];
printf("%d\n", sizeof(array));
printf("%d\n", sizeof(&array[0]));

754 :デフォルトの名無しさん:2006/09/10(日) 23:44:12
なんだ、そんな屁理屈か

755 :デフォルトの名無しさん:2006/09/10(日) 23:45:28
>>754
それを屁理屈だと言うお前は凄い

756 :デフォルトの名無しさん:2006/09/10(日) 23:47:45
そんな使い方しねーし
初心者に簡潔に教える事に必要とも思えないが

757 :デフォルトの名無しさん:2006/09/10(日) 23:49:07
一例として挙げるならせめて実用的な例を

758 :デフォルトの名無しさん:2006/09/10(日) 23:50:03
>>749
Windowsシェル(エクスプローラなど)では、
マイコンピュータなどディスク上のディレクトリでないものもフォルダと呼ぶことを、
748は言いたいのだと思う。

フォルダ⊇ディレクトリ

>>752
「配列→先頭要素へのポインタ」への変換が行われる前は、まだarrは配列型。

759 :デフォルトの名無しさん:2006/09/10(日) 23:52:55
>>758
>「配列→先頭要素へのポインタ」への変換が行われる前は、まだarrは配列型。

これは具体的にどういった意味を持つのですか?

760 :デフォルトの名無しさん:2006/09/11(月) 00:02:00
int array[5];
array は int (*)[5]
&array[0] は int *


761 :デフォルトの名無しさん:2006/09/11(月) 00:08:18
サイズが違うってだけ?

762 :デフォルトの名無しさん:2006/09/11(月) 00:11:56
蛇足ってやつだ

763 :デフォルトの名無しさん:2006/09/11(月) 00:17:24
>>760のように詳しく知らなくても済ましてたなんて、お前ら苦労を知らないなぁ?

764 :デフォルトの名無しさん:2006/09/11(月) 00:18:12
$ cat a.c
int main(int ac, char *av[])
{
int array[5];
int *p;
int (*q)[5];

p = array;
p = &array[0];
q = &array;
q = &(&array[0]);

return 0;
}

$ gcc a.c
a.c: In function `main':
a.c:14: error: invalid lvalue in unary `&'


765 :デフォルトの名無しさん:2006/09/11(月) 00:18:47
そんな当たり前のハナシ

766 :デフォルトの名無しさん:2006/09/11(月) 00:25:56
要するにarray[0]がchar型だと、そんなもん初心者でも分かりきってるだろ

767 :デフォルトの名無しさん:2006/09/11(月) 00:27:36
ああ、int型か

768 :デフォルトの名無しさん:2006/09/11(月) 00:34:23
>>760
違う、arrayはint [5]。

769 :デフォルトの名無しさん:2006/09/11(月) 00:35:31
だな

770 :デフォルトの名無しさん:2006/09/11(月) 00:36:40
実用性の無い屁理屈を言う奴は、初心者にとっては単なる教え下手

771 :デフォルトの名無しさん:2006/09/11(月) 00:37:43
>>768
ネタにマジレス

772 :デフォルトの名無しさん:2006/09/11(月) 00:38:02
おやおや・・・

773 :デフォルトの名無しさん:2006/09/11(月) 00:39:36
まあまあ

774 :デフォルトの名無しさん:2006/09/11(月) 00:40:15
やれやれ

775 :デフォルトの名無しさん:2006/09/11(月) 01:10:40
: : : : : : Λ ヽ : : : / : : : : : : : : : : : : : : :\ : : : ',
: : : : : /:,ハ  } : : / : : : : : : : : : : : : : : : : : : : \: : i
: : : : : : : : :},.イ: : /. : : : : : : : : : : : : :ヽ : : : : : : : :\l
: : : : : : : :/ /: / : : : : : : : : : : : : : :  ', : : : : : : : 、:ヽ
: : : : : : :/ノ: : / : : : : : : :/ : : : /: j: l: : l: ', : 、 : : : ヽ: :',
!: : : : : ,'、 : : ,' ,': : : : : : / /: : /: /j: !: : }斗‐‐',: : : !: i: :l
',: : : : :l : `ー! !: : : : : :/_厶∠∠.//l: :,ハ,ニ=ァ'i: :l :l: :}:lノ
: '、 : : l:\_ r{ {: : : : : :{´{=_;;云ァァ' ,ノノ 仂jイ}/: /:/ //
: : ヽ: :lヽ : :{ ヾ\ : ‐=f壬辷'丿;     ゚ー〈ノ/ノイ´
: : :',:ヽl : \\  |\: {´¨''¬'"´    ` ``}: :l : :i:l   バ カ ば っ か
: : : ',: :ヽ: : :`7`T|: : l`ー  ヽヽヽ   (_ア ,.イ: :.:l : :i l
: : : :.',: : :ヽ : {{ 「゙|: : |、ヽ、_      ,.イ: :l : :.l : :i l
: : : : :'、: : :ヽrく '、: '、\ `T¬ーrく: :! : !.:.:.:l : :i: l
: : : : : ヽ : : : ヽ \ヽ :ヽ \,ハ.   ヽハ: : :| : :.l : :i: |


776 :デフォルトの名無しさん:2006/09/11(月) 04:31:12
while(1){
switch(xxx){
a: hoge; break;
b: foo; break;
}
}
というコードで、bの場合にのみ、whileのループも抜けたい場合は
どう記述したらいいのでしょうか。

777 :デフォルトの名無しさん:2006/09/11(月) 04:38:49
>>776
goto

778 :デフォルトの名無しさん:2006/09/11(月) 04:41:04
返信ありがとうございます。
gotoしかないでしょうか、、gotoは使いたくないのですが。


779 :デフォルトの名無しさん:2006/09/11(月) 04:42:35
>>776
flag = true;
while (flag) {
flag = false;
}

780 :デフォルトの名無しさん:2006/09/11(月) 04:43:40
>>778
関数にしておき、returnとか。まあそういうダーティな方法しかない。

781 :デフォルトの名無しさん:2006/09/11(月) 04:50:33
goto嫌う奴は将来の見込みが無い

782 :デフォルトの名無しさん:2006/09/11(月) 04:53:14
gotoは悪だ!と教わったので躊躇してしまいます。
会社とかでgoto使って書いてもいいのでしょうか?
flagはいい方法ですね。

みなさま、ありがとうございます。

783 :デフォルトの名無しさん:2006/09/11(月) 04:57:33
それよりも、
>while(1){
これはどうなんだ?
ループを抜ける基本的な条件ないのか?

784 :デフォルトの名無しさん:2006/09/11(月) 04:59:16
ラベルbの処理を行った場合、抜けたいと考えています。

785 :デフォルトの名無しさん:2006/09/11(月) 05:00:08
>>782
フラグなんて使うなよ。
良い方法でもなんでもない。
素直にgoto使いなさい。

786 :デフォルトの名無しさん:2006/09/11(月) 05:03:15
goto がベスト。
関数にして return は、関数にする意味があればやってもいいが、
そうでなければいい解決法とは思わない。

goto は、使用箇所は限定されるが、ごく普通に使う。
goto を意味なく嫌う人は、思考停止してるだけ。
goto をなるべく使いたくないのは確かだが、
goto を使うのがベストな状況なら、使うべき。

まあ、本来は goto が必要ないような言語仕様にすべきだとは思うんだけどね。
C/C++ がそういう言語仕様になってないんだから仕方が無い。

787 :デフォルトの名無しさん:2006/09/11(月) 05:03:39
>>784
もし本当にあのプログラムならswitchじゃなくif文にしなさい。

788 :デフォルトの名無しさん:2006/09/11(月) 05:11:10
まあ、switch 使うならもっと分岐あるんじゃね? 流石に。

789 :デフォルトの名無しさん:2006/09/11(月) 05:11:27
もしgotoを使うなと言ったのが先輩や上司なら、素直に従っておけよ。
無視して使ってると最悪イジメにあう。
部署が代わるまでガマンだ。

790 :デフォルトの名無しさん:2006/09/11(月) 05:31:31
自作自演もたいがいにしとけよ

791 :デフォルトの名無しさん:2006/09/11(月) 05:37:40
勉強になりました。
ありがとうございました。

792 :デフォルトの名無しさん:2006/09/11(月) 07:44:18
if (xxx==b) break;

793 :デフォルトの名無しさん:2006/09/11(月) 08:55:37
gotoは使用が乱発的でなく、
使用により芸術的かつ簡潔にコーディングが成せる場合に限り
堂々と躊躇無く自信を持って使用する。

gotoはドラマにおけるハイライトである。
ドラマのハイライトを日常で安易に演じれば
単なるスタンドプレイに陥り恥ずかしく痛い奴に成り下がる危険がある。
よって、知性と精神を総動員して、注意深く且つ揺るぎ無き強い意思を持ってそこに刻み込む。

794 :デフォルトの名無しさん:2006/09/11(月) 09:21:30
そう!まさしく空気を読まず声高らかにぬるぽと叫ぶがごとく!

795 :デフォルトの名無しさん:2006/09/11(月) 09:31:31
自演のオンパレードだな

796 :デフォルトの名無しさん:2006/09/11(月) 09:39:40
そして、更に空気を読まず声高らかに >>794 ガッ と叫ぶがごとく!

797 :デフォルトの名無しさん:2006/09/11(月) 09:56:24
痛々しいからそのくらいで

798 :デフォルトの名無しさん:2006/09/11(月) 10:17:13
最近色んなスレでgoto信者を見かけるのだが同一人物か?

799 :デフォルトの名無しさん:2006/09/11(月) 10:23:47
Unix系の話です。GNUlpr1.0.1のソースが解せないので質問します。

ディレクトリ内のファイル一覧を作成する処理(getqって関数)で、
ファイルの情報を記録する配列のメモリをmallocで確保して
reallocで拡張するような仕組みがあります。
解せない点は2つです。

1.ファイルのリストを記録する配列を確保する際の初期要素数として、
ディレクトリに対してfstatを掛けて取得したファイルサイズ/24を採っているのですが、
これはどういう根拠でこうしているのか。
Linuxだと常に0になると思うけど、そうではない環境があるのでしょうか。

2.上記配列が足りなくなった時にreallocで拡張しているけど、
毎回、その時に走査していたファイルのサイズ/12を拡張後の要素数としている。
わけわかりません。これでいい環境があるのでしょうか。

ちなみに、うちの環境(Linux2.4系)だと2.が原因で当然のようにSEGVを起こします。


800 :デフォルトの名無しさん:2006/09/11(月) 11:20:16
>>793
分かってるならこのスレでも騒がないように


801 :デフォルトの名無しさん:2006/09/11(月) 11:29:29
>>799
少なくともソースへのリンクを示してもらわんとな・・・

802 :799:2006/09/11(月) 11:35:47
>>801
ソースを転載するのはライセンス上どうかと思ったので、tarボールで失礼します。
http://prdownloads.sourceforge.net/lpr/gnulpr-1.0.1.tar.gz?use_mirror=jaist

803 :デフォルトの名無しさん:2006/09/11(月) 12:18:45
>>799
dir entryの内部構造は良く知らないけど、最低block sizeになると思うけど。
ちなみに以下の環境ではstbuf.st_sizeは4096だったよ。

Fedora Core5
Linux * 2.6.16-1.2133_FC5 #1 Tue Jun 6 00:52:14 EDT 2006 i686 i686 i386 GNU/Linux

Montavista Linux
Linux * 2.4.17_mvl21 #24 2004年 10月 19日 火曜日 17:17:03 JST ppc unknown unknown GNU/Linux

804 :デフォルトの名無しさん:2006/09/11(月) 12:20:16
sage忘れスマソ・・・

805 :デフォルトの名無しさん:2006/09/11(月) 12:41:03
>>799
同じくdir entryに詳しくないので、想像を交えて。

>1.ファイルのリストを記録する配列を確保する際の初期要素数として、
>ディレクトリに対してfstatを掛けて取得したファイルサイズ/24を採っているのですが、
>これはどういう根拠でこうしているのか。

ディレクトリ内のファイルひとつのdir entryが最小で24バイトだからでは。

> 2.上記配列が足りなくなった時にreallocで拡張しているけど、
> 毎回、その時に走査していたファイルのサイズ/12を拡張後の要素数としている。
> わけわかりません。これでいい環境があるのでしょうか。

「ファイルサイズ/12」と考えると良く分からないけど、「dir entryが最小サイズだった
場合の個数*2」を確保してると考えるとわかりやすいと思う。一度拡張されるときに
余裕をもってメモリを用意しておく戦略。STLでも使われてる。

806 :799:2006/09/11(月) 13:14:55
>>803,805
レスありがとうございます。おおむね解決しました。

1.については、確かに803でおっしゃるようにディレクトリエントリの
サイズが得られるのが普通のようです。
今回の私の環境では、対象ディレクトリがtmpfs上にあったことが原因でした。
tmpfs上のディレクトリにfstatを掛けると、サイズは必ず0が返るようです。
MontavistaLinux3.0で確認しました。

2.については、バグだったようです。どっかのブランチで修正されてるようでした。
805でおっしゃるようにサイズを2倍に拡張する意図だったのは間違いないようですが、
ディレクトリを開く時のfstatでのstat構造体を
ファイルをリストアップする時のstatで使いまわしていたので、
間違ったサイズで計算してしまっているようです。

おかげさまですっきりしました。ほんとにありがとうございます。

807 :デフォルトの名無しさん:2006/09/11(月) 13:47:33
WN2000SP4、VCEEを使ってプログラムしています。

ファイル操作関数群をまとめたいと思い、プログラムを書き始めましたが
fopen();のところで以下のメッセージがMessageBoxで出ます。

test.exe の 0x0041151b でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。

fopen関係でぐぐりましたが、有効な解決策が見つかりません。
どうか救いの手を差し伸べてください(+д+)マズー


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


File.cpp

boolOpenFile( FILE **fp, LPSTR lpMode, LPSTR lpFileName )
{
*fp = fopen( lpFileName, lpMode );
return true;
}

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

Main.cpp

FILE**fp = NULL;

OpenFile( fp, "r", "text.txt" );


808 :デフォルトの名無しさん:2006/09/11(月) 13:52:36
ポインター理解できてる?

Main.cpp
FILE* fp;
OpenFile(&fp, 以下略

809 :デフォルトの名無しさん:2006/09/11(月) 13:53:13
FILE*fp = NULL;

OpenFile(&fp, "r", "text.txt" );

810 :デフォルトの名無しさん:2006/09/11(月) 14:17:53
>808
>809


どうもありがとうございましたm(__)m
ポインタのポインタの意味が少し分かったようなギガする。。


811 :デフォルトの名無しさん:2006/09/11(月) 16:11:43
FILE**fp = NULL;
*fp = (FILE *)malloc(sizeof(FILE *));

OpenFile( fp, "r", "text.txt" );

〜〜〜〜

free(*fp);

812 :デフォルトの名無しさん:2006/09/11(月) 17:11:27
質問です。
C++で構造体VECTOR2を作成しています。
この構造体の中に関数を入れて、演算子による動作を設定したいのですが
うまく行きません。
struct VECTOR2{
float x;
float y;
VECTOR2 operator-(VECTOR2 op2)
{
x -= op2.x;
y -= op2.y;
}
bool opEquals(VECTOR2 op2) {
return (x == op2.x && y == op2.y);
}
}
ご指摘お願いします。

813 :デフォルトの名無しさん:2006/09/11(月) 17:29:42
>>812
・どう巧くいかないのか。
*エラーが出たならエラーメッセージ
*期待する動作と異なるなら、それらの動作
・環境は何か。
#この場合は必要ないだろうが念の為。

814 :デフォルトの名無しさん:2006/09/11(月) 17:32:02
3重ループで、一番内側から2つのループを抜け出すための以下のような
書き方は普通に問題ないのでしょうか?
EXITのあとに;をつけないとエラーになるのがちょっと気になるのですが…
for(i=0;i<a;i++){
 for(j=0;j<b;j++){
  for(k=0;k<c;k++){
   if( hoge ){
    goto EXIT;
   }
  }
 }
EXIT:
 ;
}

815 :デフォルトの名無しさん:2006/09/11(月) 17:34:01
あ、
ラベルEXIT:の後に;を付けないとエラーになるのが気になる
です。

816 :デフォルトの名無しさん:2006/09/11(月) 17:43:27
構文規則上 <ラベル> : <式> だから

817 :デフォルトの名無しさん:2006/09/11(月) 17:50:20
なるほど。ちなみに書き方自体はこれが一般的でしょうか?

それとも以下のように毎回フラグ変数を用意するような感じが
一般的なのでしょうか?

   if( hoge ){
    flag = TRUE;
    break;
   }
  }
  if( flag ){
   break;
  }
 }
}


818 :デフォルトの名無しさん:2006/09/11(月) 17:51:47
>>812
VECTOR2 a, b, c; で c = a-b; とし、 c.x == a.x-b.x; c.y == a.y-b.y; となる動作を期待してる
のかな?

struct VECTOR2 {
float x, y;
};

VECTOR2 operator-(VECTOR2 a, VECTOR2 b) { a.x -= b.x; a.y -= b.y; return a; }


819 :812:2006/09/11(月) 18:11:49
情報少なくてすみません。
返り値戻して無かっただけでした。自己解決しました。すんません

820 :デフォルトの名無しさん:2006/09/11(月) 18:12:17
プ

821 :デフォルトの名無しさん:2006/09/11(月) 18:18:17
>>818
その程度、メンバ関数で充分だ。

>>817
どっちの方が読みやすいと思う?
特にコーディングルールなどに縛られないなら読みやすい(≒シンプル)と思う方にしておけ。


822 :818:2006/09/11(月) 18:20:02
>>821
無知でスマン
2項演算子ってメンバ関数化できるの知らなかった。

823 :デフォルトの名無しさん:2006/09/11(月) 18:42:53
いや、俺は2項演算子をメンバにすべきではないと思う。
operator -=をメンバで定義して、非メンバでoperator -をという具合に。


824 :デフォルトの名無しさん:2006/09/11(月) 18:46:17
>>823
実際 812 のコードだと 副作用おこしてるしね。
実質 a-=b と同じことになってる

825 :デフォルトの名無しさん:2006/09/11(月) 19:08:09
無知でごめんさない。
hoge.h 内で

float hoge(int hoge)
{
return hoge++;
}

のようにグローバル関数をつくって、
hoge.hをインクルードしたクラスで使えるようにしたいのだが、
他のオブジェクトで既に定義されていると言われた。

ちなみにどのクラスでも、
#program once
#include "hoge.h"

としているので2重でインクルード読込むことはないはずなのだが・・。

826 :デフォルトの名無しさん:2006/09/11(月) 19:18:26
>>825
>#program once
これはなんだ?

827 :デフォルトの名無しさん:2006/09/11(月) 19:44:31
>>825
「二重インクルードはしちゃダメ」って聞いて、意味も分からず使ってない?
今回の問題はそこじゃないよ。

一つの翻訳単位(つまり一つのソースファイル)でhoge.hを複数回インクルードするのを
防止したいというのが、二重インクルード防止。
aaa.c と bbb.c でそれぞれ hoge.h を一回ずつインクルードするのは防げないから、
aaa.o と bbb.o の両方に同名の関数が定義されたことになって、リンクしたらエラーになる。

関数の実体はどれか一つのソースだけにあればいいから、
 hoge.c (新しいソースでもいいし、既存のどれかのソースでもいい)に関数定義を移動。
 hoge.h には関数のプロトタイプ宣言だけ書く。
にすればいい。

関数定義にstaticつけるとかinline関数にするというのもあるけど、
まずは基本的なことから理解したほうがいいと思う。

あと、そもそも #pragma once (の間違いだよね)の使い方を間違ってる。
これはhoge.h の頭に書くもの。

828 :デフォルトの名無しさん:2006/09/11(月) 19:56:39
>>825
あるファイルで
int Fund() { return 0; }
とあり、別のファイルで
int Fund() { return 1; }
とあったらリンカはどっちリンクしていいか困るよね。
仮に戻り値が同じであってもやはりどっちリンクしていいか困るわけだ。
関数の実体はリンクするファイルの中に複数あってはならない。

829 :デフォルトの名無しさん:2006/09/11(月) 20:05:45
>>828
> とあったらリンカはどっちリンクしていいか困るよね。

困らないよ。

830 :825:2006/09/11(月) 20:15:45
827さん828さん ありがとうございます。
無事解決しました。
未だにプロトタイプ宣言と関数定義の違いがわかりませんが、
ようは宣言は何回でもいいけど、実装は一つにしろってことですね。
しかし、構造体宣言のなかで関数を書いた場合は・・実装になるの?

831 :デフォルトの名無しさん:2006/09/11(月) 20:17:36
>829
http://msdn2.microsoft.com/ja-jp/library/72zdcz6f.aspx

832 :デフォルトの名無しさん:2006/09/11(月) 20:18:19
とりあえず入門書はちゃんと読めってことだ。
#includeの意味も宣言と定義の意味も全部書いてある。

ただ、中には char a = 'あ'; みたいな本もあるらしいから
そういうのは捨てろ。

833 :750:2006/09/11(月) 20:21:09
マジでだれか教えてくれない?

ダイアログフォームならボタンの背景グレーになってるんだけど、
普通のウィンドウだとボタンの背景が白なんよ。
ココで言う背景ってのは、たとえばXPスタイルのボタンとかだと角が丸いよね
その丸い部分の外側。外接する四角との隙間のことです。

CButton m_button;
m_button.Create(m_hWnd,CRect(50,50,100,80),NULL,WS_CHILD|WS_VISIBLE ,0);

なぜなぜ!?!?

834 :デフォルトの名無しさん:2006/09/11(月) 20:28:23
親Windowの background color で描かれてるんじゃないの?
# Layerd window かもしれんけど

835 :750:2006/09/11(月) 21:35:41
FrameWindow -- White
└ViewWindow -- Gray
└Button -- ココ

FrameWindowの背景色をGrayに設定してもダメでした。

と、色々試行錯誤してたら出来ました。
GetWndClassInfo()で背景色設定してたんですけど、これをDECLARE_WND_CLASS_EXで設定するようにしたらOKになりました。

ありがとうございました。

836 :デフォルトの名無しさん:2006/09/11(月) 22:22:53
int (*(*p)())[5]
これってどういう風に解釈すればいいのでしょうか?

837 :デフォルトの名無しさん:2006/09/11(月) 22:29:42
>>836
http://kmaebashi.com/programmer/pointer.html
p is pointer to function returning pointer to array of int.
pは、intの配列へのポインタを返す関数へのポインタ。

838 :デフォルトの名無しさん:2006/09/11(月) 22:30:01
int (void*(*p)(void))[5]
か?

839 :デフォルトの名無しさん:2006/09/11(月) 22:36:07
後ろのvoidはいいけど前のは余分じゃない?

840 :デフォルトの名無しさん:2006/09/11(月) 22:42:10
複雑だな。
int *(*p)(void)[5]
こうじゃないか?

841 :デフォルトの名無しさん:2006/09/11(月) 22:46:34
>>840
それじゃあ*より[]の方が優先度が高いので、意味が変わっちまう。

842 :デフォルトの名無しさん:2006/09/11(月) 22:49:11
int*をかえす関数void p(void)が5個。

843 :デフォルトの名無しさん:2006/09/11(月) 22:50:30
int*を返す
関数int * func(void)
が5個。
のまちがえ。

844 :デフォルトの名無しさん:2006/09/11(月) 22:56:12
>>843
それだったら

int *(*p[5])(void); じゃね?

>>840
p is a pointer to function (void) returning array[5] of pointer to int

つまりint型へのポインタを5個持つ配列を返す引数voidの関数へのポインタでわ?

845 :デフォルトの名無しさん:2006/09/11(月) 22:59:21
違うと思う。

846 :デフォルトの名無しさん:2006/09/11(月) 23:02:27
>>845
嘘付けぇこれが通るのをどう説明するつもりだぁ

int *(*p[5])(void);

int *func1(void);
int *func2(void);
int i;

int main()
{
p[0] = func1;

return 0;
}

int *func1(void)
{
return &i;
}

int *func2(void)
{
return &i;
}


847 :デフォルトの名無しさん:2006/09/11(月) 23:04:08
typedef使えよと思ってしまう逃げ腰な俺。

848 :デフォルトの名無しさん:2006/09/11(月) 23:04:27
>838, 840, 842, 843, 845
837のリンク先を読み返してから出直せ。

849 :デフォルトの名無しさん:2006/09/11(月) 23:05:11
パズル気分で関数ポインタの配列やら関数ポインタを返す関数やらを読むのは別にいいが
実際に使用するときはtypedefして欲しい。
少なくとも俺はそうなっているものじゃないと、読む気がしない。

でもたまに必要になるが。

850 :デフォルトの名無しさん:2006/09/11(月) 23:06:30
関数は配列を返す事はできない。配列へのポインタなら返す事ができる。

851 :デフォルトの名無しさん:2006/09/11(月) 23:10:17
int (*((*p)(void)))[5];

int (*(func1(void)))[5];

int i[5];

int main()
{
p = func1;

return 0;
}

int (*(func1(void)))[5]
{
return 0;
}


852 :デフォルトの名無しさん:2006/09/11(月) 23:11:08
>>851
p is a pointer to function (void) returning pointer to array[5] of int
                          ~~~~~~~~~~~

853 :デフォルトの名無しさん:2006/09/11(月) 23:11:42
>>848 そうは言うけどお前は、void (*beam(int arg, void (*func)(int)))(int) 読めるのか?


854 :デフォルトの名無しさん:2006/09/11(月) 23:12:06
あ。悪い
×return 0;
○return &i;

855 :デフォルトの名無しさん:2006/09/11(月) 23:18:09
>>853
んー・・・・
beam is a function (int, pointer to function void(int)) returning pointer to function void(int)

856 :デフォルトの名無しさん:2006/09/11(月) 23:24:44
大きく出たわりには、勉強中なのか?
ところで、>>836は自分で創作しただろ。
コンパイル可能なのか?

857 :デフォルトの名無しさん:2006/09/11(月) 23:25:58
どうやら合ってたらしい

#include <stdio.h>
void func(int i);
void (*beam(int arg, void (*func)(int)))(int);

int main(void)
{
beam(1, func);

return 0;
}

void func(int i)
{
printf("func(%d)\n", i);
}

void (*beam(int arg, void (*func)(int)))(int)
{
printf("arg = %d\n", arg);

func(2);

return func;
}

858 :デフォルトの名無しさん:2006/09/11(月) 23:32:58
>>836
こういう事だろ。

#include <stdio.h>

int (*(*p)())[5]; // p is a pointer ti function () returning pointer to array[5] of int
int (*func1())[5];

int i[5];
int j = 12345;

int main(void)
{
p = func1;
i[0] = j;
printf("%d\n", *p()[0]);

return 0;
}

int (*func1())[5]
{
return &i;
}

859 :デフォルトの名無しさん:2006/09/11(月) 23:35:14
ちょっと修正。これならOK?
#include <stdio.h>

int (*(*p)())[5]; // p is a pointer ti function () returning pointer to array[5] of int
int (*func1())[5];

int i[5];

int main(void)
{
p = func1;
i[0] = 12345;
i[1] = 56789;
printf("%d\n", (*p())[0]);
printf("%d\n", (*p())[1]);

return 0;
}

int (*func1())[5]
{
return &i;
}

860 :デフォルトの名無しさん:2006/09/11(月) 23:38:34
質問です。
C++で作ったEXEファイルをWEBページから起動するというプログラムをC++で作ることは可能でしょうか?
ご教示お願いします。

861 :デフォルトの名無しさん:2006/09/11(月) 23:39:42
>>860
ActiveX

862 :デフォルトの名無しさん:2006/09/11(月) 23:47:22
難しいなぁ。
>>859
↑と、下記はint (*(*p)())[5]の解釈は同じ?
#include <stdio.h>
int (*(*p)())[5];
int (*func1())[5];
int i[][5]= {{0,1,2,3,4},{5,6,7,8,9}};
int main(void) {
p = func1;
printf("%d\n", *p()[1]);
return 0;
}
int (*func1())[5]{return i;}

863 :デフォルトの名無しさん:2006/09/11(月) 23:53:12
>>862
二次元配列と配列へのポインタを混同したら危ないですよ。
この場合はiは int[5]へのポインタとして解釈されています。

だから*p()[1]でi[1][0]が出力されます。

しかし、私も勘違いしていたように、*p(){1]という書き方では、
二次元配列を返す場合はいいですが、一次元配列へのポインタを
返すと、おかしな事になります。

そこで(*p())[1]と書いたのです。

864 :デフォルトの名無しさん:2006/09/11(月) 23:55:33
>>861
ご教示ありがとうございます。
また、以前オセロゲームについて意見していただいた方、本当にありがとうございました。

865 :デフォルトの名無しさん:2006/09/12(火) 00:05:09
>>863
これは関数なのか、なんなんだ?
int (*func1())[5]
{
return i;
}


866 :デフォルトの名無しさん:2006/09/12(火) 00:07:15
>>865
関数ですよ。もし

int *func1()[5]

と書いてコンパイルしたら、「関数は配列を返せない」等のエラーが出るはずです。

867 :デフォルトの名無しさん:2006/09/12(火) 00:17:10
それって、関数定義なんだろ。
なんか、不思議だな〜
見た事無いのは俺だけか?
ちょっとわからん。


868 :デフォルトの名無しさん:2006/09/12(火) 00:19:26
要するに、「何を受け取り」「何を返す」かしっかり書けていればいいんですよ。
関数名にカッコを付けても意味が変わらなければエラーは出ません。

難しいのは、Cの演算子の優先順位と適用方向がゴチャゴチャだからです。

869 :デフォルトの名無しさん:2006/09/12(火) 00:22:50
>>863
単に配列のポインタ返すだけなら下記でもよさそうですよね。
わざわざ関数の宣言に要素数が入っているのは何故でしょう?
要素数が入ることで下記と何が変わるのでしょうか?
int i[5]= {0,1,2,3,4};
int *(*p)();
int *func1(){return i;}
int main(void) {
p = func1;
printf("%d\n", p()[1]);
return 0;
}

870 :デフォルトの名無しさん:2006/09/12(火) 00:27:50
>>869
ご存じの通りCでは二次元配列以上の場合、最初の次元以外は
要素数を省略した定義や宣言が出来ません。

ご呈示いただいたソースでは、あくまでもintへのポインタ、もしくは
一次元配列を返す、と読めます。

次元が付いていると、二次元配列を返す事が出来るようになります。
私のソースでは二次元配列ではなく、配列へのポインタを返すように
しました。(どちらでも同じですけど)

だから、*p()[1]は、i[5]をアクセスする事になります。i[1]ではありません。

871 :デフォルトの名無しさん:2006/09/12(火) 01:34:48
後置演算子うぜー
やっぱJavaのほうがいい
int[] meth(), int[][] meth() はCと意味違うけど

872 :デフォルトの名無しさん:2006/09/12(火) 01:39:17
C#でいいじゃん。Javaは糞。

873 :デフォルトの名無しさん:2006/09/12(火) 01:52:16
VC++ (.Net) 選ばなければどっちでもいいよ。

874 :デフォルトの名無しさん:2006/09/12(火) 08:51:39
僕は断然 C++/CLI ちゃん!

875 :デフォルトの名無しさん:2006/09/12(火) 09:39:49
Ruby以外全部糞糞糞
もんもん万歳!

876 :M$:2006/09/12(火) 12:07:19
M$の製品以外全部糞糞、糞!
Vistaはええぞー。
ゲーシ様、マンセー!

877 :デフォルトの名無しさん:2006/09/12(火) 13:12:02
M$とか書かれても、Basicはスレ違いだ。

878 :デフォルトの名無しさん:2006/09/12(火) 16:03:38
Microsoft Visual C++ 2005 Express Editionの無償版って期限すぎたら登録キー入力しろって出るけど
キー入手するの面倒くさいし
再インストールしたらまた使えるか?

879 :デフォルトの名無しさん:2006/09/12(火) 16:16:48
ライセンス登録すりゃいいじゃん

880 :デフォルトの名無しさん:2006/09/12(火) 20:04:00
質問です
値引数←これってなんて読むんですか?w

スレ違い?

881 :デフォルトの名無しさん:2006/09/12(火) 20:10:14
ぐぐれ

882 :デフォルトの名無しさん:2006/09/12(火) 20:13:12
ねびきすうに決まってるだろ!

ちなみに、
「値渡し」は「あたいわたし」
「引数」は「ひきすう」
と読む。

「あたいわたし」というのは
女言葉の「自分自分」とは、ちょっとだけ違うので注意。

883 :デフォルトの名無しさん:2006/09/12(火) 20:14:52
\___________/
         ∨
           ___                _
       / ____ヽ           /  ̄   ̄ \
       |  | /, −、, -、l           /、          ヽ きみ頭だいじょうぶ?
       | _| -|○ | ○||         |・ |―-、       |
   , ―-、 (6  _ー っ-´、}         q -´ 二 ヽ      |
   | -⊂) \ ヽ_  ̄ ̄ノノ          ノ_ ー  |     |
    | ̄ ̄|/ (_ ∪ ̄ / 、 \        \. ̄`  |      /
    ヽ  ` ,.|     ̄  |  |         O===== |
      `− ´ |       | _|        /          |

884 :デフォルトの名無しさん:2006/09/12(火) 20:18:10
オモスレーwww

885 :デフォルトの名無しさん:2006/09/12(火) 20:19:44
ぐぐっても値引数がどんなものかの説明ばかりで
読み方が書いてないのです。
ものすごい本読みにくいので
誰か教えてほしいです。

886 :880:2006/09/12(火) 20:22:53
>>882
どもー、「あたいひきすう」って読むんですね
感謝

887 :デフォルトの名無しさん:2006/09/12(火) 20:29:40
「ねびきすう」だって言ってるだろ!

888 :880:2006/09/12(火) 20:47:26
>>887
うは、「ねびきすう」でよかったんですか
疑い深くてすみません・・・

889 :デフォルトの名無しさん:2006/09/12(火) 21:20:02
こらこら

890 :880:2006/09/12(火) 21:23:22
今、詳しい友達に聞いてみたら「ねびきすう」
でいいそうです。
みなさんありがとうです

891 :デフォルトの名無しさん:2006/09/12(火) 21:58:39
>890
そんな餌でクマー(AA略

892 :デフォルトの名無しさん:2006/09/12(火) 22:03:23
ねいんすう

893 :デフォルトの名無しさん:2006/09/12(火) 22:08:24
typedef struct foo {
 int a;
 char b[256];
} foo_t;

typedef struct bar {
int c;
 int d;
 foo_t *hoge;
} bar_t;

ってな構造体があって、
bar_t *xxx;
int n = 100;
xxx->hoge = (foo_t *)malloc(sizeof(foo_t)*n);

ってやったとき、任意のfoo_tのb[256]にはどうやって
アクセスすれば良いのでしょうか?



894 :デフォルトの名無しさん:2006/09/12(火) 22:11:18
xxx->hoge[i].b[256];
って256にアクセスしちゃだめだろ

895 :デフォルトの名無しさん:2006/09/12(火) 22:14:14
>>893
こういうことか?
xxx->hoge[任意].b

896 :デフォルトの名無しさん:2006/09/12(火) 22:46:08
>>893
じゃなくてb[256]はないっつーてるの。b[255]までだろ。

897 :893:2006/09/12(火) 22:53:45
書き方悪くて申し訳ないです。
>>895 の方が書かれている通りのことです。

>>894, 895, 896各氏どうもありがとう。

898 :デフォルトの名無しさん:2006/09/13(水) 10:59:15
すいません。構造体の質問です。
CYLS EQU 0x0ff0
LEDS EQU 0x0ff1
VMODE EQU 0x0ff2
SCRNX EQU 0x0ff4
SCRNY EQU 0x0ff6
VRAM EQU 0x0ff8
MOV BYTE [VMODE],8
MOV WORD [SCRNX],320
MOV WORD [SCRNY],200
MOV DWORD [VRAM],0x000a0000
MOV [LEDS],AL
MOV BYTE [CYLS],10
というアセンブラがあって、この値をポインタを使って受け取りたいとき、
struct BOOTINFO {
char cyls,leds,vmode,reserve;
short scanx,scany;
char *VRAM;
};
void hagemain(void)
{
char *vram;
int xsize,ysize;
struct BOOTINFO *binfo;

binfo = (struct BOOTINFO *) 0x0ff0;
xsize = (*binfo).scrnx;
ysize = (*binfo).scrny;
vram = (*binfo).vram;
以下略・・・

899 :デフォルトの名無しさん:2006/09/13(水) 11:01:01
と書けば、xsizeに320、ysizeに200、vramに0x000a0000
が代入されるのですが、これは、アセンブラの段階で以下のようになっていて、
番地 入っている値
0x0ff0 10
0x0ff1ALの値
0x0ff28
0x0ff3
0x0ff4320
0x0ff6200
0x0ff80x00a0000
次に、C言語のところでstruct BOOTINFOと言う12バイトの構造体型を宣言して
その後、struct BOOTINFO *binfo;で構造体の変数の宣言をし、
binfo = (struct BOOTINFO *) 0x0ff0;で番地を設定することで、
番地 入っている値 変数
0x0ff0 10cyls
0x0ff1ALの値leds
0x0ff28vmode
0x0ff3reserve
0x0ff4320xsize
0x0ff6200ysize
0x0ff80x00a0000vram(メモリ番地変数)
上記のように変数と値が、対応付けられるのでしょうか?
えっと説明は長いんですが、早い話、変数xsizeなどに値を代入していないのに
どのような過程で値が代入されるのかなという質問です。


900 :デフォルトの名無しさん:2006/09/13(水) 11:02:30
環境は?

901 :デフォルトの名無しさん:2006/09/13(水) 11:08:53
すいません。対応表読みにくいですね。
実は30日で出来るOS自作入門という本で勉強しているんですが、
プログラミング言語初体験で四苦八苦しています・・・
環境はgccに著者が手を入れた奴で
アセンブラもnasmに著者が手を入れた奴です。
OSはwinです。
いまは画面表示の関数を作っているところなんです。

902 :デフォルトの名無しさん:2006/09/13(水) 13:07:54
素人にはお勧めできない。
悪い事言わないから止めとけ。
そんな事で悩むようでは、後が辛すぎる。

903 :デフォルトの名無しさん:2006/09/13(水) 13:43:53
そうですかねぇ。
自分の買った本には構造体型のサイズは各メンバのサイズの合計かそれ以上と有ったんですよ。
もし、それ以上の場合なら0x0ff4とxsizeがずれて対応される可能性があるかなと思ったんです。
例えばxsize = (*binfo).scrnx;としたのにxsizeに200が代入されていたりとか・・・

904 :デフォルトの名無しさん:2006/09/13(水) 13:49:55
>>903
「そうですかねぇ」じゃねえよ、ヴォケが
質問者の発する言葉じゃないだろ

905 :デフォルトの名無しさん:2006/09/13(水) 14:11:27
>>903
そりゃ、構造体のメンバがどうアラインメントされるかで
構造体のサイズは変わるし、各メンバが連続して配置
されるかどうかも保証されていないからな。
構造体がパックされるように強制できたっけ?

906 :デフォルトの名無しさん:2006/09/13(水) 14:35:55
>>904
俺は903ではないが、お前も質問者にとっては回答者でも何でもないがな

907 :デフォルトの名無しさん:2006/09/13(水) 14:43:04
俺は904ではないが、「そうですかねぇ」にはカチンと来た。

908 :デフォルトの名無しさん:2006/09/13(水) 14:45:49
カルシウム不足なんじゃね?

909 :デフォルトの名無しさん:2006/09/13(水) 14:47:38
構造体のサイズが各メンバのサイズの合計を超えてる場合でも、
各メンバは連続してることもある。

910 :デフォルトの名無しさん:2006/09/13(水) 14:51:14
xsizeが0x0ff4にならないことはない。

911 :デフォルトの名無しさん:2006/09/13(水) 14:58:17
>>893
これってアドレスしか確保してないのにxxx->なんてやっていいの?

912 :デフォルトの名無しさん:2006/09/13(水) 15:04:22
>>905
VCなら
 #pragma pack(push, 1)
 <構造体宣言>
 #pragma pack(pop)
でパディングを0にすることが可能

913 :デフォルトの名無しさん:2006/09/13(水) 15:05:56
ヒント:省略

914 :デフォルトの名無しさん:2006/09/13(水) 15:05:57
gccなんだけど。
それに今回はpack関係ないし。

915 :デフォルトの名無しさん:2006/09/13(水) 15:08:08
gccのinfo読めば、仕様が書いてあるだろ。
著者が独自に変更していれば、それについて言及してあるだろうし。

916 :デフォルトの名無しさん:2006/09/13(水) 15:12:53
>struct BOOTINFOと言う12バイトの構造体型
なぜ12バイトだとわかったのか。
12バイトであるなら、0x0ff4以外には考えられないだろう。

917 :デフォルトの名無しさん:2006/09/13(水) 16:00:57
お取り込み中失礼
SDKでMFCのクラスを使うにはどうすればいいでうか?
初心者の陥り易い注意点とかもあれば教えて草代。

918 :デフォルトの名無しさん:2006/09/13(水) 16:17:24
まずMFCのDLLを用意する

919 :デフォルトの名無しさん:2006/09/13(水) 16:43:55
誰も「そんな事」について明確な答えを出せない点について、
と煽ってみる。
ま、モレは分からんけどね。

920 :デフォルトの名無しさん:2006/09/13(水) 16:55:59
>>919
出てるジャン。
読解力ゼロ?

921 :デフォルトの名無しさん:2006/09/13(水) 19:34:58
出ていませんね。

# こんなまぬけな開き直りは久しぶりに見た :-)

922 :デフォルトの名無しさん:2006/09/13(水) 19:36:09
そんな書き込みしても、これ以上のコメントは付きませんよ :-P

923 :デフォルトの名無しさん:2006/09/13(水) 19:51:33
マジレス。

>>899
>早い話、変数xsizeなどに値を代入していないのに

>>898
>xsize = (*binfo).scrnx;

代入してますね。

>>899
>どのような過程で値が代入されるのかなという質問です。
P75〜P99を理解できるまで読め。
この程度のことが理解できないなら、この本を読むのは無理。

924 :デフォルトの名無しさん:2006/09/13(水) 22:13:59
rand()関数の精度が悪いっていうのは、具体的にはどういうことなのですか?
線形合同法自体が良くないってことでしょうか。
あと、最大値と最小値を指定する方法で
return min + (int)(rand() * (max-min+1.0) / (1.0 + RAND_MAX)
という方法を見つけたのですが、これを使うのも良くないんでしょうか?
Visual C++ .NET2003を使っているのですがこれは関係ないのかな。
今のところ特に何に使いたいということでもないんですが…

925 :デフォルトの名無しさん:2006/09/13(水) 22:29:21
>>924
http://www.vector.co.jp/soft/data/prog/se002453.html

↑これをDLして、中のrndtest.cに掛けてみればよい。
他にもいろいろな乱数ルーチンが入っているので遊べる。

926 :デフォルトの名無しさん:2006/09/13(水) 23:04:20
>>899
>上記のように変数と値が、対応付けられるのでしょうか?
あなたがイメージしている事はだいたいあってる。
ただ、実際の動作(メンバーに対応するオフセット等)は環境による。


927 :デフォルトの名無しさん:2006/09/13(水) 23:05:44
いきなりですみませんが、C言語のエディタで字下げをTabではなく、スペースでしてくれるエディタって無いでしょうか?

928 :デフォルトの名無しさん:2006/09/13(水) 23:07:10
スレ違い

929 :デフォルトの名無しさん:2006/09/13(水) 23:08:23
>>926
> ただ、実際の動作(メンバーに対応するオフセット等)は環境による。
的外れ。
メモリ上のデータに対応するように構造体を定義してるのだ。

930 :デフォルトの名無しさん:2006/09/13(水) 23:09:01
>>925
すみません、rndtestの使い方がわかりませんでした(泣)
できれば擬似乱数について解説しているサイトを教えていただきたいのですが・・・
勉強不足で本当にすみません・・・

931 :デフォルトの名無しさん:2006/09/13(水) 23:17:53
wikipediaに割と詳しく書いてあるよ

932 :デフォルトの名無しさん:2006/09/13(水) 23:25:18
>>930
"pseudo random number"でぐぐったら?

日本ではメルセンヌ・ツイスターが有名だけど。boostにも入ってるし。

933 :デフォルトの名無しさん:2006/09/13(水) 23:27:03
http://tnt.math.metro-u.ac.jp/labo/grad/2003/lin/lin.htm

あとこの当たりとか。

934 :デフォルトの名無しさん:2006/09/14(木) 01:21:04
今までC言語を勉強していたんですが
C++と比べて機能的にはどっちがいいのでしょうか
人気がないという話を聞いたのですが・・・・

優れていたり将来性があるならC++に乗り換えたいと思っています
また無料で出来るのかも教えてくれるとありがたいです
それとC#というのは最近よく聞きますが、これの現状はどうなのでしょうか


935 :デフォルトの名無しさん:2006/09/14(木) 01:22:16
訂正です
また無料で出来るのかも教えてくれるとありがたいです
これを抜かしてください

936 :デフォルトの名無しさん:2006/09/14(木) 01:22:18
まずはC言語を極めてみてはどうだろうか

937 :デフォルトの名無しさん:2006/09/14(木) 01:25:38
お早い返事ありがとうございます
C言語を極めても結局C++に乗り換えることになるなら
初めからC++をやったほうがいいと思っているのですが

C言語で勉強したことはC++でそのまま通用するのでしょうか

938 :デフォルトの名無しさん:2006/09/14(木) 01:27:14
君にはうんこが似合ってるよ

939 :デフォルトの名無しさん:2006/09/14(木) 01:29:06
>>937
C89の機能の殆どはC++でも使えます。
C99の一部の(便利な)機能はC++では使えませんが、他の手段があります。
従って、C++を勉強することをお勧めしておきます。
GUIを手軽に作ってみたいなど、言語そのものより作ることに興味があるならC#を齧るのも悪くないでしょう。

940 :デフォルトの名無しさん:2006/09/14(木) 01:30:44
>>939
ありがとうございます
今日試しにやってみることにします

941 :デフォルトの名無しさん:2006/09/14(木) 01:31:53
vsnprintfとかってC99だけなんだっけ。
地味に羨ましい。

942 :937:2006/09/14(木) 01:39:37
C++の無料ソフトはどこのがいいのでしょうか
今のところBorlandを考えているのですが
お勧めとかありますか?

943 :デフォルトの名無しさん:2006/09/14(木) 01:54:06
VCEE。
タダ。MFC他は付いてないけどね。
どうせならあと2万出してStandard買うのがオススメ。

944 :デフォルトの名無しさん:2006/09/14(木) 01:57:41
>>943
ありがとうございます
学生なのでお金に今余裕がなくて・・・・
お金に余裕が出来たらStandardの購入を検討してみます
どうもありがとうございました

945 :デフォルトの名無しさん:2006/09/14(木) 01:59:02
つ[gcc w/cygwin]

946 :デフォルトの名無しさん:2006/09/14(木) 02:00:09
>>945
修羅の道すぎる。
せめてEclipse+CDTで緩和してさしあげるんだ。

そしてCに愛想を尽かされJavaに逃げられる罠。

947 :デフォルトの名無しさん:2006/09/14(木) 02:03:32
Turbo C++ ExplorerをDLして、BCC5.82を使うとかね。
中途半端かもしれないが使いやすい。

948 :デフォルトの名無しさん:2006/09/14(木) 02:05:15
>>945-947
皆さんご意見ありがとうございます
色々あるみたいなので明日にでもゆっくり考えて
自分にあったものを使いたいと思います


949 :デフォルトの名無しさん:2006/09/14(木) 02:09:44
gcc でも windows dll を簡単に作れると
gcc(とC99) もwindowsで使ってもらえるんだけどなぁ

950 :898:2006/09/14(木) 02:12:04
お返事できなくてすいません。今日のバイト10時間だったんで。
えっと、こんな未熟者のためにプロの方が答えを考えてくれて凄く感謝しています。
構造体のことはだいぶ分かりました。
>メモリ上のデータに対応するように構造体を定義してるのだ。
つまり今回の場合、scrnxが、構造体の先頭から4の倍数の場所になっているので、隙間は入らず、
結果アライメントやパディングの問題は発生しない。
よってstruct BOOTINFOは確実に12バイトの構造体変数になると。
最初からアセンブラでメモリの番地にデータを計算して書き込んでいるからこそ出来た訳ですね。
以上のような理解でよろしいでしょうか?
>そんな事で悩むようでは、後が辛すぎる。
プログラミング経験0から始めたので、C言語の本併読しながらですから結構大変ですけれど、
だんだん絵が出てきたりして今までの詰め込みから面白くなってきた所なんですよ。
もう少し頑張ってみますね。


951 :デフォルトの名無しさん:2006/09/14(木) 03:45:04
>>929
>的外れ。
>メモリ上のデータに対応するように構造体を定義してるのだ。
その指定方法が処理系やターゲット等の環境依存なのだが、理解できないか?


952 :デフォルトの名無しさん:2006/09/14(木) 04:05:36
>>950
>確実に12バイトの構造体変数になる
その本を読んでないのでなんともいえないけど
1、>4の倍数の場所になっているので、隙間は入らず
  作者も同じように考えてタマタマ処理系の動作と一致している
2、処理系の動作を調べて一致することを確認してある
3、アセンブラの方を構造体にあわせて書いてある
などなど、可能性はいろいろある。

動作には不定とか未定義とか実装依存とかあって、実験結果が
いつも正しいわけではない事を、頭の隅っこにでも置いといて吉。

953 :898:2006/09/14(木) 05:39:17
>処理系の動作を調べて一致することを確認してある
処理系ってコンパイラの事ですよね。
>動作には不定とか未定義とか実装依存とかあって、実験結果が
>いつも正しいわけではない事を、頭の隅っこにでも置いといて吉。
コンピュータープログラムってどんなときも同じ結果だと思っていたんですけど、
そうじゃないんですね。変なの。

954 :デフォルトの名無しさん:2006/09/14(木) 06:07:02
>>952
それ逆。
メモリ上に12バイトのある情報があって、それにあうように構造体を定義してるの。
「タマタマ」などではない。

955 :デフォルトの名無しさん:2006/09/14(木) 06:24:50
>>954
一般にメモリ上での配置に従って構造体を定義するなんてできるのか?

struct {
 char a;
 char b;
};

がメモリ上の連続した2バイトに配置されるなんて保証はないわけで。
コンパイラオプションや pragma でコンパイラの挙動を制御しなけりゃ
「それにあうように構造体を定義」なんてできないと思うんだが。

956 :デフォルトの名無しさん:2006/09/14(木) 06:25:29
>944
学生ならAcademic Editionもあるでよ(\4800)
Standard相当

ま、言語に慣れる段階ならExpressでもいいけど

957 :デフォルトの名無しさん:2006/09/14(木) 06:39:08
>>955
今回は、Windowsでgccね。

そんな一般論ならぬ特殊論をいつまでも続けるより、「そうならない処理系」の例でもあげたほうが生産的だな。

958 :また煽ってみる:2006/09/14(木) 06:44:16
>>902
>>904
出てこいやぁ、コルァ。
説明してみろや。

959 :デフォルトの名無しさん:2006/09/14(木) 06:49:21

自己中心な奴ほどプログラムに興味あるんだよね。

「オレ様プログラムを作るぞー」って意気込んで、

そのうちに真性プログラマーになって人生落ちていくんだろうよ。


960 :デフォルトの名無しさん:2006/09/14(木) 06:53:49
>>955
>一般にメモリ上での配置に従って構造体を定義するなんてできるのか?

え、出来ないの?

961 :デフォルトの名無しさん:2006/09/14(木) 06:57:05
>>955
それも考え方が逆。
筆者は構造体でアクセスするために、0xff0からchar,char,char,char,short,short,pointerと配置しておいたの。
で、最初はひとつひとつアドレスでアクセスしてて「めんどいよね」ってことで構造体登場となる。

962 :デフォルトの名無しさん:2006/09/14(木) 07:03:50
>>961 であれば、構造体の方も
__attribute__ ((packed))
指定をすべきではないだろうか。

963 :デフォルトの名無しさん:2006/09/14(木) 07:13:13
>>962
なんで?

964 :デフォルトの名無しさん:2006/09/14(木) 07:23:12
アセンブラの方で構造体でのアクセスを考慮したコーディングするなら
Cのコードの方でもアセンブラでのアクセスを考慮したコーディングしないと。
コンパイラ依存でも環境依存でも構わないんだが、
そのコンパイラですら保証されていない特性に頼るのは危険だと思う。


965 :デフォルトの名無しさん:2006/09/14(木) 07:25:13
>>964
どこがどう危険なの?

966 :デフォルトの名無しさん:2006/09/14(木) 07:39:23
>>964
その議論はどうでもいいけど、>>955のケースでメモリ上で連続しないような処理系があるなら教えて。

967 :デフォルトの名無しさん:2006/09/14(木) 07:40:44
>>960
コンパイラをバージョン含めて限定して検証しながら作れば可能。

968 :デフォルトの名無しさん:2006/09/14(木) 07:43:18
>>966
無いと思うよ。 char 二つの間にパディング入れる意味はまったく無い。
でもそれは規格では保証されていないので、期待するもんじゃない。

969 :デフォルトの名無しさん:2006/09/14(木) 08:01:37
なに構造体について議論しているの?
>>898がOS自作入門とか言う本よんでて、
初心者だったから、当たり前だろと思うことに変な疑問を持ったんでしょ。
で、作者が俺様理論で本書いてたから説明下手だっただけでしょ。



970 :デフォルトの名無しさん:2006/09/14(木) 10:13:59
>>968
処理系ごとのデフォルトの動作を期待するなと?

971 :デフォルトの名無しさん:2006/09/14(木) 10:23:12
>>970
デフォルトのアラインを調べておけ、と。

そして、処理系の実装依存である以上、たとえば
「charを4つ並べて4バイトの構造体を定義しました」ではなく
「charを4つ並べると4バイトになることは確認済みです」ということ。
事実上どっちでも変わらないからこそ、正しい解釈をしとけ、という話だな。

972 :971:2006/09/14(木) 10:27:14
処理系の仕様書調べなくても、確認方法が「うごいてるからいいや」
でもかまわないから、解釈は正しく、な。

973 :デフォルトの名無しさん:2006/09/14(木) 10:38:30
>>966
>>968
CPUのバス幅に合わせたいとか、ブロック転送命令を使いたいとか
特殊な状況だけど、charのメンバのアラインを強制的に変える事は何度かやったよ。

あと
http://www.microsoft.com/japan/msdn/vs/vc/vcconWindowsDataAlignmentOnIPFX86X86-64.aspx
とか

974 :デフォルトの名無しさん:2006/09/14(木) 10:38:33
>>971
こいつが何にこだわってるのか、さっぱりわからん。

975 :デフォルトの名無しさん:2006/09/14(木) 10:41:35
だれか つぎすれ たのむ

976 :デフォルトの名無しさん:2006/09/14(木) 11:03:02
まてまて、次はこれを使うんじゃないのか

【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145593/

977 :デフォルトの名無しさん:2006/09/14(木) 11:44:55
アラインメントにこだわる奴が多いな。

978 :デフォルトの名無しさん:2006/09/14(木) 12:27:26
もういいじゃん、質問者も理解したみたいだし。
っーか、俺もこの本持っているけど確かにパティングについては書いてないんだよね。
ただ、12バイトになるとしか書いてない。
俺は流し読みをしながら読んだから、「そうね」としか思わなかったけれど、
質問者はマジで素人みたいだし、ちゃんと理解しようと勉強しながら読んでいるみたいだから、
この問題?に気づいたのはえらいと思う。
>>923
>P75〜P99を理解できるまで読め。
>この程度のことが理解できないなら、この本を読むのは無理。
理解できるまで読んでもワカラねぇんじゃねえの?
>自分の買った本には構造体型のサイズは各メンバのサイズの合計かそれ以上と有ったんですよ。
>もし、それ以上の場合なら0x0ff4とxsizeがずれて対応される可能性があるかなと思ったんです。
>例えばxsize = (*binfo).scrnx;としたのにxsizeに200が代入されていたりとか・・・
そもそもパティングについて解説してないもん。理解できるはずがない。


979 :デフォルトの名無しさん:2006/09/14(木) 13:06:43
>>978 実は本を書いた人が
パディングって知らなかったとか。

980 :デフォルトの名無しさん:2006/09/14(木) 13:28:44
>>978
必死だな

981 :デフォルトの名無しさん:2006/09/14(木) 13:40:14
ifstreamをつかってバイナリファイルを読み込んでいます。
ファイルの末尾からある一定の間隔を持ちながら後ろにさかのぼる様なプログラムを書きたいです。
例えば次のようなプログラムです。うしろからdeltaバイトずつスキップしながらデータをとっていきます。

while( 1 ) {
 fin.seekg(-i*delta , ios::end);
if (終了条件) {
  break;
 }
 fin.read((char*)&data,sizeof(int));
 処理
 ++i;
}

ファイルの「終了条件」を先頭にきたときとしたいのですが、
どうしたらいいでしょうか?

982 :デフォルトの名無しさん:2006/09/14(木) 13:50:35
質問失礼します。

ListBoxから派生させたクラスで、ユーザ定義のデータを参照(保持)し行ごとの描画を変えたいのですが…

ユーザ定義のデータをどうやって持つのかに悩んでいます。
ListBoxは行が難行になるか分からないので、内部テーブルを持つ訳にも行かない。
ItemDataはユーザが使用するでしょうし。
コールバック関数を定義させて問い合わせるにはスタックが膨大すぎてしまいそうで、
実現的ではないし。(ON PAINTなどで処理するのでね)

何か良い実現方法はありませんか?

983 :デフォルトの名無しさん:2006/09/14(木) 13:54:37
>>978
そりゃ本にも載ってなけりゃ、ぐぐってもでてこないだろうさ。

984 :デフォルトの名無しさん:2006/09/14(木) 14:17:29
>>978
>>この程度のことが理解できないなら、この本を読むのは無理。
>理解できるまで読んでもワカラねぇんじゃねえの?

なら、この本を読むのは無理だということだね。

985 :デフォルトの名無しさん:2006/09/14(木) 14:21:00
引用符が統一されてなくてゲジゲジです><;

986 :デフォルトの名無しさん:2006/09/15(金) 01:49:54
>>982
何行か判らない、と内部テーブルが駄目、との関係がよく解らないな。
コールバック関数でも問題無いようにも思えるし。
描画はWM_PAINTでなくて、WM_DRAWITEMで個々のアイテム毎だし。

987 :デフォルトの名無しさん:2006/09/15(金) 02:40:39
アライメントって普通CPUのためのものだからなー。
4バイト整列してないintへのアクセスでコケるCPUなんてザラなんだが、
あまり意識されないもんなのかな。

話が飛ぶような飛ばないような。
仮想関数を伴わない構造体の継承って、継承元の構造体の
メモリ配置ってなんか仕様決まってるのかな。

struct A
{
char a, b, c, d;
};

struct B : public A
{
char e, f, g, h;
};

って時に、

struct C
{
char a, b, c, d;
char e, f, g, h;
}

と等価になるのかって話。
保証されてないでFAな気もするけど、それならそれで言質が欲しい。

988 :デフォルトの名無しさん:2006/09/15(金) 06:39:37
順番的には同じになる。

989 :デフォルトの名無しさん:2006/09/15(金) 13:48:57
intが4バイトなのは言語仕様で決定されている事なのでしょうか?

void __stdcall Hoge(int x, int y);
という関数の装飾名は(extern "C"していれば)、_Hoge@8に32ビット環境ではなりますよね。
ですが、intが4バイト固定でないと64ビット環境とかでおかしくなるような気が…。

990 :デフォルトの名無しさん:2006/09/15(金) 13:49:55
そんなもん環境依存に決まっとろーが

991 :デフォルトの名無しさん:2006/09/15(金) 13:51:04
>>986
よくわからないが、
サブクラスからAP関数のコールバックなんて極力やりたくないんじゃないかな?
呼ばれる回数が少ないにせよスタック潰しなのかな、と。
>何行になるか分からないので、内部テーブルを持つ訳にも行かない。
これは単純に a[] の[]内がかけないという意味じゃ?
メモリアロケートしてポインタでつなげて…じゃ、面倒かな?

992 :デフォルトの名無しさん:2006/09/15(金) 15:31:14
.libのファイルってどうやったら中身が見れますか?
このなかに入っている関数と似た関数を作りたくて、どうやっているのか調べたいの
です。
Visual Studio.NETでは意味のわからない数字とかが出てきてしまいました。

993 :デフォルトの名無しさん:2006/09/15(金) 16:08:10
>>989
環境依存。
Win32とWin64ではintは32ビットと決められている。
Win32&Win64ではlongも32ビットと決められている。


994 :デフォルトの名無しさん:2006/09/15(金) 16:09:11
>>992
ソースが無ければ無理

995 :デフォルトの名無しさん:2006/09/15(金) 17:54:52
>>989
少なくとも16bitであることは保証される

996 :デフォルトの名無しさん:2006/09/15(金) 18:43:55
double 型の変数の整数値を得る目的のとき、そのままキャストして
int 型に代入するって方法はなにか問題とか起こる可能性がありますか?

997 :デフォルトの名無しさん:2006/09/15(金) 19:00:02
>996
そのままintにキャストした場合、小数点以下が切り捨てられる。

「○○を超えない最大の整数」とか「○○を下回らない最小の整数」が欲しいんなら
math.hインクルードしてfloor()なりceil()なり使う。直接返されるのはdouble型だけど。

これが頭に入ってれば問題ないかと。

998 :デフォルトの名無しさん:2006/09/15(金) 19:14:31
>>997
サンクス 汚らわしくもキャストしていきます

999 :デフォルトの名無しさん:2006/09/15(金) 21:17:21
>>998
負の値の取り扱いに注意。
#c99ならround()系もお勧め。

1000 :デフォルトの名無しさん:2006/09/15(金) 22:04:17
ume

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

236 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)