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

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

C言語のことは<46>

1 :激しく未定義とする:02/12/08 15:25
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しろ。
むしろ質問する前にWEBで検索するのが常識だ。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへ行け。
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへ行け。

コンパイラを探しているなら >>2 を見よ。

上記を逸した場合の結果は激しく未定義とする。

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

前スレ
http://pc3.2ch.net/test/read.cgi/tech/1038405432/


2 :デフォルトの名無しさん:02/12/08 15:25
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html

3 :デフォルトの名無しさん:02/12/08 15:28
このスレは冗談で作られたニセスレです。ageないようにお願いします。

本物は↓こちら
C言語のことは俺に聞け<46>
http://pc3.2ch.net/test/read.cgi/tech/1038324550/l50

4 :デフォルトの名無しさん:02/12/08 15:29
      |        ___|_              |   |
   _ー|ー-ー      | _      ヽ \    |     |
     __|_」      ̄~| ̄    /         レ    |
    / |ノ ^ヽ     _.、|    <               ノ
    (_ノ| ノ    ∠_ノ\    \            /

.         _」__               ̄──
          _|   \  |    ヽ      /
         (ノ^|.       |     |    |
           (_._」    レ     /     \


                       ●
                ヽ(;´Д`)ノ

5 :デフォルトの名無しさん:02/12/08 15:29
>>3
つまらないのでこれで最後にしようね。

6 :デフォルトの名無しさん:02/12/08 15:32
また糞スレが立ったか。

7 :デフォルトの名無しさん:02/12/08 16:07
また偽スレ厨房が嵐に来るかもしれませんが、
前スレのときを見れば分るとおり、削除人さんがいずれあぼーんしてくれます。
(質問所の方は放置されているので、偽スレだとはっきり分ってよいですね。)

8 :デフォルトの名無しさん:02/12/08 16:08
>>1


9 :デフォルトの名無しさん:02/12/08 16:09
「C言語のことは激しく未定義とする」か…
また変なタイトルにしちゃったなあ。

10 :デフォルトの名無しさん:02/12/08 16:10
で、ドはCなわけですが。

11 :デフォルトの名無しさん:02/12/08 16:11
だから、変わるんだって。

12 :デフォルトの名無しさん:02/12/08 16:16
>>10
欧米ではFかも。

13 :デフォルトの名無しさん:02/12/08 16:19
(;゚Д゚)ぅゎ-

14 :デフォルトの名無しさん:02/12/08 16:51
本物スレage

15 :デフォルトの名無しさん:02/12/08 17:12
なんだこのスレは?
っていうか、スレタイが糞。いい加減にしてくれ・・・

16 :デフォルトの名無しさん:02/12/08 17:17
全くだ。
なんでこんな糞タイトルにしたんだよ! >>1

17 :デフォルトの名無しさん:02/12/08 17:18
本スレどこだよおおおおおおおおおお

18 :デフォルトの名無しさん:02/12/08 17:19
>>17
ココ

19 :デフォルトの名無しさん:02/12/08 17:37
インクルードファイルのコンパイルの仕方教えてください。
mst.hというインクルードファイルがあって
それをtest.cで使っているとき。
test.cなら
>bcc32 test.c
>test
でできるんですが

20 :デフォルトの名無しさん:02/12/08 17:45
できるんですが?がんがれ!

21 :デフォルトの名無しさん:02/12/08 17:45
さて、名前が気に食わないからまた本スレたてるか。

22 :デフォルトの名無しさん:02/12/08 18:23
bcc32ってのはコンパイラの名前です
インクルードファイルを自分でつくった場合それをつくって実行するやり方が
わからないということです

23 :デフォルトの名無しさん:02/12/08 18:24
んじゃ俺も俺の気に入るスレタイで本スレ立てるよ。よろしこ。




>>19
インクルードファイルはコンパイルしないよ。
インクルードされるだけだ。

24 :デフォルトの名無しさん:02/12/08 18:24
誤解を生むといけないので訂正。
×インクルードファイルはコンパイルしないよ。
○インクルードファイル自体はコンパイルしないよ。


25 :デフォルトの名無しさん:02/12/08 18:27
重複スレは
   * * * あ ら ゆ る 手 段 を 使 っ て * * *
排除します。


26 :デフォルトの名無しさん:02/12/08 18:31
>>25
じゃあここ削除されるの?
それともマジでここが本スレ?

27 :デフォルトの名無しさん:02/12/08 18:33
っていうか、訳がわからない。
どれが本スレなんだよ。
このスレも>>1は変なスレタイ付けるしよ。

28 :デフォルトの名無しさん:02/12/08 18:40
スレタイが多少 変でもしょうがない。
後から同じ主旨のを立てたら重複スレになってしまう。


29 :デフォルトの名無しさん:02/12/08 18:43
>>1の糞ヤロウ!
何とか言えゴルァ


30 :デフォルトの名無しさん:02/12/08 18:48
本物スレは

C言語のことは俺に聞け<45>
http://pc3.2ch.net/test/read.cgi/tech/1038405432/

って誘導書き込みがあるんだけど、もうすぐ1000だよ。
次スレは?
あるんだったら次スレに誘導キボンヌ

31 :デフォルトの名無しさん:02/12/08 18:50
ここが次スレ

32 :デフォルトの名無しさん:02/12/08 18:55
ここは糞スレ

33 :デフォルトの名無しさん:02/12/08 19:11
俺が新スレ立てるか?

34 :デフォルトの名無しさん:02/12/08 19:13
>>33
重複スレ立てたら潰す。

35 :デフォルトの名無しさん:02/12/08 19:16
>>33
いいよ、ここで。
まったく、>>1も余計な真似をするよ。

36 :デフォルトの名無しさん:02/12/08 19:16
もういいよ。C言語スレなんていらねーよ。
どうせまともな話出てこないじゃないか。
全部潰してしまえ糞ヤロウ

37 :デフォルトの名無しさん:02/12/08 19:25
C言語で、質問なのですが、
int a;
a = 10;
printf("%s", a);

とやってもダメです。色々調べましたが分かりません。
お願いします。

38 :デフォルトの名無しさん:02/12/08 19:26
釣られてたまるか。


39 :デフォルトの名無しさん:02/12/08 19:28
このスレは終わりです。
37に釣られないようご注意下さい。

40 :デフォルトの名無しさん:02/12/08 19:31
>>39
もう俺は荒らしに負けたよ。
ここが本スレでいいよ。
もしまともな新スレ立てても荒らされて終わりさ。
荒らし本人は正義のつもりなんだろうな。


41 :デフォルトの名無しさん:02/12/08 19:34
>>40
それがお前の作戦か?
このスレは糞すれ。放置決定。

42 :デフォルトの名無しさん:02/12/08 19:37
>>37
お前が調べたのはここか?
http://aglaia.c.u-tokyo.ac.jp/~yamamoto/diary/?200212a&to=200212021#200212021

43 :デフォルトの名無しさん:02/12/08 19:39
>>41
じゃお前はどうしようってんだ。
新しく立てるんなら1の案でも出してみろ。

44 :デフォルトの名無しさん:02/12/08 19:42
>>43
図星だからって熱くなってんじゃねーよ。

45 :デフォルトの名無しさん:02/12/08 19:45
>>41
はあ?お前リアルで氏ねよ。むかつくな。


46 :デフォルトの名無しさん:02/12/08 19:48
>>44
お前頭弱過ぎ。小学校からやり直せ
荒らしてんのお前じゃねーの?

>>40=>>45=>>46>>43 は俺じゃねーよ。


47 :デフォルトの名無しさん:02/12/08 19:53
>>46
“放置決定”なんて書く莫迦の相手をしちゃ思うツボですよ。

48 :デフォルトの名無しさん:02/12/08 19:58
>>44
>>35=>>43なんだが、一人で暑くなってんのはお前じゃないの?
クソスレだと思うならお前は放置しろ。
さもなければ納得させられるような代案を示せ。


49 :デフォルトの名無しさん:02/12/08 20:06
おもしれーな。>>45-48は誰かと誰かを勘違いしてんじゃねーの。

50 :デフォルトの名無しさん:02/12/08 20:11
なるほど。
>>40 (!=>>35)に突っ込んだ>>41に突っ込んだの>>43>>35だったのか。


51 :デフォルトの名無しさん:02/12/08 20:19
すいませんー。
アラインメントを確実に回避して詰まった構造体を生成するには
どうすればいいのでしょうか?詳しく書かれててるHPとかありましたら
教えて下さい。コンパイラはVC++6.0 Windows98SEです。

52 :デフォルトの名無しさん:02/12/08 20:21
>>50
そうなるな。
今のところ、意見を表明してるのはこんだけか?
ここでいい……2 35,40
放置……………1 41


53 :デフォルトの名無しさん:02/12/08 20:21
>>51
全部charの配列にしる。

54 :デフォルトの名無しさん:02/12/08 20:22
>>52
「放置 1」って?
1が放置表明してるの?(だったら削除以来出せよな)

55 :デフォルトの名無しさん:02/12/08 20:23
>>54
書き方がまずかった。

ここでいい……2名 (35,40)
放置…………1名 (41)


56 :デフォルトの名無しさん:02/12/08 20:24
>>53
その構造体と同サイズの全部charaの配列を作って
構造体のポインタで参照しながら使うということでしょうか?

57 :デフォルトの名無しさん:02/12/08 20:25
>>56
構造体の要素をすべてcharの配列にする

58 :デフォルトの名無しさん:02/12/08 20:27
>>51
#pragma pack
で検索しる!

59 :デフォルトの名無しさん:02/12/08 20:27
>>57
それしか無理なんでしょうか・・?
構造体の中にはいろんな型の要素を入れておきたいのですが・・・

60 :デフォルトの名無しさん:02/12/08 20:27
>>55
あぁ,すまん。読み間違えてた。


本スレ争いなんてくだらなすぎ。
もうちょっと大人な解決ができないのだろうか。
#それだけプログラマの年齢が下がってきているということか…。

61 :デフォルトの名無しさん:02/12/08 20:30
なんでまたそんな構造体をつくりたいんだろう。

62 :デフォルトの名無しさん:02/12/08 20:32
>>58
ありがとうございます!!

63 :デフォルトの名無しさん:02/12/08 20:33
>>59
処理系依存でいいなら>>58
ポータブルにしたいなら、

struct my_int {
 char data[sizeof(int)];
};

struct my_struct {
 char c;
 struct my_int i;
};

struct foo {
 struct my_struct m;
 my_int n;
};

struct foo foo;
int i;
memcpy(&i, foo.i.data, sizeof(int));

とかする。
C++でtemplate使うとちょっと楽できる。

64 :デフォルトの名無しさん:02/12/08 20:38
>>60
> あぁ,すまん。読み間違えてた。
いや、プロポーショナルフォントだってのを忘れてた。

とりあえず、他に代案が出ない限りは有効な質問スレとみなそうと思う。

65 :デフォルトの名無しさん:02/12/08 20:40
ここがOKでC言語質問所がNGな理由がわからん。

66 :デフォルトの名無しさん:02/12/08 20:41
>>65
あっちは番号が重複

67 :デフォルトの名無しさん:02/12/08 20:41
>>63
ありがとうございます。
#pragma pack って処理系依存なんですか・・・

68 :デフォルトの名無しさん:02/12/08 20:42
>>66
あとからきたやつが重複したんだが。

69 :デフォルトの名無しさん:02/12/08 20:43
>>67
そもそも、#pragmaは処理系依存の命令を与えるためのものだろ?

70 :デフォルトの名無しさん:02/12/08 20:43
個人的にはどっちもOKなんだが、このまま両方荒らされ続けるのは望ましくな
いだろうってこと。
一本化されれば荒らしも収まるんじゃないかと期待するのは甘い?

71 :デフォルトの名無しさん:02/12/08 20:43
>>70>>65へね。


72 :デフォルトの名無しさん:02/12/08 20:47
いつまでやってんの?

73 :デフォルトの名無しさん:02/12/08 22:14
いつまでも

74 :デフォルトの名無しさん:02/12/08 22:21
C言語質問所<45>は、
俺に聞け<44>がまだ300かそこらの時に冗談で立てられたネタスレ。
間違えて書き込んでしまった素人に、間違えてかわざとか答えた奴ら
のせいで混乱した。内容は「俺に聞け」と全く重複。
時期的には、「俺に聞け<44>」に300遅れで重複。

いちおう、その時にはC言語質問所<43>というのが
まだ生きていた(実は「質問所」の最初のスレなので、<43>はおかしい)が、
なぜか<44>を飛ばして<45>という番号を付けやがった。

75 :デフォルトの名無しさん:02/12/08 22:26
>>70
別にタイトルなぞどっちでも良いのだが、
「重複スレ排除」というルールに従うべきだろう。

76 :デフォルトの名無しさん:02/12/08 22:31
いっそ重複スレは次の予約スレってことに。

77 :デフォルトの名無しさん:02/12/08 22:42
どこできけばいいかわからないのでここでききます。
IntelのCPUでINT3の命令ってなににつかうのでしょうか?
マニュアル読んでも意味がよくわかりません。
解説お願いします。

78 :デフォルトの名無しさん:02/12/08 22:52
>>77すくなくともここで聞く事では無いな。マニュアル読んでも意味が分からないと言うのはちゃんと読んでない証拠。

79 :デフォルトの名無しさん:02/12/08 22:54
>>74
粘着キモッ

80 :77:02/12/08 22:55
>>78
ではあなたはマニュアルを読むと全て理解できるというのですか?

81 :デフォルトの名無しさん:02/12/08 22:56
>>78
君より分かってるけどね。

82 :77:02/12/08 23:04
>>81
口ではなんとでもいえますよね。

83 :デフォルトの名無しさん:02/12/08 23:05
>>77
breakpoint

84 :ヽ(´ー`)ノ:02/12/08 23:06
このスレは殺伐系ですね。

85 :デフォルトの名無しさん:02/12/08 23:06
>>77
アセンブラスレで訊け。

86 :デフォルトの名無しさん:02/12/08 23:16
>>84
ここはののしりあうためのスレだと思ったのですが

87 :デフォルトの名無しさん:02/12/08 23:36
>>80-81
最低限、日本語の読解力は必要。

88 :デフォルトの名無しさん:02/12/08 23:39
>>87
すぐ日本語云々だな。そういうのつまらん。

89 :デフォルトの名無しさん:02/12/08 23:45
質問しに来た人に親切にしましょうよ。
まあ、このスレを壊したいと未だにがんばる粘着な人もいるんでしょうが。

90 :名無しさん@XEmacs:02/12/08 23:48
C言語と関係ない質問に対する反応は未定義です。

91 :デフォルトの名無しさん:02/12/08 23:53
>>90
うぜーよ、クズが。

92 :名無しさん@XEmacs:02/12/09 00:05
ニヤニヤ(・∀・)>>91

93 :デフォルトの名無しさん:02/12/09 00:11
質問です。
C言語で作ったウィンドウスプログラムをCGIで出来ますか?

94 :デフォルトの名無しさん:02/12/09 00:13
>>93
ネタはもういい。

95 :デフォルトの名無しさん:02/12/09 00:14
>>93
(゚Д゚)ハァ?
CGIでWindowsプログラムを作るのか?


96 :デフォルトの名無しさん:02/12/09 00:23
Pythonでつくった開発環境みたいなものもあるしな。

97 :名無しさん@XEmacs:02/12/09 00:24
はいはい

98 :デフォルトの名無しさん:02/12/09 00:25
>>97
テメーは黙れ。

99 :名無しさん@XEmacs:02/12/09 00:27
( ´,_ゝ`)

100 :デフォルトの名無しさん:02/12/09 00:28
100

101 :デフォルトの名無しさん:02/12/09 00:31
ごめんなさい。

102 :デフォルトの名無しさん:02/12/09 00:31
C?

103 :デフォルトの名無しさん:02/12/09 00:35
>>93
マジレスするとWindowsでサーバ立ててそこで動くCGIをCで作ることは可能。

104 :名無しさん@XEmacs:02/12/09 00:38
>>103
ここは日本語の出来ないやつが来るところじゃないぞ

105 :デフォルトの名無しさん:02/12/09 00:39
XEmacsはC言語質問所の1らしい。
放置の方向で。

106 :デフォルトの名無しさん:02/12/09 00:45
>>103の書いていることは正しい。


107 :名無しさん@XEmacs:02/12/09 00:47
>>105
脳みそ落ちてますよ?( ´,_ゝ`)

>>106
>>93 の質問に対する答えとしては正しくない。

108 :デフォルトの名無しさん:02/12/09 00:52
荒らしは放置の方向で。

109 :デフォルトの名無しさん:02/12/09 00:53
>>107
> >>93 の質問に対する答えとしては正しくない。
というかその答えって存在するのか。

110 :デフォルトの名無しさん:02/12/09 00:58
>>93
「Windows上で、Cで書いたプログラムをCGIに使えるか」と聞いている
のだから、>>103の答で適切だ。

111 :デフォルトの名無しさん:02/12/09 01:02
ネタにマジレスするの流行ってるの?

112 :103:02/12/09 01:05
地道にマジレスしてればそのうち荒れなくなると思ったんだけどな…。

113 :名無しさん@XEmacs:02/12/09 01:08
( ^ヮ^) < ふざけるんじゃねえよ! てめえの善人面を
      ふざけるんじゃねえよ! いつかはぶっとばしてやる!!

114 :デフォルトの名無しさん:02/12/09 01:09
>>113
どこに善人がいる?
まあ、お前がクズであるのは一目でわかる。

115 :デフォルトの名無しさん:02/12/09 01:12
(・∀・)

116 :デフォルトの名無しさん:02/12/09 01:34
C をする時に気をつける事は何ですか?

117 :デフォルトの名無しさん:02/12/09 01:45
はあ、しかしこのスレタイわかりにくいな。
C言語のことは って何だよ

118 :デフォルトの名無しさん:02/12/09 01:51
template

119 :デフォルトの名無しさん:02/12/09 02:02
>>117
性病感染。

120 :デフォルトの名無しさん:02/12/09 02:04
まちげた。>>116だった。(・∀・)

121 :デフォルトの名無しさん:02/12/09 02:10
メモリリーク。

122 :デフォルトの名無しさん:02/12/09 03:36
近藤さんに穴が開いてないこと

123 :デフォルトの名無しさん:02/12/09 06:17
>>110
93はWindowsとは一言も言っていない。
これからの100スレを使用してウィンドウスプログラムとは何かを考察しようじゃないか。

どうやらCで書けるらしいことと、CGIに利用できそうなことはわかるが・・・
そもそもウィンドウスとは何なのかからしてわれわれは何も知らないのだ。

124 :デフォルトの名無しさん:02/12/09 07:53
風が薄いんだろ

125 :デフォルトの名無しさん:02/12/09 08:49
プログラムをする際にassert()は使いますか?

126 :デフォルトの名無しさん:02/12/09 08:58
プログラムをする際以外にassert()は使いません


127 :デフォルトの名無しさん:02/12/09 09:06
>>123
ttp://www.google.com/search?q=%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%B9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0

グーグルも知らない香具師が偉そうな口を叩くな

128 :125:02/12/09 09:08
>>126
すいません。きちんと書きます。

assert()はあまりよくないという話しを聞いたんですが、ここの人たち
はassert()を実際に使いますか?
それとも使わないようにしていますか?

129 :bloom:02/12/09 09:08

http://www.agemasukudasai.com/bloom/

130 :デフォルトの名無しさん:02/12/09 09:23
>>128
どうよくないのかわかってないからそういうアホな質問が飛び出すんだよ。
漠然と「あれはいい」「あれはよくない」って覚えるんじゃなくて、
「なぜ」よくないかを知れ。

131 :デフォルトの名無しさん:02/12/09 09:46
assert()つかいまくり。
(VCだからASSERT()だけど)

132 :デフォルトの名無しさん:02/12/09 10:21
時々アプリのくせにassertionエラーでダイアログ出すやつあるよね
assertって絶対におきない条件書くのに、起きてるのってヘタレPGなんですかね

133 :デフォルトの名無しさん:02/12/09 10:31
>>132
デバッグが充分じゃない。つーかNDEBUGつけんでリリースするのはかなりヘタレと思われ。

134 :デフォルトの名無しさん:02/12/09 10:59
>>132
絶対に起きない条件て assert (1); とかでつか?

135 :デフォルトの名無しさん:02/12/09 11:23
>>133
「うまくいかなくても平気なデバッグ時にチェックを行い、
うまくいかないと悲惨なことになる製品の段階でチェックを取り除くのは、
陸の上の練習でライフジャケットをつけ、
海に出るときにそれを外すようなものである。」
と偉い人が言っている。

136 :デフォルトの名無しさん:02/12/09 11:47
ベータテストなんだよ、きっと

137 :デフォルトの名無しさん:02/12/09 12:16
アサーションをリリース時に取り除く必要があるのは
アサーションにかかる実行時間が大きな影響を与える場合だけだろ。
単純な引数のチェックとか大抵のものはリリース時にも残しておいた方が
いいんじゃないのか?

138 :デフォルトの名無しさん:02/12/09 12:34
printf覚えたんですが次は何を覚えたらよいでしょうか?

139 :デフォルトの名無しさん:02/12/09 12:50
>>139 sprintf

140 :デフォルトの名無しさん:02/12/09 12:57
>>138
本の買い方・選び方

141 :デフォルトの名無しさん:02/12/09 13:43
>>138

>>139の無限ループについて考察せよ。


142 :デフォルトの名無しさん:02/12/09 17:48
>>138
cout いっとけ。

143 :デフォルトの名無しさん:02/12/09 19:03
system(const char *string)

144 :デフォルトの名無しさん:02/12/09 22:37
> printf覚えた

果たして本当にそうかな?

145 :デフォルトの名無しさん:02/12/09 23:32
おい、もう一つのスレの方がやたら濃くなってきてるぞ。

146 :デフォルトの名無しさん:02/12/09 23:45
>>137
アサーションをエラーチェックに使う時点で間違ってる。

147 :デフォルトの名無しさん:02/12/09 23:46
146 禿げ

148 :デフォルトの名無しさん:02/12/09 23:46
147 パイパソ

149 :デフォルトの名無しさん:02/12/09 23:49
>>146
それ以外に何に使うんだ ?

150 :名無しさん@XEmacs:02/12/09 23:52
>>146
?

151 :デフォルトの名無しさん:02/12/09 23:59
ごめん、146 禿げ同と書いたつもりだった・・・

>>149-150
エラーハンドリングとアサーションは別物だという事を理解してくれ。

152 :デフォルトの名無しさん:02/12/10 00:09
>>149-150
assert マクロが何故リリースビルドで何もしないか理解しているか?

153 :デフォルトの名無しさん:02/12/10 00:09
>>151
禿げ

154 :デフォルトの名無しさん:02/12/10 00:14
>>151-152
エラーチェックとエラーハンドリングは別物ということを理解してるか ?

155 :デフォルトの名無しさん:02/12/10 00:20
>>154
ネタですか?

156 :デフォルトの名無しさん:02/12/10 00:23
>>155
理解できてない奴、一匹目。

157 :デフォルトの名無しさん:02/12/10 00:24
あさしゃんを夜にする時点で間違っている。

158 :デフォルトの名無しさん:02/12/10 00:28
>>157
あさしゃんは夜にできないだろ…

159 :デフォルトの名無しさん:02/12/10 00:29
>>155
いいえ、シャリです。


160 :デフォルトの名無しさん:02/12/10 00:29
>>157
夜にする あさしゃん って...。

161 :デフォルトの名無しさん:02/12/10 00:36
>>151 >>152 >>154
知ったかぶらないでちゃんと説明しろ。


162 :デフォルトの名無しさん:02/12/10 00:50
>>161
教えを乞う者の態度とは思えんが・・・。

エラーハンドリングは、プログラムの仕様だ。
プログラムの実行時に発生する可能性がある異常値をあらかじめ想定して、捕捉し、
それに応じた復帰/終了処理をする。

アサーションは、プログラムが仕様/意図通りに動いているかどうかを確かめるものだ。
エラーハンドリング漏れや論理エラー等の、プログラムの実行時に許容できない異常値を
捕捉する。
仕様/意図通りに動いている事が確認できればそれはもう必要無いので、リリースビルド
には含めない。

エラーハンドリングは仕様書に現われる、アサーションは現われない。

163 :154:02/12/10 00:52
>>161
エラーチェック: エラー状態かテストすること。
エラーハンドリング: エラー状態時にしかるべき処理を行うこと。

ASSERT() が行うのは、エラーハンドリングの方。
だから、>>151 がなに言ってるか俺にはさっぱりわからん。

164 :デフォルトの名無しさん:02/12/10 00:56
>>163
assert()は「しかるべき処理」は行わないだろ。
少なくともユーザから見た場合。

165 :デフォルトの名無しさん:02/12/10 00:58
>>162
それで具体的にどういうものがエラーハンドリングになってどういうものがアサーションになるのだ?

166 :名無しさん@XEmacs:02/12/10 00:59
>>162
なんでこの人はエラーチェックをエラーハンドリングに脳内変換してるの?

167 :デフォルトの名無しさん:02/12/10 01:04
>>166
どのへんがそうなのか教えてくれないか?

168 :デフォルトの名無しさん:02/12/10 01:07
>>162
ASSERT() マクロにも仕様と言うものがあることを知らんのか ?
ちなみに、リリースビルドでも同じような動作をする VERIFY() マクロもあるぞ。

>>164
プログラマから見たときの話に決まってるだろ。
元々発生しないと思っているんだからさ。

169 :デフォルトの名無しさん:02/12/10 01:08
>>165
アサーションは、仕様通りに動いていれば本来必要の無いチェックをする。
例えば、リンクリストの意図しないリンク切れとか。
もともとアサーションはまともなデバッガが無い時代のものだから、今使う事は
あまり無いはず。

エラーハンドリングは、例えばファイルが開けなかったとか、実行時に起こり得る
ものをトラップする。

170 :デフォルトの名無しさん:02/12/10 01:09
> ASSERT() マクロにも仕様と言うものがあることを知らんのか ?

は?

171 :デフォルトの名無しさん:02/12/10 01:10
>>168
VERIFY() なんての C にあった?

172 :165:02/12/10 01:12
俺がどちらを使うかはっきりしている場合をあげておく。

コンポーネントやライブラリなどの関数・メソッド内での
引数のチェックにはアサーションを使ってはならない。

コンポーネントやライブラリなどの関数・メソッドを呼び出す前の
引数のチェックにはアサーションを使う。

173 :デフォルトの名無しさん:02/12/10 01:13
> アサーションは、仕様通りに動いていれば本来必要の無いチェックをする。

配列境界のチェックなんてのもあるな。

174 :デフォルトの名無しさん:02/12/10 01:14
> コンポーネントやライブラリなどの関数・メソッドを呼び出す前の
> 引数のチェックにはアサーションを使う。

引数をチェックするという仕様がプログラムに求められているなら、その場合は
アサーションを使ってはならない。

175 :名無しさん@XEmacs:02/12/10 01:16
この議論の原点って>>146だよね?
エラーハンドリングは>>151が勝手に持ち出した話だろ?

176 :名無しさん@XEmacs:02/12/10 01:17
>>174
もう少しよく読んだら?

177 :デフォルトの名無しさん:02/12/10 01:17
>>170
規格書ぐらい読めよ。どう言う処置をするかが書いてあるよ。

>>171
> VERIFY() なんての C にあった?
ごめんよ、ANSI-C にはなさそう。VC++ の方言のようだ。

178 :デフォルトの名無しさん:02/12/10 01:19
>>172
理由は ?

179 :デフォルトの名無しさん:02/12/10 01:20
つまり、アサーションってのはプログラム実行時にブレークして
「えっとこの時点ではこの変数はこうなっているはずだよなぁ」って
確認するような感じに使うってことでいい?
引数のチェックに使うのはもってのほかなんだね。

180 :165:02/12/10 01:23
>>178
アサーション使ってリリース時にアサーションが消えている状態で
コンポーネントやライブラリが不正な引数で呼び出されたら困るだろ。


181 :デフォルトの名無しさん:02/12/10 01:24
>>176
もう少しくわしく書こうか?
関数・メソッドを呼び出す引数をチェックするという仕様がプログラムに
求められているなら、その場合はアサーションを使ってはならない。

>>179
正解。

182 :デフォルトの名無しさん:02/12/10 01:25
>>179
そりゃブレークポイント。
(そう言えば、>>169 も、「もともとアサーションはまともなデバッガが無い時代のものだから」とかほざいてたな...。こんな香具師ばかりかよ...。)

一応意図は >>162 の...
> アサーションは、プログラムが仕様/意図通りに動いているかどうかを確かめるものだ。
> エラーハンドリング漏れや論理エラー等の、プログラムの実行時に許容できない異常値を捕捉する。

で合ってると思う。(ただしここだけね。)

183 :デフォルトの名無しさん:02/12/10 01:26
> コンポーネントやライブラリが不正な引数で呼び出されたら困るだろ。

そういう論理エラーはデバッグの段階で完全に取り除いとけ。
アサーションはそのためにある。

184 :デフォルトの名無しさん:02/12/10 01:27
182 も、アサーションが何故リリースビルドで消えるか理解していない一人か・・・

185 :名無しさん@XEmacs:02/12/10 01:28
>>181
>コンポーネントやライブラリなどの関数・メソッド内での
>引数のチェックにはアサーションを使ってはならない。
当然これが守られてる場合の話だろ?
2重にチェックする気?

186 :デフォルトの名無しさん:02/12/10 01:30
>>179
禿同。何のために、デバッグしてんだよ。

でも、実際にそう言う状況があるから、>>135 みたいな話が出てくるんだろ。

187 :デフォルトの名無しさん:02/12/10 01:31
>>185
すまん、あなたがどんな主張を持っていて、どのレスをどう解釈してそう逝っているのか
わかんなくなってきたよ。

188 :186:02/12/10 01:33
>>186
すまん、>>179 じゃねーや。

>>183
> 禿同。何のために、デバッグしてんだよ。
> でも、実際にそう言う状況があるから、>>135 みたいな話が出てくるんだろ。

だったよ。

189 :デフォルトの名無しさん:02/12/10 01:34
>>184
理由は ?

(あー、ウザイ。ちゃんと理由も一緒に書けよ。)

190 :デフォルトの名無しさん:02/12/10 01:35
「完全にデバッグする」なんてできるわけがねぇだろアフォ(w

191 :名無しさん@XEmacs:02/12/10 01:38
>>183
ライブラリ作る側の話でしょ?
ライブラリのユーザがライブラリ関数をおかしな引数で呼び出しても
暴走しないようにしとくのが普通じゃない?

>>187
>>172 とだいたい同じだと思う。
ライブラリ関数の中で、渡された引数をチェックするのにはassertは使わない。
ライブラリ関数に渡した引数がおかしな値になってないかを確認するのにはassertを使う。

192 :デフォルトの名無しさん:02/12/10 01:38
>>189
論拠はこれ。

> 「もともとアサーションはまともなデバッガが無い時代のものだから」とか
> ほざいてたな...。こんな香具師ばかりかよ...。)

193 :名無しさん@XEmacs:02/12/10 01:40
>>191 の最後
s/渡した/渡す/

てか実際はassertなんか使わないので>>192にも同意。

194 :デフォルトの名無しさん:02/12/10 01:41
>>191
だから、呼ばれる側じゃなくて、呼ぶ側でちゃんとデバッグしておけって話だろう。

195 :デフォルトの名無しさん:02/12/10 01:42
>>192
これがどうかしたか ? デバッガとアサーションって用途が違うぞ。

196 :デフォルトの名無しさん:02/12/10 01:44
195 は、アサーションはデバッグのためにするものだという事を知らないのか?

197 :デフォルトの名無しさん:02/12/10 01:45
>>194
だから呼ばれる側はアサーションを使わないでエラーにしろって。
動作が正しく行われるのをモニタリングするため使うのがアサーションで
呼ぶ側で追加でやる処理だろ。

198 :デフォルトの名無しさん:02/12/10 01:46


199 :デフォルトの名無しさん:02/12/10 01:48
んで、アサーションに引っかかるようなバグが
最終製品で残ってたとき、-DNDEBUGしてあると
何がうれしいんだ?

200 :名無しさん@XEmacs:02/12/10 01:49
>>199
アサーションに引かかったらデバグするでしょ普通。。。

201 :デフォルトの名無しさん:02/12/10 01:50
バグの究明が早くなる。

202 :デフォルトの名無しさん:02/12/10 01:52
>>200
「全部バグが取りきれた」という保証は永遠に得られないだろ?

203 :デフォルトの名無しさん:02/12/10 01:52
>>201
「遅くなる」の間違いだろ。

204 :デフォルトの名無しさん:02/12/10 01:53
>>196
> 195 は、アサーションはデバッグのためにするものだという事を知らないのか?

お前アフォだろ ?

アサーションはデバッグのためにする。
デバッガもデバッグのために使う。

だから、デバッガがあればアサーションは要らないって言うのか ?

お前のデバッガは、引数の範囲とかをちゃんと理解して要所要所で、エラーチェックしてくれんのか ?
そんなデバッガがあるなら、俺も使いたいもんだよ。

>>197
状況による。呼ばれた側がいくらエラーを返していても呼び出し側が見てなきゃ何にもならない。
また、呼び出しが非常にたくさんあるなら、呼ばれた側でチェックする方が簡単。

205 :名無しさん@XEmacs:02/12/10 01:54
>>202
そらそうだ。実際に製品として出回ってるソフトにもバグ残ってるのは
いくらでもあるよ。Windows2000も出荷時に6000ものバグ抱えてたって言うしね。

206 :デフォルトの名無しさん:02/12/10 01:54
>>203
アサーション入れてもデバッグの助けにならないというなら
入れないほうがいいじゃん。

207 :デフォルトの名無しさん:02/12/10 01:54
>>202
そこはそれ、豊富な経験・勘と.... 「日程」が背中を押してくれるんですよ。(w

208 :デフォルトの名無しさん:02/12/10 01:55
>>138のホーアの言葉は、配列の添え字チェック
(Pascalだと、コンパイラオプションでon/offできるものが多かった)
の事だが、アサーションでもまあ同じ。
エラーハンドリングの話じゃないよ。

209 :デフォルトの名無しさん:02/12/10 01:56
Windows のバグはアサーションで検知できる種類のものじゃないだろう・・・

210 :デフォルトの名無しさん:02/12/10 01:58
うちではリリース版にもアサーション生かしてあるし、
デバッグ用シンボルつけてあるし、
コアダンプを保存するようにしてある。

Netscapeだと、「クォリティフィードバック」と呼んでいるし、
他の製品でもまあよくあるよね。
昔のMS-Cだと、よく「Compiler Internal Error」ってのを見たな。

211 :デフォルトの名無しさん:02/12/10 01:58
>>204
> 状況による。呼ばれた側がいくらエラーを返していても呼び出し側が見てなきゃ何にもならない。
当たり前だ。呼び出し側にバグがあるんだから呼び出し側のチェック体制を強化しろよ。アサーションでも入れて。

> また、呼び出しが非常にたくさんあるなら、呼ばれた側でチェックする方が簡単。
簡単だからそっちでやるとかそういう問題じゃないだろ。
簡単だからという理由だけなら手抜きと一緒だぞ。

212 :デフォルトの名無しさん:02/12/10 01:59
>>209
もちろん、すべてのバグがアサーションで検知できるわけではないが、
もともと誰もそんなことを主張してはいない。

213 :デフォルトの名無しさん:02/12/10 02:00
>>211
呼び出される側にアサーション入れるのでは駄目なの?

214 :デフォルトの名無しさん:02/12/10 02:01
> また、呼び出しが非常にたくさんあるなら、呼ばれた側でチェックする方が簡単。

アサーションは普通、どこで捕捉したかが重要だから呼び出し側でやるべきだと思うが・・・

215 :デフォルトの名無しさん:02/12/10 02:02
>>212
(゚Д゚)ハァ?
じゃ、205 はどういう意味なの?

216 :名無しさん@XEmacs:02/12/10 02:02
>>211
あのね。ライブラリとかだと呼び出す側が
厨房プログラマーだったりするかもしれないでしょ?
ほんとに分かんないのかな?それともネタ?

217 :デフォルトの名無しさん:02/12/10 02:03
>>211
> 簡単だからという理由だけなら手抜きと一緒だぞ。

同じことが出来るんだったら簡単な方を選ぶよ。どこが手抜だ ?

1000個所から呼ばれてたら、1000個所にいちいち ASSERT() かますわけね。
はっきり言ってバカみたいだよ。

218 :デフォルトの名無しさん:02/12/10 02:03
>>214
コアダンプの結果見れば、どこから呼び出されたかは分かるだろ。
Winじゃpost-motem debugってできないの?

219 :デフォルトの名無しさん:02/12/10 02:03
>>213
もし呼び出され側がプログラム全体の呼び出される条件をすべてテストしており
これからの将来それが変更されないのならいいかもしれんね。

220 :デフォルトの名無しさん:02/12/10 02:03
>>217
foo()の呼び出しをassert込みでマクロ定義すればよい。

221 :デフォルトの名無しさん:02/12/10 02:04
>>217
同じことが出来るならね。だが同じことは出来ない。

222 :デフォルトの名無しさん:02/12/10 02:05
ところで、この中で
「製品版でもアサーションは生かしておくべし」
に反対してるやつってまだいるの?

223 :名無しさん@XEmacs:02/12/10 02:05
>>215
>>205>>202に対するレス。
バグが残ってる可能性があるからといってassertを残しておいたってあまり意味ないってこと。
本当に最後まで見付からないようなバグはassertでは捉えられないんだから。

224 :デフォルトの名無しさん:02/12/10 02:06
>>206
-DNDEBUGすると「アサーションは何も検査しなくなる」んだけど?

225 :デフォルトの名無しさん:02/12/10 02:07
>>223
捉えられないとも限らないだろう。
「あまり」意味は無いかもしれないが、
取り除く意味はデバッグに関して言えば「全く」無いだろう。

226 :デフォルトの名無しさん:02/12/10 02:07
>>223
ああ、理解した。

227 :デフォルトの名無しさん:02/12/10 02:08
>>223
それがなぜassertをわざわざ取り除く理由になるんだ?

228 :デフォルトの名無しさん:02/12/10 02:09
>>220
ネタ ? 悪いけど、呼ばれた側でテストしてんのとどこが違う ? (ソース/オブジェクトとか言わないでね。)
それともマジで、ライブラリ中で引っかかっ時に、どこから呼ばれたか見方がわからんの ?

>>221
何ができないのか言ってみ。

229 :名無しさん@XEmacs:02/12/10 02:10
>>225
いちいちチェックしてたら速度が落ちるでしょうが。
VC++とかでもdebug用とrelease用でコンパイルオプション変えれるでしょ?(。。。よね?)
デバッグのことだけ考えればいいんならこんな区別必要ないでしょうが。

230 :デフォルトの名無しさん:02/12/10 02:10
>>228
assertに引っかかったとき表示される行番号が違う。


231 :デフォルトの名無しさん:02/12/10 02:11
>>229
だから、そもそも「リリース用でコンパイルオプションを変えるのが間違い」
というのが>>138の主張なのだが。


232 :デフォルトの名無しさん:02/12/10 02:12
>>229
速度が落ちるなんて、せいぜい数十%だろ。
ハードの進歩で言って3か月分くらいか?

233 :231:02/12/10 02:13
>>138じゃなくて
>>135ですた。

234 :デフォルトの名無しさん:02/12/10 02:14
>>228
どんな環境でもコアダンプが利用できると主張したいわけね。

235 :デフォルトの名無しさん:02/12/10 02:14
>>230
ぷぷっ、で、デバッグできないと...。
わかったわかった。お前は、一生そうしてな。

236 :デフォルトの名無しさん:02/12/10 02:14



237 :デフォルトの名無しさん:02/12/10 02:15
>>235
230じゃないけど、君の言うことがよく分からない。説明してくれる?

238 :デフォルトの名無しさん:02/12/10 02:17
>>234
> どんな環境でもコアダンプが利用できると主張したいわけね。

まあ、できない環境もあるだろうね。
でもデバッガの環境下なら、呼び出し元ぐらいわからない ?
それもダメなら、しょうがないけどね。

239 :デフォルトの名無しさん:02/12/10 02:18
実際、ネスケのQuality Feedback Agentが働く頻度を見れば、
出荷後でもアサーションに引っかかることはいくらでも
あると思うけど。

240 :名無しさん@XEmacs:02/12/10 02:20
>>231
うーん私はそう思わない、としか言いようがないな。

>>232
同じ能力なら速度が早い方の製品を買うでしょ?

で、ライブラリ作る人間と使う人間は別(の可能性がある)ってのは
みんな分かってんのかなぁ?

241 :デフォルトの名無しさん:02/12/10 02:20
Winでコアダンプみたいな死後デバッグやる方法ってある?
Dr. Watsonみたいのに頼るしかない?

242 :デフォルトの名無しさん:02/12/10 02:22
>>237
>>238 にも書いたけど、普通のデバッグ環境なら、アサーションに引っかかった時に呼び出し元ぐらいはわかる仕組みはある。
デバッガの下にない時でも、Unix なら core, Windows ならデバッガのオンデマンド起動で呼び出し元がわかるはず。
組込みなんかのやや特殊な場合は、abort() とかでスタックダンプするとかが必要かもしれない。

と言うか、これぐらい理解してないとデバッグできないでしょ ?

243 :デフォルトの名無しさん:02/12/10 02:24
>>240
135の主張をくつがえす充分な論拠をあなたは提供していないと
思います。アサーションを入れる場所にもよると思うけど、
私は数十%も速度が変わるとは思えない。せいぜい10%以下でしょう。

たとえ数十%速くなったとしても、アサーションが無い場合に
エラーであることさえ気づかず黙って誤動作するソフトにしてしまう
(そしてそのバグが永久に発見されない)ような品質の低下が、
その数十%に見合うとは思えない。

244 :デフォルトの名無しさん:02/12/10 02:25
>>241
Win は、アサーションした時に「デバッグするか ?」と聞かれるから、「はい」と答えると VC++ が起動して、それでデバッグする。
(>>242 のオンデマンド起動)

245 :デフォルトの名無しさん:02/12/10 02:25
>>240
アサーションの速度差なんて、体感できないと思う。

246 :デフォルトの名無しさん:02/12/10 02:26
>>244
うーん。じゃあ客先環境にもVC++をインストールしといて、
「はい」と答えてもらうの?

247 :デフォルトの名無しさん:02/12/10 02:27
>>243
概ね同意するが、

> (そしてそのバグが永久に発見されない)ような品質の低下

これには同意できない。あと、

> その数十%に見合うとは思えない。

ゲームアプリの場合は、0.1 % でも重要な事が多い。

248 :デフォルトの名無しさん:02/12/10 02:27
>>243
それは、難しい問題。
逆にアサーションがぼこぼこ出るようなソフトウェアが今後売れるとも思えない。
永久に発見されないバグは、問題無しと考えこともできるよ。

249 :デフォルトの名無しさん:02/12/10 02:28
>>246
その時は、DrWatson を使えばよろし。

250 :名無しさん@XEmacs:02/12/10 02:29
>>243
上にも書いたとおり、製品版のソフトにassertで捉えられるバグなんて
ほとんど残ってない(ようにしとかないといけない)わけで、それ以外の
バグの方が圧倒的に多いから、必ずしもassertを残しといたからって
安全性が上がるってものでもない。
当然速度との兼ね合いはトレードオフの話になるから、速度なんて
どーでもいい製品なら残しといてもいいと思うけどね。

251 :デフォルトの名無しさん:02/12/10 02:29
>>248
ネスケはぼこぼこ出るよね。(QFA)
他のアプリは、アサーションは出ないけど「一般保護例外」が出る(w

252 :デフォルトの名無しさん:02/12/10 02:29
>>246
つーか、客先環境でアサーションが出ること自体が問題かと...。

253 :デフォルトの名無しさん:02/12/10 02:30
速度なんて、ユーザのPCごとにちがうのに、何パーセントだの何だの
あほらしい。

254 :デフォルトの名無しさん:02/12/10 02:30
確かにゲームにバグがあっても顧客のビジネスに影響が
あることは少ないが、ゲームで0.1%が重要なのはごく
一部の描画まわりだけだと思う。


255 :デフォルトの名無しさん:02/12/10 02:33
>>250
>>252
ネスケはぼこぼこ出るよね。
他でも、「不正な処理」が出るソフトってそんなに珍しいか?

また、「assertが入ってればすぐ見つかったのに、
ないために原因が突き止められない不具合」ってのも
あると思うが。

256 :デフォルトの名無しさん:02/12/10 02:33
ゲームで速度要求してるんなら、最低/推奨速度だの表示するだろう
そのスペックで動くモノであれば、文句言われないわけだし

257 :デフォルトの名無しさん:02/12/10 02:36
>>255
> 他でも、「不正な処理」が出るソフトってそんなに珍しいか?

珍しくはないけど、だから良いってわけないだろ。
とりあえず、DrWatson 入ってりゃスタックダンプは取れるから、ライブラリ中でアサーションしても呼び出し元はわかる。

258 :デフォルトの名無しさん:02/12/10 02:37
>>257
いや、だから「アサーション入れとけ」といいたいんだけど。

259 :デフォルトの名無しさん:02/12/10 02:39
入れるか入れないかの判断は、どちらが正しいという事でも無いと思うがな

260 :名無しさん@XEmacs:02/12/10 02:41
まぁassert残しといてバグがあるの客にバレるのが嫌
ってのもあるかもねw

>>254
最近の3Dものとかは計算部分のほうが大きいと思う。

あと、数%くらいで、って言ってる人いるけど、例えば1%でも違えば
100時間稼働したら1時間の違いが出る訳で、重要になってくる
ようなソフトもある。

261 :デフォルトの名無しさん:02/12/10 02:41
ネスケの QFA は、アサーションじゃなくてエラーハンドリングじゃないのか?


262 :デフォルトの名無しさん:02/12/10 02:45
>>260
まさか、時間のかかるループにアサーションしこんで遅くしようと考える人はいないでしょう?
どこに入れるとか、どこに入れてはいけないというくらい、プログラマならわかりますよね。


263 :名無しさん@XEmacs:02/12/10 02:48
>>262
そんなこといちいち考えるんならassertじゃなくて
普通にエラーハンドリングしなさいな。
assert ってリリース時に取り除けるからいいんでしょうが。

264 :デフォルトの名無しさん:02/12/10 02:52
>>261
でも、マクロで実装してるよ。エラーを解決して続行できるわけでもない。
assertと意図は同じ。

265 :デフォルトの名無しさん:02/12/10 03:02
>>264
エラーハンドリングは必ずしも処理を続行させるためのものではない。

266 :デフォルトの名無しさん:02/12/10 03:49
今だ!2ゲットォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
     ∧∧   )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
        ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ

267 :デフォルトの名無しさん:02/12/10 05:50
マジレスすると、1+1 は 2 だぞ。

268 :デフォルトの名無しさん:02/12/10 12:46
んなわけねーだろ

269 :デフォルトの名無しさん:02/12/10 12:47
assert(1+1 == 2);
assert(>>267 == アフォ);

270 :デフォルトの名無しさん:02/12/10 15:47
typedef struct String_tag
{
char *str;
int flag;
}String;
っていうString構造体があったとき、これを配列にして
String String_data[20];ってして
構造体メンバのstrにメモリを割り当てるときどうしたらいいんですか?
自分は
String_data[i].(*str) = malloc(-----)ってやったらgccタンに怒られました。
おねがいします。

271 :デフォルトの名無しさん:02/12/10 15:59
>>270
String_data[i].str = (char*)malloc(バッファサイズ);


272 :デフォルトの名無しさん:02/12/10 17:48
>>270
int *p;
*p = malloc(1);
とかやってそうなコードだな。

273 :教えてください><:02/12/10 18:36
実数を入力し、それぞれ以下のように変換する

小数第3位以下を切り捨てる
小数部のみに変換
小数第2位を四捨五入して小数第1位までに変換
10の位を四捨五入して100の位までに変換

※出力はすべて、printf("%f\n", x)とすること

274 :デフォルトの名無しさん:02/12/10 18:41
>>273
宿題丸ちなげかよ

275 :デフォルトの名無しさん:02/12/10 18:41
>>273
スレ違い

276 :デフォルトの名無しさん:02/12/10 22:30
>>273 の、
「小数部のみに変換」ってどうやるのか分からない。
これは「C言語のこと」として識者諸兄に聞いてみたい。

277 :デフォルトの名無しさん:02/12/10 22:39
>>276
double a = 1.3;
a = a - (long)a;

278 :デフォルトの名無しさん:02/12/10 22:41
http://pc3.2ch.net/test/read.cgi/tech/1038024989/332

279 :デフォルトの名無しさん:02/12/10 22:43
0〜3までの値を取る変数に対して、
0または3を判定する良い方法ないでしょうか?
今こうやってます。
if (n == 0 || n == 3)
ビット演算とか使ったりもっとうまいやりかたがあったら教えてください。

280 :デフォルトの名無しさん:02/12/10 22:46
>>279
そんなもので劇的に処理速度が上がることはないから気にするな。
トリッキーなコード書いてもしかたない。

281 :名無しさん@XEmacs:02/12/10 22:50
>>279
if ( (n&1) ^ (n&2) )

282 :名無しさん@XEmacs:02/12/10 22:50
ネタでミスったので師んできます。

283 :デフォルトの名無しさん:02/12/10 22:51
>>278
だめじゃん、それ

284 :デフォルトの名無しさん:02/12/10 22:51
>>279
if(n*n==3*n)

285 :デフォルトの名無しさん:02/12/10 22:56
比較演算子のみの>>279が一番速いような気がする

286 :デフォルトの名無しさん:02/12/10 22:57
>>284
if(n * (n - 3) == 0)

287 :デフォルトの名無しさん:02/12/10 22:59
if(n&1==n&2)

288 :デフォルトの名無しさん:02/12/10 23:00
>>287
それは駄目だろ。
if ((!!(n&1)) == (!!(n&2)))
か。

289 :sumaso:02/12/10 23:02
if(n&1==n&2>>1)

290 :デフォルトの名無しさん:02/12/10 23:02
ビットパターンが 00 または 11 だから
なんか上手い方法はある気はする。

291 :デフォルトの名無しさん:02/12/10 23:03
if(!(n%3))

292 :デフォルトの名無しさん:02/12/10 23:06
if((9 >> n) & 1)

293 :デフォルトの名無しさん:02/12/10 23:09
>>292
そんなのがいきなりソースに出てきたらなにしてんのか絶対分からんと思う。

294 :デフォルトの名無しさん:02/12/10 23:10
整数なら >>291で良くない?
例には ==0.0など小数で書かれていないし。

295 :デフォルトの名無しさん:02/12/10 23:11
>>292
でもそれうまいね。0と3に限らず、
0〜(intのビット数)の数の任意の組み合わせを
一発でテストできる。


296 :デフォルトの名無しさん:02/12/10 23:13
>>294
性能的にはむしろ退化しているし、なにしているのか直感的に分かりずらい。
結局279がいまんとこ最強だ。

297 :デフォルトの名無しさん:02/12/10 23:13
if((0x09>>n)&1)
なら、さらに察しやすいかな?

298 :279:02/12/10 23:15
すいません。みなさんありがとうございます。
nは整数で、intでもcharでもなんでもいいです。

299 :デフォルトの名無しさん:02/12/10 23:18
>>297
ビットでかけるようになってたらもう少しわかりやすいけどね。
if((0b1001 >> n) & 0b0001)

300 :名無しさん@XEmacs:02/12/10 23:19
>>294
割り算ってめちゃ遅いって聞いたことあるけど。。。
昔の話かな?

301 :デフォルトの名無しさん:02/12/10 23:21
if((int)(n-(3/2.0)))
って、うまく動く?

302 :デフォルトの名無しさん:02/12/10 23:21
加減算に比べれば遅いよ。
乗算は物量をぶち込めば1サイクルでなんとかできるけどナー。

303 :デフォルトの名無しさん:02/12/10 23:23
>>302
いっている意味がよく分かりません。表現を変えてもう一度お願いします。

304 :279:02/12/10 23:23
多分、アセンブラで条件ジャンプが1つになれば
そっちの方が速いんですよね。
>>292のと比較してみます。

305 :デフォルトの名無しさん:02/12/10 23:28
以外と n&1 より n%2 の方が速い。

306 :デフォルトの名無しさん:02/12/10 23:28
>>303

>>302>>300へのレスですた。

307 :デフォルトの名無しさん:02/12/10 23:28
>>305
漢字を間違ってる時点で信用に値しないですが何か?

308 :デフォルトの名無しさん:02/12/10 23:32
実験してないが、計算量を考えると 279 が最も速いように思える。

>>305
大抵の処理系では除算は重いからよろしくナ。

309 :デフォルトの名無しさん:02/12/10 23:33
>>305
なにを根拠に?


310 :デフォルトの名無しさん:02/12/10 23:35
>>308
できれば除算の方が重くない処理系ってのをあげてくれ。

311 :デフォルトの名無しさん:02/12/10 23:35
最適化すると (n%2) == 1 は (n&1) になるだろう。
どっちが速いもクソも…

312 :デフォルトの名無しさん:02/12/10 23:36
>>311
いまさら言い訳ですか?w

313 :279:02/12/10 23:36
まず、アセンブラ出力になおしてみました。
cl -O2 /FAs iftest.c
です。
nは volatile int n = 1;としました。

●if (n == 0 || n == 3)の場合
-----------------------------------
mov  edx, DWORD PTR _n$[esp+12]
test  edx, edx
je  SHORT $L53243
mov  edx, DWORD PTR _n$[esp+12]
cmp  edx, ecx
jne  SHORT $L53240
-----------------------------------

●if ((9 >> n) & 1)の場合
-----------------------------------
mov  edx, 9
mov  cl, BYTE PTR _n$[esp+12]
sar  edx, cl
test   dl, 1
je  SHORT $L53240
-----------------------------------


314 :デフォルトの名無しさん:02/12/10 23:37
>>311
そういう最適化をするコンパイラを上げてくれ

315 :デフォルトの名無しさん:02/12/10 23:37
>>310

>>308は「すべての」と断言はしなかっただけで
意味的には「すべての」と言いたかったものと思われ。

316 :デフォルトの名無しさん:02/12/10 23:39
(´-`).。oO(なんで volatile 付ける必要があるんだろう。。。?)

317 :279:02/12/10 23:40
なんかうちの環境(Win98)だとバラツキがあって
よくわからなかったので、テストソース載せておきます。

/*cl -O2 iftest.c winmm.lib */
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#pragma comment(lib, "winmm")

int main() {
  int i;
  int c = timeGetTime();
  volatile int n = 1;
  for (i = 0; i < 40000000; i++) {
#if 0 // 1
    if ((9 >> n) & 1)
      n = n;
#else
    if (n == 0 || n == 3)
      n = n;
#endif
  }
  printf("%d msec\n", timeGetTime() - c);
  return 0;
}


318 :279:02/12/10 23:41
>>316
最適化で消えてしまうので・・
なにか良い方法があったらおねがいします。

319 :デフォルトの名無しさん:02/12/10 23:41
>>313
その2つはあきらかに後者の方がはやい。
でも直感的になにをしているかが分かるのは前者。
後者を使うのならコメントは必須。

320 :311:02/12/10 23:43
>最適化すると (n%2) == 1 は (n&1) になるだろう。

昔っからたいていのコンパイラはこの最適化をやってる。
strength reductionというやつだ。実際、今試したら
gcc 2.95.3でも if (n % 2) は
testb $1,8(%ebp)
je .L4
というコードになった。

ちなみに俺は305ではない。

321 :デフォルトの名無しさん:02/12/10 23:44
>>318
ifの後の処理をn = n + 1とかもうちょっと意味のあることをすればきえないだろ。
n=nならあきらかに無駄な処理と判断して省かれるのはしかたがない。

322 :デフォルトの名無しさん:02/12/10 23:44
>>318
別の関数にすれば良いんだよ。


323 :デフォルトの名無しさん:02/12/10 23:45
>>317
PentiumIII-800MHz、VC6 で、
単純比較: 平均 350
ビット演算: 平均 400

324 :311:02/12/10 23:45
あ、ちなみに俺は「一般には割り算のほうが遅い」というのは
理解してるからな。よろしく。


325 :デフォルトの名無しさん:02/12/10 23:46
ちなみに俺も305ではない

326 :305:02/12/10 23:46
今、実際に試したら全然遅かったです。ごめんちゃい。
昔それで驚いたことがあったのですが、勘違いだったみたいです。

327 :デフォルトの名無しさん:02/12/10 23:47
311 がどう思っているかとかじゃなくて、305 の根拠が知りたいんだが。

>>318
それでも最適化で消える。

328 :327:02/12/10 23:48
> それでも最適化で消える。

すまん、これは 322 宛て。

329 :デフォルトの名無しさん:02/12/10 23:48
>>323
ちなみになにが350でなにが400なんだ?
クロック数か?
最適化されているのか?
VCは最適化しないと&の命令をちゃんと使ってくれないぞ。

330 :デフォルトの名無しさん:02/12/10 23:48
あ、よかった、解決した。

331 :デフォルトの名無しさん:02/12/10 23:48
消えたらマズくない?volatile だっつってんのに?

332 :デフォルトの名無しさん:02/12/10 23:49
n==0 || n==3みたいに2つの比較だけなら単純比較でよいだろ。
もっと多いなら >>292 が良さげ。
要するにPascalのset型を自分でやるテクだね。

333 :デフォルトの名無しさん:02/12/10 23:50
>>329
何がって、

> 単純比較: 平均 350
> ビット演算: 平均 400

ちゃんと書いておろうが。
何の数字かという意味なら、317 のソースの通り。(ミリ秒)

334 :デフォルトの名無しさん:02/12/10 23:50
これでまた一歩・・・

335 :デフォルトの名無しさん:02/12/10 23:50
volatile にしない方法を議論してるのに...、乗り遅れたな。>>331

336 :デフォルトの名無しさん:02/12/10 23:51
>>327
おいおい。
void foo(int n)
{
if ((9 >> n) & 1)
...}

これでどうやって最適化で消えるんだ?
nに値を与えてないのに。

337 :279:02/12/10 23:51
n = n+ 1にして測ってみたんですが、
結局差は良くわかりませんでした・・。
if (n==0 || n==3)
は、n==0が多い場合に速いのかな。


338 :デフォルトの名無しさん:02/12/10 23:51
> VCは最適化しないと&の命令をちゃんと使ってくれないぞ。

どゆこと?

339 :デフォルトの名無しさん:02/12/10 23:52
>>336
インライン展開したのち、無駄な処理と判断して消えて無くなる。

340 :デフォルトの名無しさん:02/12/10 23:53
>>339
別ファイルにして分割コンパイルすりゃいいだろ。
そこまで説明しないとわからんか。

341 :デフォルトの名無しさん:02/12/10 23:54
>>337
> if (n==0 || n==3)
> は、n==0が多い場合に速いのかな。

これは、正しい。詳細は短絡評価でググルべし。

342 :デフォルトの名無しさん:02/12/10 23:54
>>339
それはおかしい。
呼び出している箇所ではインライン展開されるかもしれんが、
staticでないfooという関数自体のコードは残るだろう。
そうでないと、あとで他のファイルからfooが呼び出されたらどうする?


343 :デフォルトの名無しさん:02/12/10 23:55
>>340
そんな面倒な事するくらいなら、比較前の n に rand() を代入する方を選ぶ。

344 :デフォルトの名無しさん:02/12/10 23:55
>>318
n自体をvolatileにせずに、別のvolatile変数に代入すりゃいいだろ。

345 :デフォルトの名無しさん:02/12/10 23:55
>>339はためしもせずに適当なことを言っている。

346 :デフォルトの名無しさん:02/12/10 23:55
首ククルべし

347 :デフォルトの名無しさん:02/12/10 23:57
>>342
オブジェクトファイルには foo の実体が書き出される。
ただし、それは main から呼ばれれていない。

348 :デフォルトの名無しさん:02/12/10 23:58
>>343
fooのコードが消えてなくなるコンパイラが存在するのか?
証拠きぼん

349 :デフォルトの名無しさん:02/12/10 23:58
>>347
それがどうした。
あたりまえだろ。

350 :デフォルトの名無しさん:02/12/10 23:59
>>347
問題ないだろ。
見たいのはfooのコードなんだから。
で、どうだったよ?

351 :デフォルトの名無しさん:02/12/10 23:59
>>348
あんたは証拠があればすべて信じるのか?

352 :デフォルトの名無しさん:02/12/11 00:00
(´-`).。oO(アフォに限って素直に謝ろうとしないのなんでだろう?)

353 :デフォルトの名無しさん:02/12/11 00:02
>>350
わからん奴やな。
foo が呼ばれないからテストにならないんだってば。

354 :デフォルトの名無しさん:02/12/11 00:02
>>351
そうは言ってない。
* * お 前 の 言 う こ と は 証 拠 無 し で は
    信 じ ら れ ん * *
といっている。

355 :デフォルトの名無しさん:02/12/11 00:02
>>348
> fooのコードが消えてなくなる
343 のどこにそんな事が書いてある?

356 :デフォルトの名無しさん:02/12/11 00:03
>>353
わからんやっちゃな。
分割コンパイルすれば簡単にテストできるだろうが。
まあ、やり方知らないらしいから、しょうがないか。

357 :デフォルトの名無しさん:02/12/11 00:04
>>354
そんなこと言っていないだろ。
どこで言ったんだ?

358 :デフォルトの名無しさん:02/12/11 00:04
>>355

>>343が参照している>>340が参照している>>339に書いてある。

359 :デフォルトの名無しさん:02/12/11 00:05
おまいら、もちつけ

     /\⌒ヽペタン
   /  /⌒)ノ ペタン
  ∧_∧ \ (( ∧_∧
 (; ´Д`))' ))(・∀・ ;)
 /  ⌒ノ ( ⌒ヽ⊂⌒ヽ
.(O   ノ ) ̄ ̄ ̄()__   )
 )_)_) (;;;;;;;;;;;;;;;;;;;)(_(

360 :デフォルトの名無しさん:02/12/11 00:05
>>358
あんた、ひまそうでいいですね。

361 :デフォルトの名無しさん:02/12/11 00:06

         ∧_∧
        ( ´∀`) バッチ来いや
        /,   つ
       (_(_, )
         しし'

362 :デフォルトの名無しさん:02/12/11 00:06
>>360
逃げた(w

363 :デフォルトの名無しさん:02/12/11 00:06
>>358
その事か。
それは 347 の意味だ。

364 :デフォルトの名無しさん:02/12/11 00:07
>>363
逃げた(w
それのどこが「消えてなくなる」だYo!

365 :デフォルトの名無しさん:02/12/11 00:07
何か、344 が一番よさそうだな。
rand() 呼ぶのもコストかかるし。

366 :279:02/12/11 00:08
/*cl -O2 -DSHIFT iftest.c /Feiftestsh.exe winmm.lib
cl -O2 iftest.c /Feiftestnd.exe winmm.lib */
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "winmm")
int main() {
  int i, c = timeGetTime(), n = 0;
  srand(0);
  for (i = 0; i < 400000000; i++) {
#ifdef SHIFT
    if ((9 >> n) & 1)
      n = rand();
#else
    if (n == 0 || n == 3)
      n = rand();
#endif
    n = rand();
  }
  printf("%d msec\n", timeGetTime() - c);
  return 0;
}

367 :279:02/12/11 00:08
これでテストした結果、

●シフトを使った版
>iftestsh
5917 msec

●||を使った版
>iftestnd
5425 msec
でした。
誤差は+-80msecのぐらいです。
下手に小細工しない方が速いのかな・・


368 :デフォルトの名無しさん:02/12/11 00:08
>>364
謝ればいいのか?

   ご め ん ( ̄ー ̄)

369 :デフォルトの名無しさん:02/12/11 00:09
Strength reductionも知らずにC言語のことは聞けとかほざく
知ったかさんが集まるスレはここでつか?

370 :デフォルトの名無しさん:02/12/11 00:09
>>366
rand()のベンチマークか?

371 :デフォルトの名無しさん:02/12/11 00:10
>>369
プ

372 :デフォルトの名無しさん:02/12/11 00:10
>>365
volatileにしない場合と同じ結果だとなぜわかる?

373 :デフォルトの名無しさん:02/12/11 00:11
>>369
(゚Д゚)ハァ?

374 :デフォルトの名無しさん:02/12/11 00:11
>>367
シフトしてANDして比較する、

比較して ジャンプ または 比較して ジャンプだからね。

375 :デフォルトの名無しさん:02/12/11 00:11
あのなー、キミらconstant foldingくらいは理解して
書いてるんだろうな。

376 :デフォルトの名無しさん:02/12/11 00:12
>>372
n は非 volatile で、比較に使われるのは n だろ。
違くなる可能性があるとしたらどういう場合だ?

377 :デフォルトの名無しさん:02/12/11 00:13
きみらは日本語を理解して書き込んだいるんだろうな?

378 :デフォルトの名無しさん:02/12/11 00:14
> 書き込んだいるんだろうな

理解できません。

379 :デフォルトの名無しさん:02/12/11 00:14
結論:if(!(n%3))が括弧(・∀・)ノイイ

380 :デフォルトの名無しさん:02/12/11 00:15
338 がわかる奴、誰かいないか?

381 :デフォルトの名無しさん:02/12/11 00:15
>>379
氏ね。

382 :デフォルトの名無しさん:02/12/11 00:15
>>379
かわいそうに。自分で考えたのを誰も評価してくれなかったから自分で宣伝ですか?
あなたの努力は評価しますよ。次を期待しています。

383 :279:02/12/11 00:16
あ、すいません間違えました。
n = rand();
のところを0〜3になる様に
n = rand()%4;
としたら、結果が変わりました。

>iftestnd
12055 msec

>iftestsh
11238 msec
です。数回測った誤差は+-80msecです。
やっぱりシフトの方が速い?

384 :デフォルトの名無しさん:02/12/11 00:16
>>375
その言葉は今知ったが、要は rand() で OK という話だろ?

385 :デフォルトの名無しさん:02/12/11 00:19
>>383
9 >> 132983891
とかやってたのか。

386 :デフォルトの名無しさん:02/12/11 00:19
>>383
漏れは、

>iftestnd
660 msec

>iftestsh
680 msec

やっぱり単純比較の方が速いよ。

387 :デフォルトの名無しさん:02/12/11 00:21
すまん、ループカウンタが増えてたのね。でも、

>iftestnd
6507 msec

>iftestsh
6861 msec

やっぱ変わらないよ。

388 :デフォルトの名無しさん:02/12/11 00:22
>>386
同じことを100万回繰り返して平均をとりなさい。

389 :デフォルトの名無しさん:02/12/11 00:23
>>388
おまいがやれ。

390 :279:02/12/11 00:23
>>379
それも測りましたが、遅いみたいです。

●if(!(n%3))の場合
>iftestmo
24078 msec

391 :デフォルトの名無しさん:02/12/11 00:25
結局、効果があるかどうか分からないから、読みやすい単純比較の方がいいという事だろ。
比較数が多くなってきたら、switch にすればテーブル化してくれる事が期待できる。

392 :279:02/12/11 00:27
>>387
もういちど試しましたが、
うちでは結果は変わりませんでした。

>iftestmo
24078 msec

>iftestsh
11232 msec

>iftestnd
12004 msec

393 :デフォルトの名無しさん:02/12/11 00:27
Pascalなら
if n in [0, 3] then ....
でいいよね。

Modula2のBITSET型もそんなんじゃなかったっけ。
CでBITSETを実現するマクロって書けるかな。

394 :279:02/12/11 00:28
ちなみにPen!!!-1Ghz(997Mhz)です。

395 :デフォルトの名無しさん:02/12/11 00:31
>>392
こうなった。gcc 2.95.3, Celeron 500MHz
$ ./iftestnd
9335664 usec
$ ./iftestsh
6483787 usec

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

#ifdef SHIFT
#define COND(n) ((9 >> n) & 1)
#else
#define COND(n) (n == 0 || n == 3)
#endif

int main()
{
  int i, n;
  volatile v;
  struct timeval s, e;
  gettimeofday(&s, NULL);
  for (i = 0; i < 400000000; i++) {
    n = i % 4;
    if (COND(n)) v = i;
  }
  gettimeofday(&e, NULL);
  printf("%ld usec\n", (e.tv_sec - s.tv_sec) * 1000000 + e.tv_usec - s.tv_usec);
  return 0;
}


396 :デフォルトの名無しさん:02/12/11 00:32
取りあえずなんちゃってベンチマーク。

1: 1188[ms]: 50000000, 50000000: n == 0 || n == 3
2: 1250[ms]: 75000000, 25000000: (n & 1) ^ (n & 2)
3: 1750[ms]: 50000000, 50000000: n * n == 3 * n
4: 1546[ms]: 50000000, 50000000: n * (n - 3) == 0
5: 1500[ms]: 25000000, 75000000: (n & 1) == (n & 2)
6: 1672[ms]: 50000000, 50000000: (!!(n & 1)) == (!!(n & 2))
7: 1719[ms]: 50000000, 50000000: (n & 1) == (n & 2) >> 1
8: 10344[ms]: 50000000, 50000000: !(n % 3)
9: 1500[ms]: 50000000, 50000000: (9 >> n) & 1
10: 1250[ms]: 50000000, 50000000: t[n]
11: 22734[ms]: 50000000, 50000000: (int)(n - (3 / 2.0))

10 の t[n] の t は、static const t[] = {1, 0, 0, 1}; となっている。
n は、ループカウンタの下位2ビット。
ループ回数は 100,000,000 回。
Pentium-II 400MHz + Windows2000 (SP3) + VC6: 最適化 = 実行速度。

やはり、素直な 1 が早い。割り算使う 8 と、浮動小数点演算を行う 11 を除いて、まあ似たり寄ったりだな。

397 :395:02/12/11 00:32
gccだと-DSHIFTのときにはbt命令を使うので、比較分岐を二回繰り返すよりも
速いようだ。


398 :デフォルトの名無しさん:02/12/11 00:34
>>393
bitset_t make_empty_bitset(size_t set_size);
bitset_t bitset_union(bitset_t, bitset_t);
bitset_t bitset_add(bitset_t, unsigned);
bool bitset_member(bitset_t, unsigned);
とか?

fd_setとかsigset_tとか、あちこちで似たようなのが出てくるから、
あっても良いかもね。

399 :デフォルトの名無しさん:02/12/11 00:34
>>396
ソースはこちら。

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm")

#define Test(Expression) \
 nTrue = 0; \
 nFalse = 0; \
 Start = timeGetTime(); \
 for(Loop = 0; Loop < Max; Loop++){ \
  int n = Loop & 3; \
  if(Expression){ \
   nTrue++; \
  } else { \
   nFalse++; \
  } \
 } \
 printf("%d[ms]: %d, %d: %s\n", timeGetTime() - Start, nTrue, nFalse, #Expression);
}

400 :デフォルトの名無しさん:02/12/11 00:35
>>399
続き...

int main(void)
{
 static const int Max = 100000000;
 int Start;
 int nTrue;
 int nFalse;
 int Loop;

 Test(n == 0 || n == 3);
 Test((n & 1) ^ (n & 2));
 Test(n * n == 3 * n);
 Test(n * (n - 3) == 0);
 Test((n & 1) == (n & 2));
 Test((!!(n & 1)) == (!!(n & 2)));
 Test((n & 1) == (n & 2) >> 1);
 Test(!(n % 3));
 Test((9 >> n) & 1);
 static const int t[] = {1, 0, 0, 1};
 Test(t[n]);
 Test((int)(n - (3 / 2.0)));

 _getch();
 return 0;
}

401 :デフォルトの名無しさん:02/12/11 00:48
じゃあ、たぶん、比較する数が3以上だとやっぱり
bitsetが速そうだな。

402 :279:02/12/11 00:49
ありがとうございます。
環境やコンパイラによってもだいぶ違うみたいですね。
色々と勉強になりました。

403 :デフォルトの名無しさん:02/12/11 00:58
329 の

> VCは最適化しないと&の命令をちゃんと使ってくれないぞ。

が意味わからないし、気になるんだが、誰か解説してくれないか?

404 :デフォルトの名無しさん:02/12/11 00:59
一旦CM入りまーす


405 :デフォルトの名無しさん:02/12/11 01:02
悩んでいる問題があります。

複数の番号のばらばらな順列を線形リストを使って並べ替えする
処理を考えています。

例えば8ビットカウンタなら
   253、254、255、0、1、2
と来たものはこの順番で格納したいのですが、
   250、251、253、252、254、
と来たものは昇順に、
   250、251、252、253、254
としたいのです。
前者と後者を区別するスマートな方法って無いでしょうかね?


406 :デフォルトの名無しさん:02/12/11 01:06
>>405
日本語が良く分からない。

どういうデータが渡されて、出力は何?

407 :デフォルトの名無しさん:02/12/11 01:08
>>405
0, 1, 3, ... , 254, 255, 2

とか

254, 0, 1, ... 255

とか来たら、どう並んで欲しいの ?

408 :デフォルトの名無しさん:02/12/11 01:08
>>405
250、251、253、252、254、0、1、2

と来たらどうしたいんだ?

409 :デフォルトの名無しさん:02/12/11 01:09
つーかまず、「来る」 とはどういう状態か定義してくれ。

410 :デフォルトの名無しさん:02/12/11 01:11
>>405
自前の評価関数で255<0を真とするようなの作ればいいんでは?
ループさせるなら区別する必要ないし
させないならソートの基準が曖昧

411 :デフォルトの名無しさん:02/12/11 01:11
>>405
if ( left>right+128 ) return leftよりrightの方が大きい(事にする)
else return leftとrightの比較結果そのまま

412 :デフォルトの名無しさん:02/12/11 01:14
誰か!!「日本語のことは<1>」立てろ!!

413 :デフォルトの名無しさん:02/12/11 01:14
サンプルは必ず。
A : max-min=サンプル数+1 
なの
必ずAなら255と0があればそれなりの処理をする。
そうでなければ、ちと情報がたりないな。

414 :413:02/12/11 01:16
馬鹿言った逝ってくる。

415 :デフォルトの名無しさん:02/12/11 01:17
>>405
リングバッファを使うのは?

416 :405:02/12/11 01:17
あぁ日本語が…(鬱

具体例の方が手っ取りはヤイでしょうから、、、

やりたいのは
>>407さんの例でいうと
0, 1, 3, ... , 254, 255, 2
ときたら、この通り

254, 0, 1, ... 255
ときてもこの通り、

>>408
250、251、253、252、254、0、1、2
ときたら、
250, 251, 252, 253, 254, 0, 1, 2
となって欲しい






417 :デフォルトの名無しさん:02/12/11 01:21
>>416
すまん…、分からない。

418 :デフォルトの名無しさん:02/12/11 01:21
一番大きい数と一番小さい数の境目がどういう基準で選ばれるのか
よくわからん
漏れもリングバッファで済む問題だと思った

419 :デフォルトの名無しさん:02/12/11 01:23
>>416
もっと解らなくなってきたぞ。
4、16、0、32、255、2、128、64、128、1
ときたらどうなるの

420 :デフォルトの名無しさん:02/12/11 01:24
手っ取りは(・∀・)ヤイ!

421 :デフォルトの名無しさん:02/12/11 01:27
>>416
つまり、411 の方法でいいんじゃないのか?

422 :419:02/12/11 01:28
4、16、0、32、255、2、64、128、1
ね。
あと0の無いバージョンも追加。
4、16、32、255、2、64、128、1

423 :デフォルトの名無しさん:02/12/11 01:29
わからン…
254, 0, 255, 1
だとどうなるんだ?

424 :405:02/12/11 01:30
はい。
いまレスを読んでいるのですが、どうも>>411さんがやりたい事に一番合致
するようです。これをもとにもうちょっと考えて見ます。その前に日本語勉強してきます。

425 :デフォルトの名無しさん:02/12/11 01:33
しかし

127 0 255 128 1 254

とか来たらどうするのかさっぱりわからんぞ


426 :デフォルトの名無しさん:02/12/11 01:34
扱ってるデータがパケットとかじゃないことを祈っておこう

427 :デフォルトの名無しさん:02/12/11 01:35
128を法としたりしたいのか?

428 :デフォルトの名無しさん:02/12/11 01:43
個人的には>>410の方法が一番手っ取り早くて確実だと思う。
カウンタが一周した後の0は同じ0でも違う0だと評価できるような関数を作る。


429 :これでいいんじゃ?:02/12/11 01:48
if( n[i]%256 == (n[i+1]+1)%256 )
{
int tmp=left;
left=right;
right=tmp;
}

430 :429:02/12/11 01:50
ゴメン直前に、中途半端に
書き換えちゃった。
left=>n[i]
right=>n[i+1]
としておいて。


431 :デフォルトの名無しさん:02/12/11 01:52
>>279
亀レス & 処理系依存だけど x86系なら
( ( n - 1 ) & ( n - 4 ) )

432 :デフォルトの名無しさん:02/12/11 01:55
>>431
それ、遅そうに見えるけど。

433 :デフォルトの名無しさん:02/12/11 01:55
あ!
ドピュッ
スマン逝ってしまった・・・

434 :デフォルトの名無しさん:02/12/11 01:59
>>431
それなら
!((n-1)&(n-2))
のほうが分かりやすくないか?

435 :デフォルトの名無しさん:02/12/11 02:02
>>434
(゚Д゚)ハァ?

436 :デフォルトの名無しさん:02/12/11 02:02
n-2 の正体をあばけ!!

437 :デフォルトの名無しさん:02/12/11 02:07
西へ進む >>481
東へ進む >>556

438 :431:02/12/11 02:08
>>432
CLを使ったシフトよりは良いと思ったけど
レジスタの使う数が増えるから、その可能性も…

439 :431:02/12/11 02:13
ちゃんとレスを全部読んで無かったけど
>>396
(n & 1) ^ (n & 2)
の方が良かったね…

440 :デフォルトの名無しさん:02/12/11 02:17
>>279
#include <stdio.h>
typedef void (*Func)(void);
void a(void){puts("a");}
void b(void){puts("b");}
void c(void){puts("c");}
void d(void){puts("d");}
Func func[] = {a, b, c, d};
int main(void)
{
int n;
scanf("%d", &n);
func[n&3]();
return 0;
}
ifじゃなくて関数ポインタで処理を分けるっていうのはどう?

441 :デフォルトの名無しさん:02/12/11 02:18
>>439
それ、駄目ジャン。

442 :431:02/12/11 02:19
って>>396じゃ駄目駄目じゃん…
首吊ってきます

443 :デフォルトの名無しさん:02/12/11 02:31
>>440
そんな事するくらいなら switch 使え。
第一、それで異常値に対応できるのか?

444 :デフォルトの名無しさん:02/12/11 02:33
ポテトチップスは結局うすしおが一番なんだよ。

445 :デフォルトの名無しさん:02/12/11 02:34
442じゃ無いが
他のコードでも異常値に対応してないと思うが?

446 :440:02/12/11 02:40
>>443
まあ少なくとも0から3の値以外の配列要素にはアクセスはしない。
それに、俺はただアイディアを出しただけだ。


447 :デフォルトの名無しさん:02/12/11 02:45
0〜3以外の値が絶対来ないと家庭して、1bit目と2bitのANDとEXORをとり、
それらのORをとる。

448 :デフォルトの名無しさん:02/12/11 02:46
なんだキチガイか。

449 :デフォルトの名無しさん:02/12/11 02:47
>>445
一番シンプルな n == 0 || n == 3 は対応してますが何か?

450 :デフォルトの名無しさん:02/12/11 02:48
>>447
式に汁

451 :デフォルトの名無しさん:02/12/11 02:49
>>449
nが0か3のとき?
0〜3じゃないの?

452 :デフォルトの名無しさん:02/12/11 02:52
異常値は4以上だろ?
それを判定してないのに
何で、それで対応した事になるんだ?
正常に動く事と、異常だけど動く事は別だろ?

453 :デフォルトの名無しさん:02/12/11 02:56
>>453
(゚Д゚)ハァ?
n == 0 || n == 3 以外の場合に動いてしまっていいとでも言うのか?

454 :デフォルトの名無しさん:02/12/11 02:56
>>452
一理あるけど279さんはそこまで求めていないような・・・

455 :デフォルトの名無しさん:02/12/11 02:58
みんな、n==0||n==3って書いてるけど、n>=0&&n<=3じゃないの?

456 :デフォルトの名無しさん:02/12/11 03:01
>>455
何を根拠に。

457 :デフォルトの名無しさん:02/12/11 03:01
>>455
違うだろ。

458 :455:02/12/11 03:02
ごめん・・・俺の読み違い・・・

459 :デフォルトの名無しさん:02/12/11 03:08
>>453
nが0以上3以下って前提があるのに
それ以外の数を与えた場合は結果は当然不定に決まってるだろ?

460 :デフォルトの名無しさん:02/12/11 03:08
>>459
安全側に倒すという事を覚えような。

461 :デフォルトの名無しさん:02/12/11 03:11
どこにも n=1、2 の側の方が安全だとは書いてないな。

462 :デフォルトの名無しさん:02/12/11 03:13
>>460
異常な数が与えられた時に
正常に動いて見える事が安全なのか?

463 :デフォルトの名無しさん:02/12/11 03:13
問題の前提条件を疑ったってしょうがないと思うが…
まあ、飽きてネタを振ってるつもりなんだろうが。

464 :デフォルトの名無しさん:02/12/11 03:13
ざっと流し読みしただけだけど、>>279 の一連のやつは
>>292 が秀逸だね
まぁすこしインチキっぽい気がしないでもないけど。

  int table[]={1,0,0,1};

  if( table[n] )

というのもありなのかな。ガイシュツならスマヌ


465 :デフォルトの名無しさん:02/12/11 03:14
>>461
確かにそんな事はわからないが、異常値を 「if が成り立たない側」 つまり処理を
しない側に持っていく方が安全である事が多い。

466 :デフォルトの名無しさん:02/12/11 03:15
やはりキチガイだったか。

467 :デフォルトの名無しさん:02/12/11 03:16
>>464
がいしゅつ。
>>396

468 :デフォルトの名無しさん:02/12/11 03:17
>>465
テキトウなコードを書いていただけません?

469 :デフォルトの名無しさん:02/12/11 03:17
>>465
elseもあったら?

470 :デフォルトの名無しさん:02/12/11 03:18
>>468
テキセツなコードを書いてもらえません?

471 :デフォルトの名無しさん:02/12/11 03:19
>>468
>>271

>>469
その場合はどちらとも言えない。

472 :471:02/12/11 03:20
> 271
ごめん、>>279 の間違い。


473 :デフォルトの名無しさん:02/12/11 03:26
>>467
やはりそうだったか・・・
>>396 で10が1より遅いというのはどうかと思うが、まぁいいや

474 :デフォルトの名無しさん:02/12/11 03:28
>>473
間接アドレッシングがどうして速いと思うんだ?

475 :デフォルトの名無しさん:02/12/11 03:30
はっくしょん!!

476 :デフォルトの名無しさん:02/12/11 03:30
http://senmen.tripod.co.jp/swf/mona/puha.swf?inputStr=%82%CD%82%C1%82%AD%82%B5%82%E5%82%F1%21%21

477 :デフォルトの名無しさん:02/12/11 03:31
>>473
分岐予測が良かったんでないの?

478 :デフォルトの名無しさん:02/12/11 03:32
>>279のはC前提みたいだけど、
アセンブラで書くと速くなる事ってない?

479 :デフォルトの名無しさん:02/12/11 03:33
>>474
キャッシュにヒットすれば速いでしょう
まあ、ヒットしなければ、とても遅いが…

480 :デフォルトの名無しさん:02/12/11 03:33
まぁないだろうな

481 :デフォルトの名無しさん:02/12/11 03:33
>>478
このスレを何だと思ってるんですか?

482 :デフォルトの名無しさん:02/12/11 03:35
>>481
何とも思ってませんが何か?

483 :デフォルトの名無しさん:02/12/11 03:36
>>478
どうして速くなると思うんだ?

484 :デフォルトの名無しさん:02/12/11 03:37
>>479
キャッシュとは言え、値をレジスタに拾う n==0 || n==3 より速い訳がなかろう。

485 :デフォルトの名無しさん:02/12/11 03:37
この中でプロの方はいらっしゃいます?

486 :デフォルトの名無しさん:02/12/11 03:38
(((unsigned int)n-1)>1)
はどうだ?


487 :478:02/12/11 03:38
>483
C言語で直接使えない命令が、
アセンブラにあったりするかもしれないと思ったんで。
(MMXの飽和加算とか。)

488 :デフォルトの名無しさん:02/12/11 03:41
>>483
特殊なCPUでnが3か0の時に真であると判定する
命令があれば速くなる

489 :デフォルトの名無しさん:02/12/11 03:42
>>485
その質問には答えられません。

490 :デフォルトの名無しさん:02/12/11 03:43
>>486
ひょっとして神出現?

491 :デフォルトの名無しさん:02/12/11 03:43
>>487-488
なるほど。もっともだ。


で、あるの?

492 :デフォルトの名無しさん:02/12/11 03:43
>>490
(゚Д゚)ハァ?

493 :デフォルトの名無しさん:02/12/11 03:44
>>486
よさそうだな。

494 :デフォルトの名無しさん:02/12/11 03:49
>>486
おお、明らかに速そうですな。
んで、うちの環境でテストしてみたら、

>>279
iftestnd 1904 msec
>>292
iftestsh 1828 msec
>>486
iftestun 1747 msec
でした。
結構差が出た。

495 :デフォルトの名無しさん:02/12/11 03:50
(n == 0 || n == 3)
  test  esi, esi
  je   SHORT $L53243
  cmp  esi, 3
  jne  SHORT $L53242

((9 >> n) & 1)
  mov  eax, 9
  mov  ecx, esi
  sar  eax, cl
  test  al, 1
  je   SHORT $L53242

(((unsigned)n-1)>1)
  dec  esi
  cmp  esi, 1
  jbe  SHORT $L53243

496 :デフォルトの名無しさん:02/12/11 03:50
>>491
普通に考えたらないがフラグに直接代入すれば
動くCPUもあるかもしれない (←適当)

497 :デフォルトの名無しさん:02/12/11 03:52
(n & (n>>1))

498 :デフォルトの名無しさん:02/12/11 03:53
載せ忘れ。

if( table[n] )
  mov   eax, DWORD PTR _table$[esp+esi*4+32]
  test  eax, eax
  je   SHORT $L53243

命令数は少ないが、この mov は実はやたら遅い。

499 :デフォルトの名無しさん:02/12/11 03:54
>>497
n==0の場合動作しない。

500 :デフォルトの名無しさん:02/12/11 03:54
>>497
n == 0 は?

501 :デフォルトの名無しさん:02/12/11 03:54
ケコーン

502 :デフォルトの名無しさん:02/12/11 03:55
>>496
「かも知れない」 じゃなくて、あるかどうか訊いているんだが。

503 :デフォルトの名無しさん:02/12/11 03:55
>>497
駄目じゃん

504 :デフォルトの名無しさん:02/12/11 03:55
!(n ^ (n>>1))

505 :デフォルトの名無しさん:02/12/11 03:57
>>502
ここはCのスレ

506 :デフォルトの名無しさん:02/12/11 03:57
>>504
(゚Д゚)ハァ?
n==3 以外の時全部誤動作するぞ。

507 :506:02/12/11 03:58
あ、頭に ! 付いてるか。
でも、やっぱり n==3 の時誤動作するぞ。

508 :デフォルトの名無しさん:02/12/11 03:59
>>507
ナ ゼ ?

509 :デフォルトの名無しさん:02/12/11 04:00
>>496
は神ということで宜しいですか?

510 :デフォルトの名無しさん:02/12/11 04:00
つーか、(((unsigned)n-1)>1) で dec しかしてない訳だから、それを超えるのは
難しいだろう。

511 :デフォルトの名無しさん:02/12/11 04:00
>>496じゃない、>>486でした。

512 :デフォルトの名無しさん:02/12/11 04:01
カミュ

513 :デフォルトの名無しさん:02/12/11 04:01
すごいね。unsignedにするなんて思いつかんかった。

514 :デフォルトの名無しさん:02/12/11 04:02
>>508
アフォですか?

515 :デフォルトの名無しさん:02/12/11 04:03
>>514
ヴァカです。

516 :デフォルトの名無しさん:02/12/11 04:03
素直に褒め称えよう。

517 :デフォルトの名無しさん:02/12/11 04:03
ブラボー!!

518 :デフォルトの名無しさん:02/12/11 04:12
このスレはめでたく終了いたしました。

519 :デフォルトの名無しさん:02/12/11 04:33
いやしかし、bitsetライブラリはあると便利だと思うんだが、まじで。

520 :デフォルトの名無しさん:02/12/11 05:13
誤爆ですか?

521 :デフォルトの名無しさん:02/12/11 15:20
質問
Cで書いたユーザーのプログラムはなぜmain()から実行が始まるのですか?

522 :デフォルトの名無しさん:02/12/11 15:31
そこにmain()があるから

523 :デフォルトの名無しさん:02/12/11 15:39
ボトムアップ トップダウン

524 :デフォルトの名無しさん:02/12/11 16:59
もうひとつのスレで 「main()からはじまるとは限らない」 とか書いている香具師が
いるな。
突っ込むべきか突っ込むべきでないか・・・。

525 :デフォルトの名無しさん:02/12/11 17:29
>>521
ホスト環境の場合,リンクするときに実行開始点を指定せねばならない
オマエは大事な仕事を忘れてるのに翻訳環境に助けられていて気がついていないのだ
実行開始点をmainと指定すればmainから始まる,それだけのことだ
実際にはstartupが実行開始点になっていてstartupがmainを呼び出すようになっている

組み込みでもリセットハンドラで似たようなことをするが
そこではmainからというルール自体が存在しない

526 :デフォルトの名無しさん:02/12/11 17:35
> mainからというルール自体が存在しない

単に規格外の挙動をしているだけで、main() からというルールは規格で明確に
定められている。

527 :デフォルトの名無しさん:02/12/11 17:48
>>526
ISO/IEC9899:1999(E) 5.1.2.1 Freestanding environment

528 :デフォルトの名無しさん:02/12/11 18:02
フリースタンディングがOSの上で動かないものを指すなら、OS自体もフリースタンディングになるの?


529 :デフォルトの名無しさん:02/12/11 18:12
>>527
そんなんあったんか。初めて知った。ありがとう。

530 :デフォルトの名無しさん:02/12/11 18:13
全くの私見だが
あの条文はあまり現実に即していない
OSの下で動くOSがあったり
mainから始まらないOS環境があったり
終了ステータスがどこの世界でも絶対にintだと断言していたり
etc...

531 :デフォルトの名無しさん:02/12/11 18:14
>>527
それだとprintfですら、標準でなくなるんだったかな・・・

532 :デフォルトの名無しさん:02/12/11 18:57
Cのソースでの関数名はアセンブラのソースではどのようになるのですか?
誰か教えてください。

533 :デフォルトの名無しさん:02/12/11 19:02
>532
どのOS/コンパイラで?

534 :デフォルトの名無しさん:02/12/11 19:15
<533
何でもいいのでお願いします。


535 :デフォルトの名無しさん:02/12/11 19:25
コンパイラならふつうアセンブラコード吐いてくれるオプションか何かあるでしょ。

536 :デフォルトの名無しさん:02/12/11 19:26
$ echo 'foo(){}' | gcc -x c - -S -o - | grep foo
.globl foo
    .type  foo,@function
foo:
    .size  foo,.Lfe1-foo

そのまんま。(Linux gcc 2.95.3)

537 :デフォルトの名無しさん:02/12/11 19:50
うちの LSI-C試食版くらいかな、アンダーバーが付くのは、、、

538 :デフォルトの名無しさん:02/12/11 20:00
試食版ばかり使わないで買ってやれよ・・・

539 :デフォルトの名無しさん:02/12/11 20:02
必要になったら購入します。

540 :デフォルトの名無しさん:02/12/11 20:15
MS 系はみんな付くよ、アンターバー。

541 :デフォルトの名無しさん:02/12/11 20:30
おれはアンダーパーだしたことねーぞ。

542 :デフォルトの名無しさん:02/12/11 20:36
(゚Д゚)ハァ?

543 :デフォルトの名無しさん:02/12/11 21:00
おれはアベレージ100切るかも。

544 :デフォルトの名無しさん:02/12/11 21:03
何の話だよ・・・

545 :デフォルトの名無しさん:02/12/11 21:23
おれは黄色いほうが好き

546 :デフォルトの名無しさん:02/12/11 21:26
かゆい。

547 :デフォルトの名無しさん:02/12/11 21:29
だから何の話なんだよ・・・

548 :デフォルトの名無しさん:02/12/11 21:29
あちらはリコーダーのスレ、こちらは・・・

549 :デフォルトの名無しさん:02/12/11 21:32
あちらは利口だーのスレ、こちらは馬鹿だーのスレ

550 :デフォルトの名無しさん:02/12/11 21:34
もすぃかしてこっちはネタスレ?

551 :デフォルトの名無しさん:02/12/11 21:36
どっちもネタスレ

552 :デフォルトの名無しさん:02/12/11 21:39
へ(゜∇、°)へ

553 :デフォルトの名無しさん:02/12/11 21:43
誰か答えろよ。何の話なんだよ。気になるじゃねーか。

554 :デフォルトの名無しさん:02/12/11 21:45
C# の話だろう?

555 :デフォルトの名無しさん:02/12/11 21:53
アンダーパー アベレージ100 黄色いほう かゆい

C#???

556 :デフォルトの名無しさん:02/12/11 21:56
>>537-555キチガイ警報

557 :デフォルトの名無しさん:02/12/11 21:57
という訳でお前ら、漏れに罰金を支払え!!

558 :デフォルトの名無しさん:02/12/11 22:03
>>557
えっ えと・・・ いくらほど?

559 :デフォルトの名無しさん:02/12/11 22:05
一人 3 両。

560 :デフォルトの名無しさん:02/12/11 22:07
>>559
車両で支払うのかよ!!!

561 :デフォルトの名無しさん:02/12/11 22:10
おれはいつもオーバーパー

562 :デフォルトの名無しさん:02/12/11 22:11
ものすんごくパー? 頭が?

563 :デフォルトの名無しさん:02/12/11 22:12
お前ら!!
落ち着いてないでケンカしろ!!

564 :デフォルトの名無しさん:02/12/11 22:14
>>563
そういうお前こそケンカしろ!!!

565 :デフォルトの名無しさん:02/12/11 22:16
>>546
ごめんなさい、ゆるしてください。

566 :デフォルトの名無しさん:02/12/11 22:17
C言語らしくケンカしやがれ貴方たち!!!

567 :デフォルトの名無しさん:02/12/11 22:18
>>565
ごめんなさい、そういう俺こそゆるしてください。

568 :デフォルトの名無しさん:02/12/11 22:20
つーか、「もう一つ」 の方で、(なぜか C++ の) ケンカが発生しています。
どうぞ、はちゃめちゃに騒いでください。

569 :デフォルトの名無しさん:02/12/11 22:21
よーしはちゃめちゃに騒ぐぞー。

ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
 ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
 ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ

570 :デフォルトの名無しさん:02/12/11 22:29
こっちで騒いでどないすんねん。

571 :デフォルトの名無しさん:02/12/11 22:31
いーなー、こういうノリ好きだ。
嫌いなヤシも居るだろうけど。

572 :デフォルトの名無しさん:02/12/11 22:32
あほらしすぎてチョトワラタw

573 :デフォルトの名無しさん:02/12/11 22:51
ワラタすぎてチョトあほらしw

574 :デフォルトの名無しさん:02/12/11 22:53
>>571
好きなのはどっちのノリだ?
たべるほうかつけるほうか?

575 :デフォルトの名無しさん:02/12/11 22:55
ボーランドのデバッガ使ってるんですけど、配列の中身を楽に参照
する方法ないでしょうか?いちいちhoge[0]みたいにしていくの面倒
でたまりません。

576 :デフォルトの名無しさん:02/12/11 22:56
>>576
食べる方。
韓国ノリとか大好き。

577 :デフォルトの名無しさん:02/12/11 22:58
お、自己レスですね(・∀・)ニヤニヤ

578 :デフォルトの名無しさん:02/12/11 23:00
>>575
ボーランドのデバッガにあるかどうかは知らんが、
大抵のデバッガにはメモリをダンプする機能があり、
そこに配列の先頭アドレスを入れてあげればいい。

579 :デフォルトの名無しさん:02/12/11 23:01
自己ノリ

580 :デフォルトの名無しさん:02/12/11 23:04
>>578
なるほど!
ありがとうございました。

581 :デフォルトの名無しさん:02/12/11 23:06
質問したら最低半日待てよ。

582 :デフォルトの名無しさん:02/12/11 23:08
>>581
すいませんでした。

583 :デフォルトの名無しさん:02/12/11 23:19
待てっ!

584 :デフォルトの名無しさん:02/12/11 23:34
やだ

585 :デフォルトの名無しさん:02/12/11 23:38
童貞ですが何か?

586 :デフォルトの名無しさん:02/12/12 00:27
中はダメっ!

587 :デフォルトの名無しさん:02/12/12 01:09
赤ちゃんできちゃう!

588 :デフォルトの名無しさん:02/12/12 01:21
>一行カキコ野郎
新手の荒らしですか?


589 :デフォルトの名無しさん:02/12/12 01:21
いかにもCのスレだ(藁

590 :デフォルトの名無しさん:02/12/12 04:00
カーボンについて語るスレはここですか?

591 :デフォルトの名無しさん:02/12/12 04:22
ドについて騙るスレはここです。

592 :デフォルトの名無しさん:02/12/12 11:13
C言語今から始めるんだけど、文句ある??ん?

593 :デフォルトの名無しさん:02/12/12 11:16
const 付きで受けたchar型のポインタをfreeする時にWarning が出るんですが、
これって明示的にvoid型のポインタにキャストしなきゃいけないの?
警告が出るのは constだから?Warningは消せたのだけど、
理由が解らずに昨日から悩んでいます。

環境は、gcc/cygwin 3.1.1 です。


#include <stdlib.h>
char* foo(void){
char char *str = (char *)malloc(1);
return str;
}

int main(void){
const char *str = foo();
free(str); /* free((void *)str); だと ok */
str = NULL;
return EXIT_SUCCESS;
}

594 :デフォルトの名無しさん:02/12/12 11:21
> 理由が解らずに昨日から悩んでいます。

んなもん、char * でやってみればすぐ解ると思うが。
というか、なんでconst付けんの?

595 :脱字訂正:02/12/12 11:27
なんでconst付けんの?

なんでconst付けてんの?

596 :デフォルトの名無しさん:02/12/12 12:49
const の意味わかってる?

597 :デフォルトの名無しさん:02/12/12 16:56
色々試して覚えていくもの!

598 :デフォルトの名無しさん:02/12/12 16:58
ヾ(≧∇≦)/

599 :デフォルトの名無しさん:02/12/12 18:40
C言語でのプログラミングスタイルについて意見を求む。
C++はダメだよ。Cしか使えないんで。

ファイルを開いて hoge() の処理する。そしてファイルから nバイト読み取
り uge() の処理する。
正常なら読み取ったバッファへのポインタを返し、エラーならNULLを返す。
そんな関数を作りたいとする。
言っとくけど宿題じゃないよ。(実際のプログラムはソケットを対象)

hoge()、uge() は正常なら 0以上の整数値を返し、エラーなら負値を返す。
プロトタイプはそれぞれ

int hoge(void);
int uge(void);

んで、実際に作った関数

600 :599:02/12/12 18:41
char *openseek(const char *filename, int offset, int nbytes)
{
  FILE *fp;
  char *buff;

  if (TRUE) {
    fp = fopen(filename, "r");
    if (fp == NULL) {
      goto error_end;
    }

    if (hoge() < 0) {
      goto error_end;
    }

    buff = malloc(nbytes);
    if (buff == NULL) {
      goto error_end;
    }

    fread(buff, 1, nbytes, fp);

    if (uge() < 0) {
      goto error_end;
    }


    return buff;
  }

601 :599:02/12/12 18:41
  else {
error_end:
    if (buff != NULL) {
      free(buff);
    }
    if (fp != NULL) {
      fclose(fp);
    }

    return NULL;
  }
}

602 :599:02/12/12 18:41
エラー時は、free()とfclose()しなくちゃいけなくて、それを一箇所にまと
めたいな と思ったらこんなんなったけどどう?読みずらい?

603 :599:02/12/12 18:43
関数名
×openseek
○openread

604 :599:02/12/12 18:45
×return buff;
○fclose(fp); return buff;

鬱だ


605 :デフォルトの名無しさん:02/12/12 18:46
あんま関係ないけど↑のhogeとかuseで例外起こったら
どうするのが適切?

606 :599:02/12/12 18:47
×char *buff;
○char *buff = NULL;

あぁ〜もうーーー。スマン心中するよ。

607 :599:02/12/12 18:51
>>605

Cなんで例外は無いんでつ。・°・(ノД`)・°・。
エラー発生時は、単にエラーか否かがわかればいいでつ。
(本物は、引数にエラーコードの格納先もあるんでつ)

608 :599:02/12/12 18:55
なんか引数に int offset とかも残ってるし。
これ最初、ファイル開いてシークしてそんで...って処理を考えたのさ。
でもシークするのは別にいらないやってんでその部分は消したの。
でも引数の部分は残ったままだった。

ようはね、エラー時の処理として free()とかfclose()とかのなんらかのリソース
の開放が必要な場合、それらを一箇所にまとめようとしたら goto がけっこう
でてきて、それで他の人が読んだらどう思うかなって思ったの。

皆さんのお目を汚してゴメンナタイ。・°・(ノД`)・°・。
今日はもう帰りまつ。

609 :デフォルトの名無しさん:02/12/12 19:18
>>608
別にgoto使って問題ないパターンだと思われ。
あんまり if (TRUE) {...} else なんてしないが。

610 :デフォルトの名無しさん:02/12/12 20:09
こんなヒドいコードよく書けたなぁ.....

611 :デフォルトの名無しさん:02/12/12 20:28
BASICみたい

612 :デフォルトの名無しさん:02/12/12 20:46
freadについての質問なのですが、

FILE *fp;
float d;
int i;

for(i=0;i<3;i++){
  fread(&d,sizeof d, 1, fp);
  printf("%f\n", d);
}
簡潔に書いてしまいましたがこのような状態のときに、
ファイルに10 20 30と書いてあったとしたら
画面に10 20 30と表示されると書いてあったのですが(実際にも試しました)
いまいち理解できません。
freadをforで繰り返していますが、一回目10を読み込み、
二回目読み込むときには20を読み込むようになるのはなぜでしょう?
fgetcのように順番に次へ次へと読み込む関数なのでしょうか?
言ってることがよくわからなかったりアホなコトだったらすいません。
もしわかる方がいらっしゃいましたらご解答お願いします



613 :599:02/12/12 20:51
帰宅しますた。
今夜はウドンを湯でまつ。

>>609 あんまり if (TRUE) {...} else なんてしないが。
最初は無かったんだけど、正常シーケンスの時の return を忘れてて、お!こりゃ
まずいじゃんってんで、正常シーケンス時はエラーシーケンスに入らないようにって
if else でくくったのです。でも確かに冗長な気がするので、はずしました。

>>610 こんなヒドいコードよく書けたなぁ
自分もなんかスッキリしてないので、是非スッキリ綺麗なコードをご教授ください。
お願いしまつ。

614 :599:02/12/12 20:57
>>611 BASICみたい
すんまてん。

自分は基本的に、エラーになったらそこですぐ処理を終了する って書き方
なんですが、こいつの場合、

  hoge()では free()したらダメ。uge()では free()しないとダメ

で、なんか綺麗な書き方思い浮かばないんです。
是非、ご教授ください。

615 :デフォルトの名無しさん:02/12/12 21:09
ホントに単純なことなんですけど、リンクってどうやるんですか?


616 :デフォルトの名無しさん:02/12/12 21:16
>>614=599
単純に簡単化しただけだけど、どうかな?
char *openseek( const char *filename, int nbytes )
{
FILE *fp;
char *buff;

fp = fopen( filename, "r" );
if ( !fp || hoge() < 0 )
goto error_end;

buff = malloc( nbytes );
if ( !buff )
goto error_end;

fread( buff, 1, nbytes, fp );

if ( uge() < 0 )
goto error_end;

return buff;

error_end:
free( buff );
if ( !fp )
fclose( fp );
return NULL;
}

617 :デフォルトの名無しさん:02/12/12 21:22
>>615
<a href="www.2ch.net">2ちゃんねる</a>

618 :デフォルトの名無しさん:02/12/12 21:32
>>617
いや、そうじゃなくて(ネタだと思うけど)
インクルードは #include<******>
じゃ、リンクはどうやるんですか?

619 : ◆F52DmOxJlc :02/12/12 21:35
>>618
リンカにお願いする。

620 :デフォルトの名無しさん:02/12/12 22:02
#include <stdio.h>
#define NUM 5
int main(void)
int test[NUM];
int num;
int i,j;
num=0;
printf("テストの点数を入力してください。\n")
for(i=0; i<NUM; i++){
scanf("%d",&test[i]);
if(test[i]>=70){
num++;
}
}
for(j=0;j<NUM;j++){
printf("%d番目の人の点数は%dです。\n",j+1,test[j]);
}
printf("70点以上の学生は%d人です。\n", num);
return 0;
}


問題集ですが答えを見ながら答えを出したのですが原因不明のエラーが15行目と18行目に出ます。どこがおかしいのでしょうか?

621 :デフォルトの名無しさん:02/12/12 22:11
>>612
こういう事では?
#include <stdio.h>
void read_t(char* str)
{
static unsigned int i = 0;
printf("%c\n", *(str+i));
i++;
}
int main(void)
{
char* str = "ABCDE";
read_t(str);
read_t(str);
read_t(str);
read_t(str);
read_t(str);
return 0;
}


622 :デフォルトの名無しさん:02/12/12 22:13
>>620
まずは、質問の方法がおかしいです。
エラーがでるなら、そのエラーくらい書きましょうや。
宿題なら、専用のスレがあるわけだし。

#include <stdio.h>
#define NUM 5
int main(void)
{
int test[NUM];
int num;
int i,j;
num=0;
printf("テストの点数を入力してください。\n");
for(i=0; i<NUM; i++){
scanf("%d",&test[i]);
if(test[i]>=70){
num++;
}
}
for(j=0;j<NUM;j++){
printf("%d番目の人の点数は%dです。\n",j+1,test[j]);
}
printf("70点以上の学生は%d人です。\n", num);
return 0;
}


623 :デフォルトの名無しさん:02/12/12 22:20
>>612
何故読み取り位置が自動で動くか、という意味でしょうか?
freadをする前に、毎回fseekしなくてはいけない実装がお望みなのでしょうか。

624 :612:02/12/12 22:31
>>621
それがfreadの中身(?)ってコトでしょうか?
>>623
>何故読み取り位置が自動で動くか、という意味でしょうか?
はい、そうなんです。



625 :C初心者:02/12/12 22:32
>>599 >C言語でのプログラミングスタイルについて意見を求む。
「自分の場合だったらー」って理解していいっすね?
>>614 >で、なんか綺麗な書き方思い浮かばないんです。
自分も自身ないっすけど、、、取り合えず作ってみたっす。自分だったらこんな感じです。

char *openseek(const char *filename, int offset, int nbytes)
{
    FILE *fp;
    char *buff = NULL;
    char *exitselect( FILE **, char *, int ); /* 例外用の補助関数 */

    if( (fp = fopen( filename, "r" )) == NULL )
        return ( NULL );
    if( hoge() < 0 )
        return ( exitselect( &fp, buff, 1 ) );
    if( (buff = (char *)malloc( sizeof(char)*nbytes +1 )) == NULL )
        return ( exitselect( &fp, buff, 2 ) );
    fread( buff, 1, nbytes, fp );
    if( uge() < 0 )
        return ( exitselect( &fp, buff, 3 ) );
    return ( buff );
}

char *exitselect( FILE **fp, char *buff, int select )
{
    if( select == 3 )
        free ( buff );
    fclose( *fp );
    return ( NULL );
}


626 :621:02/12/12 22:37
>>624
中身じゃなくて考え方ね。

627 :デフォルトの名無しさん:02/12/12 22:38
どうすればレジスタを効率的に使えるようにできるのでしょうか?

628 :デフォルトの名無しさん:02/12/12 22:43
>>627
良いコンパイラを使う。

629 :デフォルトの名無しさん:02/12/12 22:43
>>599
フラグを使えは、こんな感じ...

char *openread(const char *filename, int offset, int nbytes)
{
 FILE *fp = NULL;
 char *buff = NULL;
 int Success = 0;

 fp = fopen(filename, "r");
 if (fp == NULL) goto Done;
 if (hoge() < 0) goto Done;
 buff = malloc(nbytes);
 if (buff == NULL) goto Done;
 fread(buff, 1, nbytes, fp);
 if (uge() < 0) goto Done;
 Success = 1;

Done:
 if (fp != NULL) fclose(fp);
 if (Sucess){
  return buff;
 } else {
  free(buff);
  return NULL;
 }
}

ところで、fread() のエラーチェックはいらないのか ?

630 :デフォルトの名無しさん:02/12/12 22:48
>>625
ネタか ? 突込みどころ満載なんだが...。

631 :593:02/12/12 22:48
>>594-596
返事ありがとう。
勿論、char * で警告無しに通るのは試して確認してました。

const をつけた理由は、
関数内で、mallocで確保した領域に値を代入して return
受け取り先では、そのポインタの指す領域を、 それ以降書き換えて欲しくない 場合
・・・といったケースを想定していました。

変更したくないのだからfreeでその領域を開放するときに警告されるのは
当然かな。とも思うのだけど、この const char * の指す領域を
警告出さずに、開放する方法ないかなと模索していました。

で、自分で見つけた解決策の一つが、
freeの引数に渡す時、void * にキャストするという方法。
でも、const char * の場合だけキャストする
というのも、なんかスッキリしません。

こういったケースをうまく収める定石ってないのでしょうか?


>>596
自分では解って使っているつもりだったんだけど、
// 勿論、テストでポインタの指す領域への代入で警告出るのも確認しました。
上記の様な場面での利用で、何か
勘違いしている点があれば、指摘お願いします。

632 :デフォルトの名無しさん:02/12/12 22:48
>>627
インラインアセンブラについて、勉強スレ。

633 :デフォルトの名無しさん:02/12/12 22:49
>>626
考え方もなにも、、、
たとえば、標準入力(たとえばキーボード)をfopenして、freadで読み取って、
次にfreadしても、前回の値が延々ときてもしょーもないし。

634 :konnnaka?:02/12/12 22:57
#include <stdio.h>
main(){
printf("<html><body><a href=\"http://www.2ch.net\">2ch</a></body></html>");
return 0;
}


635 :デフォルトの名無しさん:02/12/12 23:03
>>630
それでは突っ込んでください。

636 :デフォルトの名無しさん:02/12/12 23:14
>>635
> if( (buff = (char *)malloc( sizeof(char)*nbytes +1 )) == NULL )

の +1 ってなんだ ?

637 :デフォルトの名無しさん:02/12/12 23:19
>>636
\0専用!!

638 :デフォルトの名無しさん:02/12/12 23:24
>>637
わけ分からん


639 :デフォルトの名無しさん:02/12/12 23:26
  ワケ     ワカ     ラン
  ∧_∧   ∧_∧    ∧_∧
 ( ・∀・)  ( ・∀・)   ( ・∀・)
⊂ ⊂  )  ( U  つ  ⊂__へ つ
 < < <    ) ) )     (_)|
 (_(_)  (__)_)    彡(__)


640 :デフォルトの名無しさん:02/12/12 23:32
  カツオ    ワカメ   タランチュラ
  ∧_∧   ∧_∧    ∧_∧
 ( ・∀・)  ( ・∀・)   ( ・∀・)
⊂ ⊂  )  ( U  つ  ⊂__へ つ
 < < <    ) ) )     (_)|
 (_(_)  (__)_)    彡(__)



641 :デフォルトの名無しさん:02/12/12 23:33
  タワケ   ワカサマ   ゴランシン
  ∧_∧   ∧_∧    ∧_∧
 ( ・∀・)  ( ・∀・)   ( ・∀・)
⊂ ⊂  )  ( U  つ  ⊂__へ つ
 < < <    ) ) )     (_)|
 (_(_)  (__)_)    彡(__)

