C言語なら俺に聞け 152at TECH
C言語なら俺に聞け 152 - 暇つぶし2ch21:デフォルトの名無しさん
19/06/23 11:00:21.67 0CutuGif0.net
そのような現象が起こるのはC言語の浮動小数点数に限った話ではない
基本的に0か1かの世界であるコンピュータがどうやって浮動小数点数を扱っているのか
その辺のことを考えながらすこし色々調べ直したほうが良い
正確な精度が必要なら浮動小数点数じゃなくて任意精度計算のライブラリを使いましょう

22:デフォルトの名無しさん
19/06/23 12:07:37.92 LchWS7uN0.net
マジモンのネタか
ホームラン級のアホか
それとも嵐か
第四の選択肢をもった世界初の偉人か
どれだ

23:デフォルトの名無しさん
19/06/23 12:20:26.35 6tta8QXL0.net
四次元空間の歪みが原因

24:デフォルトの名無しさん
19/06/23 12:35:51.53 NJ0BedP7r.net
>>21
答えを教えてください。最後の4の正体はなんですか?初心者なので。

25:デフォルトの名無しさん
19/06/23 12:55:52.97 0CutuGif0.net
>>24
あなたがちゃんと>>20を調べたとは思えないので私は答えません。
調べているならちゃんと計算方法も出てくるし、本当にそうなるのか実際に自分の手で試してみようという気も起きると思います。
初心者だからこそ自分で調べて自分で計算してみてください。

26:デフォルトの名無しさん
19/06/23 13:11:05.43 WmqFlq0Wr.net
>>25
スレタイにあるとおりC言語なら俺に聞けとあります。あなたは、その「俺」ではないのですか?なければやむを得ませんね。

27:デフォルトの名無しさん
19/06/23 13:19:19.31 0CutuGif0.net
ちなみにあなたの質問は「C言語」についての質問になっていません
「浮動小数点数を扱う規格」とそれを使った計算結果の質問です
なのでそもそもこのスレで答える筋合いがありません

28:デフォルトの名無しさん
19/06/23 13:38:06.54 6tta8QXL0.net
>>19
>8.21 * 5 = 41.050000000004←この4は何者でしょうか?
>8.21 * 5 = 41.050000000000004
コピペミスか?

29:デフォルトの名無しさん
19/06/23 14:23:31.49 WmqFlq0Wr.net
>>28
コピペではありません。手入力です。0は重要ではありません。最後の4が曲者です

30:デフォルトの名無しさん
19/06/23 14:28:01.64 q+spl44ja.net
誰かと思ったら引数voidじゃん。

31:デフォルトの名無しさん
19/06/23 14:38:43.89 6tta8QXL0.net
手入力だったのかw
じゃあ犯人は君の右手だ

32:デフォルトの名無しさん
19/06/23 14:55:34.65 WmqFlq0Wr.net
そもそもなぜ4でなく0で完結しないのか。0だと不都合があるのか、本質が議論されていないからいつまでたってても解決しませんよ。

33:デフォルトの名無しさん
19/06/23 15:22:02.08 swNRnu090.net
>>32
マジレスすると浮動小数点は内部で2^nの有限和でしか表現できないから(nはマイナスもあり)。
10進数に変換すると誤差が出る。
これで分からないなら諦めろ。

34:デフォルトの名無しさん
19/06/23 15:27:27.16 WmqFlq0Wr.net
>>33
んむ、、。。

35:デフォルトの名無しさん
19/06/23 15:31:00.34 6tta8QXL0.net
桁数には頓着せずに見かけの数値に拘るって
どこかが変

36:デフォルトの名無しさん
19/06/23 15:31:16.28 vVd52qKZ0.net
>>32
答えは>>20で出ており、議論すべきことはなにも残っていない。
残っているのはお前さんが提示された情報をちゃんと調べて自分の頭で考えることだ。
それをした上でまた疑問が出たならそれを質問すればいい。

37:デフォルトの名無しさん
19/06/23 15:36:12.25 WmqFlq0Wr.net
>>35
手入力で適当に0埋めたからヒューマンエラーがあってしかるべき。だからおかしくない。

38:デフォルトの名無しさん
19/06/23 16:21:26.48 lZwOGhs8a.net
>>37
ゲッターの話はもういいの?

39:デフォルトの名無しさん
19/06/23 16:24:54.10 QCIWb8Wa0.net
0.821を=a/2+b/4+c/8+....ってやってみて
出てきたabcd.....を5倍すると最後が4になるってことだよ

40:デフォルトの名無しさん
19/06/23 16:48:18.15 x5yyaGlX0.net
マジレスできるが、おまえの態度が気に入らない

41:デフォルトの名無しさん
19/06/23 17:35:42.12 2hTCNg/0M.net
このレベルの質問者に対して、ieee754読んでこいおしまいも、そうとうどうにかしてる

42:蟻人間
19/06/23 17:39:16.12 /bRV2XXvd.net
基本情報の範囲でしょ。勉強不足。

43:デフォルトの名無しさん
19/06/23 17:50:45.53 6tta8QXL0.net
質問自体がネタにしか思えないからなあ

44:デフォルトの名無しさん
19/06/23 18:04:53.73 RHMsicrzr.net
>>42
申し訳ありません。最初にコメントした通り初心者なもんでして。
1000人の初心者に対して同じ質問しても1000人とも答えられないでしょう。だから恥じらいとかないんです。

45:デフォルトの名無しさん
19/06/23 18:09:08.51 6tta8QXL0.net
>>44
回答してもらって納得するよりも、
自分でやる方が遙かに勉強になる
ヒントだけ書いておこう
数値の内部表現を調べて、演算仮定を追いかけ
計算結果の内部表現を見て、それを10進表示に戻す
以上を追いかけていけば自ずと回答がでる

46:デフォルトの名無しさん
19/06/23 18:17:35.42 CFRhe1LU0.net
>>41
今時ググればいくらでも情報あるから自分で調べる気があるならキーワードだけで充分だろ

47:デフォルトの名無しさん
19/06/23 18:18:38.46 QCIWb8Wa0.net
みんなこの質問に答えると中出しセックスできると本心では思っているからなかなかおしえてくれないよな
中出しセックスができなくなるアニメとかゲームとかパソコンの質問は簡単に教えてもらえるよ

48:デフォルトの名無しさん
19/06/24 00:03:38.49 JSF3ka2M0.net
>>19
普通はCは浮動小数点を内部で2進数で扱っているため。
10進数で歯切れのよい数でも2進数では循環小数になったりして割り切れない値になることがある(例えば10進数で 0.1 は2進数では 0.00110011...という循環小数になる)。そうなるとどうしても10進数文字列への変換で近似値にしか変換できない。
では最初から内部も全て10進数で全て計算すれば良いではないかと思うかも知れないが、それではコンピュータ内部での計算が遅くなる。
遅くなってでも正確さが必用とされるお金の計算等はそれ用のコンパイラまたはライブラリを使用して実現する(あるいはC言語ではないそれ用に設計された言語を使う)。
デフォルトではCは誤差が出てもいいから素早く計算出来る状態になっていると考えて良い。

49:デフォルトの名無しさん
19/06/24 01:06:30.65 zV4JNsEga.net
cでデシマル型ってあんの?

50:蟻人間
19/06/24 03:15:28.63 eqHVB1zL0.net
ない。

51:18
19/06/24 05:23:21.67 218UFAwP0.net
URLリンク(home.a00.itscom.net)
こういうものでチェックしたら完全にクロスプラットフォームになるの?
ifdefとかなしで?

52:デフォルトの名無しさん
19/06/24 07:23:45.27 zxVE+D4VM.net
>>48
> では最初から内部も全て10進数で全て計算すれば良いではないかと思うかも知れないが、それではコンピュータ内部での計算が遅くなる。
それ以前に1/3ってやられたら同じことになる
10進数だと内部形式と外部形式で変換誤差が出ないだけで計算にまで言及したら10進数も2進数も同じだよ

53:デフォルトの名無しさん
19/06/24 09:50:57.10 Ih+U6NjR0.net
要は有効桁数を意識してりゃいいんだよ
それ以上の制度が欲しいなら専用ライブラリ使えばいい

54:デフォルトの名無しさん
19/06/24 11:14:12.23 UiRTkeqO0.net
2進数で計算する方が悪い
ちゃんと10進数で計算するライブラリを使え

55:デフォルトの名無しさん
19/06/24 12:10:10.27 K2wdCfDba.net
>>54
53の言ってる意味わからんでしょ

56:デフォルトの名無しさん
19/06/24 12:34:02.56 yt8SVBnP0.net
>>49
URLリンク(www.open-std.org)

57:デフォルトの名無しさん
19/06/24 12:50:07.91 6xXOOyfaa.net
>>52
そうだね。
>>53
そういう事だな。

58:デフォルトの名無しさん
19/06/24 13:01:39.05 KbxaxfSBM.net
有理数で計算するライブラリを使えばいい。
パイ?何それおっぱいのこと?

59:デフォルトの名無しさん
19/06/24 13:12:08.72 BrGul7Md0.net
有理数計算は実装してみれば分かるが圧倒的に遅いからな
無理数はどうやって実装するのか知らん

60:デフォルトの名無しさん
19/06/24 15:14:23.48 KYWI3ygZ0.net
有理数で計算したあと最後に無理数に直すところで一番最後が4になったらどうするんだよ

61:デフォルトの名無しさん
19/06/24 15:23:01.79 HSUghupZx.net
>>60
4を引けばいいじゃない。

62:デフォルトの名無しさん
19/06/24 15:23:13.21 zV4JNsEga.net
無理数って円周率とかeだろ?
違ったっけ?

63:デフォルトの名無しさん
19/06/24 15:30:42.35 KYWI3ygZ0.net
有理数じゃなければ無理数だろ

64:デフォルトの名無しさん
19/06/24 16:31:31.15 Ih+U6NjR0.net
メモリが有限である限り無理数を厳密に表現するのは不可能だよ

65:デフォルトの名無しさん
19/06/24 16:33:17.68 218UFAwP0.net
C言語でWebAssemblyできるみたいだけど
ハードウェアに近いとこでもなければC言語は使わないほうが良いイメージだけど
実際WebAssembly的にCはどうなんだろうか?

66:デフォルトの名無しさん
19/06/24 16:44:03.34 T0z2fm5aa.net
>>64
数値演算に拘ならければ数式処理でπはπ、√2は√2のままで計算できるだろ。

67:デフォルトの名無しさん
19/06/24 16:50:34.10 Ih+U6NjR0.net
>>66
だから「厳密に」って言ってるじゃん
πは14桁で事足りるし31兆行も必要ないからね