642 :599:02/12/12 23:58
>>616
それだと、fopen() と hoge() の間に処理入れられないのがイヤン。


>>625
補助関数いいですね。
自分も終了処理用の関数を分けようかどうしようか悩みました。


>>629
フラグもいいかも。
fread()エラーチェック必要ですね。ご指摘ありがとう。
実際の処理では fread() ではないんですがちゃんとエラーチェックしないと
ね。


自分としては、goto による前方ジャンプがなんか構造化の点からイヤンな感
じなんですよ。
でもまぁ goto絶対イヤ ってわけじゃないんで、まぁいいかと思ったり。

とりあえずは、それほど規模の大きい関数ではないんで元の(if else を取っ
たやつ)で行こうかなと思いまつ。


さて、そろそろおやすみです。

643 :デフォルトの名無しさん:02/12/13 00:02
●とにかく気が小さい(二言目には「世間」)
●ストレスを溜め込んでは、キレて関係ない人間を巻き添えにして暴れまくる(小心者のくせに短気)
●自尊心が異常に強く、自分が馬鹿にされると怒るくせに平気で他人を馬鹿にしようとする(ただし、相手を表面的・形式的にしか判断できず、実際にはたいてい、内面的・実質的に負けている)
●他人の忠告を受け入れない、反省できない、学習能力がない(自分の筋を無理にでも通そうとするため)
●「常識、常識」と口うるさいが、実はピントがズレまくっている(日本の常識は世界の非常識)
●権力、強者(警察、暴走族…etc)に弱く、弱者には威張り散らす(強い者に対してはへりくだり、弱いものに対してはいじめる)
●あら探しだけは名人級(例え10の長所があってもほめることをせず、たった1つの短所を見つけてはけなす)
●基本的に悲観主義でマイナス思考に支配されているため、性格がうっとうしい(根暗)
●一人では何もできない、女は連れションが大好き(群れでしか行動できないヘタレ)
●少数派を馬鹿にする、排斥する
●異質、異文化を排斥する(差別主義者)
●集団いじめのパイオニア&天才
●悪口、陰口が大好き(性格極悪)
●他人からどう見られているか、体裁をいつも気にしている(「世間体命」)
●DV夫が多い(世間体を気にするあまり)
●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことを何度も言う、知障)
●頑固で融通(応用)が利かず、表面上意気投合しているようで、腹の中は各自バラバラ(しかも考えていることは驚くほど幼稚)
●人を信じられず、疑い深い(自分自身裏表が激しいため、他人に対してもそう思う)
●自分は常に自己抑制しているもんだから、自由に見える人間に嫉妬し、徒党を組んで猛烈に足を引っ張ろうとする(ねたみが人一倍強い)
●おまけに執念深くしつこい(「一生恨みます」タイプ)
●自分に甘く他人に厳しい(自分のことは棚に上げて、まず他人を意識する・冷酷)
●要するに女々しい、あるいは女の腐ったみたいなやつが多い


644 :デフォルトの名無しさん:02/12/13 00:19
>>643
これは何ですか?

645 :デフォルトの名無しさん:02/12/13 00:35
>>643
誉め言葉と思って有難く受け取っておくよ。

646 :デフォルトの名無しさん:02/12/13 01:00
>>643
コピペならコピペらしく全文載せろよ(w

647 :C初心者:02/12/13 01:04
>>630 >ネタか ? 突込みどころ満載なんだが...。
一応ネタではないです。。。

>>637 ホローありがとうっす。

>>638 すみません。変てこなロジックで。。。

>>642 >補助関数いいですね。
ありがとうっす。
>でもまぁ goto絶対イヤ ってわけじゃないんで、まぁいいかと思ったり。
自分もgoto はそんなに嫌いじゃないです。

うーーん。しっかし、さむいっす。
自分もそろそろ寝ます。

648 :デフォルトの名無しさん:02/12/13 01:19
>>647
>>637はフォローじゃないぞ。
バッファに読み込んだ後、終端に'\0'付けてないんだから、
そのコードでは何の意味も無い。理解してない証拠だね。

この手のエラーチェックは、例外使えない言語ではgotoが一番綺麗だと思う。
擬似コードで書くとこんな感じ。

 if (リソースA取得 == 失敗)
  goto 失敗A;
 if (リソースB取得 == 失敗)
  goto 失敗B;
 if (リソースC取得 == 失敗)
  goto 失敗C;

 リソースC開放;
失敗C:
 リソースB開放;
失敗B:
 リソースA開放;
失敗A:
 return;

649 :デフォルトの名無しさん:02/12/13 02:02
>>599
暇つぶし・・・長くてごめん・・・
enum Err{FCLOSE, FREE};
char *err_end(void** p, unsigned flag)
{
if(*p != NULL){
switch(flag){
case FCLOSE:
fclose((FILE*)*p);
break;
case FREE:
free(*p);
break;
}
}
*p = NULL;
return NULL;
}


650 :デフォルトの名無しさん:02/12/13 02:03
>>649の続き
char *openseek(const char *filename, int offset, unsigned nbytes)
{
FILE* fp = fopen(filename, "r");
if(fp == NULL)
return err_end((void**)&fp, FCLOSE);
if(hoge() < 0)
return err_end((void**)&fp, FCLOSE);
char* buff = (char*)malloc(nbytes);
if(buff == NULL)
return err_end((void**)&fp, FCLOSE);
if(fread(buff, 1, nbytes, fp) != nbytes){
err_end((void**)&fp, FCLOSE);
return err_end((void**)&buff, FREE);
}
if(uge() < 0){
err_end((void**)&fp, FCLOSE);
return err_end((void**)&buff, FREE);
}
return buff;
}


651 :デフォルトの名無しさん:02/12/13 02:30
>>599
char *openseek(const char *filename, int nbytes)
{
  FILE *fp = fopen(filename, "r");
  char *buff = malloc(nbytes);
  if(fp && buff && fread(buff, 1, nbytes, fp) == nbytes)
  {
    fclose(fp);
    return buff;
  }
  buff && free(buff);
  fp && fclose(fp);
  return NULL;
}

652 :651:02/12/13 02:33
651 は脊髄反射ですた。
hoge() とか入っとらん。

653 :デフォルトの名無しさん:02/12/13 02:37
char *openseek(const char *filename, int nbytes)
{
  FILE *fp = fopen(filename, "r");
  if(fp && hoge() >= 0)
  {
    char *buff = malloc(nbytes);
    if(buff && fread(buff, 1, nbytes, fp) == nbytes && uge() >= 0)
    {
      fclose(fp);
      return buff;
    }
    buff && free(buff);
  }
  fp && fclose(fp);
  return NULL;
}

654 :デフォルトの名無しさん:02/12/13 02:39
>>649-650 は、「goto を使った方が分かりやすい場合」 の例でつか?

655 :デフォルトの名無しさん:02/12/13 03:03
>  buff && free(buff);
無用。free(NULL)は合法。

656 :デフォルトの名無しさん:02/12/13 03:07
> 無用。free(NULL)は合法。

そーでない不確かな処理系がある。

657 :デフォルトの名無しさん:02/12/13 03:16
char *p = openseek("text.txt",100);
なんかの処理
free(p);

なんかメモリリーク引き起こしそうな使い方だな。

658 :デフォルトの名無しさん:02/12/13 03:16
>     buff && free(buff);
これってありなの?

659 :デフォルトの名無しさん:02/12/13 03:21
>>656
どこにあるの?

660 :658:02/12/13 03:30
なんか言い直した方が良さそうだ。

>     buff && free(buff);
free()の戻り値の型ってvoidなんだけど、
こういう書き方ってできるの?

661 :デフォルトの名無しさん:02/12/13 03:31
できる!

662 :658:02/12/13 03:44
gccではコンパイルは通った。
本当にできるみたい。
ムムム…

663 :デフォルトの名無しさん:02/12/13 03:45
buf && (free(buf), 0);

664 :デフォルトの名無しさん:02/12/13 03:48
buf && (free(buf), buf=NULL);

665 :デフォルトの名無しさん:02/12/13 03:52
その gcc チョンボっぽいな。
2.95.1 は通らない。

666 :658:02/12/13 04:24
>>665
stdlib.hのインクルード忘れてた。stdio.hは追加したのに…
うちのgccでもエラーになりました。

667 :デフォルトの名無しさん:02/12/13 04:48
おいしいビッグマックが食べたい・・・

668 :デフォルトの名無しさん:02/12/13 07:20
>>631
> こういったケースをうまく収める定石ってないのでしょうか?

ないと思う。

> で、自分で見つけた解決策の一つが、
> freeの引数に渡す時、void * にキャストするという方法。

それでいい。

または、場合によっては、書き換えて欲しくない処理の
ところだけを別の関数にして、その引数を const char *
で宣言して渡すのも有効な方法だね。

669 :デフォルトの名無しさん:02/12/13 07:22


670 :デフォルトの名無しさん:02/12/13 07:31
> // 勿論、テストでポインタの指す領域への代入で警告出るのも確認しました。

警告じゃなくてエラーになるハズなんだが・・・。

671 :デフォルトの名無しさん:02/12/13 11:33
たとえば組み込み系のコンパイラで
const char hoge[] = ”abcdefg”;
とすると、ROMにデータが置かれて、ROMだから書き換えとかも不可なわけで。
キャストしようが何しようが、constを書き換えるのはアレかなと。

672 :デフォルトの名無しさん:02/12/13 11:39
>>671
それはconstでなければ書き換え可。
hogeは配列だろ。

673 :デフォルトの名無しさん:02/12/13 11:46
ハァ?

674 :デフォルトの名無しさん:02/12/13 12:17
char hoge[] = "abcdefg"; と char *hoge = "abcdefg"; の区別は大丈夫か?

つーか、全角使うなよ・・・。

675 :デフォルトの名無しさん:02/12/13 12:53
>>674
すんまそん、区別がつかない一人です。
違いを教えていただけないでしょうか?

676 :デフォルトの名無しさん:02/12/13 12:55
>>674
671が書いてる前提と違ってきていますが

677 :デフォルトの名無しさん:02/12/13 13:04
>>674
char hoge[] = ...
だとhogeは配列。hoge[i]に代入しても良い。
hogeには代入できない。
char *hoge = ...
だとhogeはポインタ変数。hoge[i]に代入するのは未定義動作。
hogeには代入してよい。

678 :デフォルトの名無しさん:02/12/13 13:07
>>675
C FAQ。
「以下の二つの初期化の違いは。」
http://www.catnet.ne.jp/kouno/c_faq/c1.html#32
「でもchar a[]はchar *aと同じと聞いたことがあるが。」
http://www.catnet.ne.jp/kouno/c_faq/c6.html#2
役に立つから 1 度は通読する事をお奨めする。

>>676
671 の前提がそもそもおかしいという話なのだが。

679 :675:02/12/13 13:19
>>678
ありがとうございました
今宵はぐっすり眠れそうです。

680 :675:02/12/13 13:37
>>678
だからといって、前提をあっさりと無視しなくても・・・

681 :デフォルトの名無しさん:02/12/13 13:48
>>680
無視と異議の区別は大丈夫か?

682 :デフォルトの名無しさん:02/12/13 14:07
>671は>631の話の流れから書いたのだろうけれど。
constをキャストしてまで書き換えるなと言いたいだけでは?


683 :デフォルトの名無しさん:02/12/13 14:10
辿るならちゃんと 593 まで辿れ。
const をキャストして書き換える話などではない。

684 :デフォルトの名無しさん:02/12/13 14:23
ROM に格納される可能性のあるデータを書き換えてはいけないというのは、
const か否かと全然関係無いじゃん。
671 は const について勘違いしている?

685 :デフォルトの名無しさん:02/12/13 14:59
見せかけの大人しさ(さいたま)に騙されるな!
埼玉県民の特徴

●とにかくさいたまが小さい(二言目には「さいたま」)
●さいたまを溜め込んでは、キレて関係ないさいたまを巻き添えにして暴れまくる(さいたまのくせに短気)
●さいたまがさいたまに強く、さいたまがさいたまにされると怒るくせにさいたまでさいたまをさいたまにしようとする(ただし、さいたまをさいたま的にしかさいたまできず、さいたまにはたいてい、さいたま的に負けている)
●さいたまの忠告を受け入れない、さいたまできない、さいたまがない(さいたまの筋をさいたまにでも通そうとするため)
●「さいたま、さいたま」と口うるさいが、実はさいたまがズレまくっている(さいたまの常識は世界の非常識)
●さいたま、さいたま(さいたま、さいたま…etc)に弱く、さいたまには威張り散らす(強い者に対してはへりくだり、弱いものに対してはいじめる)
●さいたま探しだけは名人級(例え10のさいたまがあってもほめることをせず、たった1つのさいたまを見つけてはけなす)
●基本的にさいたま主義でさいたま思考に支配されているため、さいたまがうっとうしい(さいたま)
●さいたまでは何もできない、さいたまは連れションが大好き(さいたまでしか行動できないヘタレ)
●他人からどう見られているか、さいたまをいつも気にしている(さいたま命)
●さいたま夫が多い(さいたまを気にするあまり)
●さいたまの感情をうまくさいたまできず、コミュニケーションさいたまに乏しい(同じことを何度も言う、さいたま)
●さいたまで融通(さいたま)が利かず、表面上意気投合しているようで、さいたまの中は各自バラバラ(しかも考えていることは驚くほどさいたま)
●さいたまを信じられず、疑い深い(さいたま自身裏表が激しいため、さいたまに対してもそう思う)
●さいたまは常に自己抑制しているもんだから、さいたまに見えるさいたまに嫉妬し、さいたまを組んで猛烈にさいたまを引っ張ろうとする(ねたみが人一倍強い)
●おまけにさいたま深くしつこい(「一生さいたま」タイプ)
●さいたまに甘くさいたまに厳しい(さいたまのことは棚に上げて、まずさいたまを意識する・さいたま)
●要するに女々しい、あるいはさいたまの腐ったみたいなやつが多い

686 :デフォルトの名無しさん:02/12/13 15:07
通報しますた。

687 :デフォルトの名無しさん:02/12/13 15:38
よくこんなくだらんことできるよなぁ(苦笑

688 :デフォルトの名無しさん:02/12/13 15:43
ANCI Cで、動的に、二次元配列を使いたいのですが
どのようにしたら実現できるでしょうか?

mallocだと、だめなのかなぁ

689 :デフォルトの名無しさん:02/12/13 15:46
freeでポインタだけしか渡していないので
mallocで確保したサイズが解放できるわけを教えてください。

690 :デフォルトの名無しさん:02/12/13 15:50
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
  int x, y;
  int (*a)[16];
  a = (int (*)[16])malloc(sizeof(int) * 16 * 16);
  free(a);
  for(x = 0; x < 16; x++)
    for(y = 0; y < 16; y++)
      a[x][y] = x * 16 + y;
  for(x = 0; x < 16; x++)
    for(y = 0; y < 16; y++)
      printf("a[%d][%d] = %d\n", x, y, a[x][y]);
  getchar();
  return 0;
}

691 :デフォルトの名無しさん:02/12/13 15:53
>>689
実装は処理系定義であり、いろいろな方法が考えられる。
ポピュラーな実装方法としては、malloc() が返すポインタよりも少し前の領域に
サイズを記録しておくとか、メモリ割り当ての管理テーブルを作成しておく等が
ある。

692 :688:02/12/13 15:55
> 690

うぉっ、回答(゚д゚)ハヤー
激しく感謝

あとは、理解する頭を・・・

693 :690:02/12/13 15:55
あ、free(a); 忘れ。(このサンプルでは影響少ないけど)

ちなみに、int (*)[16] 型だからね。int *[16] 型じゃないからね。

あと、16 は y の 16 であって x の 16 じゃない。
例えば三次元配列 int [12][34][56] へのポインタは int (*)[34][56]。

694 :688:02/12/13 15:58
> 690

8行目の free(a); とは別に要るんですか?


695 :デフォルトの名無しさん:02/12/13 16:02
>688
一次元を二次元風にするとかは、ださいんでしょうか
foo = malloc((max_x + 1) * (max_y + 1) * sizeof(bar));
foo[(x * max_y) + y] = 1024;
#なんか間違えてるかな

696 :デフォルトの名無しさん:02/12/13 16:07
大抵は、malloc関数によってユーザに与えられたメモリのアドレスの定数ワード前にサイズとか色んな情報が入っている場合があります。

こんな感じ
-------------------
|サイズ等の管理情報|
------------------- <-このアドレスがmallocで返される
| |
| ユーザメモリ |
| |
| |
------------------- <-次のメモリブロック
|サイズ等の管理情報|
------------------- <-このアドレスがmallocで返される
| : |
:
:


697 :デフォルトの名無しさん:02/12/13 16:08
OSが管理している、という一言で済むかな・・・

698 :デフォルトの名無しさん:02/12/13 16:19
>>697
とは限らない。

699 :デフォルトの名無しさん:02/12/13 16:24
>>695
何がやりたいの?

>>697-698
つーか、全部を OS に管理させている処理系は少ないぞ。

700 :デフォルトの名無しさん:02/12/13 19:31
C99 PDF の翻訳スレって誰か立てないの?

701 :593, 631:02/12/13 22:37
# >>593, >>594-596, >>631

>>668
なるほど、設計を変えることで対応できるんですね。
見直して見る価値がありそうです。ありがとう。

>>670
> // 勿論、テストでポインタの指す領域への代入で警告出るのも確認しました。
> 警告じゃなくてエラーになるハズなんだが・・・。
Warning: assignment of read-only location
で、一応コンパイルは通り、実行も出来ました。

>>631 で話したテストとは下記の様な場面を想定したテストでした。
この場合の const char* の指す場所は、mallocで確保した領域です。

// 普通に初期化せず、関数内で値を設定しているのは、
// 環境等によって異なる値を所得する必要があるため。テストでは省いています。
--------------------------------------------
#include <stdlib.h>
char *foo(void){
char *str = (char *)malloc(2);
if (str){ str[0]='a'; str[1]='\0'; }
return str;
}
int main(void){
const char *str = foo(); /* foo で設定した値を、これ以降書き換えたくない */
if (str) str[0]='b'; /* Warning */
free((void *)str);
return EXIT_SUCCESS;
}

// 誤解、解けたかな?

702 :デフォルトの名無しさん:02/12/13 22:55
申し訳ありません。基本かもしれませんが、参考書に載ってないので教えて下さい。

#include <stdio.h>
int main(void)
{
char str[100];
int i,c;
c=0;
printf("文字列を入力してください。\n");
scanf("%s",str);
for(i=0;str[i]!='\0';i++){
c++;
}
printf("文字列の長さは%dです。\n",i);
return 0;
}



このコードのstr[i]!='\0'の!=hは非等価ですが'\0'の意味を教えて下さい。

703 :デフォルトの名無しさん:02/12/13 22:57
本当に載ってないならその参考書を燃やしてもっとましな新しい参考書を買うよろし

704 :デフォルトの名無しさん:02/12/13 22:58
>>701
> if (str) str[0]='b'; /* Warning */

Σ(゚д゚lll)
それおかしい。
C 規格外の動作をしている。
コンパイラは何?

705 :デフォルトの名無しさん:02/12/13 23:12
http://science.2ch.net/test/read.cgi/future/1022864257/425

「このDVDは36時間以内に」消滅 007新作で実現

(CNN) 映画「007」シリーズではこれまで、ニセの指紋や毒入りペンといったスパイ用
の突飛な「新技術」が次々に発表されてきたが、22日に全米公開された最新作「ダイ・アナザー・デイ」
でもまた新たな技術が披露された。「36時間以内に消滅するDVD」だ。

このDVDは、映画の公開前に批評用として報道関係者に配られるもの。報道関係者が見たあと、
一般に出回ってコピーされたりするのを防ぐためニューヨークを本拠とする「フレックス・タイム」会社が
開発した新技術が採用された。
同社のC・E・シャノンさんは「化学のおかげ」としか言わないが、仕組みはこうだ。DVDの表面には
透明な樹脂が張ってあり、プレーヤーはそこを透過するレーザー光で信号を読み出す。ところが、新しい
DVDでは、樹脂に特殊な工夫があり、36時間程度で発熱・発火・発光―つまり爆発―するように
なっている。その結果、DVDは消滅するわけだ。

007のDVDには「包装を開いたあと、36時間以内に作品を鑑賞してください」と書いてある。シャノ
ンさんは「新技術はジェームズ・ボンドにぴったりでしょう」と話している。この技術は音楽CDや、ソフト
ウエアの収録したCD―ROMにも応用でき、フレックス・タイム社には商談の話が来ているという。

706 :デフォルトの名無しさん:02/12/13 23:14
>>703
そんなこと言わないで教えて下さいよー。麻奈本ですけど。おかねないですよ。

707 :デフォルトの名無しさん:02/12/13 23:15
>>705は【転送】また、騙された訳だが【完了】

708 : ◆F52DmOxJlc :02/12/13 23:17
>>702
ヌル文字

709 :デフォルトの名無しさん:02/12/13 23:18
ぬる文字?

710 :593, 631, 701:02/12/13 23:24
>>704
cygwin gcc3.1.1 です。
gcc -ansi -Wall foo.c でコンパイルしました。
何処辺りが規格外なの?


>>702
typo かなっ? // 数値は同じだけど。
> printf("文字列の長さは%dです。\n",i);
< printf("文字列の長さは%dです。\n",c);

711 : ◆F52DmOxJlc :02/12/13 23:25
http://www.google.co.jp/search?q=%83k%83%8B%95%B6%8E%9A+C%8C%BE%8C%EA&ie=Shift_JIS&hl=ja&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
お金たまったらマトモな本買ってね。

712 :デフォルトの名無しさん:02/12/13 23:39
>>653-666
今更だが、
buff && free(buff), 0;
でOK

713 :712:02/12/13 23:40
でも、見にくくなるだけだから、使わない方がベター

714 :デフォルトの名無しさん:02/12/13 23:52
>>712
(゚Д゚)ハァ?

715 :デフォルトの名無しさん:02/12/13 23:53
関数のポインタってどういうときに使うんですか?


716 :デフォルトの名無しさん:02/12/13 23:53
おい・・・
またスレ立てたいだけ厨が出たぞ・・・。
http://pc3.2ch.net/test/read.cgi/tech/1039790146/l50
しかもあっちのスレ、まだ 900 も逝ってないのに。

717 :デフォルトの名無しさん:02/12/13 23:54
>>715
qsort()
SetWindowsHookEx()

718 :デフォルトの名無しさん:02/12/13 23:55
>>702
strcpy 等で、文字列をコピーするのに
何処が、文字列の終端なのか分からないと
何処までをコピーすれば良いか分かりませんよね?
つーわけで、その'\0'は、文字列の終端である事を表す文字です

719 :デフォルトの名無しさん:02/12/13 23:57
>>714
buff && ( free(buff), 0 ) ;
カッコが抜けてた
首吊ってきます

720 :デフォルトの名無しさん:02/12/13 23:59
constに代入?

721 :デフォルトの名無しさん:02/12/14 00:00
>>715
使うと便利なとき

722 :デフォルトの名無しさん:02/12/14 00:00
くだらねぇ。free(buf)でいいだろが。
C厨ならC厨らしく特殊な例外に対応するときはマクロでも使え。

723 :デフォルトの名無しさん:02/12/14 00:04
722 に 0.8 票

724 :デフォルトの名無しさん:02/12/14 00:06
>>717
ありがとうございます。ところで、
SetWindowsHookEx()ってなんですか?

>>721
便利なときって例えばどういうときでしょうか。

725 :デフォルトの名無しさん:02/12/14 00:10
>>724
> 便利なときって例えばどういうときでしょうか。
C言語でオブジェクト指向プログラミングをする時などに使用します。

726 :デフォルトの名無しさん:02/12/14 00:19
>>722
そのマクロで意味も無く使って見るのがベター

727 :デフォルトの名無しさん:02/12/14 00:20
(゚Д゚)ハァ?

728 :デフォルトの名無しさん:02/12/14 00:24
>>724
クイックソートのような補助関数を使いたい時や
配列化(特に多次元)したい時とか

729 :デフォルトの名無しさん:02/12/14 00:25
>>725
ありがとうございます。ところで、
オブジェクト指向プログラミングが全く判らないので出直してきます。



質問があるときにはまたよろしくお願いします

730 :デフォルトの名無しさん:02/12/14 00:39
>>727
#ifdef XXX
#define Free(s) ((s)&&(free(s),0))
#else
#define Free(s) free(s)
#endif
こうすれば、移植しやすいでしょう?
まぁ、普通にステートメントとifを使う方が見やすいけどね…

731 :デフォルトの名無しさん:02/12/14 00:41
#ifdef XXX
#define free(s) ((s)&&(free(s),0))
#endif

732 :デフォルトの名無しさん:02/12/14 00:44
>>731その",0"って何か意味あるの?

733 :デフォルトの名無しさん:02/12/14 00:45
>>732
free() は vois 型だから、そのままだと && のオペランドにできないの。
どうせやるなら #define free(s) ((s)&&(free(s),s=0)) でもいい気がする。

734 :訂正:02/12/14 00:46
> vois 型

void 型

735 :デフォルトの名無しさん:02/12/14 00:50
なるほど。しかし名前が同じだと却って混乱を招いたりしない?このfreeはどっちのfreeだったかなとか。

736 :デフォルトの名無しさん:02/12/14 00:53
(゚Д゚)ハァ?

737 :デフォルトの名無しさん:02/12/14 00:53
>>731
ライブラリはマクロで定義されてる事もあるので…
まぁfreeがマクロになってる事はあまりないか

738 :デフォルトの名無しさん:02/12/14 00:54
脳内スタックの容量は大丈夫ですか?

739 :デフォルトの名無しさん:02/12/14 01:00
関数型のマクロは、引数を複数回評価した時に副作用があるので、その可能性が
あれば文書で警告されるはず。
free() にはそのような警告はないよ。

740 :デフォルトの名無しさん:02/12/14 01:01
>>735
どっちって、特殊な環境で動くようにしてるだけだから
普通は間違えようにも間違えようがありません

741 :デフォルトの名無しさん:02/12/14 01:05
hogeって日本語?

742 :デフォルトの名無しさん:02/12/14 01:07
アメリカ人は foo とかかいてる気がするな。


743 :デフォルトの名無しさん:02/12/14 01:07
hoge-hage, or hoge-page
foo-bar

744 :デフォルトの名無しさん:02/12/14 01:08
>>739
それは、あなたの環境でfreeがマクロでは無いからです
で、>>730で移植しやすいと言ってるのだから
汎用性を考えるのなら、マクロの定義で
関数名で使われている名前は避けるべきではないかと…

745 :デフォルトの名無しさん:02/12/14 01:09
>>744
(゚Д゚)ハ?

746 :デフォルトの名無しさん:02/12/14 01:10
hogeって
ほげ〜。。。(ボーっとしている様)
っていう意味でいいの?

747 :デフォルトの名無しさん:02/12/14 01:10
>>744
漏れの処理系にじゃなくて、規格に無いと逝ってるんだが。
ちなみに gets() はもろに警告されている。

748 :デフォルトの名無しさん:02/12/14 01:12
>>744
730 が移植しやすいなんで誰も言っていない。
第一、free() を完全に置き換えたいのだから、別の名前の方が混乱する。

749 :デフォルトの名無しさん:02/12/14 01:16
>>747
だから、その規格が、全ての標準ライブラリは
マクロか適当に実装して提供すればOKってなってない?
それとも、俺の勘違い?

750 :デフォルトの名無しさん:02/12/14 01:20
foo bar baz
hoge hero moe

751 :デフォルトの名無しさん:02/12/14 01:38
規格では、関数として実装しなければいけないものも
たくさんあると思う

752 :デフォルトの名無しさん:02/12/14 01:38
ISO_IEC 9899_1999 の 7.1.3 Reserved identifiers の 項 4 に、
予約した識別子を #define したり #undef した場合の動作は未定義って
書いてあるナー・・・。

753 :デフォルトの名無しさん:02/12/14 02:27
>>752
予約した識別子って、ライブラリ関数名と関係あるの?

754 :デフォルトの名無しさん:02/12/14 02:37
>>753
予約語以外の、予約した識別子。
つまり、ライブラリ関数/変数、マクロの名前。
それぞれの解説文の中に埋まってて、一覧は無かった。

755 :デフォルトの名無しさん:02/12/14 05:07
予約した識別子がライブラリ関数/変数、マクロの名前ということは誰が言ったんだ?

756 :デフォルトの名無しさん:02/12/14 09:17
>>752
それはすごいな
大手メーカーのコンパイラがほぼ全てギルティだな

757 :デフォルトの名無しさん:02/12/14 12:18
すいません教えてください。お願いします。
3つの配列のうち最小のやつを選びたいのですが、

minimum( Gx[i][j-1] , Gx[i-1][j] , Gx[i-1][j-1] );
としてminimumに渡したいのですが、

minimum' : 1 番目の引数を 'unsigned char' から
'int [][512]' に変換できません。

とエラーが出て上手く渡せません。どうしたらよいでしょうか。

ちなみに

#define X_SIZE 512
unsigned char Gx[X_SIZE][X_SIZE];

unsigned char minimum(unsigned char Gx1[X_SIZE][X_SIZE],
  unsigned char Gx2[X_SIZE][X_SIZE],
unsigned char Gx3[X_SIZE][X_SIZE]){
}

と、しているのですが・・・。

758 :デフォルトの名無しさん:02/12/14 12:20
>>757
minimum の宣言がどうなってるんだろうねぇ。

759 :デフォルトの名無しさん:02/12/14 12:21
>>757
マルチポストすんな
回線切って首吊って氏ね

760 :デフォルトの名無しさん:02/12/14 15:26
教えてほしいんですけど、リンクってどうやるんですか?

リンカにお願いするとかは無しよ。

761 :デフォルトの名無しさん:02/12/14 15:36
>>760
リンカ無しでリンクすんの?

762 :デフォルトの名無しさん:02/12/14 15:54
>>760
//LKED EXEC PGM=IEWL,REGION=96K,PARM=(XREF,LET,LIST)

763 :デフォルトの名無しさん:02/12/14 16:09
>>760

764 :デフォルトの名無しさん:02/12/14 16:16
リンカの内部動作を知りたいということ?

765 :デフォルトの名無しさん:02/12/14 16:25
リンカタンの内部動作(´Д`;)ハァハァ

766 :デフォルトの名無しさん:02/12/14 18:42
チチビンタリカ

767 :デフォルトの名無しさん:02/12/14 20:50
#define MAX 21
double u[MAX][MAX], f[MAX][MAX];

void poisson_equation(u,f)
double u[MAX][MAX],f[MAX][MAX];
{
この部分で関数の定義間違っていますとメッセージが出るのですが、
どうしてなのか分かりません。どこがおかしいのでしょう?


{

768 :デフォルトの名無しさん:02/12/14 20:57
>>767
void poisson_equation(double u[MAX][MAX],double f[MAX][MAX])

769 :デフォルトの名無しさん:02/12/14 21:09
>>767
>> {

}

770 :デフォルトの名無しさん:02/12/14 21:12
>>767
関数の引数定義ではマクロは使えませんよ。
MAXを直接21と書き換えてしまってください。

771 :767:02/12/14 21:15
>>770
わかりました。ありがとうございます。

772 :デフォルトの名無しさん:02/12/14 21:20
>>768
void poisson_equation(double u[][MAX],double f[][MAX])

773 :デフォルトの名無しさん:02/12/14 21:22
>>770
どこのコンパイラでそうなってるんだ?

774 :デフォルトの名無しさん:02/12/14 21:24
>>770
お前適当なこと吹き込むなよ。
コンパイラとプリプロセッサの違い分かってる?

775 :デフォルトの名無しさん:02/12/14 21:24
>>770
ま、まじっすか?

776 :デフォルトの名無しさん:02/12/14 21:29
>>774
お前にはわかっているというのか?

777 :デフォルトの名無しさん:02/12/14 21:33
>>776
わからないんだったら、ここで素直に聞いておいたほうがいいよ。

778 :776:02/12/14 21:35
>>777
教えてくれ。

779 :デフォルトの名無しさん:02/12/14 21:41
>>778
おもろいやつだなw

#で始まる命令はプリプロセッサが処理する。
コンパイラに渡されたソースではMAXという文字列ではなく21という数字になっている。
だからMAXを21に変えたところでコンパイルには何も影響が無い。

780 :776:02/12/14 21:56
>>779
大体解った。

#define MAX yahoo

printf("MAX"); → printf("yahoo");

ってなってくれんだな。結構慎重に使わないとやばいな。

781 :デフォルトの名無しさん:02/12/14 21:57
>>780
ネタなのか?

782 :デフォルトの名無しさん:02/12/14 22:01
>>780
Cプリプロセッサはそういう挙動はしない。

783 :デフォルトの名無しさん:02/12/14 22:01
ネタにきまってんじゃん

784 :776:02/12/14 22:06
>>782
じゃあ、どう動くんだ?

785 :デフォルトの名無しさん:02/12/14 22:11
>>784
$ cat hoge.txt

#define MAX yahoo

1. printf("MAX");
2. MAX
3. [MAX]
4. // MAX
5. /* MAX */


$ cpp --version
cpp (GCC) 3.2 20020927 (prerelease)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.



786 :結果:02/12/14 22:12

$ cpp hoge.txt

# 1 "hoge.txt"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "hoge.txt"


1. printf("MAX");
2. yahoo
3. [yahoo]
4.
5.


787 :776:02/12/14 22:13
>>786
すまんが日本語で説明してくれ

788 :デフォルトの名無しさん:02/12/14 22:14
>>787
>>785のhoge.txt にCプリプロセッサをかけると
>>786になる。

説明も何もそのままだ。

789 :デフォルトの名無しさん:02/12/14 22:19
a[i++] = i;
は禿しく未定義なんでしょうか。

790 :776:02/12/14 22:22
>>789
未定義だ

791 :デフォルトの名無しさん:02/12/14 22:25
なんで!?

792 :776:02/12/14 22:25
>>788
おまえも理解していないってことだな

793 :デフォルトの名無しさん:02/12/14 22:30
C言語は仕様をどれだけ覚えているかを競って遊ぶ言語です。

794 :デフォルトの名無しさん:02/12/14 22:31
>>792
ハァ。見りゃ分かるだろ。
Cプリプロセッサは文字列リテラルの中には関与しないんだよ。

795 :776:02/12/14 22:36
>>794
根拠は?

796 :903:02/12/14 22:37
>>794
まあ、ここまでくればネタか本当のアフォだろ >>776
無視しとこうよ。

797 :デフォルトの名無しさん:02/12/14 22:39
>>776
よっぽど悔しかったんだね。プ

798 :デフォルトの名無しさん:02/12/14 22:40
>>795
>>786を見ろ。

>>796
確信犯か、わざとやってるかのどっちかだな。
そうします。

799 :デフォルトの名無しさん:02/12/14 23:04
>>795
C90およびC99。

800 :デフォルトの名無しさん:02/12/14 23:06
>>795
800げっと。

801 :デフォルトの名無しさん:02/12/14 23:18
>>794
文字列の連結は、関与と言えば関与のような…

802 :デフォルトの名無しさん:02/12/14 23:42
>>780
それはK&Rのfirst editionではないか?

803 :デフォルトの名無しさん:02/12/14 23:45
>>801
>>794「文字列リテラルの中」と書いてあるが?
#中という表現もどうかと思うが。

804 :真面目に質問:02/12/15 00:22
すいません。質問します。

ソース
sprintf(qs,"Cookie: NAME=%s; MAIL=%s",UrlEncode("aaa"),UrlEncode("aaa"));

デバッグでqsに入っている文字列を見ると、
"フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフミケ"
となり、文字列が変換・代入されません。

どうして、こうなるのでしょうか?
すいません、初歩的な質問で・・・

805 :デフォルトの名無しさん:02/12/15 00:27
>>804
それだけじゃわからん。前後でなにしているのか、どの段階でそうなっているのかかけ。
その関数実行後にそうなっているのか?
環境とコンパイラとデバッグ環境は・

806 :デフォルトの名無しさん:02/12/15 00:31
( ´∀`)フフフフフフフフフフフ……(;゚Д゚)ミゲ!

807 :真面目に質問:02/12/15 00:33
Windows XP
VisualC++6

ソース
char qs[100];
sprintf(qs,"Cookie: NAME=%s; MAIL=%s","aaa","aaa");

文字列の変換をしたいだけです。
結果として、qsには、「"Cookie: NAME=aaa; MAIL=aaa"」と入ってくれればOKです。
ただ、これだけです。関連しているのは。
MFCだと、CStringを使えば、簡単に文字列操作ができますが・・・。

どこに問題があるのでしょうか?

808 :真面目に質問:02/12/15 00:34
>>807 の続き。
qsには"フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフミケ"
と代入されます。なぜでしょうか。

809 :デフォルトの名無しさん:02/12/15 00:35
>>807
デバッガで矢印がsprintfの次までいった時点で見てるのか?
→sprintf(...)
ってときにみてもおかしなものが入っているのは当然だぞ。

810 :デフォルトの名無しさん:02/12/15 00:36
んなアフォな

811 :真面目に質問:02/12/15 00:37
>>809
いえ、その関数を実行した後です。


812 :デフォルトの名無しさん:02/12/15 00:39
>>807
んなアフォな。何か隠してるだろ?

813 :デフォルトの名無しさん:02/12/15 00:40
>>811
コンパイル時になんか警告でなかった?

814 :真面目に質問:02/12/15 00:41
>>ALL
いえ、全くエラーはでません。
多分、何か、基本的な間違いをしているのだと思いますが・・。
それが、解らなくて・・。困ってます。(涙)

815 :デフォルトの名無しさん:02/12/15 00:43
謎は全て解けた!
#define sprintf(a,b,c,d) strcpy(a, "フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフミケ")
こういうマクロが定義されていたんだ!

816 :デフォルトの名無しさん:02/12/15 00:43
>>814

main() {
  char qs[100];
  sprintf(qs,"Cookie: NAME=%s; MAIL=%s","aaa","aaa");
  printf("%s",qs);
}
でもフフフフ…なのかい?

817 :デフォルトの名無しさん:02/12/15 00:44
>>807
全コードを載せてくれ

818 :デフォルトの名無しさん:02/12/15 00:45
>>814
807のソースをそのまま貼り付けてコンパイルして実行してもそうなるの?
そうならデバッガが壊れている。
そうでなければ変な結果になるソースのその部分の処理のまとまりをあげてくれなきゃ解決できない。

819 :デフォルトの名無しさん:02/12/15 00:45
VC++だとフフフフフ…は良く見るよな。領域確保された時点でフ(コード忘れた)で埋まるんだよね。

820 :デフォルトの名無しさん:02/12/15 00:47
>>819
デフォルトの初期化がフだと?

821 :真面目に質問:02/12/15 00:48
>>816
やってみます。

822 :デフォルトの名無しさん:02/12/15 00:50
C/C++の宿題なら私にやらせろ!
http://pc3.2ch.net/test/read.cgi/tech/1039772622/137
マルチに降格しました。
真面目に質問は放置でお願いします。


823 :デフォルトの名無しさん:02/12/15 00:51
もう寝ようと思っていたのに変な質問あげやがって。
結果が気になるじゃねーか。

824 :真面目に質問:02/12/15 00:51
>>816
main() {
  char qs[100];
  sprintf(qs,"Cookie: NAME=%s; MAIL=%s","aaa","aaa");
  printf("%s",qs);
}
だと、きちんと表示されました!!!!

何が違うのだろうか・・・???

825 :デフォルトの名無しさん:02/12/15 00:53
>>824
だからソース上げろ。その処理が書いてある関数全体を。

826 :真面目に質問:02/12/15 00:55
>>822
あれ?マルチはだめなんですか。すいません。
この掲示板は初心者なモンで。
皆様にはご迷惑をおかけしました。

で、VisualC++を再起動しなおして、ビルドしたら、きちんと表示されました。
何が原因でこうなったかは、わかりませんが、一応解決しました。

誠にすいませんでした。
今度から気をつけます。

827 :真面目に質問:02/12/15 00:58
いまから、2CHにクッキーを転送して書き込もうとしているところなんですよ。

うまくいくかどうか、心配ですが、夜が明けるまでには、書き込みがうまくいくように、
必死でプログラミングしています。

828 :デフォルトの名無しさん:02/12/15 01:01
http://cocoa.2ch.net/test/read.cgi/qa/1039870549/883

こいつ、ここの人でしょ?
うざいんですけど。

829 :親切な人:02/12/15 01:03

ヤフーオークションで、凄い人気商品、発見!!!

プランテック製の「 RX-2000V 」を改造済み
にした、アイティーエス製の「 RX-2000V 」↓
http://user.auctions.yahoo.co.jp/jp/user/neo_uuronntya

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。

ヤフー ID の無い方は、下記のホームページから、
購入出来る様です↓
http://www.h5.dion.ne.jp/~gekitoku/#.2ch.net/

830 :確かにうざいね:02/12/15 01:16
初心者の質問@2ch掲示板
もの凄い勢いで誰かが質問に答えるスレ3639
http://cocoa.2ch.net/test/read.cgi/qa/1039870549/811-
811 :JPS ◆XXXAXAQILI :02/12/15 00:53
友達いなそうw

852 :JPS ◆XXXAXAQILI :02/12/15 00:57
死ね死ね団キモイ
860 :JPS ◆XXXAXAQILI :02/12/15 00:57
馬鹿は死ねw

872 :JPS ◆XXXAXAQILI :02/12/15 00:58
屑w

883 :JPS ◆XXXAXAQILI :02/12/15 00:59
おまえってゴミだねw

902 :JPS ◆XXXAXAQILI :02/12/15 01:01
クズなんだから死ねw

910 :JPS ◆XXXAXAQILI :02/12/15 01:02
ゴミ失せろw

922 :JPS ◆XXXAXAQILI :02/12/15 01:03
糞虫w


831 :デフォルトの名無しさん:02/12/15 01:17
char str[4] = "2ch";

printf("%d",(unsigned int)sizeof(str));

なら上手く行くのに


char (*str)[4] = "2ch";

printf("%d",(unsigned int)sizeof(*str));

とやるとエラーが出るのはなぜでしょうか?
多次元配列がよくわからなくて色々やってたらふと疑問に思ったのですが・・・

832 :デフォルトの名無しさん:02/12/15 01:18
>>819
VC++のデバッグビルドだと、全てのローカル変数を'ヘ'(0xcc)で初期化して、
ポインタとして触ったときにAccess Violationするようにしてるんじゃなかったか?
Win32だと0x80000000以降のアドレスはカーネル用で絶対触れないからね。

よーするに、初期化してない自動変数には何入ってるかわからん、ってことさヽ(´ー`)/



833 :デフォルトの名無しさん:02/12/15 01:20
>char (*str)[4] = "2ch";
なんだこりゃ......

834 :デフォルトの名無しさん:02/12/15 01:22
>>831
エラーって何よ?コンパイルエラー?
それくらいは書け阿呆

835 :デフォルトの名無しさん:02/12/15 01:22
後者のstrは配列へのポインタ。文字列リテラルは配列ではない。
つーか、アラーメッセージ見た?

836 :デフォルトの名無しさん:02/12/15 01:23
>>831
printf("%d",(unsigned int)sizeof(str));
で何が知りたいのかも気になるところだが.

837 :デフォルトの名無しさん:02/12/15 01:24
>>835
アラーメッセージ.......ムスリムでつか?

838 :デフォルトの名無しさん:02/12/15 01:25
>>833
サイズが4であるchar型の配列へのポインタだろ

839 :デフォルトの名無しさん:02/12/15 01:25
無間に続く数列の値を入力として、平均値をとって返す関数
を考える。単純に、n番目に入力された値までの平均値

(A0 + A1 + A2 + ... An)/n

を計算しようとすると、分母も分子も32ビットの範囲をいずれ越えて
一回りしてしまうかも。何かいい方法ない?


840 :デフォルトの名無しさん:02/12/15 01:25
>>838
んなこたぁ分かっとるわ!クソヴォケ!

841 :デフォルトの名無しさん:02/12/15 01:26
64ビットでやろう。

てか、構造体つくって繰上りとか自分でなんとかしる。

842 :デフォルトの名無しさん:02/12/15 01:27
>>837
最近流行りらしい<アラーメッセージ
最初見た時はめちゃワロタ。

843 :デフォルトの名無しさん:02/12/15 01:27
>>838
良く読むと違う気が(w

844 :デフォルトの名無しさん:02/12/15 01:27
アラー(゚д゚ )

845 :デフォルトの名無しさん:02/12/15 01:28
>>839
束胃腸演算

846 :デフォルトの名無しさん:02/12/15 01:28
束胃腸演算 ??

847 :デフォルトの名無しさん:02/12/15 01:28
>>843
ということは>>840の立場って…

848 :デフォルトの名無しさん:02/12/15 01:29
>>843
ん?何が違う?

849 :デフォルトの名無しさん:02/12/15 01:29
面白くなって参りました
>>846
多倍長じゃないの?

850 :デフォルトの名無しさん:02/12/15 01:29
>>847
吊られたってコトさ。

851 :デフォルトの名無しさん:02/12/15 01:30
↓「釣れた」の予感?

852 :デフォルトの名無しさん:02/12/15 01:30
漏れた

853 :デフォルトの名無しさん:02/12/15 01:30
平均の取り方の工夫(層化平均にはこだわらない)でなんとかならない?

854 :デフォルトの名無しさん:02/12/15 01:32
32ビットと限定するのは何故?

855 :デフォルトの名無しさん:02/12/15 01:32
すいません!
s undeclared
というアラーメッセージが出ます!
やはりラマダンのときにパンをつまみ食いしたのが悪かったんでしょうか!?

856 :831:02/12/15 01:33
>>835
今一度コンパイルし直したらただの警告が出てきますた。でちゃんと動きました。
さっきのエラーは一体なんだったんでしょうね。(←これについての突っ込みは無しということで)
お騒がせしました。

>>836
いえ、ただの遊びのつもりで

この板れすが速くてイイですね。

857 :デフォルトの名無しさん:02/12/15 01:34
>>854
特に限定してるわけじゃありません。
64ビットでやれってのでもいいんだけど、それでもいずれ限界がくるから
別のスマートな方法ってないのかなと、、、

858 :デフォルトの名無しさん:02/12/15 01:35
コンピュータが無限なんてあつかえねーんだよヴォケ

859 :デフォルトの名無しさん:02/12/15 01:36
>>858
誰もそんなこと言ってねーよクァス

860 :デフォルトの名無しさん:02/12/15 01:37
>>857
そんなこと言い出したらきりないでしょ。
最後には数値がビット表現で10TBを超えちゃう場合とかも考えるわけ?

861 :デフォルトの名無しさん:02/12/15 01:38
>>855
吐けば消える。
今からでも遅くない。
やれ。
やるんだ。

862 :デフォルトの名無しさん:02/12/15 01:38
メモリは有限だからいつかは限界がくるんだよ。

863 :デフォルトの名無しさん:02/12/15 01:39
>>856
警告消したいならキャスト汁
char (*str)[4] = ( char(*)[4] )"2ch";

864 :デフォルトの名無しさん:02/12/15 01:39
>>861
もううんちとして排出してしまいましたので、
うんちを取り返しておしりから入れて口から出したいと思います。

865 :デフォルトの名無しさん:02/12/15 01:40
>>863
おまい, 分かってねーなw

866 :デフォルトの名無しさん:02/12/15 01:42
(゚Д゚)ハァ?

867 :デフォルトの名無しさん:02/12/15 01:42
>>860
たしかにそうかもですね。
>>841さんのいわれるように、繰り上がりとかのケアをするようにするかな。


868 :デフォルトの名無しさん:02/12/15 01:43
>>856
そのコードで警告のみ・・・怪しいですな。

869 :デフォルトの名無しさん:02/12/15 01:44
>>868
怪しいのはてめーだこのDQN原人

870 :デフォルトの名無しさん:02/12/15 01:44
どうでもいいけどデリケートな部分って一体どこなの?

871 :デフォルトの名無しさん:02/12/15 01:45
♪探し物はナンですか?

872 :デフォルトの名無しさん:02/12/15 01:46
ねいちゃんのパンツ

873 :デフォルトの名無しさん:02/12/15 01:46
>>865
(void *)の方が良かったか?

874 :デフォルトの名無しさん:02/12/15 01:51
>>872
デリケートでデリシャス…

875 :デフォルトの名無しさん:02/12/15 01:52
しみつき

876 :デフォルトの名無しさん:02/12/15 01:52
キャストして済ませばいいという問題か否か。

877 :デフォルトの名無しさん:02/12/15 01:53
char *(*_)(int (*(*a)(const void *, const void*))[5]) = (void *)"2ch";

878 :デフォルトの名無しさん:02/12/15 01:54
>>856
char* str = "2ch"と同じことだろ。


879 :865 :02/12/15 01:54
>>863
ごめん, おまいは合ってるわ. 正直すまんかった.

880 :デフォルトの名無しさん:02/12/15 01:54
[5]

881 :デフォルトの名無しさん:02/12/15 01:54




865 名前:デフォルトの名無しさん 投稿日:02/12/15 01:40
>>863
おまい, 分かってねーなw






882 :デフォルトの名無しさん:02/12/15 01:56
>>876
こうしろってか?
char str[1][4] = { "2ch" } ;
char (*strp)[4] = str ;
わざわざ、こんな事しなくても分かってれば良いんじゃねぇか?

883 :デフォルトの名無しさん:02/12/15 02:00
>>882
char str[4] = "2ch";
char (*strp)[4] = &str;

なぜこう書かない?

884 :デフォルトの名無しさん:02/12/15 02:02
>>883
>>831で多次元配列が云々って言ってるから

885 :デフォルトの名無しさん:02/12/15 02:04
>>883
プププ

886 :883:02/12/15 02:06
>>884
おお、そうか!それは失礼。
でも>>831のコードは多次元配列ではないけどね。


887 :デフォルトの名無しさん:02/12/15 02:13
>>886
なんで多次元配列でないの?
もっとも、本当は配列の配列だという意味ならその通りだけど。

888 :デフォルトの名無しさん:02/12/15 02:15
配列へのポインタでしょ
どう見たって。

889 :デフォルトの名無しさん:02/12/15 02:16
推測だが...
>>831氏が多次元配列で悩んでるっていうのは,

char ss[4][4]={ "1ch", "2ch", "3ch", "4ch"};
とかやりたいんはないのか?多分.

890 :デフォルトの名無しさん:02/12/15 02:17
>>887
多次元配列が云々が無ければ配列へのポインタやね

891 :デフォルトの名無しさん:02/12/15 02:17
あ、ごめん。
>>883のコードだと早とちりしてた。。
忘れてくれ。

892 :デフォルトの名無しさん:02/12/15 02:18
>>887
キャストしていないのは置いといて・・・
>>831のコードは4バイト(俺の処理系では)の1次元配列の
先頭アドレスを格納する変数って意味では?

だから配列の配列ではない。

893 :887,891:02/12/15 02:19
ちがう。>>882だ。

894 :デフォルトの名無しさん:02/12/15 02:20
>>892
>>>831のコードは4バイト(俺の処理系では)の1次元配列の
揚げ足取られないようにしたつもりだろうが
どの処理系でも4Byteだ。

895 :デフォルトの名無しさん:02/12/15 02:21
>>889
リモコン作るんですか?

896 :デフォルトの名無しさん:02/12/15 02:22
>>894
釣りしてたんだろ?

897 :デフォルトの名無しさん:02/12/15 02:35
つっこまれたら釣り扱いか。

898 :デフォルトの名無しさん:02/12/15 02:43
>>892==894じゃねぇのか?
でアライメントが何たらかんたらって出てくるのを
期待してたんじゃ無かったのか?

899 :デフォルトの名無しさん:02/12/15 02:45
(゚Д゚).......!?

900 :831:02/12/15 02:46
情報が交錯してなんか混乱してきましたので、頭を冷やして自分を見つめ直してみます。
こんな夜中に大量にレス付けて下さってありがとうございます。
おまいら最高です。
(多次元配列云々は恐らく蛇足でした。脳内あぼんして下さい。)

901 :デフォルトの名無しさん:02/12/15 02:46
何たらかんたらって何ぞ?

902 :デフォルトの名無しさん:02/12/15 02:50
>>901
それは, , , あの, , , , つまり, , ,

あれだ.

903 :デフォルトの名無しさん:02/12/15 02:51
そういうことか、分かった。

904 :デフォルトの名無しさん:02/12/15 03:03
よっ、待ってましたっ!!

905 :デフォルトの名無しさん:02/12/15 03:07
char s[][4] = {"2ch"};
char *s2[3] = (char (*)[3])&(((char *)*s)+1);

906 :831:02/12/15 03:12
追伸
>>863氏のやり方で上手く行きました。
ただ、何故キャストすると上手く行くのかがよくわかってないのでもう少し考えてみます。

907 :デフォルトの名無しさん:02/12/15 03:29
>>831
配列へのポインタは>>882>>883の様にして使います
で警告が出る原因は
char cp[4] = "2ch" ;
int *ip = cp ;
で警告が出るのと同じ様に、左右の型が違うからです
まぁ、これで分からなかったら本でも読んで
もう一度ポインタについて勉強しなおして下さい

908 :デフォルトの名無しさん:02/12/15 03:43
>>905への突っこみは誰も入れないのか
つーか、寝てるのか

909 :デフォルトの名無しさん:02/12/15 03:50
飽きた

910 :デフォルトの名無しさん:02/12/15 04:40
へーちょ

911 :デフォルトの名無しさん:02/12/15 06:11
>>831
かなり冗長的だし余計混乱するかもしれませんが
これを実行して各初期値と結果を見比べれば少しは理解出来るかも
int main() {
char str1[4] = "012" ;
char *str2 = str1 ;
char str3[2][4] = { "345","678" } ;
char (*str4)[4] = str3 ;
char *str5 = str3[0] ;
int i = 1 ;
printf("(char*) str1 (string) %s\n", str1) ;
printf("(char*) str1 (char ) %c\n", *(*((char(*)[4])str1+0))) ;
printf("(char*) str1+i (string) %s\n", str1+i) ;
printf("(char*) str1+i (char ) %c\n", str1[i]) ;
printf("(char*) str2 (string) %s\n", str2) ;
printf("(char*) str2 (char ) %c\n", *(*((char(*)[4])str2+0))) ;
printf("(char*) str2+i (string) %s\n", str2+i) ;
printf("(char*) str2+i (char ) %c\n", *(str2+i)) ;
printf("(char(*)[4]) str3+i (string) %s\n", str3+i) ;
printf("(char(*)[4]) str3+i (char ) %c\n", *(*(str3+i))) ;
printf("(char*) *str3+i (string) %s\n", *str3+i) ;
printf("(char*) *str3+i (char ) %c\n", *(*str3+i)) ;
printf("(char(*)[4]) str4+i (string) %s\n", str4+i) ;
printf("(char(*)[4]) str4+i (char ) %c\n", *(*(str4+i))) ;
printf("(char*) *str4+i (string) %s\n", *str4+i) ;
printf("(char*) *str4+i (char ) %c\n", *(*str4+i)) ;
printf("(char*) str5 (string) %s\n", str5) ;
printf("(char(*)[4]) *str5+i (char ) %c\n", *(*((char(*)[4])str5+i))) ;
printf("(char*) str5+i (string) %s\n", str5+i) ;
printf("(char*) str5+i (char ) %c\n", *(str5+i)) ;
return 0 ;
}

912 :デフォルトの名無しさん:02/12/15 09:15
delete noname00.c

913 :831:02/12/15 15:40
>>907>>911
なんとなくわかってきました。ありがとうございます。

914 :デフォルトの名無しさん:02/12/15 16:03
int a;
double b = 1.1;
a = b;
これに対してgccはwarningを出してくれません。
そのせいでバグってた、っての結構ある気がする。

915 :デフォルトの名無しさん:02/12/15 16:24
>>911
pointer.c:17: warning: char format, different type arg (arg 2)
pointer.c:21: warning: char format, different type arg (arg 2)
printf("(char(*)[4]) str3+i (string) %s\n", str3+i) ;
printf("(char(*)[4]) str4+i (string) %s\n", str4+i) ;
ここでwarningがでます。
(str3+i)[0]
(str4+i)[0]
としたら出なくなりました。

916 :デフォルトの名無しさん:02/12/15 16:24
>>911
pointer.c:17: warning: char format, different type arg (arg 2)
pointer.c:21: warning: char format, different type arg (arg 2)
printf("(char(*)[4]) str3+i (string) %s\n", str3+i) ;
printf("(char(*)[4]) str4+i (string) %s\n", str4+i) ;
ここでwarningがでます。
(str3+i)[0]
(str4+i)[0]
としたら出なくなりました。

917 :デフォルトの名無しさん:02/12/15 16:25
連続投稿スマソ。
つーか規制しろよ。

918 :デフォルトの名無しさん:02/12/15 20:16
char buf[100];
fprintf(stdin , "hello");
fread(stdin , buf , sizeof(buf) - 1);
ってしても読み込めません。これはできないのでしょうか?
ほかにいい方法はありますか?

919 :デフォルトの名無しさん:02/12/15 20:28
>>918
> fprintf(stdin , "hello");

はぁ ? stdin ってなにもんかわかってるか ?

> ほかにいい方法はありますか?

一体何がしたいんだ ?

920 :918:02/12/15 20:33
>>919
すみません。どういうもんなのでしょうか?

921 :デフォルトの名無しさん:02/12/15 20:49
>>920
stdin: Standard Input, 標準入力
fprintf() は、出力する関数だから stdin は使えない。

922 :918:02/12/15 21:08
>>921
なんとなくわかりました。
やりたかったのは、標準入力されたようにして、freadでその入力されたものを取り出したいと思ったのですが、
どういうふうにすればいいのでしょうか?

923 :デフォルトの名無しさん:02/12/15 21:14
>>922
> やりたかったのは、標準入力されたようにして、freadでその入力されたものを取り出したいと思ったのですが、

自分で出力したものを、入力したいのか ? なんでまたそんなことを...。

まあ、良くわからんけど取りあえず適当なファイルに fprintf() して、それを fread() すれば ?
fopen()/fclose() とかについても調べた方が良いよ。

924 :デフォルトの名無しさん:02/12/15 21:49
>>918
ungetc() のような事をさせたいんでしょうか…?

925 :デフォルトの名無しさん:02/12/15 22:02
>>924
それにしては、先に出力してるしなぁ...。
unputc() みたいなことしたいのか ? ってどう言う状況だろう...。

926 :デフォルトの名無しさん:02/12/15 22:20
まさか標準入力されたものをbuf[]に格納したいだけだとか

927 :918:02/12/15 22:50
>>924
そういう感じです。
1文字じゃなくて文字列全体を戻して、
別の処理でそれをfreadやfgetcで取り出していきたいのですが、
どうすればいいのでしょうか?

928 :デフォルトの名無しさん:02/12/15 22:55
>>927
別にストリームに戻さなくてもいいと思うぞ。

strcpy(buff, "hellow");

として、buff をその「別の処理」とやらに渡せばすむ話じゃないの ?

929 :デフォルトの名無しさん:02/12/15 22:57
hellow

何語だ

930 :デフォルトの名無しさん:02/12/15 23:01
節穴か? hello world の略じゃん

931 :デフォルトの名無しさん:02/12/15 23:13
>>929
typo だ。気にするな。
取りあえず、"hellow" でググって見たら、28,100件もヒットしやがった。
全部が間違いではないだろうが、結構間違いやすい単語のようだ。

と、言い訳しとこう...。

932 :918:02/12/15 23:36
>>928
戻したものを再び取り出すのに意味があるんです。
わけは聞かないでください。
何か方法はないでしょうか?

933 :デフォルトの名無しさん:02/12/15 23:39
>>932
>戻したものを再び取り出すのに意味があるんです。
プログラムの組み方が間違ってると思われる

934 :918:02/12/15 23:45
>>933
ごめんなさい。組み方に問題があるのは重々承知しています。
でもぼくにはどうしようもないんです。
できるかできないか教えていただけないでしょうか?

935 :デフォルトの名無しさん:02/12/15 23:52
>>934
標準「入力」に「出力」できるわけないだろ?

936 :デフォルトの名無しさん:02/12/15 23:54
>>934
標準入力じゃないと駄目なの?
例えば、一度標準入力から入力されたものを
他のファイル(入出力モード)に出力して
fseek等を駆使して適当にでっち上げるとか…

937 :デフォルトの名無しさん:02/12/15 23:56
何がしたいのかさっぱり分からん。
根本的にとんでもなく間違ってる余寒。

938 :918:02/12/15 23:58
>>936
呼び出さなければいけない関数のほうが標準入力から値をとってきているんです。
正直にいうとCGIで使われている関数を呼び出して処理しなければいけないんです。
getenvなどで取得する値は問題ないのですが、標準入力からも値をとってきている処理のために、
そこに値を入れておかないと処理がエラーで終了してしまいます。
なにかいい知恵はないでしょうか?


939 :デフォルトの名無しさん:02/12/16 00:05
パイプを使う

940 :デフォルトの名無しさん:02/12/16 00:06
そのCGIを変更しろ。つか晒せ。

941 :デフォルトの名無しさん:02/12/16 00:09
>>918
仕様を書いてくれ


942 :デフォルトの名無しさん:02/12/16 00:27
>>938
他のファイルに出力して
その関数にはstdinをfreopen()した物で動く事を期待してみるとか
つーか、その関数で標準入力から読み取ってるデータを
全てbufにコピーしておく方が良い

943 :デフォルトの名無しさん:02/12/16 00:47
>>938
バイプを使うに++

944 :デフォルトの名無しさん:02/12/16 00:51
>>938
そりゃパイプだろ

945 :デフォルトの名無しさん:02/12/16 00:58
バイブを使うに--

946 :デフォルトの名無しさん:02/12/16 01:16
うにー!

947 :デフォルトの名無しさん:02/12/16 11:50
age

948 :デフォルトの名無しさん:02/12/16 19:10
ファイルからある形式で書かれたデータを読み込むプログラム
を作成中ですが、如何せん下手糞です。そこで熟練プログラマは
どういう風に書いているのかな?と思いたって、ソースコードが
見れるところを探しているんですが、痒いところに手が届くような
自分が探しているのにマッチしたところが見つからないです。

どこか有名なところないでしょうか?C言語でCSV形式のファイル
を変換するようなプログラムを求めています。perlとかが主流み
たいでなかなか見つかりません。

949 :デフォルトの名無しさん:02/12/16 19:14
sscanfで手っ取り早く・・・

950 :デフォルトの名無しさん:02/12/16 19:22
>>948
ソースが汚くて下手だけどここなんかは?

http://www.orchid.co.jp/computer/cschool/csv2.html

951 :デフォルトの名無しさん:02/12/16 19:38
>>950
BASICみたいな書きかたしとるな…

952 :デフォルトの名無しさん:02/12/16 22:10
>>948
http://www.cs.bell-labs.com/cm/cs/tpop/csvgetline2.c

953 :デフォルトの名無しさん:02/12/16 23:02
なんだかんだいろいろあったがそろそろ次スレの季節だな。
まともなスレが立ちますように。

954 :デフォルトの名無しさん:02/12/16 23:06
初心者ですが、>>952の日本語訳
プログラミング作法
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3649-4.html
って手元にあっても損はないもんですか?

スレ違いでスマソ。

955 :デフォルトの名無しさん:02/12/16 23:07
今ある偽スレを再利用しようよ。<次スレ

956 :デフォルトの名無しさん:02/12/16 23:12
糞スレは所詮糞スレ。
駄目な奴は何をやっても駄目

957 :デフォルトの名無しさん:02/12/16 23:13
このスレは950を超えました間もなく蛍の光が流れるでしょう。

958 :デフォルトの名無しさん:02/12/16 23:16
>>955
またいらぬ荒らしの元になる気がしますが・・・。

959 :デフォルトの名無しさん:02/12/16 23:17
蛍の光・・・saturn light

960 :デフォルトの名無しさん:02/12/16 23:20
>>955
すでに削除依頼が出ているので、それを待ったほうがイイ。

961 :デフォルトの名無しさん:02/12/16 23:23
削除人仕事遅せえ。無能。だから糞スレ立ちつづけるんだ。

962 :デフォルトの名無しさん:02/12/16 23:23
47が2つ出来てるよ

963 :デフォルトの名無しさん:02/12/16 23:25
新スレが立ちました。
速やかに移行ください
http://pc3.2ch.net/test/read.cgi/tech/1040048527/

964 :デフォルトの名無しさん:02/12/16 23:27
>>963
乙・・・って偽スレじゃん。

965 :デフォルトの名無しさん:02/12/17 01:48
じゃ、先に立った方の次スレ。

C言語なら、オレに聞け! 47
http://pc3.2ch.net/test/read.cgi/tech/1040048202/

966 :デフォルトの名無しさん:02/12/17 11:47
宣言してから立てろよ。毎回乱立させんな。

967 : ◆F52DmOxJlc :02/12/17 22:10
賛否両論あったスレタイだったけど無事に終了しそうだね。

968 :デフォルトの名無しさん:02/12/17 22:43
>>967
しかし、10日も持たないとは...。

969 : ◆F52DmOxJlc :02/12/17 23:43
>>968
スレの伸びはいいのにまともな質問が少なくて寂しいね。
やっぱ偽スレ乱立してるせいかな。

970 :デフォルトの名無しさん:02/12/18 22:50
>>969
それは、このスレに限らず全般的な傾向だからなぁ...。
極秘に、「まともなプログラム技術板」でも作って欲しい...。

971 :デフォルトの名無しさん:02/12/18 23:06
極秘すぎて誰も来ない罠

972 :デフォルトの名無しさん:02/12/18 23:26
>>971
まあ、そうなんだよね。
まともだけど、あまり人の来ない掲示板か
ぐちゃぐちゃだけどにぎわってる掲示板...。
究極の選択。

それにしても、最近のぐちゃぐちゃさはちょっと行き過ぎかと。

973 :デフォルトの名無しさん:02/12/19 11:03
ぐちゃぐちゃで、かつ人の来ない掲示板

974 :デフォルトの名無しさん:02/12/19 11:05
>973
荒らしと変わらん罠

975 :デフォルトの名無しさん:02/12/19 13:45
「まともなプログラム技術板」 って、具体的にどんな内容がいいと思うんだ?

976 :あぼーん:あぼーん
あぼーん

977 :デフォルトの名無しさん:02/12/19 15:56
>>973
WebProg板とか、ゲーム製作技術とか?w

まだム板はましだな、それと比べると。

978 :デフォルトの名無しさん:02/12/19 16:57
char *s = "(゚Д゚)ハァ?";
s = s + s;

これを実行すると "(;´Д`) ハァハァ" になると聞いたのですが、なりません。
どうしてですか?

979 :デフォルトの名無しさん:02/12/19 17:05
"(;´Д`) ハァハァ"にはなりません
"(´c_,` ) プッ"になりますよ

980 :デフォルトの名無しさん:02/12/19 17:48
うーん、いまいちだったか

981 :デフォルトの名無しさん:02/12/19 22:15
えっ!1に戻っちゃったのっ!
早く膿めないと

982 :デフォルトの名無しさん:02/12/19 23:31
http://qb.2ch.net/test/read.cgi/saku2ch/1033032078/6

983 :デフォルトの名無しさん:02/12/19 23:35
!= と || では優先順位はどちらが高いでしょうか?

984 :デフォルトの名無しさん:02/12/20 00:03
みかちゃんの方が大事

985 :デフォルトの名無しさん:02/12/20 00:58
!=
つーかリファレンス見れ

986 :デフォルトの名無しさん:02/12/20 02:05
>>983
気分次第。

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

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)