68:デフォルトの名無しさん
19/06/24 16:52:25.55 Ih+U6NjR0.net
>>67
31兆桁ね

69:デフォルトの名無しさん
19/06/24 16:58:47.67 Vk3kXnxv0.net
> πは14桁で事足りるし
ぐるぐる回転するとだんだんずれてくる

70:デフォルトの名無しさん
19/06/24 17:08:19.82 Ih+U6NjR0.net
>>69
なら必要な精度だせばいいじゃん

71:デフォルトの名無しさん
19/06/24 17:09:23.06 T0z2fm5aa.net
>>67
いや、そうではなくて数式処理ならメモリ有限でも厳密に表現できるんだけど。
なんか俺変なこと言ってる?もしかして議論噛み合ってない?

72:デフォルトの名無しさん
19/06/24 17:13:52.11 Ih+U6NjR0.net
>>71
πはπとして表現するってことね
そりゃそうだよね

73:デフォルトの名無しさん
19/06/24 17:15:00.84 KYWI3ygZ0.net
>>71
数式でいいなら紙に数式を書けばそれが答えじゃないのか?

74:デフォルトの名無しさん
19/06/24 17:18:50.20 KYWI3ygZ0.net
でもpiを1として考えたら1が1/piになるんじゃないのか?

75:デフォルトの名無しさん
19/06/24 17:25:35.31 T0z2fm5aa.net
>>73
そりゃ紙に書いて数式演算って言い始めたら数値演算も紙の上でできるでしょ。
俺の言ってるのはMathmaticaのような数式処理。

76:デフォルトの名無しさん
19/06/24 17:32:02.39 3Q+jRQuy0.net
建築設計や土木設計の時の数量計算なら、数字を出さないといけませんよ

77:デフォルトの名無しさん
19/06/24 17:34:05.13 S0Qqu87l0.net
最終的に望む精度で出せばいいだけでは

78:デフォルトの名無しさん
19/06/24 17:34:44.59 KYWI3ygZ0.net
>>75
じゃあはじめから紙でいいだろ

79:デフォルトの名無しさん
19/06/24 17:37:46.46 KYWI3ygZ0.net
紙が足りなくなってきたら最初の方から消しゴムで消していけばいいだけだからいつかは書き終わるだろう

80:デフォルトの名無しさん
19/06/24 17:47:35.39 Ih+U6NjR0.net
半径5の円の面積求めなさいって言われて
78.5... と数値として答えるか 5^2*pi と数式で答えるか
俺は数値の精度の話をしてたんだよ

81:デフォルトの名無しさん
19/06/24 17:53:40.54 HRlrDhQRa.net
数値にしたら負けだよな

82:デフォルトの名無しさん
19/06/24 17:55:12.54 7zvW/rVQ0.net
BCDコードは流行りませんか?

83:デフォルトの名無しさん
19/06/24 18:08:31.47 BrGul7Md0.net
有理数を実装すればいかなる整数m, n に対しても m / n * n がきちんと m に戻る
(decimal型でも普通無理)
同じようなことを無理数でやる方法がわからんって話よ
無理数が厳密に数値化できないなんて誰でも知ってる話はせんわ

84:デフォルトの名無しさん
19/06/24 18:30:26.02 Ih+U6NjR0.net
>>83
現実問題としてそんな厳密解は必要がないってことだよ
だから数値の精度の話したんだけどな
NASAはπ15桁で軌道計算して誤差は約12cmだってよ

85:デフォルトの名無しさん
19/06/24 18:34:28.07 BrGul7Md0.net
>>84
「そんな厳密解は必要がない」ってのはお前の信条だろ
お前の信条を話に混ぜられても困る

86:デフォルトの名無しさん
19/06/24 18:37:48.29 Ih+U6NjR0.net
>>85
どこに俺の信条があるんだよw
じゃあ何が問題なのか具体的に言ってみろよ

87:デフォルトの名無しさん
19/06/24 18:39:33.96 BrGul7Md0.net
>>86
俺「どうすれば実現すればいいのかわからない」
お前「そんなものは必要ない」
話になってない

88:デフォルトの名無しさん
19/06/24 18:40:08.00 BrGul7Md0.net
「どう実現すればいいのかわからない」だった

89:デフォルトの名無しさん
19/06/24 18:40:45.27 Ih+U6NjR0.net
>>87
何を実現したいのよ

90:デフォルトの名無しさん
19/06/24 18:42:33.59 BrGul7Md0.net
>>89
計算の中で無理数を無理数として処理したい
最後に数値化したいならそのときの誤差だけは許容する

91:デフォルトの名無しさん
19/06/24 18:43:40.86 Ih+U6NjR0.net
>>90
じゃあ数式処理でいいじゃんw

92:デフォルトの名無しさん
19/06/24 18:46:56.46 BrGul7Md0.net
>>91
その数式処理をどうやるのか知らないって話なんだが

93:デフォルトの名無しさん
19/06/24 18:48:23.44 Ih+U6NjR0.net
>>92
>>75が言ってるじゃん
Mathmaticaでも使えば?

94:デフォルトの名無しさん
19/06/24 18:50:18.95 DSBJ/2Do0.net
Mathmatica 的に数式処理したいならそういうパーサーを書いてだな…
解析解が求まるといいですね (lol

95:蟻人間
19/06/24 18:50:43.29 oK/rIQPyd.net
C++ 数式処理ライブラリ
で検索。

96:デフォルトの名無しさん
19/06/24 18:51:36.46 BrGul7Md0.net
>>93
Mathmaticaいくらすると思ってんだよ…

97:デフォルトの名無しさん
19/06/24 18:53:18.44 BrGul7Md0.net
そもそもどう処理してるのか興味があるだけなんだがな
OSS漁ればあるかな

98:デフォルトの名無しさん
19/06/24 18:53:43.02 Ih+U6NjR0.net
>>96
じゃあお前が書けw
お前ならできる

99:デフォルトの名無しさん
19/06/24 19:07:01.18 KYWI3ygZ0.net
「数式処理ソフト」と紙に書けばいいんじゃないのか?

100:デフォルトの名無しさん
19/06/24 19:23:05.36 T0z2fm5aa.net
>>80
やっぱり議論が噛み合ってなかったね。
俺は厳密解の話してたわ。
無理数が有限メモリで表現できないからの数式処理なら表せられるの流れだったのでまさか数値解の話で止まってるとは思わなかった。

101:デフォルトの名無しさん
19/06/24 19:26:15.32 6eeWUnLH0.net
「計算のステップごとに増えてく誤差の蓄積」と、
「最後に(それまで記号的に扱うことで保留していた)
無理数や無限小数を実際の数値に直す際の誤差」と、
話がゴッチャになってるでしょ。

102:デフォルトの名無しさん
19/06/24 19:27:51.25 Ih+U6NjR0.net
>>100
数式で表現できるのは当たり前だし
そんな当たり前の話されてもって感じだったわ

103:デフォルトの名無しさん
19/06/24 19:29:37.69 3Q+jRQuy0.net
ここはC言語のスレですよ
数式処理スレじゃないです

104:デフォルトの名無しさん
19/06/24 19:33:07.57 T0z2fm5aa.net
>>102
なら最初からそう書けばいいのに、何で数値解にこだわったの?俺は最初からこだわらなければと書いてるけど?

105:デフォルトの名無しさん
19/06/24 19:35:48.83 3Q+jRQuy0.net
C言語で扱えるのは数値解でしょ
それ以外はスレ違いのテーマ

106:デフォルトの名無しさん
19/06/24 19:38:12.07 Ih+U6NjR0.net
>>104
こだわりなんてないけどね
πは数式でπと表現するなんて当たり前だから
当然、無理数の数値表現の話だと思っただけだよ

107:デフォルトの名無しさん
19/06/24 19:40:21.01 Ih+U6NjR0.net
>>105
その通りだね

108:デフォルトの名無しさん
19/06/24 19:44:36.26 rEOVCAEx0.net
>>106
無理数を有限の有理数表現するなんて、議論するまでもないじゃんw
>>105
そだね、俺はMahmaticaのような数値処理をC言語で実装すれば無理数も有限メモリで扱えるよ、と言いたかったんだが、議論がスレチになったのでもうやめます。

109:デフォルトの名無しさん
19/06/24 19:47:11.95 Ih+U6NjR0.net
>>108
その当たり前を分かってないからこうなってるじゃんw

110:
19/06/24 19:49:56.29 SbfV+wvC0.net
>>51
lint 前提のコードは、変てこなキャストとかが多用されているので、私は好きくない
(void)fclose(fp);
とか

111:
19/06/24 19:54:09.43 SbfV+wvC0.net
多桁長演算は、私もすごく欲しくて遂には C++ で書いてみました
これさえあれば、有理数ライブラリもすぐに書けるでしょう
スレリンク(tech板:51番)
無理数は無理ですが

112:デフォルトの名無しさん
19/06/24 19:56:21.02 rEOVCAEx0.net
>>109
ま、ここではよくあるコミニュケーションエラーだったね。
建設的な議論になりそうにないので、もうやめとこ。
俺は数式処理にMathmaticaしか使ったことないけど、オープンソースでMaximaってソフトあるね。
どういう実装になってるのか今度見てみよう。

113:デフォルトの名無しさん
19/06/24 19:58:51.26 zV4JNsEga.net
数式処理はコンパイラ書くのと同じですよ。
記号操作なんだから、ある意味コンピュータの仕事の本質です。数値よりも。

114:デフォルトの名無しさん
19/06/24 20:00:22.77 zV4JNsEga.net
あと、mathematicaは任意桁の誤差なしの数値計算もできるけど、そっちはGNUのライブラリ使ってたのではないかと。

115:デフォルトの名無しさん
19/06/24 20:07:45.26 Ih+U6NjR0.net
Axiomってのもソース読めるな
探せば色々でてくる
パーサ書くなら昔はlexとyaccが定番だったけど今は何使ってるのかね

116:デフォルトの名無しさん
19/06/24 20:09:05.85 zxVE+D4VM.net
>>109
いや、わかってないのはお前
そもそも数式処理って最後に数値なんか出さないし
大学で(一般教養としての)数学やってないの?

117:デフォルトの名無しさん
19/06/24 20:12:05.34 Ih+U6NjR0.net
>>116
ああ、わかったわかったw
後出し多くて疲れるわw

118:デフォルトの名無しさん
19/06/24 20:14:52.08 rEOVCAEx0.net
>>115
俺はむしろ数式処理はPrologのようなパターンマッチングやってると勝手に思ってる。
知らんけど。

119:デフォルトの名無しさん
19/06/24 21:54:22.85 f0ou4boT0.net
>>117
えっ、後出し?
マジで>>66の言ってることを理解できてなかったのかよ…
もしかして入試問題が「直径1cmの円の面積を求めよ、ただしπは3と仮定する」みたいな学校にしか入れなかったのか?w

120:
19/06/25 01:19:55.45 eaNcyZwN0.net
πの定義って本当は難しいではないかと考えるようになりました…

121:デフォルトの名無しさん
19/06/25 01:28:22.57 uTzXwYL5M.net
定義そのものは単純
円の直径と円周の長さの比

122:
19/06/25 01:34:45.27 eaNcyZwN0.net
>>121
円周の長さって曲線ですよね
曲線の長さ…んー、曲がっているのに長さ?
「円周の長さが存在すると仮定したら」円の直径と円周の長さの比である、なら理解できなくもないのですけれども

123:デフォルトの名無しさん
19/06/25 01:51:31.50 9pz2xub80.net
え?

124:デフォルトの名無しさん
19/06/25 02:12:37.49 F7MMtx7f0.net
>>122
もうC言語に関係のない話題なんだから黙ってろよ

125:デフォルトの名無しさん
19/06/25 03:38:38.87 t3KmtNcy0.net
えーと、>>19から延々と話が続いてんのかな?

126:デフォルトの名無しさん
19/06/25 03:58:09.25 XPL9ybbga.net
引数にvoidを指定したときから続いてる

127:デフォルトの名無しさん
19/06/25 06:03:41.53 JYAeHTmF0.net
>>64
いや可能だよ
おまえさんがそう発言しているのは
有限のメモリを使って表示されている電子教材に厳密な定義が書いてあるからだ
それはおそらく自然言語で書かれたものだろうがCに翻訳するのはおまえさんの仕事だ

128:デフォルトの名無しさん
19/06/25 15:14:34.88 9pz2xub80.net
ホラーだなw

129:デフォルトの名無しさん
19/06/25 16:03:33.62 AVCUyi6k0.net
いま気づいたんだけどgccの拡張使えばC++のテンプレート的なことできるな

130:デフォルトの名無しさん
19/06/25 16:10:30.14 AwR7wU0da.net
素直にg++を使えばいいような・・・

131:デフォルトの名無しさん
19/06/25 16:24:43.72 Z38gwzpf0.net
>>129
させねーよ・・・

132:デフォルトの名無しさん
19/06/25 16:35:26.91 AVCUyi6k0.net
>>131
どいうこと?

133:デフォルトの名無しさん
19/06/26 02:05:22.90 alD8Bem60.net
このMSの新コンソールのデモビデオ
URLリンク(youtu.be)
編集してるのは C のソースのように見えるけど
"<=" を "≦" に変えたり、"==" を "=" にしたりとか何の冗談だろう
それとも本当に こういう文字も OK になるのか?
オレが知らないだけで すでに OK なのか?

134:デフォルトの名無しさん
19/06/26 02:17:04.58 dK4c3UqUM.net
お前が知らないだけ

135:デフォルトの名無しさん
19/06/26 02:19:08.09 dK4c3UqUM.net
リガチャでググれ

136:デフォルトの名無しさん
19/06/26 02:38:59.73 alD8Bem60.net
>>134-135
ググった。どうも
Unicode のリガチャ? とすると見かけだけではなくて、ファイルに格納したときの文字コードも
変わるってこと?
ていうか最近の C コンパイラはそれを認識するのか?

137:デフォルトの名無しさん
19/06/26 03:00:34.30 alD8Bem60.net
>>136
自己れす
考えるに、やはり見かけだけのことだな
CSS のスタイル指定と同じことをやってると

138:デフォルトの名無しさん
19/06/26 05:32:18.41 vCLnuco30.net
fira codeっていうのがあってな
emacsでもつかえる

139:デフォルトの名無しさん
19/06/26 11:01:02.69 kpnHwXwW0.net
行書体フォントは合字で見映えを変えてるだけだな
嵯峨本フォント公開 - Togetter
URLリンク(togetter.com)

140:デフォルトの名無しさん
19/06/27 18:52:32.86 tbUThdPVa.net
>>64
3.1415926535897... ≒ 3.14
これだけの話

141:デフォルトの名無しさん
19/06/27 19:26:18.86 fhoZJ8gK0.net
>>96
raspberry piからなら無料で使える
raspberry pi 4も3日くらいまえに発売された

142:デフォルトの名無しさん
19/06/27 21:23:07.41 tw9eT+4Xa.net
およそ3

143:デフォルトの名無しさん
19/06/27 22:09:24.03 E9QSvqb40.net
C11を使っています。
#include <stdbool.h>
void main( void)
{
int cnt = 0;
bool hoge = false;
while( !hoge){
if( cnt++ >= 10) hoge = true;
}
このような感じのコードを実行したところ、ループから抜けません。
stdbool.hにはtrueが1と定義されているので、10回ループを回ると
while(!1)と同じ状態になると思います。
これはfalseと等価とは扱われないのですか?

144:デフォルトの名無しさん
19/06/27 22:17:33.62 xVmqmc55a.net
C11とは

145:
19/06/27 22:18:44.31 xOvGlzCg0.net
>>143
私の手元で実行するとループを抜けています
URLリンク(ideone.com)

146:143
19/06/27 22:22:52.82 E9QSvqb40.net
>>145
そうですか・・・
TrueSTUDIO for STM32のコンパイラはgccじゃないかと思うのですが、
何か違うのかもしれません

147:蟻人間
19/06/27 22:23:58.00 PK9sLC9K0.net
あまり一般的じゃないコンパイラだね。バグか。

148:デフォルトの名無しさん
19/06/27 22:36:05.09 xVmqmc55a.net
!!!hageとかすると動くんでしょうね

149:デフォルトの名無しさん
19/06/28 09:20:40.61 aeC7bTCc0.net
>>144
まさか知らんのか?
ISO/IEC9899:2011のことだよ
ISO/IEC9899:2018が現行規格で、
それの1個前の旧規格だ
・・・またおかしいことになってるな
ISO/IEC9899:1990がC89なのと同様
ISO/IEC9899:2018がC17だ

150:デフォルトの名無しさん
19/06/28 09:29:32.78 1Q6Ak4jma.net
>>149
C11を使ってます、で意味が通じたということ?
あと引数にvoidがあるけど、大丈夫だった?

151:デフォルトの名無しさん
19/06/28 09:46:32.88 apo2D6tyx.net
>>143
何か変な最適化されてるのかな?
逆アセンブラ見てみたいね。

152:デフォルトの名無しさん
19/06/28 11:05:29.15 BZSAOrWQ0.net
hoge は不変とみなしてループ外に追い出すような類推が働いてしまうコードっぽくないのに
true との比較ではなく !hoge だから間違いもおこさない形式だし

153:デフォルトの名無しさん
19/06/28 12:18:07.65 T5ABk70zM.net
そもそもこのループは最適化で1行も生成されてないと推測。
んで何かの勘違いで抜けてないと思ってしまったと予想。

154:デフォルトの名無しさん
19/06/28 12:24:53.76 xv7yRtbc0.net
gccの -std=c11 -O0 でやったら終了した

155:デフォルトの名無しさん
19/06/28 12:52:11.88 aeC7bTCc0.net
>>148
 
                 ノ
          彡 ノ
        ノ
     ノノ   ミ
   〆⌒ ヽ彡     
   (´・ω・`) 

156:デフォルトの名無しさん
19/06/28 12:54:28.02 6cUEPi280.net
if文の中を hoge == true とタイプミスしているとか

157:デフォルトの名無しさん
19/06/28 13:12:10.56 aeC7bTCc0.net
>>143
      str      fp, [sp, #-4]!
      add      fp, sp, #0
      sub      sp, sp, #12
      mov      r3, #0
      str      r3, [fp, #-8]
      mov      r3, #0
      strb      r3, [fp, #-9]
      b      .L2
.L3:
      ldr      r3, [fp, #-8]
      add      r2, r3, #1
      str      r2, [fp, #-8]
      cmp      r3, #9
      ble      .L2
      mov      r3, #1
      strb      r3, [fp, #-9]
.L2:
      ldrb      r3, [fp, #-9]
      eor      r3, r3, #1
      and      r3, r3, #255
      cmp      r3, #0
      bne      .L3
      nop
      add      sp, fp, #0
      @ sp needed
      ldr      fp, [sp], #4
      bx      lr
問題なさそうだが、本当に抜けなくなったのか?

158:デフォルトの名無しさん
19/06/28 13:22:10.14 j6O/VBH7M.net
そのコードはx86 じゃないの?
STM32用の開発ツールらしいしARMのコードを吐くコンパイラだろ

159:デフォルトの名無しさん
19/06/28 16:31:54.35 aeC7bTCc0.net
おまえさん、x86のレジスタ名は知ってるか?

160:デフォルトの名無しさん
19/06/28 16:42:37.66 BZSAOrWQ0.net
疑いだしたらきりがないけど
>このような感じのコード
と言ってるあたり、このコードが100%再現する最小コードではない可能性もあるということだろうか?
擬似的に if( cnt++ >= 10) hoge = true; と書いてるけど
実情は割り込みや別スレッドかなんかで hoge を書き換えてたりとかさ

161:デフォルトの名無しさん
19/06/28 17:40:23.39 F+VtS9/i0.net
へんな動きしたらデカい配列作ってスタック破壊してないか疑う。
アセンブラ使てたらショートジャンプで128バイト以上離れてるラベル指定してないかとかも。
16/32bit時代のことですが。

162:デフォルトの名無しさん
19/06/28 18:37:17.90 tgbP+JHV0.net
スタック破壊は高確率でリターンアドレス壊して暴走(coreダンプとか例外とか)が発生するので発生しちゃえば案外すぐに分かる。

163:デフォルトの名無しさん
19/06/28 19:29:54.68 k4pW0x/X0.net
ポインタは値と参照どちらですか?
f(&v);みたいにポインタを渡す事を参照渡しと呼ぶのは妥当ですか?
ポインタをインクリメントしたりアドレス計算に使う場合があるから
値っぽい気もしますよね

164:デフォルトの名無しさん
19/06/28 19:32:57.11 k4pW0x/X0.net
「C言語は数値でアドレス指定してデータにアクセスする能力を持つ言語だ」
と捉えて、ポインタ渡しはあくまで値渡しと捉えるのも妥当そうじゃないですか?

165:デフォルトの名無しさん
19/06/28 19:41:54.17 gZBVzR2k0.net
そういう認識ができてるなら十分だな
その値から指し先が示す実体を引っ張ってこれるってだけで
関数のインターフェースとしては値を渡してる
C言語ではできないが
int a = 0;
foo(a);
呼び出した結果 a の値が書き換わって戻ってくる
っていう渡り方があって、そっちを参照渡しって呼ぶし

166:デフォルトの名無しさん
19/06/28 20:38:41.57 TwLtdi9D0.net
「C言語に参照渡しは無い」という理解でよくね?

167:デフォルトの名無しさん
19/06/28 20:56:34.47 tgbP+JHV0.net
そういう意味では全ての言語は参照または値を表記の違いこそあれ何かの値を渡してるわな。
「参照のための値(アドレス)を渡している」という意味において、C言語もまた参照渡しのある言語になるんじゃない?

168:デフォルトの名無しさん
19/06/28 21:07:11.36 1Q6Ak4jma.net
違います。

169:デフォルトの名無しさん
19/06/28 21:13:05.54 ASw3jrNxa.net
Cに参照はないが、ポインタ経由のアクセスを参照だと脳内定義するなら参照ということにはなる。
ただC++は参照もポインタ経由のアクセスも両方使えるようになってるので後でC++やろうとすると混乱するかもね。

170:デフォルトの名無しさん
19/06/28 21:16:07.88 lanM6mt5d.net
先輩「~~」
新人「なるほど、つまり参照渡しですね」
先輩「違います」
新人「オオ…オ……オ……」
そして新人はIT業界を去ったのであった

171:デフォルトの名無しさん
19/06/28 21:38:39.85 TwLtdi9D0.net
ポインタを特別扱いする必要とか無いがな

172:デフォルトの名無しさん
19/06/28 21:38:47.78 DEsb2BLF0.net
C言語の場合は素直にアドレス渡しで良いと思う
紛らわしい用語使うとかえって混乱するだけ

173:デフォルトの名無しさん
19/06/28 22:56:11.75 K80D90id0.net
先輩「~~」
新人「なるほど、つまり参照渡しですね」
先輩「まあそうだね」
新人「なるほど理解しました」
優しい世界

174:デフォルトの名無しさん
19/06/28 23:31:41.66 TwLtdi9D0.net
そして姑息な優しさによりC++の参照で混乱する

175:デフォルトの名無しさん
19/06/29 00:30:28.54 kzB3RaMy0.net
C++なんてクソ言語は回避すればいい

176:デフォルトの名無しさん
19/06/29 00:57:44.40 CfES0TXk0.net
姑息じゃない先輩「~~」
新人「なるほど、つまり参照渡しですね」
姑息じゃない先輩「まあそうだね」
新人「なるほど理解しました」
姑息じゃない先輩「でもC++の時は注意が必要だよ。その時にまた質問してね。」
素晴らしい先輩

177:デフォルトの名無しさん
19/06/29 01:04:38.27 k/WM/TXw0.net
Java は参照の筈なのにある日 NullPointerException を見て愕然とする。

178:デフォルトの名無しさん
19/06/29 07:27:30.85 HFXZY0WT0.net
NullPointerException を見て愕然
「ぬるぽ」を見ると「ガッ!」と返されることの由来。

179:デフォルトの名無しさん
19/06/29 17:54:21.19 8z7l0ZZs0.net
ポインタ?BASICのPEEK、POKE、CALL、DEF FN使ったことあるなら(ry

180:デフォルトの名無しさん
19/06/29 18:15:02.25 Ec0dmaS10.net
>>179
DEF FNが全てのBASICにあると思うなよ。

181:デフォルトの名無しさん
19/06/29 18:24:39.84 0fRKmc/o0.net
I/Oの何十ページもあるダンプリスト打ち込んでたなあ・・・

182:デフォルトの名無しさん
19/06/29 18:28:11.52 QwBwV953M.net
かつて皆一度は通ってきた道

183:デフォルトの名無しさん
19/06/29 18:58:28.75 SkCg/0zJ0.net
デバドラを作った事がないんだけど
C言語で作ったとして、
CPUやOSの違いに対してクロスプラットフォームなソースコードを作れるものなの?

184:デフォルトの名無しさん
19/06/29 19:11:10.87 KCwWGOZi0.net
>>179
それを言うならDEF USRだな
富士通のやつ
CALLつーと早川電機か?

185:デフォルトの名無しさん
19/06/29 19:12:21.23 VF6wNxfU0.net
クロスプラットフォームなデバイスドライバなんて見たことが無いんだけど存在するの?
デバイスにもよるんだろうけどインストーラが分けてあるイメージある

186:デフォルトの名無しさん
19/06/29 19:15:54.19 jvYtCUwd0.net
この話題に付いてこれるのは50代より上

187:デフォルトの名無しさん
19/06/29 19:24:10.90 SkCg/0zJ0.net
実行ファイルは環境毎でも
ソースコードは共通化されてるかもしれない

188:デフォルトの名無しさん
19/06/29 19:45:16.95 0fRKmc/o0.net
早川電機ってw
何歳なんだよw

189:デフォルトの名無しさん
19/06/29 19:46:57.93 Ec0dmaS10.net
>>183
そりゃ無理だ。
デバドラはデバドラでOS毎にお作法がちがう。
>>184
早川電機じゃオッサンでも分からんだろ(笑)
シャープと言えや。
確かにS-BASICにCALLはあったけども。

190:デフォルトの名無しさん
19/06/29 19:57:31.13 dqvciFo5a.net
同じデバイスに対しては同じ様なプログラムになると思うぞ。

191:デフォルトの名無しさん
19/06/29 20:13:31.33 SkCg/0zJ0.net
>>189
CPUの違いだけならクロスプラットフォームにできる?

192:デフォルトの名無しさん
19/06/29 20:17:37.78 VF6wNxfU0.net
クロスプラットフォームの意味履き違えてない?

193:デフォルトの名無しさん
19/06/29 20:26:03.44 jvYtCUwd0.net
東京通信工業なんて会社、知らないだろうな

194:デフォルトの名無しさん
19/06/29 20:33:24.22 SkCg/0zJ0.net
間違えてはいないが単にその言葉が曖昧だ。
ifdef等を使わずにCPUの違いに対処できるCコードは書けるか?

195:デフォルトの名無しさん
19/06/29 20:51:37.84 Ec0dmaS10.net
>>191
デバドラの種類によるかな?
ユーザモードドライバだけで済むような環境だとCPUが違ってもソースコードを共用できる可能性が高い。

196:デフォルトの名無しさん
19/06/29 20:51:42.07 dqvciFo5a.net
>>194
プラットフォームの差を吸収するレイヤがありゃできるだろう。
普通のプログラムだってリンク時に解決してる部分がかなり大きいんだから。
Cで書いてる時点でそれなりに抽象度が高いと思うよ。

197:デフォルトの名無しさん
19/06/29 21:58:02.57 k/WM/TXw0.net
>>195
Linux は結構共通になってない?ものにもよるか。

198:デフォルトの名無しさん
19/06/30 21:20:05.21 28buo1qB0.net
PC-98、TWONS、AT互換機でDOSのファンクションコールしか使わないなら同じexeファイルが使えたと思った。

199:デフォルトの名無しさん
19/07/01 00:10:17.16 cUStBYS8a.net
MSX-DOSとかCP/Mのプログラム動いたぜ。
Z80だし当たり前なんだけど驚いた。

200:デフォルトの名無しさん
19/07/04 18:46:50.22 RufwSseDM.net
hoge.hというヘッダーファイルがシステムで使用可能ならインクルードして、ないならローカルに用意したものをインクルードしたい時はどうすればいいですか?
イメージはこんな感じです
if (exists("hoge.h")):
#include<hoge.h>
else:
#include"./src/hoge.h"

201:デフォルトの名無しさん
19/07/04 18:59:45.02 ead2oXvp0.net
>>200
#if EXISTS_HOGE
#include <hoge.h>
#else
#include "./src/hoge.h"
#endif
コンパイラオプションで-DEXISTS_HOGE=1を指定するとシステムのヘッダをインクルードできる
これの欠点は手動で指定する必要があること
自動でやりたいならautotoolとかcmakeを使うしかない

202:デフォルトの名無しさん
19/07/04 19:38:05.76 j+BKfkH80.net
>>200
includeパスの優先順位を利用するのじゃダメなの?

203:デフォルトの名無しさん
19/07/04 19:40:09.58 CiYpNsgja.net
自分の hage.h を用意しとけば。名前何でもいいけど。
で、本物のhageのインクルードガードのマクロ定義をチェックすればいい。マクロがあればの話だけど。

204:デフォルトの名無しさん
19/07/04 20:01:31.43 DFmBoT0+d.net
こっそり__has_include使えたりしないの?

205:デフォルトの名無しさん
19/07/04 22:38:29.59 YXLsgD0T0.net
cmake便利だよな。これを覚えたせいで仕事を簡単に家に持って帰れるようになってしまったよ……

206:デフォルトの名無しさん
19/07/04 23:09:00.36 Dgm46w9S0.net
社畜w

207:デフォルトの名無しさん
19/07/05 07:37:58.54 gYSYJWLY0.net
ハッカータイプの人はそれが普通なんだよ
パンピーには解らないし解ってもらいたいとも思わない

208:デフォルトの名無しさん
19/07/05 07:39:43.05 RJCpPwwqa.net
いわゆる暇プロタイプの人だな。

209:デフォルトの名無しさん
19/07/05 10:42:30.79 /9SntML6a.net
タクシー運転手の趣味がドライブみたいなものだな。

210:デフォルトの名無しさん
19/07/05 10:48:27.91 V1OP8/TU0.net
会社でマルウェア製造していたのか

211:デフォルトの名無しさん
19/07/05 12:21:58.01 /9SntML6a.net
四角くてもマルウェア

212:デフォルトの名無しさん
19/07/05 19:35:27.70 cg54bwGhM.net
山田く~ん

213:デフォルトの名無しさん
19/07/07 01:12:52.69 ibboI0jYa.net
マ板化してる・・・

214:デフォルトの名無しさん
19/07/07 12:35:21.67 L+nDH+YyF.net
>>163 >>167
ポインタと配列の違いを説明してみ

215:デフォルトの名無しさん
19/07/07 13:52:06.12 rNUlAIMGM.net
*p[]
(*p) []
**p
*(*p)

216:デフォルトの名無しさん
19/07/07 16:31:13.26 hqXlVeni0.net
>>214
ポインタは変数で4バイトのメモリ領域で、
配列は連続したメモリ領域?
int arr1[] = {1,2};
int arr2[] = {3,4};
arr1 = arr2;
がエラーになるから配列はポインタ変数とは明確に区別されてるみたいだが

217:蟻人間
19/07/07 16:40:40.99 0lH1eUtNd.net
16-bitのMS-DOSの時代だと2バイトのポインタがあったし、64ビットのCPUなら、8バイトもあり得る。

218:デフォルトの名無しさん
19/07/07 16:45:42.38 YcHC3knN0.net
また値渡し、ポインタ渡し、参照渡しは~ってやるのか?

219:デフォルトの名無しさん
19/07/07 16:52:42.60 21BbIGV/0.net
> *(*p)
ああ、こいつ解ってないな

220:デフォルトの名無しさん
19/07/07 18:03:14.45 XjejoYnQ0.net
>>219
それ顔文字っぽいよね。

221:デフォルトの名無しさん
19/07/07 18:04:40.15 XjejoYnQ0.net
>>216
うちのポインタは8バイトだ。

222:デフォルトの名無しさん
19/07/07 19:09:15.76 bN7H9WWH0.net
配列はポインタのシンタックスシュガーでしかない
ポインタは何でも許されるが配列は操作が簡略化と同時に制限されてる

223:
19/07/07 19:31:01.29 wvjux2100.net
>>222
配列名は定数扱いのポインタですね
しかし、配列だけに許される簡素化ってなんですか?

224:デフォルトの名無しさん
19/07/07 19:32:54.23 bN7H9WWH0.net
>>223
配列は宣言した瞬間に領域が確保されてるだろ

225:デフォルトの名無しさん
19/07/07 19:33:00.70 SGQz+b0c0.net
>>222
x[-1]、これも許されるんだよな

226:デフォルトの名無しさん
19/07/07 20:07:07.70 OUCQisjNM.net
int a[1];

int *a;
a=(int *)malloc(sizeof(int));
の違いって何?

227:蟻人間
19/07/07 20:12:27.77 0lH1eUtNd.net
>>226
前者はスタックか静的領域に確保される。後者はヒープに確保される。前者はスコープを抜けると自動で解放。後者は解放しないとメモリーリークする。

228:デフォルトの名無しさん
19/07/07 20:15:53.10 OUCQisjNM.net
>>227
ということは配列ってメモリのことよく分からない初心者プログラマ以外には無用の長物なん?
解放漏れの考慮以外でわざわざ配列使うメリットってあるの?

229:デフォルトの名無しさん
19/07/07 20:17:35.62 bN7H9WWH0.net
>>228
寧ろ配列で済むのにポインタを使う意味がないぞ

230:蟻人間
19/07/07 20:18:55.18 JhpdhjN90.net
>>228
繰り返し(iteration)の処理で連続データを処理・制御するときに配列がないと困る。

231:デフォルトの名無しさん
19/07/07 20:29:34.92 OUCQisjNM.net
>>229-230
int a[3];
for(int i=0;i<3;i++) a[i] = 0;
int *a;
a=(int *)malloc(sizeof(int * 3));
for(int i=0;i<3;i++) *(a+i) = 0;
これとこれだと違うの?
ポインタだとchar型の時とか文字列代入出来るし
上位互換な気がするんだけど。

232:蟻人間
19/07/07 20:32:06.26 JhpdhjN90.net
>>231
sizeof(int) * 3の間違い。
ヒープだと可能なかぎり自由に実行時にサイズを決められる。

233:蟻人間
19/07/07 20:34:52.90 JhpdhjN90.net
配列のサイズが決まるのはコンパイル時だ。

234:デフォルトの名無しさん
19/07/07 20:36:22.20 bN7H9WWH0.net
>>231
前者の方が簡潔だし
書かなくていい確保・開放処理は避けるものだ
パフォーマンスも配列の方が上

235:デフォルトの名無しさん
19/07/07 20:36:48.46 HZba7DSz0.net
>>228
自分で書いたんだから分かると思うけど、言語構造の話でも>>226の場合は記述量で配列の方が楽だし、読む側もひと目でわかるじゃん。

236:デフォルトの名無しさん
19/07/07 20:37:18.16 HZba7DSz0.net
かぶった

237:デフォルトの名無しさん
19/07/07 20:50:54.62 OUCQisjNM.net
じゃあ配列は、ポインタの一部機能を制限して使いやすさの向上を図ったものという認識でいいの?
それとも生まれも育ちも全く別の概念?
何か、今やってるcの教材が、まず最初に配列を使ってプログラム書いて、
次の章でポインタ出てきて、今まで配列使って書いた奴をポインタで書き変えろみたいな例題ばっかりだから
だったら最初から配列いらなくない?と思ってしまいました。

238:蟻人間
19/07/07 20:52:43.83 JhpdhjN90.net
実用的なプログラム書いてたら、そのうちわかる。心配要らない。

239:デフォルトの名無しさん
19/07/07 21:00:11.30 OUCQisjNM.net
分かりました。unionもわざわざこんなの使わずstruct使えばよくねって思うけどそういうもんだと今は思っときます。

240:デフォルトの名無しさん
19/07/07 22:02:44.50 o4vR1s03a.net
>>237
むしろ、何故ポインタが不要だと思わんのか謎だわ

241:デフォルトの名無しさん
19/07/07 22:15:20.04 2f8BNWqD0.net
なぜopenとfopenの二つのファイルアクセス手段が用意されているのか。

242:
19/07/07 22:18:01.98 wvjux2100.net
>>241
open() は OS が提供するシステムコールそのもの
fopen() はライブラリ関数であり open() をラップして「使いやすくした」(本当か?)もの

243:デフォルトの名無しさん
19/07/07 23:10:44.83 XjejoYnQ0.net
>>242
バッファっリングしてくれるとか、fprintf()もあったりしてテキストをフォーマットして出力するのも楽というのがある。

244:デフォルトの名無しさん
19/07/07 23:15:22.66 o4vR1s03a.net
Cライブラリとしてはfopenしかないわけだけど、正直あんまり便利じゃないよな。

245:
19/07/07 23:16:29.46 wvjux2100.net
>>243
バッファリングはね…バッファリングは今は大部分 OS が抱いているものなんじゃないかな…アプリケーションが各々のユーザーランドに抱いていてメリットがあるのかな…

246:デフォルトの名無しさん
19/07/07 23:34:13.80 XjejoYnQ0.net
>>245
ま、そうだけどね。Cってそういう今時のちゃんとしたOSのないところや完全にOSなし環境用のプログラム作るのにも使われるし、ああいうライブラリはあってもいいと思う。
まあしかしちょっと古くなった感はあるのでリニューアルしても良いんじゃないかとは思うけどね。てか、最低でも標準ライブラリなのにセキュリティーホール作ってしまうようなのは廃止した方が良いよな。

247:デフォルトの名無しさん
19/07/07 23:42:46.95 sq3gNEgUd.net
システムコール自体相当重いから、OS呼び出す回数減らすためのバッファリングだろ

248:デフォルトの名無しさん
19/07/07 23:47:08.94 YcHC3knN0.net
入出力バッファリングしてくれるファイルシステムなんてあるか?
ジャーナリングと勘違いしてるんだろ

249:デフォルトの名無しさん
19/07/07 23:54:40.74 sq3gNEgUd.net
しない方が珍しくね?
writeしたらディスク書き込み完了するまで次がブロックするとか?

250:デフォルトの名無しさん
19/07/07 23:59:57.04 YcHC3knN0.net
それジャーナル制御の話だろ

251:デフォルトの名無しさん
19/07/08 00:13:01.27 cSAl/tEC0.net
バッファリングとキャッシュの区別が…。

252:デフォルトの名無しさん
19/07/08 00:15:59.34 +tWapxmU0.net
>>248>>245へのレスな
バッファリングはアプリの仕事

253:デフォルトの名無しさん
19/07/08 00:21:05.88 G56xs+BGM.net
>>240
char *str;
str = "abc\n";
が許されるから。
配列に文字列を代入出来ないのが不便
>>241
それ言うならfopenとfopen_sの方が意味分からんね
VS使ってたら書き換えろと警告出してくるわ、書き換えたら引数の取り方違うとかいうクソ仕様だし

254:デフォルトの名無しさん
19/07/08 00:29:20.86 EniIIYRYa.net
>>253
そりゃ、現実としてそういう建て付けになってんだから使うよ。
でも文字列だったら最初からもうちょっと抽象的な操作の方がいいわ。ポインタ使いたかったら&つけてもいいんだし。

255:デフォルトの名無しさん
19/07/08 00:44:01.80 YBWHLZTU0.net
>>253
一応初期化の時だけ char s[] = "..."; って書き方できるけどね。これは初期化だけの特別な書き方だな。

256:デフォルトの名無しさん
19/07/08 01:20:48.92 6nQUGxHg0.net
OSによっては遅延書き込みってしているだろう

257:デフォルトの名無しさん
19/07/08 02:05:54.23 YBWHLZTU0.net
やってるな。外付けのHDD付けた時なんかはするかしないか設定できたりして。

258:デフォルトの名無しさん
19/07/08 08:34:21.82 IKtCR6xL0.net
DOS時代、ディスクキャッシュはドライバーが必要だったな。

259:デフォルトの名無しさん
19/07/08 08:57:53.53 YymrlAAVd.net
str[9]="おはよう"
str[9]={'お','は','よ','う'}
こうやってまとめて配列に日本語を入れるのは出来るんだけど「お」、「は」、「よ」、「う」と一文字ずつ入れることって出来ますか?
英語ならstr[0]=…、str[1]=…って済むけど

260:デフォルトの名無しさん
19/07/08 09:43:06.34 tzeJFuHla.net
>>259
> こうやってまとめて配列に日本語を入れるのは出来るんだけど
え?できる?
>「お」、「は」、「よ」、「う」と一文字ずつ入れることって出来ますか?
wchar_t 型を使ってL付けたらできないか?

261:デフォルトの名無しさん
19/07/08 09:53:54.58 jiAfHW5M0.net
要素数を明示してるので、文中の代入ではなく、初期化のときの話だろうとは予測できるが
「入れる」というのは、代入を連想させるので、うまい言い回しではないかもね

262:デフォルトの名無しさん
19/07/08 11:00:59.71 sWBK4Oik0.net
>>253
関係ないけどconst違反だね
そのケースだけ特別に見逃すことになってるけど
>>255
その書き方はK&Rでは静的記憶域期間にのみ許されていた
なぜだかわかるか?

263:デフォルトの名無しさん
19/07/08 11:23:23.17 tzeJFuHla.net
>>262
そうだったっけ?そうだったような気もするが。
なかったのは自動変数だと毎回コピーすることになって無駄だからかな?

264:デフォルトの名無しさん
19/07/08 11:25:22.35 Y+Xu67y40.net
>>262
初回のみ限定警告100%オフ! 送料無料! だからね
いちおう違反ではないことになってる

265:デフォルトの名無しさん
19/07/08 11:45:28.78 IKtCR6xL0.net
>259
>str[9]={'お','は','よ','う'}
マルチバイト文字をこう書く時はエンディアンにも気をつけないとね。

266:デフォルトの名無しさん
19/07/08 12:17:44.27 tzeJFuHla.net
>>265
てか、それできる?

267:デフォルトの名無しさん
19/07/08 12:23:54.16 sWBK4Oik0.net
>>263
memcpyみたいのは言語自体に組み入れるべき機能ではないという判断だ
俺は今でもそう思っている

268:デフォルトの名無しさん
19/07/08 12:29:40.10 SgFxP6hn0.net
思ってるって……
じゃK&Rにはwhyは書いてないってこと?
なんでお前の脳みその中身を当てこしなきゃいけねーんだ
バカかこいつ?

269:デフォルトの名無しさん
19/07/08 12:30:19.48 sWBK4Oik0.net
>>265
エンディアンが同じでも解釈が違うことがあるぞ
printf("%x %x", 'あ', L'あ');
bcc32: a082 3042
cl: 82a0 3042
gcc: error

270:デフォルトの名無しさん
19/07/08 12:31:09.46 sWBK4Oik0.net
>>267
じゃあ言い直そう
- 思っている
+ 賛成している

271:デフォルトの名無しさん
19/07/08 12:31:47.98 sWBK4Oik0.net
くそ、安価ミスとは俺としたことが
- >>267
+ >>268

272:デフォルトの名無しさん
19/07/08 13:00:33.95 tzeJFuHla.net
>>267
なるほど。

273:デフォルトの名無しさん
19/07/08 13:43:50.72 IKtCR6xL0.net
>266
どのあたりに疑念を持ってるの?

274:デフォルトの名無しさん
19/07/08 13:58:51.22 tzeJFuHla.net
>>273
'あ' みたいなのは char じゃないから少なくとも警告出そうな感じするんだが。

275:デフォルトの名無しさん
19/07/08 14:09:16.87 IKtCR6xL0.net
int Code='ABCD';
なんて書き方できるから文字列はOK。(Code=0x41424344; と解釈)
全角文字の解釈はコンパイラ次第。unicodeやutf-8対応なら問題ないと思う。
S-JISはよく"\"が含まれる文字で誤作動起こすけど。

276:デフォルトの名無しさん
19/07/08 14:54:14.01 jiAfHW5M0.net
C99 6.4.4.4 Character constants で
 character-constant:
  'c-char-sequence'
  L'c-char-sequence'
 c-char-sequence:
  c-char
  c-char-sequence c-char
こうなってて文法的には 'ABCDEF' は許されるんだな ちょっと意外

277:デフォルトの名無しさん
19/07/08 15:31:05.17 sWBK4Oik0.net
>>275
printf("%x", Code);
bcc32: 44434241
cl: 41424344
gcc: 41424344

278:デフォルトの名無しさん
19/07/08 15:37:58.06 u+KjwOdz0.net
処理系定義の動作だから移植性は落ちるよね

279:デフォルトの名無しさん
19/07/08 20:12:45.44 84rxMJ1M0.net
文字定数は
Cではint型
C++ではchar型

280:デフォルトの名無しさん
19/07/08 20:54:00.78 ibRWBgM50.net
int *ptr;
↑なんですが、「int型のポインタ変数ptr」、それとも「int *型のポインタ変数ptr」のどちらでしょうか?

281:デフォルトの名無しさん
19/07/08 20:55:50.12 Fr0SEB8b0.net
int*型の変数

282:デフォルトの名無しさん
19/07/08 21:09:00.76 ibRWBgM50.net
>>281
読み方としては
int (イント) * (ポインタ) 型の変数
でしょうか
「ポインタ変数」と言った場合は「* (ポインタ)変数」という捉え方でいいのでしょうか?
「ポインタ」と言った場合に「*」を指すのは普通ですか?

283:
19/07/08 21:12:57.52 qs7HTSo50.net
>>282
好きなように把握すればよい、しかし int * の使われ方は決まっているのだから、それがすんなりできるかどうかが問題

284:デフォルトの名無しさん
19/07/08 21:24:04.62 /2nq94DTa.net
pointer to int

285:デフォルトの名無しさん
19/07/08 21:42:19.26 prK3AyGza.net
>>280
Cの場合は変数に*がくっついた形で宣言されていると考えた方が良い。というのは int *a, b; と書いた場合に a は int * 型だが b は int 型になるからだ。

286:デフォルトの名無しさん
19/07/08 22:54:53.21 ibRWBgM50.net
なんとなくわかりました
ありがとうございました

287:280
19/07/09 00:31:35.20 L+Vy/ftS0.net
規格書には
pointer to a character type
pointers to structure types
という文が頻繁に出てきますね
日本語で言ったら「char型へのポインタ」のほうが「charのポインタ型」より正しい気がします
>>284さんのpointer to intは日本語なら「int型へのポインタ」ですね
と思ったんですが規格書には
pointer type
も出てくるので、どっちでもいいということでしょうか
つまり「char型へのポインタ」=「charのポインタ型」ということになりますが

288:デフォルトの名無しさん
19/07/09 02:08:12.29 Mm2yqLXca.net
変数の宣言と型の宣言が同じ形というCの事情もありそうだが、そこは曖昧だと思うね。
アップキャストしたら単にポインタだし、ポインタ型と言う場面もあるだろう。
これいいね
URLリンク(cdecl.org)

289:デフォルトの名無しさん
19/07/09 09:14:08.91 gdYXIa6pa.net
typedef char *pchar; とすると pchar 型は「charのポインタ型」というとにはなる。

290:280
19/07/09 11:14:54.62 L+Vy/ftS0.net
ということはどっちでもいいんですね

291:デフォルトの名無しさん
19/07/09 11:27:52.60 knKJba5J0.net
気にしたことが無いくらいどうでもいい話。

292:デフォルトの名無しさん
19/07/09 12:21:07.04 J4x6YR7aa.net
引数のvoidが一体なんなのか考える方が有意義

293:デフォルトの名無しさん
19/07/09 12:41:16.87 jbK1WB2u0.net
引数なしの関数を書くときはvoidと書く
以上

294:デフォルトの名無しさん
19/07/09 12:59:36.67 PyDbCO5q0.net
voidって引数じゃないの?

295:デフォルトの名無しさん
19/07/09 15:08:36.62 jbK1WB2u0.net
引数に予約語使えるの?

296:デフォルトの名無しさん
19/07/09 15:44:50.86 +qcz+46H0.net
some_type foo() と戻りがあるのに、その戻りを捨てる意図で
(void)foo(); と呼び出すコードを見たことがあるような気がするが C++ かもしれん
最適化の際にうまいことしてくれるのを期待してるのかしら

297:デフォルトの名無しさん
19/07/09 15:55:38.40 td6qAd7k0.net
>>296
コンパイラかコードチェッカーのwarning抑止のためじゃないかな

298:デフォルトの名無しさん
19/07/09 16:02:30.30 +dEKq4+ba.net
Cでも使える。
一度も使ってない引数変数があるとか、関数の戻り値を使っとらんとかで警告が出る場合にくっつけるのが主だと思う。

299:デフォルトの名無しさん
19/07/09 16:03:09.93 NP6oYl9g0.net
> 引数なしの関数を書くときはvoidと書く
プロトタイプじゃなかったっけ

300:デフォルトの名無しさん
19/07/09 16:07:01.41 gdYXIa6pa.net
>>299
プロトタイプと違ったらエラーになる。

301:デフォルトの名無しさん
19/07/09 16:20:41.31 +qcz+46H0.net
>>297-298
なるほど、警告避けかー
引数に対してのは
callback 関数として、引数の型&数は限定されてるけど
実装時には一部の引数を使わずに実装できちゃうときに発生しそうね
void foo(int arg1, int arg2)
{
 /* 色々書くけど arg2 は使わない: callback 関数の都合で引数の型と数は変えられん */
 (void)arg2;
}

302:デフォルトの名無しさん
19/07/09 17:10:50.55 NP6oYl9g0.net
>>299
これ OKでしょ
int func(void);
int func()
{
return 0;
}

303:デフォルトの名無しさん
19/07/09 17:12:50.99 NP6oYl9g0.net
アンカミスった >>300

304:デフォルトの名無しさん
19/07/09 17:17:21.63 +qcz+46H0.net
>>302 のは 非ANSI の K&Rフォームで警告されるんじゃ
引数有りの記述では
 int func(int);
 int func(a)
 int a;
 { return 0; }
と等価

305:デフォルトの名無しさん
19/07/09 17:26:13.08 jbK1WB2u0.net
>>302
これアウトでしょ
int func(void);
int func()
{
return 0;
}
func(hoge);

306:デフォルトの名無しさん
19/07/09 17:28:26.22 PyDbCO5q0.net
>>302
VCだと
> warning C4255: 'func' : 関数プロトタイプがありません : '()' を '(void)' に変換します。
って警告出て、関数部分の引数を変えてしまってる

307:デフォルトの名無しさん
19/07/09 17:41:06.68 3UBru1uA0.net
>>302
おまえさん、自分のところで動作確認してるか? でたらめこくな

308:デフォルトの名無しさん
19/07/09 17:43:09.00 8Y9GhXx/M.net
char *p;
p = "str1";
p = "str2";
こんな風に文字列リテラルのポインタを付け替える時に前の文字列リテラルのメモリ領域を解放するにはどうすればいいの?

309:デフォルトの名無しさん
19/07/09 17:49:15.98 PyDbCO5q0.net
>>308
静的領域に確保しているから解放は無理

310:デフォルトの名無しさん
19/07/09 17:59:43.14 3UBru1uA0.net
exit関数を呼び出せば解放できるね

311:デフォルトの名無しさん
19/07/09 18:21:06.36 NP6oYl9g0.net
X 3010:2003 では
6.7.5.3 関数宣言子(関数原型を含む)
「並びの中の唯一の項目が void 型で名前のない仮引数であるという特別な場合,関数が仮引数をもたないことを指定する。」
6.9.1 関数定義
typedef int F(void);
F f, g;
int f(void) { /*... */ } // 正
int g() { /*... */ } // 正
という訳で
int func(void); /* prototype */
int func() /* definition */
{
return 0;
}
どこかまちがっているか

312:デフォルトの名無しさん
19/07/09 18:28:37.94 8Y9GhXx/M.net
>>309
まじですか。じゃあこのような書き方してたらいずれクラッシュするってことですか?
char *p;
while(1) {
//何かの処理
p = "hoge";
}

313:デフォルトの名無しさん
19/07/09 18:36:42.49 lRtOoeh80.net
それは同じ"hoge"のアドレスがロードされるだけ
文字列リテラルのポインタ扱うならconst char *使いなされ

314:デフォルトの名無しさん
19/07/09 18:43:38.45 gdYXIa6pa.net
>>312
文字列の定数は静的な領域に作られるだけで実行時に動的に作られたりしないのでそれは問題なし。

315:デフォルトの名無しさん
19/07/09 18:46:20.39 gdYXIa6pa.net
あ、でも、定数でなくても同じか。単にポインタ代入してるだけだもんな。

316:デフォルトの名無しさん
19/07/09 18:47:53.66 jbK1WB2u0.net
>>311
プロトタイプと同じだからOKだよね
>>302は何を言いたいのか分からんな

317:デフォルトの名無しさん
19/07/09 19:48:16.54 YXbnrG+I0.net
>>301
その場合は↓で良いはず
void foo(int arg1, int)
{
}

318:デフォルトの名無しさん
19/07/09 20:34:43.07 3UBru1uA0.net
>>311
おまえさんは「関数原型を含む」を、「関数原型についてのみ」と脳内変換しているのか?
> int func() /* definition */
これのどこに、void型で名前のない仮引数があるんだ?

319:
19/07/09 21:57:18.11 Rbs4mLR80.net
>>296
それは lint 対策ですよ

320:デフォルトの名無しさん
19/07/09 22:42:13.74 pf5t+DpRa.net
最近C言語学び始めた者ですが練習がてらトランプのブラック・ジャック的なものを作っています
そこで11以上がでた時10とするという単純なプログラムを書きたいのですがつまづいています。
ご教授頂ければありがたいです

321:デフォルトの名無しさん
19/07/09 23:16:49.68 PyDbCO5q0.net
>>320
パッと思いつくのは、要素数13の配列用意して
対応する番号の所に希望する数を入れておく

322:デフォルトの名無しさん
19/07/09 23:46:17.89 pf5t+DpRa.net
>>321
一応rand関数というのをつかって1~13までの数をランダムで出すようには組めたのですがそのランダムで出た数が11以上だった時10として扱うというのが組めません
やはり13個全部配列組む方が確実なのでしょうか

323:デフォルトの名無しさん
19/07/09 23:52:36.31 khnvGGZh0.net
ブラックジャックのルール全部適用させようとすると初心者には結構ハードル高いような気がする。

324:デフォルトの名無しさん
19/07/09 23:54:18.16 PyDbCO5q0.net
>>322
式でやりたいなら、
i>10? 10: i

325:デフォルトの名無しさん
19/07/09 23:59:20.27 pf5t+DpRa.net
>>324
ありがとうございます!早速試して見ます!

326:デフォルトの名無しさん
19/07/10 00:04:27.37 YFbFPCAXa.net
>>323
あんまり細かいことはさすがに手が出ないのでとりあえず
・11以上は10として扱う
・21超えたら負け
・1がでたら1か11好きな方を選べる
この3つだけできればとりあえずブラック・ジャックとしてゲームは成り立つかなと考えてます

327:デフォルトの名無しさん
19/07/10 00:04:44.92 q0FoS2hTa.net
カード52枚作るのがいいと思いますよ。
シャッフルもしがいがある。
配列の要素は見た目(ハートのJとか)を表す構造体。なんだったら実際の値も入れる。Aが微妙ですが。

328:デフォルトの名無しさん
19/07/10 00:14:34.49 YFbFPCAXa.net
>>327
作り始めた時52枚全部定義すれば本格的になるかなと思ったのですが、ご教授お願いしている身で申し訳ないんですけど少し面倒だなと思ってしまいましてorz
やっぱりちゃんとしたブラック・ジャックを作りたいなら52枚全部定義した方がいいですよね

329:デフォルトの名無しさん
19/07/10 02:58:29.54 Jh4oErcv0.net
そうしないと確率が変わってしまうのではないかな。

330:デフォルトの名無しさん
19/07/10 07:53:06.60 c5IU7AfX0.net
某ゲーム内のブラックジャックは同じカードが自分と相手に出てきた。
カジノのブラックジャックだとトランプを何セットも混ぜてやってるらしいね。

331:デフォルトの名無しさん
19/07/10 08:45:30.08 FsJSBTR40.net
絵札の数が決まっていると残りの絵札を数えれば勝てるらしい。

332:デフォルトの名無しさん
19/07/10 08:48:48.34 q0FoS2hTa.net
実際は6セットとか使うわけです。
有限なのでカウンティングができる。
過去の結果に依存するってことはサイコロ使うような無記憶な試行ではないってことだね。

333:デフォルトの名無しさん
19/07/10 09:15:26.99 1T4zvF6/x.net
カウンティングだけで勝つのは驚異的な記憶力がないとなかなか難しいと聞く。
小説「マルドゥックスクランブル」でのBJシーンは有名だけど、読んででも半分も理解できなかった記憶があるわ。

334:デフォルトの名無しさん
19/07/10 09:18:07.74 8OTK1K8V0.net
麻雀よりは簡単

335:デフォルトの名無しさん
19/07/10 09:20:35.29 8OTK1K8V0.net
麻雀の方が簡単か
すまん

336:デフォルトの名無しさん
19/07/10 09:37:28.19 z7915HRG0.net
BJのカードカウンティング、結構な種類があるんだね
URLリンク(vegasdocs.com)

337:デフォルトの名無しさん
19/07/10 17:29:16.11 6YiGFI5ep.net
麻雀の役判定、得点計算できるライブラリってある?

338:デフォルトの名無しさん
19/07/10 18:23:48.87 Tg8SA/BfM.net
>>337
ググれ

339:デフォルトの名無しさん
19/07/10 18:44:07.65 rAQ8nA0Y0.net
>麻雀の役判定、得点計算
あると思う
判定も計算も難しくはないし
無くても自製可能なレベル

340:デフォルトの名無しさん
19/07/10 19:16:43.40 iZJC1PSD0.net
ものすごく基礎的な質問で申し訳ないんだけどテトリスのようなゲームを作るとき、実行中のプログラムとは別にn秒ごとにあるプログラムを実行するようなのってどうすればいいの?
キーボードからの入力待ちの状態と並行して時間の計測とブロックを落下させるみたいなの

341:デフォルトの名無しさん
19/07/10 19:21:28.73 rAQ8nA0Y0.net
OSによって違いがあるけれど、
指定した時間間隔でイベントを発生させ
そのイベント通知を受けて処理を行うようにする

342:デフォルトの名無しさん
19/07/10 19:24:28.60 c5IU7AfX0.net
DOSならVSYNC割り込みとかタイマ割り込みっていうのがある。

343:デフォルトの名無しさん
19/07/10 19:37:55.05 b2TgwlJAa.net
入力待ちしてるはずなのになんでブロックは落ちてるんだ

344:デフォルトの名無しさん
19/07/10 19:48:07.07 wGS7rpFP0.net
待ってないから。

345:デフォルトの名無しさん
19/07/10 19:48:36.59 YAEkGiKl0.net
ブロッキング/ノンブロッキング
同期/非同期

346:デフォルトの名無しさん
19/07/10 19:59:01.20 iZJC1PSD0.net
うーん…前提から間違ってるのか?
ブロックを生成した後、キーボードからの入力を待ちながら一定時間毎に落下させるのかと思ってたけど、一定時間毎に落下させる中でキーボードからの入力があればそちらを実行する感じ?

347:デフォルトの名無しさん
19/07/10 20:00:37.82 b4vpo7xg0.net
非同期処理

348:デフォルトの名無しさん
19/07/10 20:08:27.28 iZJC1PSD0.net
なるほど
同期処理、非同期処理を使えば割り込ませたりすることができるのか
まだほとんど理解できてないけどある程度方向性は見えてきた気がする
サンクス

349:デフォルトの名無しさん
19/07/10 20:10:55.04 rAQ8nA0Y0.net
>>346
マルチスレッドって分かるかな?
同時に複数の処理を行うんだけど
多分イメージしているプログラムは
それを利用する事で出来ると思う
ただし、OSが何かによって実装方法が変わってくる

350:デフォルトの名無しさん
19/07/10 20:23:29.74 nUGO9xykM.net
>>346
そうだよ。古典的なゲームは、1秒間に30回または60回、入力の取得と状態の更新と画面の更新を行う。
ギャラクシアンもといタスクシステムでぐぐれ

351:デフォルトの名無しさん
19/07/10 20:48:50.43 lDiVjXP/a.net
テトリス程度の(コンピュータからしたらゆっくりな動きの)ゲームならマルチタスクやマルチスレッドにしなくても順番に処理すればできそうだけどな。
キー入力については何も押されてなかったらすぐに処理を抜けるようにしとけば良い。
で、画面書き換えたりする処理して、またキー入力されてるかを見て、という感じで繰り返す。
キー入力されてたらそれによって変化するパラメータ(テトリスならブロックの向き等)を変更する。

352:デフォルトの名無しさん
19/07/10 21:05:28.75 gc55JO0Da.net
マルチスレッドだって順番だろう
昔はコアが一つしかなかったんじゃよ

353:デフォルトの名無しさん
19/07/10 23:25:08.72 QCGATMsz0.net
ソフトタイマ ポーリング 状態シーケンス制御

354:デフォルトの名無しさん
19/07/11 01:13:09.90 9IeQUu2b0.net
>>352
順番って、時分割で切り替わるって意味?
しかしそれは普通はOSレベルでやってるので切り替え部分までユーザが考える必要はないね。
そこまで自分で作らねばならないようなOSなし環境や昔の 8 bit CPU みたいなのだと別だが。

355:デフォルトの名無しさん
19/07/11 02:10:12.63 j5kiUrVb0.net
>>351
それってキー入力取り逃したりしないの?

356:デフォルトの名無しさん
19/07/11 06:43:27.53 bnplrtu80.net
>>352
マルチスレッドじゃなくて単なるループだと思うが

357:デフォルトの名無しさん
19/07/11 07:08:26.92 l57S3jiM0.net
ハードウェア割り込みとマルチタスクOSがごっちゃになってるんだろ

358:デフォルトの名無しさん
19/07/11 08:25:52.40 Osy0Da+v0.net
>>355
処理のサイクル(1/30秒 や 1/60秒)の間に off->on->off とパルス状に入力されると取りこぼすよ

359:デフォルトの名無しさん
19/07/11 09:26:29.26 42U1oSKOa.net
高橋名人の16連射でもコンピュータからすれば物凄く遅いスピードだから問題ない。40年ぐらい前のクロック4MHzで動く 8 bit CPU でも余裕だ。
それにゲームなら一回や二回入力が失敗しても文句を言うやつはまずいない。

360:デフォルトの名無しさん
19/07/11 10:34:43.73 nMYI1ORia.net
>>356
まあユーザースレッドなんて言葉もあるけども
昔のCPUだとぶんまわすしかなかったけど、ある意味わかりやすい気がするわ。
リッチな環境でアクションゲームってどうやって作るの?条件変数とか使うのかね?

361:デフォルトの名無しさん
19/07/11 11:38:42.52 KgOJMZpN0.net
>>358
炎のコマの解説は嘘だったんだよな
あれ以来、人間を信用しなくなった

362:デフォルトの名無しさん
19/07/11 12:18:10.67 xCkJ5LaR0.net
組み込みでは、0.1~1秒など、長時間に渡って、
何回もキーを押しているかどうか確認してから、機械を動かす
そうやって、ボタンを確実に押しているかどうかを判断する
1回で判断すると、ボタンの接触不良で、
モーターのon/off が繰り返されてしまうから、短時間で判断できない
この判断を、ハードウェア回路で行うのと、ソフトウェアで行うのと、2つの方法がある
詳しくは、組み込み(エンベッド)情報処理資格の教科書を参照

363:デフォルトの名無しさん
19/07/11 12:23:27.06 ZSl7eG940.net
一々教科書を読まなくても「組み込み チャタリング」などで調べれば分かるのでは

364:デフォルトの名無しさん
19/07/11 15:03:35.76 vYMpRAzp0.net
Windows初期はVsync待ちとかウェイトかけずに処理してて、CPU速度が上がったら実機より速くなって(60fps以上)ゲームにならんのもあったわ。

365:デフォルトの名無しさん
19/07/11 21:07:12.90 W9yQmyPFa.net
エイリアンの動きが速すぎて穴を掘ってる暇がないと

366:デフォルトの名無しさん
19/07/11 21:08:10.26 +FsFkp9e0.net
それ何ていう平安京エイリアン?

367:デフォルトの名無しさん
19/07/11 21:47:38.69 BSTUJEPb0.net
space panic

368:デフォルトの名無しさん
19/07/11 21:55:53.90 pe38QhTW0.net
Linuxってconio.h使えないのかよ
getcheもkbhitも駄目とか面倒臭いな

369:蟻人間
19/07/11 21:57:23.76 JEmOAlRld.net
コンソールで色を付けるならpdcurse使え。ncursesは古い

370:蟻人間
19/07/11 21:57:56.88 JEmOAlRld.net
pdcurses

371:デフォルトの名無しさん
19/07/11 22:15:03.30 BSTUJEPb0.net
ioctl

372:デフォルトの名無しさん
19/07/12 04:02:10.72 30ixxYg+0.net
pdcursesってcursesのWindows実装なんだけどな

373:デフォルトの名無しさん
19/07/12 12:58:51.21 4AR7dspsa.net
>>368
ncursesとかを使ってそういうラッパー関数作れば良いのではないかな。

374:デフォルトの名無しさん
19/07/12 18:40:44.71 q8HbeEfz0.net
Cで面白いワンライナーとかない?ICCCMとかにも案外ワンライナーという分類はないんだよね。

375:デフォルトの名無しさん
19/07/12 19:20:34.57 rA9WmwUa0.net
1行と言うのは難しそうだが、7行で良ければ
URLリンク(uguisu.skr.jp)

376:デフォルトの名無しさん
19/07/12 19:24:01.49 Vt6HtS1w0.net
BASIC時代に1画面プログラムってのがあったな。

377:デフォルトの名無しさん
19/07/12 19:40:11.46 aSZPouska.net
1行の定義って何?

378:デフォルトの名無しさん
19/07/12 19:56:09.02 pYBNura/0.net
>>373
既に世界中で書かれて公開されている予感

379:デフォルトの名無しさん
19/07/12 19:56:09.31 zAF1v8/n0.net
\n

380:デフォルトの名無しさん
19/07/13 01:22:11.42 +XrRzYc00.net
>>378
結婚して///

381:デフォルトの名無しさん
19/07/13 06:35:45.40 GFbMPvry0.net
#defineを-Dでやれば1行にできるかも
URLリンク(www.ioccc.org)

382:デフォルトの名無しさん
19/07/13 07:12:15.59 THUdwCLa0.net
そもそも改行しないでプログラム書けば一行

383:デフォルトの名無しさん
19/07/13 13:07:12.18 BfevEbDR0.net
cppディレクティブは1個1行

384:デフォルトの名無しさん
19/07/14 22:19:01.35 uXqqdpfBM.net
int i = 0;
int s[2];
s[i] = i++ + 1;
printf("%d", s[1]);
これの出力が1になります。これは理解できません。
事実、3行目は以下のようにすると出力は0になります。
s[i++] = 1;
また、3行目は以下のようにすると出力は0になります。
s[i] = i++;

385:デフォルトの名無しさん
19/07/14 22:22:40.77 /MgLlV8v0.net
>>384
URLリンク(www.kouno.jp)

386:蟻人間
19/07/14 22:30:43.07 uXkiDi0Ud.net
「式の評価」という言葉はわかるか?
1+1という式を評価すると2になる。
C/C++の後置演算子では、全ての評価が終わった後で変数を書き換える。
i++は、++がiの後ろについているから、後置だ。i++を評価すると、評価した瞬間の値はiであり、そして式全体の評価が終わると、iはプラスいちになる。
後置の反対は前置演算子であり、式全体の評価の前に変数を+1もしくは-1する。

387:デフォルトの名無しさん
19/07/14 22:48:05.04 uXqqdpfBM.net
演算規則に従い、インクリメント後置なので、元の3行目の式は
s[i(==0)] = i(==0) + 1
i = i + 1
の順に行われて結果、
s[0]に0が代入されてs[1]の値は初期値0だと思うのですが。
事実、3行目がs[i] = i++;なら上の通りの順で実行されます。
演算規則が無視されて結果がコンパイラ依存になる理由は何ですか?

388:デフォルトの名無しさん
19/07/14 22:48:51.03 uXqqdpfBM.net
私は間違えました、s[0]に1が代入されます。

389:デフォルトの名無しさん
19/07/14 22:52:20.27 uXqqdpfBM.net
また、3行目を以下の通りにすると演算規則通りに結果2が得られます。
s[i] = ++i + 1;

390:デフォルトの名無しさん
19/07/14 22:53:42.53 uXqqdpfBM.net
順番はこの通りです、
i = i + 1
s[i(==1)] = i(==1) + 1

391:蟻人間
19/07/14 23:13:20.84 uXkiDi0Ud.net
>>387
主な原因は順序が決められないことと最適化のためらしい。詳しくは知らん

392:デフォルトの名無しさん
19/07/14 23:15:43.21 uXqqdpfBM.net
i = i++;
これの結果が未定義なのは直感的に理解できます。
代入とインクリメント増分の関係が不明だからです。
s[i] = i++;
これの結果が未定義なのは直感的に理解できません。
演算規則に従えば、iはインデックスとしての間接参照でしかないからです。

393:デフォルトの名無しさん
19/07/14 23:18:12.85 XOVWGW1L0.net
>>387
左辺と右辺の評価順序は未定義だからだ
gccとclとか違う環境で試してみれば分かる

394:デフォルトの名無しさん
19/07/14 23:28:34.66 uXqqdpfBM.net
int x = 2*i + i++;
それでは、これの結果もまた未定義ですか?

395:デフォルトの名無しさん
19/07/14 23:55:54.94 XOVWGW1L0.net
iの評価は何回だ?
評価が複数回入る式は書くなということだ
仕事でそんなコード書いたらどやされるぞ

396:デフォルトの名無しさん
19/07/15 00:20:47.65 wok43DsHM.net
私は勉強のためにコードを書いています。
コードがどのような動きをするか興味があります。
int a = 1;
int x = (a = a) + a;
それでは、この式ではxは定義されますか?
左辺と右辺の評価順序に関わらず、答えは同じです。

397:デフォルトの名無しさん
19/07/15 00:33:43.29 mPPf+F39a.net
されます

398:デフォルトの名無しさん
19/07/15 00:46:03.12 E9YINa1F0.net
そんな無意味なコードから何を学ぼうとしているのか分からんわ

399:デフォルトの名無しさん
19/07/15 00:55:35.98 wne2EA+X0.net
優先順位や式の評価順が曖昧かもって考えるソース、
書いてて気持ち悪くなりませんか?私はなりますよ。

400:デフォルトの名無しさん
19/07/15 01:14:29.35 Voexy70f0.net
>>394
副作用完了点でググってこい

401:デフォルトの名無しさん
19/07/15 02:04:55.42 wok43DsHM.net
while((s[i++] = t[j++]) != '\0') ;
元々気になったのは、tをsにコピーするこのコードです。
これを見て、他にインクリメントで簡略化出来そうなコードを考えています。

402:デフォルトの名無しさん
19/07/15 02:10:16.53 wok43DsHM.net
for(;t[j] != '\0'; j++){
s[i] = t[j];
i++;
}
s[i] = t[j];
従来の私なら、このようにコードを書いていました。
新しいコードの記述なら1行で書けます。

403:デフォルトの名無しさん
19/07/15 02:19:48.51 wok43DsHM.net
while((s[i++] = t[i + 1]) != '\0') ;
そこでtをsに1つずらしてコピーするコードをこのように書けないか考えていたら、未定義の問題が生じました。
私は演算規則から考えてこのコードは上手く働くと思いました。

404:デフォルトの名無しさん
19/07/15 03:09:03.53 mPPf+F39a.net
俺はmemcpy使う
性能は知らん

405:デフォルトの名無しさん
19/07/15 07:21:57.18 ex33LrHm0.net
せっかくC-FAQのリンク書いたのに…
バカって人の言う事聞かないからバカのままなんだな…

406:デフォルトの名無しさん
19/07/15 07:41:01.06 Voexy70f0.net
>>401
「簡略化」とは、何を目指しているんだ?
行数が少ない方がいいとか考えているならバカな考えだからやめとけ。
コンパイラの最適化で同じコードになるような範囲の変形で行数を減らしたところで、可読性を下げてるだけで何のメリットもないぞ。

407:デフォルトの名無しさん
19/07/15 08:20:49.21 wok43DsHM.net
私は行数の少なさというよりはむしろ見た目の単純さで読みやすいと感じます。
C-FAQのリンクは事実が書かれているのみで演算規則が無視される理由が理解できませんでした。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch