C言語なら俺に聞け 142at TECH
C言語なら俺に聞け 142 - 暇つぶし2ch1:デフォルトの名無しさん
17/08/10 20:21:23.44 hEocmkh50.net
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
URLリンク(paiza.io)
URLリンク(ideone.com)
URLリンク(codepad.org)
C11
URLリンク(www.open-std.org)
C99
URLリンク(www.open-std.org)
URLリンク(kikakurui.com)
C FAQ 日本語訳
URLリンク(www.kouno.jp)
JPCERT C コーディングスタンダード
URLリンク(www.jpcert.or.jp)

スレリンク(tech板)
URLリンク(www.geocities.jp)
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured

2:デフォルトの名無しさん
17/08/10 20:44:11.22 aWUdy/dyM.net
だめ意見にはけなしたり煽るんじゃなくて具体的な反論ができるといいね

3:C言語ますたー《ますたー軍団(常時募集)の長》
17/08/10 21:39:10.50 Wh1e+mJZM.net
帰ったらお勉強だぜ!!

4:デフォルトの名無しさん
17/08/10 21:51:00.72 LT6YffV+0.net
>>1 乙です

5:デフォルトの名無しさん
17/08/11 01:27:59.65 DcjyhNkl0.net
乙っ乙

6:デフォルトの名無しさん
17/08/11 03:16:23.49 suC9gTdR0.net


7:デフォルトの名無しさん
17/08/11 08:28:05.03 8TW1by1n0.net
>>2
煽りコントで笑いをとってたコメディアンのこと?

8:デフォルトの名無しさん
17/08/11 11:41:11.10 JIMcqw5z0.net
最近はPythonやっとけみたいな意見が多いんですが、
今、Cをやるメリットは何かありますか?

9:デフォルトの名無しさん
17/08/11 12:00:57.14 Ca8C76qb0.net
両方やればいい

10:デフォルトの名無しさん
17/08/11 12:14:58.92 8TW1by1n0.net
ハード・ソフト両利きになるには絶好の近道

11:デフォルトの名無しさん
17/08/12 10:34:20.89 mpXbTRP+d.net
IYHスレのかほりがするw

12:デフォルトの名無しさん
17/08/12 16:57:37.18 6AXlD0eu0.net
>>8
それはあなたが今後何をやりたいかによる。

13:デフォルトの名無しさん
17/08/13 15:57:24.74 m4Rk+6os0.net
>>8
結局のところ C は基本中の基本で、避けて通れない、いずれやらないと仕方ない、という状況に追い込まれる

14:デフォルトの名無しさん
17/08/13 16:07:14.55 2GAXDCvV0.net
そういう意味では、あと英語な
マニュアルや規格票といえばまず英語
日本語版はないか、あっても10年遅れとか
そればかりか自分のコードのマニュアルやコメントも
英語で書けとだいたい言われる

15:デフォルトの名無しさん
17/08/13 17:01:50.43 aXXBQeA80.net
え?そんな所あるの?外資系とか?
まあ最初から英語できることを前提に雇っているならわかるけど、そうでない会社で
それやったらネイティブが忍耐をもってしても解読困難な英語モドキの文書の山に
なってしまうのではないか?

16:デフォルトの名無しさん
17/08/13 17:33:10.24 2GAXDCvV0.net
解読困難な英語モドキすっげええ、うんざりするほどあるよ
ずーずー弁しぇからしかこんだらず、なんて次元じゃねえ訛り方
・・・まあ恥ずかしながら日本人の訛り方はトップグループなんだが

17:デフォルトの名無しさん
17/08/13 17:59:59.41 aXXBQeA80.net
omg

18:デフォルトの名無しさん
17/08/13 18:13:02.46 WSSr83j30.net
>>14
英語の鍛え方として王道はないものか‥
今構文の教科書(昔の受験用,今の時代には難しすぎるかな‥)をさらっている.URLリンク(www.amazon.co.jp)

19:デフォルトの名無しさん
17/08/13 18:29:50.42 2GAXDCvV0.net
技術英語を憶えるのに一般英語は邪魔
技術英語独特のボキャ貧はマニュアルや論文でしか学べない

20:デフォルトの名無しさん
17/08/13 18:34:17.87 8MgVlazH0.net
brother と sister は習っても、sibling を学校で習った覚えは無いな

21:デフォルトの名無しさん
17/08/13 18:39:03.83 o1ygPh5l0.net
>>18
自分がある程度詳しい分野のちゃんとした英語のドキュメントを読んでると、ここはこういう意味か、こんな時はこんな表現するのか、と言うのがある程度身についてくると思う。

22:デフォルトの名無しさん
17/08/13 18:54:33.40 2GAXDCvV0.net
>>20

23:デフォルトの名無しさん
17/08/14 00:49:40.57 FXoIQaW20.net
RFC読んだ後は、プログラム関係の文書だけは、英語でも何となくわかるようになったなぁ
人の和訳みながらよんだだけだけど

24:デフォルトの名無しさん
17/08/14 23:14:42.24 G751meAI0.net
苦手意識がなくなるだけでもかなりの前進かと

25:デフォルトの名無しさん
17/08/16 03:13:15.44 J8ft/v5zd.net
C言語の勉強をするためのおすすめのIDEを教えてください

26:デフォルトの名無しさん
17/08/16 06:06:58.39 g+tkU2cqd.net
Visual Studio

27:デフォルトの名無しさん
17/08/16 08:20:25.87 0Vt0rye20.net
Vim Emacs

28:デフォルトの名無しさん
17/08/16 09:23:43.88 zAUipZYH0.net
猫こそ至高

29:デフォルトの名無しさん
17/08/16 10:15:56.42 xWmu06fM0.net
VisualStudioに一票

30:デフォルトの名無しさん
17/08/16 11:07:32.90 J2krMHFz0.net
エディタで充分
IDEいらね

31:デフォルトの名無しさん
17/08/16 11:12:04.39 79/XacN36.net
Cの文法だけ知りたいんならIDEで身につくと思うけど、CのUNIX的な使い方とかMakefileの作り方まで含むならやっぱりターミナルでVimかEmacsが一番身につくと思うな

32:デフォルトの名無しさん
17/08/16 11:17:42.10 Xm1ENLXg0.net
ほんのさわりだけの話なら >>1
URLリンク(paiza.io)
URLリンク(ideone.com)
URLリンク(codepad.org)


33:デフォルトの名無しさん
17/08/16 11:42:34.56 CBEVrlMza.net
覚えるだけとか編集するにはPlumaで良かった

34:デフォルトの名無しさん
17/08/16 12:30:21.85 J2krMHFz0.net
IDEであろうがなかろうが
複数の環境を使ったほうがいい
1つの環境だけ使っていると
間違った知識をたっぷり吹き込まれる
その環境が悪いわけじゃなく
Cには処理系定義だの未規定だのがたくさんあるからだ

35:デフォルトの名無しさん
17/08/16 12:58:54.66 MtMWIb12M.net
汎用機でトライグラフとワードアドレッシングな奴をやっておけば完璧だね

36:デフォルトの名無しさん
17/08/16 17:14:38.09 J2krMHFz0.net
関数を呼び出すたびごとにいちいちGETMAINするのかと思ったら違った

37:デフォルトの名無しさん
17/08/16 18:42:31.13 eXMOwWIc0.net
実際のところトライグラフの環境ってあるのかね
汎用機のEBCDIC(英字)も記号は一通りあるよね

38:デフォルトの名無しさん
17/08/16 21:24:11.17 J2krMHFz0.net
カード穿孔機くらいかな
トライグラフの必要性を感じたデバイスは

39:デフォルトの名無しさん
17/08/17 00:56:17.97 ugZ0fkzt0.net
NEC MSコンピューターとかかな
シリーズで言うと MS120,MS140,MS190

40:デフォルトの名無しさん
17/08/17 06:39:42.32 3FDT79Ua0.net
ヨーロッパとかで英語以外の国で、C言語で使う記号のところに別の文字が割り当てられてるケースとか。文字コードまたはキーボードのキーとして。

41:デフォルトの名無しさん
17/08/17 06:59:39.42 qA/UZuuOM.net
どうでもいいことばかりだな

42:デフォルトの名無しさん
17/08/17 07:30:42.82 5FUl5JPE0.net
バックスラッシュがあるべき文字コードの場所が
現地の通貨記号に置き換わってる環境でトライグラフ使わね?

43:デフォルトの名無しさん
17/08/17 07:50:53.84 wL10pSGX0.net
>>42
そもそもそんな環境で開発なんてしたことないし

44:デフォルトの名無しさん
17/08/17 08:03:54.42 zzoRHhsR0.net
>>42
どこの国だよ
糞だなwww

45:デフォルトの名無しさん
17/08/17 08:26:01.37 NamoDwZf0.net
ノーマークでトライグラフになっちまってたことは過去に何度か・・・
(s)printf 中の format 文字列で

46:デフォルトの名無しさん
17/08/17 09:31:58.57 3IL/r6zdM.net
>>42
半角の¥は廃止すべき

47:デフォルトの名無しさん
17/08/17 10:45:25.58 ugZ0fkzt0.net
>>45
MJD?

48:デフォルトの名無しさん
17/08/17 10:55:11.53 NamoDwZf0.net
>>47
最近のコンパイラはデフォでトライグラフを抑制してくれてるようだけど
古いコンパイラは、そんな気がきいてないから <


49:br> 警告文 "warning??!" ってやって実際の出力が warning| で なんじゃこりゃ?と



50:デフォルトの名無しさん
17/08/17 10:59:46.51 NamoDwZf0.net
それでも ??/ → \ で
次の文字をエスケープして大事故にというのは無かったかな

51:デフォルトの名無しさん
17/08/17 11:00:52.21 OslnP8rdM.net
>>47
>>45じゃないけど "不正な値です: ??(10)" ってやったら "不正な値です: [10)" ってなって
はあ?ってなったことあるわ

52:デフォルトの名無しさん
17/08/17 12:36:35.61 kQ6hfaFr0.net
CとC++は馬鹿には使えない
惨事が起きるから
使わせてはいけないと聞いた

53:デフォルトの名無しさん
17/08/17 13:57:01.69 ylZytAyh0.net
いくつかのコンパイラはトライグラフがデフォルトで無効になっていたと思う

54:デフォルトの名無しさん
17/08/17 16:57:48.81 ZvDESEOS0.net
clとclangとgccはデフォルトで無効だし、今じゃ有効な環境のほうが珍しいんじゃないの

55:デフォルトの名無しさん
17/08/17 21:30:33.60 2RZZpZadE.net
char s[3] = "abc";
printf("%s %lu", s, strlen(s));
これの出力がabc 3にならず
abc 9abc 9とか
abcea 9abcea 9みたいに毎回不定で文字列が出力されるんですけど何でですか?

56:片山博文MZ
17/08/17 21:37:39.45 XnqHf7Mqd.net
>>54
ヌル文字が足りない。
改行がない。

57:片山博文MZ
17/08/17 21:39:34.19 XnqHf7Mqd.net
s[4]か、サイズ未指定のs[]にする。
\nを追加する。

58:片山博文MZ
17/08/17 21:40:55.02 XnqHf7Mqd.net
strlenの返却値はsize_tだから、%luは間違い。

59:デフォルトの名無しさん
17/08/17 23:15:30.23 zzoRHhsR0.net
>>57
正解は?

60:片山博文MZ
17/08/17 23:27:33.59 XnqHf7Mqd.net
>>58
URLリンク(qiita.com)
%zuのようだな。

61:デフォルトの名無しさん
17/08/17 23:35:38.09 zzoRHhsR0.net
組み込みのショボいライブラリじゃ使えなかったりするから
unsigned intにキャストして%u
でいいや

62:デフォルトの名無しさん
17/08/18 03:59:52.12 URLOh4DLM.net
キャスト毛嫌いしてたんだけど、size_t や int*_t シリーズを printf 書式で使う時のベストプラクティスだと気付いてしまったよ。

63:片山博文MZ
17/08/18 04:18:35.01 sjvn+N2bd.net
サイズの変わる型キャストは、(通常無視できる程度の)少しだけコストがかかることに言及しておこう。

64:片山博文MZ
17/08/18 04:20:02.39 sjvn+N2bd.net
わずかに時間と計算量がかかるという意味のコストね。

65:デフォルトの名無しさん
17/08/18 07:04:19.91 R7MrN97k0.net
printf使ってるときなら、無視できるレベルだな

66:デフォルトの名無しさん
17/08/18 07:10:44.43 RGoxPD09M.net
大抵の場合、暗黙でintに変換されるので%dで問題ない

67:デフォルトの名無しさん
17/08/18 07:50:44.76 cQGhZEXD0.net
>>63
64ビットで渡すより32ビットで渡す方が普通は速い

68:デフォルトの名無しさん
17/08/18 07:51:44.71 cQGhZEXD0.net
>>65
intより大きいサイズはintに変換されない

69:デフォルトの名無しさん
17/08/18 09:48:31.67 +zi/zXZ30.net
>>65
問題大ありだよ
64bit 環境では、sizeof sizeof 1 == 8 だぞ

70:デフォルトの名無しさん
17/08/18 10:03:06.56 +zi/zXZ30.net
脇道に逸れるが整数のサイズってどいつもこいつもイマイチだね
char 8
short 16
int 32
long 64
long long 128
と、せっかく5階級あるのを無駄なく使えるようになってない

71:デフォルトの名無しさん
17/08/18 11:07:14.63 cQGhZEXD0.net
どこの環境だよ

72:デフォルトの名無しさん
17/08/18 11:55:29.20 +zi/zXZ30.net
いや、そういう環境があったらなあと

73:デフォルトの名無しさん
17/08/18 12:41:24.28 8ZqVNhGud.net
そんなに細かく分ける意味あんのかね。
64bitだけでいいだろ。

74:デフォルトの名無しさん
17/08/18 12:46:10.63 K+PXWISB0.net
Makefileの書き方なんだけど
makeが実行されているときに 今何を実行してるか表示されるけど
「なんでこれが実行されているんか」の理由も表示したい
依存関係の hoge: fuga を表示したい

.c.o:
@echo $@:$^
$(CC) $(CFLAGS) -c $<
みたいに書いたりしてんだけど、全部に書くのもダサい気がするし
良い方法はないでしょうか

75:デフォルトの名無しさん
17/08/18 15:25:50.71 +zi/zXZ30.net
>>72
128が標準にあれば使い途いろいろあるぞ

76:デフォルトの名無しさん
17/08/18 15:40:25.23 RRX5RBja0.net
>>73
GNU make なら -d (デバグ表示)とかは?
ただ「なぜこれが実行される」って、ファイルの更新日時ぐらいしか
ないと思うけど

77:デフォルトの名無しさん
17/08/18 16:57:07.47 UodSk1FQ0.net
>>75
このコマンドを実行したのは○○より△△が古いから
って言うのを知りたいんでしょ
$^ の意味も知らないならROMってなよ
>>73
make コマンド自体に手を入れた方が早いかも

78:デフォルトの名無しさん
17/08/18 18:57:47.45 aoGOUUu+0.net
C関係ないんだから、別スレでやれよ

79:デフォルトの名無しさん
17/08/18 20:41:27.26 2qfgYUHL0.net
すみません初歩的なことですが・・
前置インクリメントa++
後置インクリメント++a
がありますが、a=a+1は後置になりますよね?

80:デフォルトの名無しさん
17/08/18 20:44:00.68 m74Y+4jlM.net
b=a++ と b= a= a+1 は違う気がする。

81:片山博文MZ
17/08/18 20:47:26.76 sjvn+N2bd.net
どちらでもない。

82:デフォルトの名無しさん
17/08/18 20:49:13.42 5LpMFucB0.net
加算と代入

83:デフォルトの名無しさん
17/08/18 20:51:16.52 2qfgYUHL0.net
回答有難うございます
実験してみたのですが、a=a+1は前置(a++)にも後置(++a)にもなるのですね
URLリンク(i.imgur.com)

84:デフォルトの名無しさん
17/08/18 23:11:42.85 +zi/zXZ30.net
違う! 前置だ
b = (a = a + 1);

85:デフォルトの名無しさん
17/08/18 23:21:22.94 5LpMFucB0.net
a[i++] = i; は悪魔召還だけど
インクリメント演算子なしのこれ
 a[i =i+1] = i;
も鼻から悪魔になるのかな

86:デフォルトの名無しさん
17/08/18 23:57:54.41 nSj4GkNd0.net
>>78
>前置インクリメントa++
>後置インクリメント++a
考え方が逆
変数を基準に考えるのではなく演算子を基準に考える
前置インクリメント++a : 演算子を’前’置した場合、変数(式)の評価’前’に演算子が適用される
後置インクリメントa++ : 演算子を’後’置した場合、変数(式)の評価’後’に演算子が適用される

87:デフォルトの名無しさん
17/08/19 00:03:09.07 0xgPi4RO0.net
>>84
なるでしょ
iの変更と最後のiの評価の間に順序性がない事に変わりはない

88:デフォルトの名無しさん
17/08/19 09:44:47.22 CpINIl4e0.net
i = i + 1;
の、iの変更と最後のiの評価の間の順序性は?

89:C言語ますたー《ますたー軍団(常時募集)の長》
17/08/19 09:54:20.36 6ANTyB1VM.net
>>87
i+1のiは変更前のiでしょ

90:デフォルトの名無しさん
17/08/19 10:03:42.32 cD3Bg7W9d.net
>>30
デバッグしないのか?

91:デフォルトの名無しさん
17/08/19 10:37:04.42 opyN89fo0.net
デバッガはデバッガで起動すればいいし、printf があるし。

92:デフォルトの名無しさん
17/08/19 11:26:43.49 0xgPi4RO0.net
>>87
6.5.16 Assignment operators
「The side effect of updating the stored value of the left operand is sequenced


93:after the value computations of the left and right operands. The evaluations of the operands are unsequenced.」 左オペランドの変更は、左右オペランドの評価の後



94:デフォルトの名無しさん
17/08/19 12:19:31.20 9KU7ntuJ0.net
>>84
MISRA-C で、禁止されている
a[式]
この式に、副作用があったら、ダメ。
バグるから

95:デフォルトの名無しさん
17/08/19 15:28:05.17 CpINIl4e0.net
>>91
thx
だよな、そこは断り書きが必要な箇所

96:デフォルトの名無しさん
17/08/19 23:53:05.68 HeBiuDVT0.net
>>92
バグが入りやすい書き方ってだけでバグるわけじゃない

97:デフォルトの名無しさん
17/08/20 00:16:58.16 856Qy56L0.net
a[i++]= b; は問題ないしな。

98:デフォルトの名無しさん
17/08/20 03:47:32.99 +c5k6kJk0.net
右辺の結果を出してから左辺の計算やってるようだな。
URLリンク(paiza.io)

99:デフォルトの名無しさん
17/08/20 06:41:37.88 6XW1JaY/0.net
URLリンク(i.imgur.com)

100:デフォルトの名無しさん
17/08/20 09:25:38.38 sGdhnhOm0.net
事実上どうなっているという話ではなく
理屈の上でどうなのかという話
ちゃんと断り書きがあったからめでたしだが
そうでなかったら大変だった

101:デフォルトの名無しさん
17/08/20 09:58:54.27 SbUj3AhWM.net
>>76
ありがとう
ちょっとmake読んでくる

102:デフォルトの名無しさん
17/08/22 11:22:32.57 chgkyZKA0.net
defineした定数を文字列定数にいれるにはどうしたらいいの?
#define EOL 0x0d
const char version_message[] = "Version 1.0\x0d"
↑この文字列の改行コードに定数EOLを展開した値を入れたいです。

103:デフォルトの名無しさん
17/08/22 11:44:36.20 xXPB4eWM0.net
>>100
URLリンク(ideone.com)

104:デフォルトの名無しさん
17/08/22 11:47:40.32 przmPyd7E.net
typedef struct hoge {
int a;
int b;
} hoge;
hoge h = {1, 2};
構造体に含まれるメンバ名と値を全て出力する方法を教えてください
上の構造体なら
a,1
b,2
と出力したいです

105:デフォルトの名無しさん
17/08/22 11:59:42.09 GCxyf0Da0.net
>>100
小さな部品を繋いで大きなものを得るのはとても簡単にできるけど
部分を削って小さな部品を得るのはとても大変なのよ
だから本来は改行文字は機能的にレイアウトなのでデータとは分離しておいて
表示なりなんなりするときに結合して使うのが望ましいもちろんVersionと数字もね
その上で既存コードのメンテ等でどうしても必要なら>>101がベスト

106:デフォルトの名無しさん
17/08/22 12:08:53.86 R9ds2cCvH.net
>>100
#define EOLSTR "\x0d"
const char version_message[] = "Version 1.0" EOLSTR;

107:デフォルトの名無しさん
17/08/22 12:11:18.37 xXPB4eWM0.net
>>104
それは迷ったんだよねー
次点でその文字列をマクロで作ることも考えたけどあかんかったw

108:デフォルトの名無しさん
17/08/22 12:14:35.93 GCxyf0Da0.net
>>102
変数名はあくまで人間が扱いやすいように何らかの領域(一般的にメモリアドレス)に付けるあだ名であって
プログラム(コンピュータ)的にはメモリアドレスのほうが扱いやすいのであだ名は不要(アドレスのほうはプログラム的に出せる)
なのであだ名のほうが欲しいなら以下のように直書きするしかない
printf("%s,%d\n", "a", h.a);

109:デフォルトの名無しさん
17/08/22 12:52:42.46 przmPyd7E.net
>>106
そうなんですか・・・
全部直書きするのキツイのであだ名がなくてもかまわないのでこの場合の方法ないでしょうか?

110:デフォルトの名無しさん
17/08/22 13:00:37.52 u9fcDp43H.net
デバッグ目的ならデバッガで

111:デフォルトの名無しさん
17/08/22 13:20:20.96 chgkyZKA0.net
>>101,104、ありがとうございます、
PCとUSBシリアルで通信する組み込み機器のドライバをメンテしていて
受信したテキストの終端検出にEOLはキャラクタで扱っているし
送信する固定テキストは改行含めてリテラルにしたく
プリプロセッサの#か##で連結でなんとかできないか悩んでました。

112:デフォルトの名無しさん
17/08/22 13:21:07.96 bF0tRsYk0.net
コンパイルしたらメンバー名と型の情報は消える

113:C言語ますたー《ますたー軍団(常時募集)の長》
17/08/22 15:44:32.04 tfXVsICTM.net
メモリアドレスを出力させればいいんじゃない?
%pで&aを表示できるはず

114:デフォルトの名無しさん
17/08/22 16:43:27.00 xXPB4eWM0.net
与えられた変数から、メンバ名とその値を再帰的に列挙して欲しいんだろうけど
そんな都合の良い言語じゃないから自分で並べるしかない
必要に応じて毎回並べるか
並べて出力したものを関数化しといてそれを呼び出すか

115:デフォルトの名無しさん
17/08/22 17:44:12.68 NIldwpVs0.net
再帰的に列挙は自動だととんでもない情報量になったりするからな
そこから欲しい情報をどうやって抜き出すかが頭の使いどころ

116:デフォルトの名無しさん
17/08/22 22:53:39.27 YwU2BQ/U0.net
>>100
#include <stdio.h>
#define EOL x0a
#define _STRING(s) # s
#define STRING(s) _STRING(s)
#define _VALUE(s) 0 ## s
#define VALUE(s) _VALUE(s)
char a[] = "Hello" STRING(\EOL);
void main(void) {
int n;
n = VALUE(EOL);
printf("%02x [%s] \n", n, a);
}

117:デフォルトの名無しさん
17/08/22 22:53:45.07 hpqXPKX70.net
>>107
マクロでちょっと簡略化することはできる。ちょっとだけな。
URLリンク(paiza.io)

118:デフォルトの名無しさん
17/08/22 22:56:32.37 hpqXPKX70.net
あ。もうちょっとできたので今修正した。

119:デフォルトの名無しさん
17/08/22 23:26:16.15 bF0tRsYk0.net
>>115
これってさ、メンバ名をconst char*にするんだよね?

120:デフォルトの名無しさん
17/08/22 23:41:21.22 D8nSL4rC0.net
>>115でいいと思うけど、
そもそもこれがしたい場合にC言語を使うのが間違いでしょ。
動的言語かリクレクションがある言語を使えばいいだけ。
ちなみにVC++/CLIでよければリフレクションが使えるけどね。
質問者には無理だろうけど。
レベルからいって>>108が当たりだろうね。

121:デフォルトの名無しさん
17/08/23 00:06:55.83 b0JJUPNx0.net
>>117
#x の所? そうじゃないかな。gcc -E とかやって見てみるとわかると思うが、 h.a は単純に "h.a" になっている。
>>118
C使わなきゃいいってのはその通りだが、それを言っちゃあお終いよ。

122:デフォルトの名無しさん
17/08/23 00:14:59.00 PJzK0CC4M.net
構造体のメンバ名がほしいとかデバッグ以外に何があるの

123:デフォルトの名無しさん
17/08/23 00:22:23.00 CuDbJhab0.net
>>120
有名どころはGUIのバインディング。
例えばWPFは自動的にリクレクションを使ってこれをやってくれる。詳細は以下参照。
URLリンク(www.atmarkit.co.jp)
ただ、Cのアプリでこれは要らんし、今時生CでGUIもないよな?

124:デフォルトの名無しさん
17/08/23 06:05:17.73 x0fRL5lg0.net
テキストベースで構造体の値のファイルへの保存と読み込みをしたいのかな

125:デフォルトの名無しさん
17/08/25 05:26:20.30 vC6ff47f0.net
マクロでどうにかできるかとも考えたが壊れる対処のし様がない
#define pr(a,b) printf(pr_##a(b))
#define pr_test_t(b) "#b{i:%d,s:%s}", (b).i, (b).s
typedef strct{int i; char *s;}test_t;
pr((test_t){.i=999; .s="abc"});

126:デフォルトの名無しさん
17/08/25 05:30:42.91 hNG5yKqv0.net
Cはウンコ言語なのでリフレクションはありませんの一言で終わる質問

127:デフォルトの名無しさん
17/08/25 08:26:26.12 degYWVoy0.net
C言語はもう 気ままにリフレクション

128:デフォルトの名無しさん
17/08/25 08:28:37.56 +VfvF6y6d.net
>>124
うんこじゃない言語もコンパイラはうんこ言語(お前に言わせるとC言語)でつくられてるけどな

129:デフォルトの名無しさん
17/08/25 08:31:15.05 mWX/padLd.net
本当にうんこならとっくの昔に消えてるよ

130:デフォルトの名無しさん
17/08/25 15:42:32.73 RGmsOxnq0.net
Cはうんことかほざくやつ
まさかLinuxなんか使ってねえだろな

131:デフォルトの名無しさん
17/08/25 17:02:40.42 mWX/padLd.net
linuxはうんこ

132:デフォルトの名無しさん
17/08/25 17:44:02.80 GY4pXB3S0.net
Cがウンコとか言ってる奴に限ってRubyでしか書けないとかいうオチだったら笑えるんだけどな

133:デフォルトの名無しさん
17/08/25 21:36:12.81 BZOsNf+t0.net
高級アセンブラ最高じゃん

134:デフォルトの名無しさん
17/08/25 22:36:16.04 +VfvF6y6d.net
>>131
ほんそれ

135:デフォルトの名無しさん
17/08/25 22:45:39.22 IHFV3+gX0.net
むしろ Ruby で自由にコードを書ける人を尊敬する今日この頃。
最近やってるんだけど、どうしても馴染めない。普通には組めるけど、違和感が残るというか抵抗があるというか。

136:デフォルトの名無しさん
17/08/26 00:06:54.39 F7j6CSPU0.net
リフレクションを使う気がなければリフレクション自体がウンコだよ。
・ソースコードがだだ漏れ
・実行体が無駄に膨らむ(ソースコード情報を含むため)
・リクレクションが必要な用途なら、動的言語でついでに型無しの方が断然楽
GUIとかね。
ウンコと言われ続けたJavaScriptを誰も殺せず、
ついにはElectronとか言い出してデスクトップ側にも進出してきてるだろ。
やれば分かるがGUIに関しては動的型無しHTML(=JavaScript)は最強。
C言語はC言語が目指した範囲での仕様は美しいよ。
ただそこには今後ともリクレクションは必要ないね。
唯一引っかかるのは>>122か。
>>133
どの辺が?
俺はRuby使いではないが、それよりも酷いとされるJavaScriptには馴染んでしまったから、
ある程度は答えられるかも。

137:デフォルトの名無しさん
17/08/26 00:48:52.34 acOQPPj10.net
lua等の組込み言語とやり取りする container生成用補助構文群が有ってもいい
関数では前方宣言とか scopeが邪魔して対処しきれないだろうから
うまくすれば文字列操作表示も標準libraryから追い出せる

138:デフォルトの名無しさん
17/08/26 00:52:27.30 acOQPPj10.net
pr(test_t, (test_t){.i=999; .s="abc";});

139:デフォルトの名無しさん
17/08/26 14:20:33.57 rkE5GYva0.net
>>134
javaでアノテーションいじり始めるとリフレクションまじ便利で欲しくなるけど、c系にはなくてもいいかなというのも思う。
テバグ目的ならgdbでいいしな。

140:デフォルトの名無しさん
17/08/29 00:26:03.40 +Y8D6iZy0.net
>>134
規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
TypeScriptとかFlowとか
速度を稼ぐ目的でwasmも今後主流になっていくだろう
巨大ストレージ、OSSが主流な時代にメタデータのサイズやソース隠蔽は気にしなくなったし

141:デフォルトの名無しさん
17/08/29 02:58:14.41 Uz0lh6nE0.net
>>138
> 規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
違うね。今の流れは「選べる」だ。つまり、
・型無し言語に型情報を付加し、恩恵を受ける---TypeScript
・型あり言語に型推論やジェネリックを追加し、型情報を記述する煩わしさを回避---C#/C++/Java
どっちも出来ることはほぼ同じ。ほぼ全ての言語がここを目指してるでしょ。(Cを除く)
要するにいいとこ取りを目指しているわけで、自然な流れだ。
型があった方が助かるのなら書け、煩わしいだけなら書かなくて済む、という方向に進化しつつある。
なお、GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
> 速度を稼ぐ目的でwasmも今後主流になっていくだろう
ならんと思うし、C使いにとってはなったとしてもああそうですか、でしかないと思うが。
> 巨大ストレージ、OSSが主流な時代にメタデータのサイズやソース隠蔽は気にしなくなったし
OSSについては歪んでいて、本来は選べるべきだよ。
JavaScriptのようにソース曝露必須というのは問題ではある。
富豪どころか大富豪プログラミングを自由に出来る時代ではあるが、
何だかんだで速度=バッテリの持ち/快適さなので、実際は、「気にしなくていい環境も増えた」だよ。
とはいえCレベルでのチューニングが必要なこともそうないが。

142:デフォルトの名無しさん
17/08/29 07:49:01.20 pPJ906sN0.net
>・型無し言語に型情報を付加し、恩恵を受ける---TypeScript
>・型あり言語に型推論やジェネリックを追加し、型情報を記述する煩わしさを回避---C#/C++/Java
後者は型を明示的に書かなくてもいというだけで最初からすべて型検査してるぞ。
型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。

143:デフォルトの名無しさん
17/08/29 08:29:00.57 E7mhir0G0.net
動かす前にバグが見つかる仕掛けがちゃんとあるなら
動的型付けでも構わんよ

144:デフォルトの名無しさん
17/08/29 14:42:19.23 /UmWkn6m0.net
無理ゲーっぽくね?

145:デフォルトの名無しさん
17/08/29 14:47:49.09 /UmWkn6m0.net
んなことはないみたいだぬ

146:デフォルトの名無しさん
17/08/29 18:55:09.32 qEt/+AkhM.net
100%は無理
そこそこなら行ける

147:デフォルトの名無しさん
17/08/29 20:04:11.09 //zGX0GI0.net
option explicit +中間言語コンパイル,なら使えそうだ

148:デフォルトの名無しさん
17/08/29 22:43:29.12 Uz0lh6nE0.net
>>140
> 型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
これは事実としてはその通りだが、理由はこれが型あり言語の正義だからであって、
現実は型検査がウザイだけの時も多いだろ。
C++のtemplateとか、varで書いたら勝手にtemplate化してくれ、という場合も多い。
込み入ったことをやるとコンパイルを通すだけの為に苦労したりするが、
あんなのは完全に時間と手間の無駄だ。
また、他でもよく言われているが、確かに関数ポインタを常用し始めた場合、
型あり『しか出来ない』言語は壮絶にウザイ。どうでもいい型が氾濫するだけだし。
言語として出来る/出来ないではなく、
ユーザーがやりたい時には出来る/やりたくない時には切れる、が正解なんだよ。
型無し言語はこれを認めていて、欠点を修正し始めてる。
型あり言語はこれを認められず、まだ自分たちの正義(型検査は必須)を押し売りしてるだけ。
C(と言うかC++)ではconstがこの状況に近いのではないかな?
通説ではconstは付けるべき、となっているが、俺は付けてない。理由は、
・そもそも俺はconstで苦労したことがない(必要性を感じない)
・中途半端に付けてると余計に面倒になるだけ
・const_castとか、ただの馬鹿としか思えない
なんだが、同様の意見の奴もある程度はいるだろ。
過剰な型検査ってのはあるんだよ。それが人によって異なるってだけで。
やればいいって物ではない。

149:デフォルトの名無しさん
17/08/29 22:56:30.74 pPJ906sN0.net
なんだ�


150:H>>139の「違うね」ってのは現状認識が違うって話じゃなくてあんたの理想と違うってことか? そりゃ正解はあんたにしかわからんわ。



151:デフォルトの名無しさん
17/08/29 23:14:00.57 Uz0lh6nE0.net
>>147
現状認識も間違っていると思うけど。
日本語が不自由ならさようなら。
そもそも「型検査」が欲しいわけではなくて、静的チェックが欲しいだけなんだよ。
君は最初からずれている。>>141が正しい。

152:デフォルトの名無しさん
17/08/29 23:17:01.52 /SLQJmZn0.net
> コンパイルを通すだけの為に苦労したりするが、
> あんなのは完全に時間と手間の無駄だ。
そうだねえ
自分の考えがはっきりしてなくて筋が通らないのを
コンパイラに突っ込まれ、そのたびに右往左往じゃ
下手の考え休むに似・・いや如かずってやつ

153:デフォルトの名無しさん
17/08/29 23:31:56.37 pPJ906sN0.net
「今の流れってこうだよね」
「俺の欲しいものは違う」
会話にならねぇ。

154:デフォルトの名無しさん
17/08/29 23:53:00.65 Uz0lh6nE0.net
>>150
そうとしか取れないのは君が未熟だからだね。
「流れ」ってのは原因ではなく、大多数が希望した「結果」なんだよ。
君は初心者だから、毎日コード書いている連中が何を求めているのか分からない。
それだけだね。

155:デフォルトの名無しさん
17/08/29 23:57:29.58 +Y8D6iZy0.net
>>139,146
>GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
見てわかる程度の規模の場合は型無しでもよいだろうね
>型検査がウザイだけの時も多いだろ
どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
COM除けばJSONやXMLの処理で楽するときぐらい?それでも本番用ならちゃんと書くなぁ
>どうでもいい型が氾濫
ジェネリックで型指定するだけだから氾濫しなくね?
あと、constはプログラマーがミスを防ぐためのものであると同時にコンパイラーへのヒントでもある
const修飾されていれば大胆な最適化が可能な場合も多い

156:デフォルトの名無しさん
17/08/30 00:01:54.97 3iEZIBUv0.net
>>151
俺も>>150と同じように読めた。
自分の希望を大多数の希望だと決め付けるのは止めろよ。

157:デフォルトの名無しさん
17/08/30 00:53:26.35 F1WQhw000.net
>>152
> >GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
> 見てわかる程度の規模の場合は型無しでもよいだろうね
規模にかかわらず、見ずにチェックするGUIなんて無いだろ。
> どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
おー、C#はやはり進んでいるというか、痒いところに手が届いているね。
要するに楽をさせてくれでしかないのだが、ぱっと思いつく遭遇したケースは、
・callbackでdelegateの型チェックがウザイ。グダグダ言わずにcallbackしてこい。
・リフレクション時がかなり最悪。(C#なら問題ないが、
VC++2008とかだと、MSDNで型を調べながら型を書くという本末転倒の事態になる)
以下にはJSONガーとか書いてあるけど、JSONをC++で受けたことはないので実感はない。
URLリンク(ufcpp.net)
後は型無しだとデタラメなパッチが可能だというのもあるし、俺は常用してるけど、
これ自体はあまり推奨されることではないね。
俺はJavaScriptで型をかかないことに慣れてしまったので、
再びVC++で型を書く時にウザくて仕方ない。
(ただしこれはVC++しかやってない時には全く感じなかった)
要するに型情報は具ではなく、ただのチェック用付加情報でしかないんだよ。
例えれば、当たり前に読める漢字にもいちいち全部ルビを付けている感じか?二度手間がウザイ。
ただし二重チェックをしたい部分もあるので、そういうところは書かせろ、とも思うが。
コンパイラにプログラマが合わせるのではなくて、プログラマにコンパイラが合わせるべき。
> ジェネリックで型指定するだけだから氾濫しなくね?
C#は多分そうだね。C#では解決済みかも。
> const修飾されていれば大胆な最適化が可能な場合も多い
この説はよく聞くが、具体的にどういうケースよ?

158:デフォルトの名無しさん
17/08/30 00:58:09.18 ry+Kms2n0.net
>>141
こういうやつってユニットテストしらないのか?
Cでも今時は書くだろ

159:デフォルトの名無しさん
17/08/30 01:17:46.58 ry+Kms2n0.net
型どうこうで考えるべきは依存関係なんだが
静的型言語はすぐに依存関係ができる
そのためにやれ継承だのインタフェースだのデザパタだのとごちゃごちゃ考えなきゃならん
しかもデザパタで実現できる疎結合は完全じゃないからね

160:デフォルトの名無しさん
17/08/30 01:56:29.11 F1WQhw000.net
>>156
それは型ではなくてラムダの利点だと思うが。
ただ、ラムダを積極活用すると型が邪魔だってのはあるし、
結果的に関数型が型無しor型推論に突き進んだのはこれが理由だと思うが。
しかもデザパタって使い物にならんだろ。
というか元々Javaという関数ポインタもラムダもない言語で(キリッされても、
他の言語ならもっとマシに出来るんじゃね?ってのが多いというか、
なんで縛りプレイに付き合わないといけないの?っていうか、
だいたい説明自体もイミフなのが多いし。

161:デフォルトの名無しさん
17/08/30 02:00:40.60 vF4qFgfn0.net
>>154
コンポーネントとかイベントの引数の型を間違えたり変更時に修正漏れが出たりはよくあるでしょ
>callbackでdelegateの型チェックがウザイ
async/awaitがある言語だとコールバックを使うことはあまりないしなぁ
どういうのを望んでるのかよくわからんが、型安全と最適化を投げ捨ててまでやることには見えん
コールバックの処理が適切なことはテストとかで保証するとか考えるとそっちが面倒そうに見えるが
>リフレクション時がかなり最悪
VC++でリフレクションって、どの話だ
>チェック用付加情報・二度手間がウザイ
どうせドキュメントとかテストに書いてくんだから二度手間は避けられん
定義が面倒な分、静的型言語では戻り値の型やメンバーが即座に確実に補完されるので非常に快適
全参照を書き換えるリファクタとかもできるし
新しい言語はそこら辺かなり解決されてる

162:デフォルトの名無しさん
17/08/30 02:07:48.34 ry+Kms2n0.net
>>157
酔ってんのか?Java?意味不明だ
レス付けるなら何を話してんのか特定しろ

163:デフォルトの名無しさん
17/08/30 02:25:01.52 vF4qFgfn0.net
>>154
constはどちらかというと、x + y = zみたいな変な呼び出しを禁じたいからつけてるから、最適化についてはパッとでは極端な例しか思いつかんな・・・
hoge(&a,&b);
c = a + b
でhogeの引数がconstなら処理を無視してa+bを静的に確定できるとか
根本的にC++は「型安全とバイナリの性能>>>楽をしたい」という発想の言語だから静的な型の確定を妨害するような機能は理念に反するでしょ
javascriptにポインタが欲しいぐらいの不自然さ

164:デフォルトの名無しさん
17/08/30 06:22:36.60 dAnuHQ8p0.net
早く夏休み終わらないかな…

165:デフォルトの名無しさん
17/08/30 07:01:40.06 AqkMSzAW0.net
いや終わらなくていいよ
電車混むし

166:デフォルトの名無しさん
17/08/30 08:10:07.81 Li+Lo8rKd.net
大学生のは未だ続くで

167:デフォルトの名無しさん
17/08/30 13:51:14.27 AB0hyKA3E.net
すいません
Windowsでvirtualboxとかcygwinとかmsysみたいな名前のをインストールする予定はないんですが
WindowsでCを書く場合はVC++を使うのが定番なのでしょうか?
gccとclangを使うのはあんまりおすすめしないですか?

168:デフォルトの名無しさん
17/08/30 13:58:51.95 1qHN72hha.net
GUIないならgccでも問題ない

169:デフォルトの名無しさん
17/08/30 14:33:39.82 BJd10UjW0.net
GUIあってもgcc使えるぞ
gcc your_program.c -luser32 -mwindows
-luser32ってのがインポートライブラリuser32.libを使う指定な
他に色々kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.libなんかがいるんで適宜追加しる

170:デフォルトの名無しさん
17/08/30 18:06:52.31 S+MvNVsbM.net
Windows版のgccある?

171:デフォルトの名無しさん
17/08/30 18:24:32.41 BJd10UjW0.net
たとえばこんなのか?
URLリンク(sourceforge.net)

172:デフォルトの名無しさん
17/08/30 18:31:00.76 S+MvNVsbM.net
mingw 入ってない環境だとバイナリ使えないよね。
コンパイルして実行したいだけなのに。

173:デフォルトの名無しさん
17/08/30 18:43:05.43 LRl1+/WB0.net
実行ファイルの配布の意図?
mingwでコンパイルできれば、実行もできる環境が整ってるんじゃないの?

174:デフォルトの名無しさん
17/08/30 19:17:06.22 58Rp2mqQ0.net
>>169
よくごっちゃにしてる人がいるけどそれはcygwinを使う場合
mingwはランタイムにmsvcrtを使うのでcygwin1.dllは不要

175:デフォルトの名無しさん
17/08/30 19:17:51.85 BJd10UjW0.net
あのなー・・・
cygwinがそういう批判を受けていたのを踏まえて
「本当のミニマリスト」を目指したのがmingwなんだよ
それすらいやなら、あとはM$純正のbashくらいだぞ

176:デフォルトの名無しさん
17/08/30 19:21:14.37 qx/wlZ6S0.net
URLリンク(www.youtube.com)

177:デフォルトの名無しさん
17/08/30 20:36:36.61 ViOUv0iA0.net
>>167
The Perl for MS Windowsって言うのがある。
これインストールすると、gccも入る
普通にコマンドラインで使える
URLリンク(strawberryperl.com)

178:デフォルトの名無しさん
17/08/30 20:41:41.90 BJd10UjW0.net
>>168だって本当に最小限のmingwが黙って入るから意識せずに使えるぞ
で最小限じゃないmingwが欲しくなったらmsys2とか入れるんだよ

179:デフォルトの名無しさん
17/08/30 20:52:42.57 t1uAI5x90.net
こういう枝葉でゴチャゴチャやるぐらいなら、さっさとVC入れたほうが良い
windowsで開発するなら、VCさえあれば十分

180:デフォルトの名無しさん
17/08/30 21:46:54.45 1xtdX2a20.net
コンソールアプリくらいならgccでコンパイルできても良さそうなもんだけどな。
関係ないけど .NET に JS コンパイラが入ってるの知らなかった。

181:デフォルトの名無しさん
17/08/30 22:05:25.61 AIW55pOFM.net
>>168 >>171
知らなかったです。
いいですね、MinGW

182:デフォルトの名無しさん
17/08/30 23:02:07.68 F1WQhw000.net
>>158
> 引数の型を間違えたり変更時に修正漏れが出たり
ねえよ。正確に言うと、『これが型検査で都合よく引っかかるのは』ねえよ。
型があってコンパイル時に落とせるのは明確なtypoだけで、それ以外は期待出来ない。
xxxx2とxxxx3とかを間違えた場合、通常、型は同じでしょ。
ただそれ以前にJavaScriptだと修正漏れ自体がないっつうか、修正しなくていいというか。
型検査は基本的にソース全体で辻褄が合っているかを検査する。
だから例えば機能追加で関数の引数が増えた場合、コンパイラは修正漏れを全て検出し、修正を促してくる。
ところがJavaScriptにはそういう機能はないから、漏れてしまう、というのがそちらの意見だと思うが、
そもそも漏れても動作するように作られてるから問題ない、というのがJavaScriptの思想。
具体的には、
・同じ関数が引数の数が違っても呼べるから、エラーにはならない。(引数の型/個数はシグニチャに入らない)
・足りてない引数は、undefind(falsy)になっているから、if (addedParameter) で簡単に対応出来る。
だから修正するパス(その機能が追加される動作パス)の部分だけ修正して、後は放置で問題ない。
もちろんこれだとソース内で引数の数の一致なんて無くなってしまう。
これでいいのか?とも思うが、俺が試した範囲では特に問題はなかった。
C#はIDEがいいから、全ソースをリファクタとかも簡単に出来るようだ。これはこれで一つの完成形だ。
そうではなく、手修正だと漏れる、だからコンパイラがそれを検出する、というのも一つの手だが、(C++)
漏れる漏れない以前に、関係ないところは修正の必要がそもそも無い、というのも一つの手だよ。(JavaScript)
ちまちま全修正するのが面倒だし危険だから、
受け側で引数違い毎にラップ(オーバーロード)してたらなんだかなぁ(俺的C++)、
みたいなのとは発想が逆だった。

183:デフォルトの名無しさん
17/08/30 23:03:09.90 F1WQhw000.net
async/awaitはJavaScriptにもあるが、あれはC#とかで必要なのであって、JavaScriptでは要らないね。
理由は、
・外側関数(上位階層)の変数は全部クロージャになっていて読み出せる。
・関数はどこにでも書ける。
から。C的に関数毎に変数が完全に分離している時にはasync/awaitでないと変数が共有出来ないけど、
JavaScriptの文法だとcallbackでも変数共有出来るから、要らん。具体的には、文法は適当だが、
function someTask {
var x = xxx;
var a = await funcA(x);
var b = await funcB(a,x);
}
みたいなのを、
function someTask {
var x = xxx;
var a, b; // 共有変数は上位で宣言しておく。これでクロージャから捕捉出来る。;
function funcA(){}
funcA(funcB); // funcBはcallback、funcA内でxは使える、aにも書ける
function funcB(){} // funcB内でa,xは使える、bにも書ける
}
だからawait毎にぶった切ってcallbackしても、上から順に実行するだけの単純ソースにしかならない。
JavaScriptなら、どっちでもいいや位でしかないんだよ。
C#ではこれができないから、async/awaitが必要だってだけで。
ただ俺もcallbackと言ったがこれは間違いだった。VC++では非同期のcallbackはやってないわ。
ウザイと思ったのは関数ポインタを差し込む時に型チェックがあることだった。
上記の通り、JavaScriptでは関数ポインタでさえあれば引数の型と個数は関係なく呼んでくるので、
関数ポインタを差し込む時にいちいち考える必要がないんだよ。
そして機能追加は追加パスだけの変更で済む。
C++の型チェックだと変更がソース全体に及ぶしこれを断れない。
引数の型とか個数を間違えた場合、普通は根本的に動かないなら、テストでは当てさえすれば検出出来る。
そんな簡単なエラーチェックの為にコンパイルを通すだけの為にいちいち型を合わせたり、
変更がソース全体に波及するのが危険でウザイって事。

184:デフォルトの名無しさん
17/08/30 23:04:03.99 F1WQhw000.net
> コールバックの処理が適切なことはテストとかで保証するとか考えると
どのみちテストはやらんと駄目でしょ。と言うか、逆に、
「コールバックの処理が適切なことは『型検査』で保証する」ってのは無理でしょ。
Haskellのキチガイ共はそういう思想らしいが。
「型安全」ってのはバグの一つの形「インタフェース(接続部)の間違い」を検出するだけであって、
処理の中身が間違っている場合は全く検出出来ない。つまりテストは省略出来ない。
それで「型安全」にするために払うコストと、それによって受ける恩恵を考えた場合、
俺にとっては「無いよりマシ」程度で、「投げ捨ててまで」って程の価値はないね。
とはいえtypoを検出する機能だけは欲しいんだが、逆に言えばそれだけで十分だ。
>>160
多分、constで最適化ガーってのはやっぱり無いんだよ。
想定されるケースはそちらの挙げたとおりで、
void someFunc(){
// (A)
hoge(&a, &b); // (B)
// (C)
}
で、(B)で変更されないことを保証されれば、
(A)時点の&a, &bのキャッシュ(というかローカル変数に取ったもの)が
(C)でも有効です、ってだけだが、そもそもこのケースがないだろ。
自関数内で変更してるかどうかはコンパイラには明確に分かるんだから、
考えられるのはこのように他関数をまたいだケースなんだけど、
それなら最初から(A)(C)(B)の順に処理しろ、でしかないし。
((B)で変更されるから(C)は(B)の後ろなのであって)

185:デフォルトの名無しさん
17/08/30 23:14:59.21 58Rp2mqQ0.net
ただmsvcrtを使うということはvcがサポートするC規格に引きずられるのを留意しておくこと
最新のmsvcrtでもたしかC99止まりでinttypes.hをインクルードしてもPRId64とか使えない
C11の機能が欲しければ素直にlinux+gcc|clangの環境をオススメする

186:デフォルトの名無しさん
17/08/30 23:55:33.72 FdjUx67gd.net
最適化かけないと通るけど、最適化かけるとセグフォ
プリントデバッグしたらプリント文置いたり減らしたりするだけで最後に表示されるものが変わる
なんだこれ

187:デフォルトの名無しさん
17/08/31 00:01:55.43 B2+zi4Baa.net
最後に¥0を付けてないとか

188:デフォルトの名無しさん
17/08/31 00:06:31.32 M/UQy7Jt0.net
>>183
malloc/free使ってる?

189:デフォルトの名無しさん
17/08/31 00:15:15.17 AFctto/wd.net
>>185
一切使ってないっす……
引数で配列の大きさ渡してるのがまずいのかもしれない

190:デフォルトの名無しさん
17/08/31 00:22:21.25 Mr6ZzHeH0.net
配列サイズを越えて代入しているとか

191:デフォルトの名無しさん
17/08/31 00:28:32.21 K0ByhO+S0.net
つかソース晒せないの?

192:デフォルトの名無しさん
17/08/31 00:28:58.33 AFctto/wd.net
配列の代入とは関係ないところで死んでるっぽいこともあるんだけど、それでも配列の範囲外アクセスとかあるものかなあ……

193:デフォルトの名無しさん
17/08/31 00:31:52.88 AFctto/wd.net
>>188
そこそこ依存ファイルあるし、一応研究室の研究で書いているので、失礼ながらソースは上げられないです

194:デフォルトの名無しさん
17/08/31 00:32:55.14 AFctto/wd.net
よく考えたらそんな状態で相談することが間違いか
やっぱり撤回します。スレ汚しすいませんでした

195:デフォルトの名無しさん
17/08/31 00:34:49.91 M/UQy7Jt0.net
>>190
メモリリークをチェックしてみたら

196:デフォルトの名無しさん
17/08/31 02:33:47.40 KfXpPD/x0.net
最適化の有無で変わった事と言うと、この前こんなことがあった。
(以下の A, B は typedef された構造体)
A *p = NULL;
B *q = NULL;
if (...) {
 A x;
/* x の初期化などをする。 */
 p = &x;
}
if (...) {
 B y;
/* y の初期化などをする。 */
 q = &y;
}
この後で p が NULL でなければ p の指す先を使おうとして死亡。
まあ、ブロック(というかスコープ)から外れた所で使ってるんだから当然と言えば当然ではあるが、
最適化しない場合は x, y はその他のブロック外の自動変数と同じようにスタックに領域が取られ
ていて変化する事がなかった。そのため内容は保たれた。
しかし最適化したら A の領域は A のあるブロックから外に出たら破棄されたと解釈され、そして
B のあるブロックの B の領域として上の A の領域を使用するようになっていた。そのため x と y
の指す先は union のように重なってしまっておかしくなったと。

197:デフォルトの名無しさん
17/08/31 03:22:36.47 IR3nOS0l0.net
>>179
いや、もっと単純に、APIの仕様変更で取得できる情報や型が変化したけど、エラー処理とか偶然うまく見える場合とかは目視では見落としがあるよねということ
テストを書く前に簡単に修正箇所がわかれば便利みたいな話だけど、まぁ、やり方やライブラリによって違うのかもね
少なくともAngularとかはTypeScript採用だし、型あったほうが便利派は少なからずいるよとだけ

198:デフォルトの名無しさん
17/08/31 03:58:43.17 IR3nOS0l0.net
>>180,181
C#でも同じようにラムダ式やローカル関数で変数をキャプチャできるぞ
というかC++でもできるはず
コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
新しいライブラリとかはPromiseで返すのが当たり前になって来てるし、今後の言語もasyncに舵をきるんじゃないかな
>関数ポインタを差し込む時にいちいち考える必要がない
C++でどうやって実現すんの?
char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ
コンパイルエラーじゃなくてテストで保証するとになればなおさら変

199:デフォルトの名無しさん
17/08/31 04:15:22.77 IR3nOS0l0.net
>>181
>最初から(A)(C)(B)の順に処理しろ
何言ってんだBとかCに副作用があるなら入れ替えちいかんだろ
コードは適当だけど、
void test(a,b)
{
hoge(&a,&b);
piyo(a+b);
}
test(1,2)
みたいに静的に確定するなら、piyoの引数をコンパイル時に計算してpiyo(3)みたいなコードをはいてくれたりもする

200:デフォルトの名無しさん
17/08/31 05:12:55.38 egwbmqN8M.net
スタックフレームの破壊は明白なんだから関数内で宣言してる配列全部の
範囲チェック入れてみな

201:デフォルトの名無しさん
17/08/31 11:26:29.57 e5ym4hpC0.net
やりそうなこと
□ 要素数 n=10 の配列 int array[10];
アクセス可能なのは array[0] ~ array[n-1] まで
なのに array[n] を利用してる
□ 文字列による配列の初期化で 終端記号(\0)含んだ分の領域を用意してない
× char text[3] = "123"; // 終端記号含めると 4要素の空間が必要なのに 3要素にしてる
○ char text[] = "123";  // コンパイラにおまかせで
□ 要素数を求めるのに sizeof(a) / sizeof(a[0]) を使ってるけど
そもそも論で a が配列ではなくポインタだった為
処理したい要素数が渡っていない

202:デフォルトの名無しさん
17/08/31 13:55:57.05 wUqC2S3T0.net
>>183
研究室から出せない秘伝のソース、
なら特殊なハードウェアで、実はvolatileが欠かせない、とかじゃねえの
ソースの向こうのハードウェアが実は核分裂制御装置でした!……とかでももう驚かねえよ

203:デフォルトの名無しさん
17/08/31 16:11:13.20 aZ9Rj489d.net
創業当時から継ぎ足した秘伝のソース

204:デフォルトの名無しさん
17/08/31 16:17:00.98 JYM1pg890.net
半分使って、半分継ぎ足しを繰り返すと79回目あたりで
アボガドロ定数の逆数くらいに薄まるよね

205:デフォルトの名無しさん
17/08/31 16:47:29.73 aZ9Rj489d.net
何か、酵母とか菌糸とか入ってて熟成されるんよ。ただ混ざるだけじゃないんよ。

206:デフォルトの名無しさん
17/08/31 22:53:34.07 F9uWTtxD0.net
>>194
> 型あったほうが便利派
半分くらいはインテリセンス目当てだと思うぞ。
そして俺自身も型を否定はしないが、C++の型検査も過剰気味だと感じている。
だからconstは使ってないし、関数ポインタの型検査もウザイ。
つーか、型を間違えること自体がほぼ無いだろ?
引数の順番を間違えたりした場合に型検査で引っかかるってだけで。

207:デフォルトの名無しさん
17/08/31 22:54:02.64 F9uWTtxD0.net
>>195
> ローカル関数で変数をキャプチャできるぞ
ローカル変数しかできんだろ。しかも明示しなければならない。(全指定も出来るが)
JavaScriptの場合は上位関数の変数をどこまでも辿れるので、(レキシカルスコープ)
入れ子になっていても破綻せずに分解して展開出来るんだよ。
C++方式の場合はawait内にawaitが入れ子になっていると、展開出来ないだろ。
> コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
> それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
これは通説だが、俺はこれが嘘だと思ってるんだよね。
JavaScriptで言われているcallback地獄ってのは、非同期処理をその場で


208:入れ子で書いている。 それよりawaitの方が見やすいってのは、上から順に読める形式だから。 でも>>180に書いたとおり、JavaScriptの文法ではcallbackを常に展開して書けるので、 その気になればawaitと同じ順で処理を書けるんだよ。(非同期がネストしない) つまり、レキシカルスコープ+クロージャなら、awaitが無くてもawaitと同じ順で処理を書けるわけ。 C#やC++はレキシカルスコープがないからawaitが必要なだけ。 だからここら辺は実は文法との相性もあるんだよ。 C++はそんなのお構いなしに何でもかんでも入れてる感じだが。 (とはいえ、選択肢が増えること自体は悪いことではない) > char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ そりゃconstの有無をテストで落とすのは無理だろうさ。 まあ、俺はconst自体が意味無い(無駄な手間が増えるだけ)という認識だが。 (ただし本当の意味でのconst(「定数」)の場合は使う。Cならマクロで与えていたケースとか) そもそも君はどこまでconstを使っているんだ? C++のconstは「定数」ではなく「再代入禁止」だ。 現実的には無駄に再代入することもないので、ローカル変数の大半にconstを付けられるはず。 これをやっているのか? やっていないのなら、君自身も「過剰な型検査」が存在することを認めていることになるが。



209:デフォルトの名無しさん
17/08/31 22:54:22.15 F9uWTtxD0.net
>>196
コードを流用するとね、
void test(a,b)
{
// (A)
hoge(&a,&b); // (B)
piyo(a+b); // (C)
}
で、(B)をconst指定にした時のみ(C)で大胆な最適化を行えるケースは、
・(B)が(C)に影響する副作用を持っていないと「const指定した時のみ」分かる
場合だけだが、これはconst指定ではどうにもならんだろ。
これはプログラマが上位の仕様(test関数の仕様)として規定するものであって。
例えば構造体配列で、(B)は[i]への書き込み、(C)は[j]からの読み出しで、i!=jが上位で保証されているとか。
この場合は、プログラマが最初から(A)(C)(B)の順に書けるんだよ。
そうではなくて、(B)が(C)に対しての副作用を持つ可能性がある場合、つまりi!=jが保証されていない場合、
当然(B)(C)の順にする必要があるけど、
これをconst指定で最適化(=(B)が(C)に対しての副作用を持たないことを保証)することは出来ないでしょ。

210:デフォルトの名無しさん
17/09/01 02:04:57.35 2msaHTP30.net
>>204
ん、C++のconstは、Cのconstよりも「定数」だぞ
int const a = 1;
switch(1) [
case a: ; //valid in C++, invalid in C
}

211:デフォルトの名無しさん
17/09/01 08:48:03.58 5GGRc0nid.net
>>206
すまん、そのコードの意味がわからん

212:デフォルトの名無しさん
17/09/01 09:06:42.83 2msaHTP30.net
typoしとるな
[は{

213:デフォルトの名無しさん
17/09/01 09:55:02.84 kxCoop1y0.net
case ラベルに const な変数の変数名
C++ ならばリテラルと等価となりセーフ
C は変数のままの扱いでアウト

214:デフォルトの名無しさん
17/09/01 11:36:56.59 IGPoCkp90.net
Cのconstは変更不可なオブジェクトだからな

215:デフォルトの名無しさん
17/09/01 13:20:08.84 JSZHio/AM.net
C++は使える範囲を広くしただけでconstの意味はCといっしょ
constによる最適化の話には関係しない

216:デフォルトの名無しさん
17/09/01 15:37:25.51 2msaHTP30.net
違う
constはもともとC++発祥のもので、
Cでパクるにあたり微妙に改変した
constは最適化に関係するが
今この流れでは最適化とは全く無関係の話をしている

217:デフォルトの名無しさん
17/09/01 16:51:03.36 dkwAUCjz0.net
volatileについてもkwsk

218:デフォルトの名無しさん
17/09/01 17:40:42.98 XJwe5Q/Z0.net
URLリンク(regmedia.co.uk)
こういう時代の揮発性のメモリ
揮発しないメモリもあるんですよ

219:デフォルトの名無しさん
17/09/01 18:43:10.50 2msaHTP30.net
ビットフェードとvolatileは関係ないぞ

220:デフォルトの名無しさん
17/09/01 18:59:13.16 dXFBhBz10.net
コード中の文意では変わってなくても、他の要因で変わる可能性あるような
割り込みやマルチスレッド等で共有してる変数とか

221:デフォルトの名無しさん
17/09/03 03:14:53.65 GCfgdhr+0.net
> C++のconstは「定数」ではなく「再代入禁止」だ
代入と初期化を混同してませんか

222:デフォルトの名無しさん
17/09/03 08:56:24.33 72Px+h1e0.net
staticについてもkwsk

223:デフォルトの名無しさん
17/09/03 11:44:42.91 jl0cf3RS0.net
性的な

224:デフォルトの名無しさん
17/09/03 12:14:41.26 9dM4T0NO0.net
外からは見えないように、そして、なくさないようにするエロ本

225:デフォルトの名無しさん
17/09/03 17:40:32.30 jXGwZqzU0.net
一口にstaticと言っても、そのキーワードは用法で意味が変わるからなあ

226:デフォルトの名無しさん
17/09/03 17:45:54.60 5WRYI1ZX0.net
static に背負わせすぎな気がする
関数内変数の static
関数スコープ外の static
C++ ならばクラスメソッドのstatic
クラス変数の static もあったかな‥多すぎだ‥

227:デフォルトの名無しさん
17/09/03 18:29:43.87 fyDk5FSQ0.net
予約語を減らす涙ぐましい努力

228:デフォルトの名無しさん
17/09/03 18:47:29.02 jXGwZqzU0.net
C99以後、仮引数のstaticもあるしな

229:デフォルトの名無しさん
17/09/04 00:43:28.93 QxIkVb9z0.net
ポインタ関連で*と&の記号を使っているのも
初心者を遠ざけているよな
素直にpointerとかrefとかの予約語作ればよかったのに

230:デフォルトの名無しさん
17/09/04 01:05:35.63 IeE+YITL0.net
>>225
もともと高級アセンブラとして生まれた経緯を考えたら、ポインタ関連の基本的な記述のためにはくどいキーワードではなく最もシンプルな演算子が割り当てられるのは自然なことだと思う。

231:
17/09/04 01:17:41.88 rnM3x3Xp0.net
>>225
C# の ref 宣言のように,宣言だけでなく呼び出し側でも ref が必要だという文法はあってもよかったかな

232:デフォルトの名無しさん
17/09/04 02:45:48.86 tVodzhFi0.net
>>224
え?そんなのあった?

233:デフォルトの名無しさん
17/09/04 08:55:10.34 pd3pCmCq0.net
>>228
ISO/IEC9899:1999
6.7.5.3 Function declarators (including prototypes)
21 EXAMPLE 5
void f(double a[restrict static 3][5]);

234:デフォルトの名無しさん
17/09/05 00:59:51.51 2RdPD3ce0.net
>>229
ああ。そういう使い方か。

235:デフォルトの名無しさん
17/09/07 15:42:36.42 zsD50ajta.net
以下の三つの操作に違いはありますか
NはMと比べて十分大きいとします
char s[M];
wchar_t ws[N];
mbstate_t state = {0};
// 1
scanf("%s", s);
wbsrtowcs(ws, &s, N, &state);
// 2
scanf("%ls", ws);
// 3
wscanf(L"%ls", ws);

236:デフォルトの名無しさん
17/09/08 04:19:51.29 LlnxN/9E0.net
>>231
1のscanf()はchar型で文字列を受け取ろうとするのでエンコードによっては複数バイト文字が全て読めない可能性がある。
例えば2バイトづつのUnicodeの0xff以下のコードがそのまま来た場合、ビッグエンディアンならすぐに0x00が1バイト目に来てしまう。

237:デフォルトの名無しさん
17/09/08 22:13:19.23 Hco6il2OE.net
兄貴すいません
アロー演算子の使い方を学びたいのですがどこを直せば動くのか教えてください
#include <stdio.h>
struct User {
char name[5];
int age;
};
int main()
{
struct User *u = { "hoge", 10 };
if (u->hoge != NULL) {
printf("%d\n", 1);
} else {
printf("%d\n", 0);
}
return 0;
}

238:デフォルトの名無しさん
17/09/08 22:41:39.10 R6JsR04N0.net
>>233
*uじゃなくてsにてもしてuに&sを入れてhogeをnameに変えれば動くけど
これnameが実体だから100% 1が出るよね

239:デフォルトの名無しさん
17/09/09 01:43:06.63 DK1wXlQ90.net
struct User {
char *name;
int age;
};
int main()
{
struct User st = { "hoge", 10 };
struct User *u = &st;
if (u->name != NULL) {
 ......

240:デフォルトの名無しさん
17/09/09 12:01:06.79 KEHxH6tI0.net
>>233
mallocして中身を詰める
#include <stdio.h>
#include <stdlib.h>
typedef struct{
char name[5];
int age;
}User;
User* new_user(const char* const name, const int age){
User* u = (User*)malloc(sizeof(User));
strcpy(u->name, name);
u->age = age;
return u;
}
int main(){
User* u = new_user("hoge", 10);
if (u->name != NULL) {
printf("%d\n", 1);
} else {
printf("%d\n", 0);
}
return 0;
}

241:デフォルトの名無しさん
17/09/09 12:54:39.58 Ii5yjdZLa.net
>>232
なるほど
ありがとうございます
fgets(s, M, stdin);
const char *p = s;
mbsrtowcs(ws, &p, N, &state);
でも1と同様の問題が起こりますか
>>231は関数名と実引数の型を間違えてました

242:デフォルトの名無しさん
17/09/09 16:17:54.34 qJRB74Th0.net
>233
int main(){
return !printf("%d\n",strlen( (&(struct User){.[0]name=0, .age=10, .name={'h','o','g','e'}})->name) 1: 0), 0;
}
char[5] nameとNULLの比較じゃ意味ねーと思うんだわ

243:デフォルトの名無しさん
17/09/10 04:20:42.87 3lFSiHDa0.net
>>237
大丈夫だと思う。

244:デフォルトの名無しさん
17/09/10 09:19:13.64 bduAIVLIa.net
>>238
なんか色々間違ってねーか?

245:デフォルトの名無しさん
17/09/10 10:12:13.09 3KJHgwTr0.net
>>238
>>233のような初学者にそんな解読しにくいコードを提示しても意味ねーと思うんだわ

246:デフォルトの名無しさん
17/09/10 11:46:48.72 uI7cAZFMa.net
暇すぎたので昨日からC言語の勉強始めましたプログラミング初心者です。
これって趣味にできる?

247:デフォルトの名無しさん
17/09/10 11:52:24.67 igLJE8zId.net
できる

248:デフォルトの名無しさん
17/09/10 13:39:43.37 3lFSiHDa0.net
そして趣味が高じて仕事にw

249:デフォルトの名無しさん
17/09/10 13:42:12.95 uI7cAZFMa.net
今本屋なんだけどどの本で学ぶのがいい?
てかphytonとか他の言語の方が良かったりする?

250:デフォルトの名無しさん
17/09/10 13:45:14.25 uI7cAZFMa.net
ちなみに本職は監査法人の公認会計士で監査してるんだけど仕事に役立つならそれに越したことはない

251:デフォルトの名無しさん
17/09/10 13:50:00.90 SyCSejr00.net
幅広くエロエロやると上達早いで
もしノイマン型コンピュータの基本知識が
無いのならどこかで学習する必要がある
メモリ、アキュムレーター、インデックスレジスタ…etc

252:デフォルトの名無しさん
17/09/10 13:53:38.31 rGvjr77j0.net
>>246
公認会計士の仕事にはなかなか結びつかないだろうけれども…ガンバレ
C/C++ はどちらかというと原始的
python AI/機械学習で今はやり
ゴルフでもなんでも最初は大変だから一定の覚悟が必要

253:デフォルトの名無しさん
17/09/10 13:56:43.80 uI7cAZFMa.net
あんま知識は無い。
じゃあC言語とphytonを並行して学ぼうかしら。

254:デフォルトの名無しさん
17/09/10 14:35:30.74 3lFSiHDa0.net
会計ねえ。Excelとかの本のほうがいいかも知れんな。その方が仕事に結び付けられる事が多くて覚えは早いのではないかと思う。
マクロも一応プログラムだしな。Excelにくっついた形のものではあるが結構色々な事ができる。
で、それがある程度できるようになったらプログラムというものがだいたいどういうものかわかるようになってるだろうから次はVBのように似ているものをやる。
似ているのでこれの習得はかなり早いと思う。それから他の言語を色々やって幅を広げる。

255:デフォルトの名無しさん
17/09/10 14:52:01.58 SyCSejr00.net
Excelマクロ…
組むと疲れる、悪い癖が付く等良い所が無い言語

256:デフォルトの名無しさん
17/09/10 15:07:37.65 uI7cAZFMa.net
まあ別に趣味だから仕事に役立たなくてもいいぞ

257:デフォルトの名無しさん
17/09/10 15:12:20.15 uI7cAZFMa.net
苦しんで覚えるC言語っての買った

258:デフォルトの名無しさん
17/09/10 15:23:52.77 GVNmgcdo6.net
苦しめ

259:デフォルトの名無しさん
17/09/10 15:29:50.37 7And7Hgf0.net
俺なら楽しんで覚えるけどね

260:デフォルトの名無しさん
17/09/10 16:30:29.97 TxU3QtzA0.net
苦Cは買わなくてもネットで読めるのに・・・

261:デフォルトの名無しさん
17/09/10 16:52:57.48 3KJHgwTr0.net
見易さではいまだ紙媒体の方が上だと思うし、惜しむほどの額でもないだろう

262:デフォルトの名無しさん
17/09/10 17:48:30.86 eDTlLPEV0.net
神聖言語COBOL

263:デフォルトの名無しさん
17/09/10 17:58:39.08 Z8XrRGDBa.net
受信したメールの中身を理解して必要なメールと不必要なメールを分け、必要なメールの情報を分かりやすい文章に要約して表示するプログラムC言語で作れる?
ついでに簡単な返信なら自動でしてくれたらありがたいんだが。

264:デフォルトの名無しさん
17/09/10 18:04:27.57 Z8XrRGDBa.net
返信が必要なメールと判断した場合は、返信メール本文の例を1万種類ぐらい自動で作成して、その中からより最適なものを3種類ぐらい提示してきてこっちはそれを選ぶだけで良いという機能も欲しいぞ

265:デフォルトの名無しさん
17/09/10 18:16:25.18 /r+wfg1UM.net
レス乞食

266:デフォルトの名無しさん
17/09/10 18:24:18.77 TxU3QtzA0.net
>>257
それがついこの間デザインがリニューアルされたんだよ
内容は同じだけどw
前よりは見やすくなったかな

267:デフォルトの名無しさん
17/09/10 18:26:26.80 VNZjd7Zj0.net
りんなとやり取りするプログラム作って、りんなに判断してもらえ。返信内容も一緒に

268:片山博文MZ
17/09/10 18:40:04.78 m2l+DHFcd.net
SMTP, POP3などのメールプロトコルで、メールサーバとソケット通信。
メールを分類するなら、自然言語処理とベイズ推定が必要。

269:片山博文MZ
17/09/10 18:57:20.96 m2l+DHFcd.net
単純な分類なら、振り分けルールが使えるメーラーを使えば簡単。

270:デフォルトの名無しさん
17/09/10 19:00:07.53 Fa46oRS50.net
ヘッダーに書いてあるエンコードが嘘いってて中身は別コードを
なんとか帳尻合わして可視化する部分が厄介 (nkf で大分楽にはなるらしいけど)

271:デフォルトの名無しさん
17/09/10 19:00:48.08 BxaTac1G0.net
>>259
「必要なメール」とそれ以外の境界を
おまえさんが明確化できるか否かにかかっている
何言語を使おうが同じことだ
Cは推論エンジンそのものを作れる言語で
通信アプリやドライバを作れる言語でもあるので
諦めねばならないアイディアはまずないはず

272:デフォルトの名無しさん
17/09/10 19:38:42.01 Z8XrRGDBa.net
>>267
「必要なメール」とそれ以外の境界線はこれまで私自身が行ってきたメールへの対応を見てプログラム自ら学習して欲しい。
また分類や要約は高度な文脈、ニュアンス判断も伴うレベルで行わせたい。
それも様々な小説や文献を通してコンピュータ自ら学習して欲しい。
ちなみにこれ外注したらいくらぐらい?
10万円ぐらいするかな?

273:デフォルトの名無しさん
17/09/10 19:44:06.14 jwBfW/fF0.net
10倍ぐらい出せば良いんじゃねーの

274:デフォルトの名無しさん
17/09/10 19:46:11.33 +BHhCGE8a.net
linuxでpop/smtpサーバー立てればよくね
スクリプトで特定のワードが見つかったら処理すればいいし
送信はmailコマンドがあるし

275:片山博文MZ
17/09/10 19:47:08.66 m2l+DHFcd.net
>>268
自ら学習するにしても、教師なしでは低品質になる。効率よく学習するためには、コンピュータとの対話(ダイアログ)が必要になる。

276:片山博文MZ
17/09/10 19:52:13.40 m2l+DHFcd.net
深層学習させるにしても、タグ付けの作業が必要になる。

277:デフォルトの名無しさん
17/09/10 20:10:47.20 BxaTac1G0.net
>>268
267だが、Cは推論エンジンを作れると言ったはず
おまえさん自身はそこから学習しなかったのか?
10万ねえ
支那の国家プロジェクトがどうなっているか知っているか?
支那からのSPAMに「天安門」と書いて返信すると我々にとって
ありがたい動作をしてくれるというアレだ
国家ではないが大企業のAIが共産党は無能とか言い出して
ひと騒ぎにもなったよなあ
おまえさんの10万円のソフトはおまえさんを無能とか
言い出さないか?

278:デフォルトの名無しさん
17/09/10 20:26:02.78 Z8XrRGDBa.net
あとC言語でタイムマシン作れる?
といっても未来のインターネット閲覧できる程度でいいんだが。
作れる人いたら10万円までなら出すぜ。

279:片山博文MZ
17/09/10 20:32:37.81 m2l+DHFcd.net
>>274
予測・予想が届く範囲でないと、予知はできない。できたとしても、競馬の予想や天気予報くらいだ。物理法則を超えることはできない。

280:デフォルトの名無しさん
17/09/10 20:39:00.76 rIACWFTk0.net
アホなことを書いてしまったと気付いて、ネタだったことにしてごまかそうとしている?

281:デフォルトの名無しさん
17/09/10 20:42:41.68 I7ZEh6pU0.net
物理法則なんて人間が考えたものに過ぎないからどうせ間違いだらけでしょ?

282:片山博文MZ
17/09/10 20:50:00.29 m2l+DHFcd.net
深層学習で美少女の画像を大量に生成するという技術はある。未来の人が書きそうな絵を生成することはできる。

283:デフォルトの名無しさん
17/09/10 21:11:06.17 n6o1Bnrv0.net
物理は、むずかしい

284:片山博文MZ
17/09/10 21:39:16.69 m2l+DHFcd.net
へ へ
の の
 も
 へ

285:デフォルトの名無しさん
17/09/11 03:08:03.91 byfRWwJtM.net
div B = 0
rot E = -(∂B/∂t)
div D = ρ
rot H = ∂D/∂t + j

286:デフォルトの名無しさん
17/09/12 18:24:02.20 zVhRA/dD0.net
C言語覚えればCIAのパソコン
ハッキングできたりするの?

287:デフォルトの名無しさん
17/09/12 19:21:49.41 8ybhBsXfM.net
なんでこんなアホがプログラム板にいるんだ?

288:デフォルトの名無しさん
17/09/12 19:35:17.20 8gurLWtqd.net
だって、コーダーって大概馬鹿じゃん

289:デフォルトの名無しさん
17/09/12 19:59:12.99 C09YrKwT0.net
夏休みはもう終わったぞ

290:デフォルトの名無しさん
17/09/12 20:22:37.24 E3lbzyXMM.net
ずっと休みの奴が張り付いてるんじゃね?

291:デフォルトの名無しさん
17/09/12 20:40:18.98 oYtiliiD0.net
printf("Hello, work!");

292:デフォルトの名無しさん
17/09/12 22:47:32.51 CGKPtYms0.net
>>284
馬鹿つっても、少なくともおまえみたいな自宅警備員より1ペタくらいマシだよ
コーダーでやってけてるやつナメてんだろ、おまえ ボケ!

293:デフォルトの名無しさん
17/09/13 00:05:26.05 iyeBQ3Kc0.net
コーダーだから馬鹿だとは思わないが、>>288みたいなレスをするのは馬鹿だなと思いました。

294:デフォルトの名無しさん
17/09/13 10:49:46.10 gIW5dRYoa.net
>>239
ありがとうございました

295:デフォルトの名無しさん
17/09/13 10:57:10.59 E2QlRAh70.net
>>287
puts("Hell 'o work?");

296:デフォルトの名無しさん
17/09/13 11:29:24.17 tSE5B5Al0.net
printf("HALO world!");

297:デフォルトの名無しさん
17/09/13 12:41:46.69 cFJcbLHs0.net
>>289
いいこぶってろクズ
現業がいなきゃ自分じゃ何もできないやつが
現業をバカにするのを見ると虫酸が走るんだよ

298:デフォルトの名無しさん
17/09/13 13:17:09.64 z6o40qKf0.net
>>293
安価に取り替えがきくので、低く見られるのはしょうがないと諦めろ

299:デフォルトの名無しさん
17/09/13 13:33:05.82 cFJcbLHs0.net
人件費のダンピングは国が国民を保護する義務の対象だが
真面目にやってくれなくて我々はその被害を受けているのだ
本来、能力に応じた収入があるべきという感覚そのものを
捨てちまったブタはいいねえ悩みがなくて

300:デフォルトの名無しさん
17/09/13 14:36:38.24 GgkwnlJN0.net
>>295
本来能力に応じた報酬を受け取るべきと考えて、それが受け取れない事に不満を持った連中はとっくに逃げ出してる
残ってるお前らは不満を持ちながら逃げ出す事さえ出来ないゴミ
下に見られてもしょうがない

301:デフォルトの名無しさん
17/09/13 14:42:45.38 yshNp3B/a.net
確かに馬鹿な奴もいるけどレベルの高い奴もいる。コーダーに限った話じゃないだろ。
日本に馬鹿が多いんだよ。たぶん。

302:デフォルトの名無しさん
17/09/13 15:31:18.76 cFJcbLHs0.net
>>296
俺より年収1桁少ないやつにだけは言われたくねえぜ
なに、2桁? そりゃ失礼したw

303:デフォルトの名無しさん
17/09/13 15:43:10.20 lgdTeqni0.net
3桁ってことか

304:デフォルトの名無しさん
17/09/13 16:11:37.47 PJsF5JPod.net
時給だろ。

305:デフォルトの名無しさん
17/09/13 16:18:46.88 cFJcbLHs0.net
妻子持ちがどのくら金いるか
童貞にはわからんようだな

306:デフォルトの名無しさん
17/09/13 16:31:08.86 J/ZU3q6K0.net
板違いが分からないよりマシ

307:デフォルトの名無しさん
17/09/13 16:42:40.48 cFJcbLHs0.net
284にぬかせボケ

308:デフォルトの名無しさん
17/09/13 17:15:26.17 7kZqRPKj0.net
クソスレ過ぎ笑う

309:デフォルトの名無しさん
17/09/13 19:04:55.78 FmzSjQYZ0.net
>>298
奴隷的労働しか選択肢が無いのに妻子持ち
妻子が哀れすぎる

310:デフォルトの名無しさん
17/09/13 19:25:13.27 cFJcbLHs0.net
>>305
奴隷? 俺は領主の立場だ
おまえと一緒にするな無礼な

311:デフォルトの名無しさん
17/09/13 19:29:03.36 E/jL69iKd.net
複雑な立場だなww

312:デフォルトの名無しさん
17/09/13 19:36:56.55 FmzSjQYZ0.net
>>306
僕のお父さんは奴隷のリーダーですってか?

313:デフォルトの名無しさん
17/09/13 20:24:58.56 ruF3Cq7F0.net
実際のところそれでも結構なもんだ

314:デフォルトの名無しさん
17/09/13 21:33:37.15 qtzqYGs4M.net
馬鹿な奴隷に指示、管理する者の気苦労が分からんのか

315:デフォルトの名無しさん
17/09/13 21:35:35.97 PcFMQESFM.net
>>301
妻はまだ自分の食いぶちの一部でも稼がせばいいけど子の方はマジで金かかる
国は学資保険なんてものがあることをちょっと恥じるべき

316:デフォルトの名無しさん
17/09/13 21:50:53.77 ruF3Cq7F0.net
金持ちしか子供作らせないのは国策
やつらに恥などない
怒れ

317:デフォルトの名無しさん
17/09/13 21:56:29.09 dVC5ajCT0.net
マ板でやれ

318:デフォルトの名無しさん
17/09/13 22:36:54.70 cFJcbLHs0.net
>>312
俺は金持ちじゃねえ
単年度で8桁いっても次年以後で気を抜けばボコボコだ
一生遊んで暮らせる金があるやつにしか子供を作らせないなんて国策はねえ
童貞がイソップの葡萄こいてろ、こちとら稼いでみせると必死こいてんだ

319:デフォルトの名無しさん
17/09/13 23:29:23.30 ruF3Cq7F0.net
ポッキリと折れて周囲に生暖かい目で見られるところまで見えた

320:デフォルトの名無しさん
17/09/14 17:55:25.19 r9C1TnUx0.net
まんこ

321:デフォルトの名無しさん
17/09/14 21:35:54.73 Ng+6QcSm0.net
>>299
3桁って、10進数だと999円が限界だぞ

322:デフォルトの名無しさん
17/09/14 22:14:40.48 vjSz//mI0.net
>>300

323:デフォルトの名無しさん
17/09/14 23:45:34.67 lhu0Z/PJ0.net
ジンバブエドルで3桁か?

324:デフォルトの名無しさん
17/09/15 11:30:59.37 EItFo4370.net
>>317
頭いいなおまえ

325:デフォルトの名無しさん
17/09/19 16:22:54.12 SXimL5kTp.net
昔"c言語をダイエットさせる本"みたいなタイトルの本読んだと思うんだが分かるやついる?
見つからなくて探してる

326:デフォルトの名無しさん
17/09/21 20:42:10.28 x8dEnzes0.net
for(;~scanf("%d",&a);)とかwhile(~scanf("%d", &a))とかで~がないだけで永遠に入力ループするんだけど
~ってなにを宣言してるんだ教えてくれ

327:デフォルトの名無しさん
17/09/21 20:48:43.32 BDILGhdI0.net
~はビット単位のNOT演算子じゃないの?

328:デフォルトの名無しさん
17/09/21 21:03:53.86 N1EOCCyb0.net
~なしでよくね?

329:デフォルトの名無しさん
17/09/21 21:23:35.16 kYTPFpbC0.net
本来なら 変数a に格納されるまでループしたい意図だろうけど・・・・・
scanf の戻り値は 代入操作できた変数の数で
0 だと入力のフォーマットに合致しなかったわけなんだが (ここまでは素直)
一旦 その状態になると、次に正しく入力しても拾ってくれない scanf 独特の挙動があって
正しく入力しようが 0 のままというkuso
件の場合
 最初の入力で数値ではない o を与えると (%d で受けれないので失敗)
次のループの入力で 1 を与えても やはり変数に格納ざれずに失敗したまま
これがあるので scanf は使うな、と良く言われてる所以

330:デフォルトの名無しさん
17/09/21 21:54:22.20 x8dEnzes0.net
一行読み込みで同じ処理を数値なくなるまでしたいんだけどどう読み込んだ方がいい?

331:デフォルトの名無しさん
17/09/21 22:19:34.61 kYTPFpbC0.net
fgets で行単位で読み込み
その行バッファに対して sscanf で変数に拾い上げするなり、11文字ずずつ字句解析するなり
char buf[512];
int a;
while (fgets(buf, 512, stdin)) {
 /* 1行読んだよ */
 
if (sscanf(buf, "%d", &a) != 1) {
  /* 数値じゃないのが来たのは無視する */
continue;
 }
/* a に値が格納されたよ */
:
}

332:デフォルトの名無しさん
17/09/21 22:26:26.69 kYTPFpbC0.net
日本語でおけ
× 11文字ずずつ字句解析するなり
○ 1文字づつ字句解析するなり

333:デフォルトの名無しさん
17/09/21 23:44:09.55 Xpxn9Za50.net
>>327
strtolとかstrspn?系つかったほうがよくね?

334:デフォルトの名無しさん
17/09/22 00:16:23.70 zbqUBjYs0.net
>>325
まじかよ..
scanf呼び出して戻ってきたあとも何かしらのscanf内部変数が残ってるってこと?
だとしたらクソ過ぎるだろ

335:デフォルトの名無しさん
17/09/22 01:03:58.95 IvB4cJv30.net
こんなのどうかな
URLリンク(paiza.io)

336:デフォルトの名無しさん
17/09/22 01:11:24.08 exEqzPdX0.net
>>330
標準入力を勝手に読み捨てないってこと
数値以外が来たら"何もせずに"失敗で終わるから
ループするとまた失敗以前の場所からそれを繰り返すだけ

337:デフォルトの名無しさん
17/09/22 01:39:40.49 BRiVyzo00.net
forの継続条件がどう動いてるのかわからないな読み込めた時はループして読み込めなかったときはループ抜けるってのがどう判定されてるのか見えないな

338:デフォルトの名無しさん
17/09/22 02:12:21.25 exEqzPdX0.net
>>333
scanf("%d",&a);
で、数値が来れば取り込みに成功した個


339:数、つまり1を返し、失敗なら0を返す それを~でビットNOT、つまり各ビットを反転させるので 成功なら0x00000001を反転で0xFFFFFFFE、失敗なら0x00000000を反転で0xFFFFFFFF ようするにどうやってもループを抜けないので、結論としては「そもそもループ条件として間違ってる」 >>324の言う通り~は不要



340:デフォルトの名無しさん
17/09/22 02:35:57.85 dUE2o1PV0.net
もっとシンプルに使える入力関数を
誰かが作ってくれれば良いのに

341:デフォルトの名無しさん
17/09/22 03:10:18.60 IvB4cJv30.net
>>335
簡単なので多分もう世界中に山ほどあると思うが、標準化されてないだけだろうな。

342:デフォルトの名無しさん
17/09/22 05:10:39.06 BRiVyzo00.net
while((a=Console.ReadLine())!=null)こうゆうので入力がなかったら終了するって簡単にできればC言語も楽なんだけどな

343:デフォルトの名無しさん
17/09/22 14:57:26.19 8MJCwgYc0.net
int *get_int(int *dst, jmp_buf err)
{
if (scanf("%d", dst) != 1)
{
if (err) longjmp(err, 1);
else return NULL;
}
return dst;
}
こんなしょーもないのでいいのに標準化委員会は斜め上なことばかり・・・

344:デフォルトの名無しさん
17/09/22 20:47:03.45 dtN6vQMf0.net
>>334
でもscanfの前に~あるだけで入力なくっても無限ループしないで抜けるのはNOTと戻り値がNOTでtureだから抜けるの?

345:デフォルトの名無しさん
17/09/22 22:06:16.56 IvB4cJv30.net
チルダ付けたのは失敗した時に-1が返されると思ったからかな?
てか、チルダ付けた場合はそれ以外で0にならんよな。
まあでもこれも整数値の内部表現の違う特殊な環境だったりしたらダメかも知れないが。

346:デフォルトの名無しさん
17/09/22 22:16:43.87 JX9ZYj2p0.net
組込み以外で~使ってんの初めて見た

347:デフォルトの名無しさん
17/09/22 22:21:06.44 FtjqsiSd0.net
普通にビット処理だと使うよね
ビット処理なんかしないって?

348:334
17/09/22 22:25:08.34 exEqzPdX0.net
ごめんウソ書いたわ
一つも変換されないで入力エラーになったらscanf()は0ではなくEOFを返すらしい
>>339
よって多くの環境ではEOF==-1(0xFFFFFFFF)だからその反転で0になってループ抜けるということだね

349:片山博文MZ
17/09/22 23:25:37.12 TihxA+yD0.net
>>338 ゼロオーバーヘッドは正義。

350:デフォルトの名無しさん
17/09/23 07:38:02.97 9QRg4G5c0.net
>>343
入力ストリームが閉じてて変換できなかったら EOF
入力ストリームは開いてるけど変換できなかったら 0
でないのけ?

351:デフォルトの名無しさん
17/09/23 11:43:39.39 8bsZ0VcP0.net
>>345
どうやらそのようだな。Linuxのmanで見てみたらそんな風に書いてあった。
とすると入力が閉じないで変換失敗した場合は0が返されて無限ループになるな。

352:デフォルトの名無しさん
17/09/23 14:50:28.05 IblrvTVf0.net
Win32環境なのですが
_beginthread関数で、thread1, thread2を回し
グローバル変数g_nをthread1の中で変更しても
thread2から正しい値が参照できません。参照できないというよりthread2が機能しなくなるように見えます。変数表示がカットされる。
VisualC++でプログラムしてるのですがデバッグモードだと普通に動いて
リリースモードだと動かなくなります。グローバル変数にvolatileをつけてみてもダメでした。
何が原因でしょうか?

353:デフォルトの名無しさん
17/09/23 15:16:24.27 PasvkTo90.net
具体的なコードもなく原因を聞かれても、どうしようもないと思うぞ
VCの拡張機能で相応の機能が追加されてたような気もするが
本来volatileにスレッド間での排他やメモリバリアの機能はないからな

354:片山博文MZ
17/09/23 15:34:39.04 oO/4QkxId.net
>>347
デバッガ側で例外をキャッチして、呼び出し履歴を調べると何かわかるかもしれない。おそらくゼロ除算かアクセス違反かスタックオーバーフロー。

355:デフォルトの名無しさん
17/09/23 16:05:08.45 IblrvTVf0.net
>>348-349
thread2の中身を以下みたいにtry~catchで囲むと何故か直りました…
でもcatchの中は実行されてないです… 少しcatchの中身を書き足すとまたダメ…
どういうことだろう…
void thread2(void*)
{
try{

} catch (...) {

}
}

356:片山博文MZ
17/09/23 16:06:48.32 oO/4QkxId.net
スタックを破壊してる可能性

357:片山博文MZ
17/09/23 16:07:30.45 oO/4QkxId.net
呼び出し規約が間違い

358:デフォルトの名無しさん
17/09/23 16:14:51.44 IblrvTVf0.net
>>352
>呼び出し規約が間違い
これはどういう事ですか?
宜しければご教示をm(__)m

359:片山博文MZ
17/09/23 16:23:43.62 oO/4QkxId.net
URLリンク(msdn.microsoft.com)
_beginthreadexの場合は、__stdcallを関数名の前につける。_beginthreadの場合は、__cdeclを。
__cdeclはデフォルトでは省略可能だから、間違ってはいない。
ということは、ポインターかなんかでスタック破壊している可能性が高い。

360:片山博文MZ
17/09/23 16:28:26.72 oO/4QkxId.net
配列の添字がオーバーしてないか?

361:片山博文MZ
17/09/23 16:50:48.86 oO/4QkxId.net
ideone.com に貼れ

362:デフォルトの名無しさん
17/09/23 19:47:03.99 IblrvTVf0.net
>>356
もう少し深く調べてみます!ありがとうございます!

363:デフォルトの名無しさん
17/09/23 21:54:35.77 IblrvTVf0.net
>>356
たぶん原因が分かりました。
現在は標準関数をやめてWINAPIのCreateThreadを使ってますが標準関数と原因は同じです。
CreateThreadでThread1,Thread2を作成して監視してるとあるタイミングでThread2が消失してたのですが
どうやらThread1で変更があった他のグローバル変数の値がThread2で上手く読めずに終了判定されて消えてたようです。
ようするに他のグローバル変数の書き換えが原因でした。
ロック処理をしたりしたのですが上手く行かずグローバル変数すべてにvolatileをつけると上手く動いてるようです。
でもこの回避作で良いんでしょうか?CriticalSectionを使ったりして処理してもうまく他スレッドでグローバル変数が
参照出来なかったのでvolatileをつけてみたら完璧に動作するようにはなったんですが……

364:デフォルトの名無しさん
17/09/23 22:09:28.20 9QRg4G5c0.net
排他制御の問題ではなく
最適化の作業で、変数を不変値と判断し、変数参照を追い出した翻訳をしたパターン
int a; // グローバル変数
void foo() { a = 1; while (a) { /* */ } }
a は文意から不変の定数として扱えるので
while (1) { /* */ }
に翻訳しちゃえるわけさ

365:デフォルトの名無しさん
17/09/23 22:20:31.54 IblrvTVf0.net
>>359
その変数達の最適化を無効にしたということですね。
ということはこの回避方法で大丈夫だということですか?

366:デフォルトの名無しさん
17/09/23 22:28:00.05 9QRg4G5c0.net
volatile つけるのは1つの手ではあるが 100% 回避してくれるかは、コンパイラ次第
スレッドで共有するフラグ関係はOS側が用意してる機構を使うほうが良いんだけどねー

367:デフォルトの名無しさん
17/09/23 22:50:44.07 IblrvTVf0.net
>>361
一旦コンパイルして普通に動作してるなら大丈夫ですか?
他の環境でいきなり動かなくなるとかもありますか?

368:デフォルトの名無しさん
17/09/23 22:58:35.90 PasvkTo90.net
何の変数を使ってるか知らんが、排他取ってねーんだから書き換え途中の変数を読み取ってバグることもあるだろ
最近のVCはvolatileだけでマルチプロセッサ対応のメモリバリアになるらしいから、古いVCでビルドしてもアウトだな
まあ滅多に起らないからローカルでそれっぽく動けばいいのなら、十分じゃねーの

369:デフォルトの名無しさん
17/09/23 23:10:54.21 Z1NsXN0c0.net
>>358
いや、359ではなくて、363の言うとおり、
> ロック処理をしたりしたのですが上手く行かずグローバル変数すべてにvolatileをつけると上手く動いてるようです。
これが問題だと思うぞ。つか、ロックしろよ。
volatileの意味分かってるか?
それ多分他スレッドから書き換えられたときに自スレッドのその値が更新されておらず、バグるのだと思うぞ。
ただしこの場合は、
> 最近のVCはvolatileだけでマルチプロセッサ対応のメモリバリアになるらしい (>>363) ←コマ?
が正しいのならvolatileでも確かに治りそうな気はするが。で、これってマジなん?
つかね、マルチスレッドでグローバル変数を使いまくること自体がだね、、、

370:デフォルトの名無しさん
17/09/23 23:20:05.48 Z1NsXN0c0.net
>>363
調べてみたんだが、これか?
> Microsoft 固有の仕様 → /volatile:ms の項目
> ・volatile オブジェクトへの書き込み (volatile 書き込み) は、解放セマンティクスを持っています。
>  つまり、命令シーケンスで volatile オブジェクトへの書き込み前に発生するグローバル オブジェクトまたは静的オブジェクトへの参照は、
>  コンパイルされたバイナリでの volatile 書き込みの前に発生します。
> ・volatile オブジェクトの読み取り (volatile 読み取り) は、取得セマンティクスを持っています。
>  つまり、命令シーケンスで volatile メモリの読み取り後に発生するグローバル オブジェクトまたは静的オブジェクトへの参照は、
>  コンパイルされたバイナリでの volatile 読み取りの後に発生します。
URLリンク(msdn.microsoft.com)
これならロックではなくフェンスだね。volatileでは直らないはず。

371:デフォルトの名無しさん
17/09/23 23:22:23.90 PasvkTo90.net
>>365
自分も見かけただけでちゃんと調べたわけじゃないけど、それだね
フェンス+ロックが必要ってのは当然として、最近のVCならフェンスのほうが保証してくれてるってだけ

372:デフォルトの名無しさん
17/09/23 23:26:59.26 IblrvTVf0.net
>>361-365
CriticalSectionつかってグローバル変数の書き込み時にはロックをするのも試してみたんですが
やっぱりthread2が途中で死んで(内部のループで終了判定になってしまって)、ダメだったんですよね。
それがグローバルにvolatileをつけると普通に動作するようになってるんです……

373:デフォルトの名無しさん
17/09/23 23:29:48.18 IblrvTVf0.net
こういう事ですか?
CriticalSectionによるロックもやる必要がある。理由はロックしてない時固有の問題もあるから。
今回の不具合はコンパイラの最適化が原因だったのでvolatileで回避できただけ。
ロック処理もvolatileも両方やる必要がある。ということですか?

374:デフォルトの名無しさん
17/09/23 23:33:50.34 9QRg4G5c0.net
書き込み時だけロックして 読み込み側のほうはロックせずに読み込んでる
片手落ちのように受けとれる文章だけど・・・ 排他制御をちゃんとやってたうえでの話?

375:デフォルトの名無しさん
17/09/23 23:49:15.83 8bsZ0VcP0.net
volatileにしてロックして読み書きするのが普通では?

376:デフォルトの名無しさん
17/09/23 23:55:28.48 IblrvTVf0.net
>>369-370
volatileにして読み書きロックして厳密にやります!

377:デフォルトの名無しさん
17/09/23 23:57:26.40 Z1NsXN0c0.net
>>368
× > 今回の不具合はコンパイラの最適化が原因だったのでvolatileで回避できただけ。
○ コンパイラの不具合ではなく、君のコードの問題で、
 volatileで動いているように見えるのはバグに当たる確率が低くなっただけで、直ってはいない。
ただ、366の通り、全部ロック+フェンスすれば直りそうな気はする。
つか、そもそもフェンスが大量に要るような使い方でマルチスレッドするのが問題なんだが。

378:デフォルトの名無しさん
17/09/24 00:00:33.14 jg2xx4vD0.net
posixだとロックAPIにメモリ同期の効果があるから、普通はvolatileいらんけどな
CriticalSectionも共有リソースへのアクセス制御用の関数なんだから、同じはずだと思うけども

379:デフォルトの名無しさん
17/09/24 00:22:34.33 AOwUcJWDd.net
>>372
コードの不具合って意味だろ?
やっぱり最適化が問題だったんじゃないか?

380:デフォルトの名無しさん
17/09/24 01:04:50.76 R8lp94JX0.net
>>374
> どうやらThread1で変更があった他のグローバル変数の値がThread2で上手く読めずに終了判定されて消えてたようです。(>>358)
この場合はvolatileをつけないと話にならない。(ただし本来の使い方ではない)
コンパイラのバグではなく、多分デバッグビルド時には毎回読み出しだっただけ。(最適化なし、なおフェンスもなし)
データ同期する気がなければフェンスは本来は要らない。
ロックはしないと書きかけの値を掴んだりしてバグる。
ここら辺分かってなくてグローバルで同期ってのはマルチスレッド初心者なのだろうけど、
バグったらsync入れまくってデバッグはセオリーではあるし、まあがんばれ、と。
ただ、おそらく同期の仕方を根本的に間違ってるから、知ってる人に見てもらったほうがいいとは思うが、
コード内のグローバルは常に「最新」を期待しているのであれば、ロック+volatile+フェンスで動くはずでもある。

381:デフォルトの名無しさん
17/09/24 05:58:29.08 jg2xx4vD0.net
ロック中の読み出しが最適化で消えるなら、それはロックとコンパイラが腐ってる

382:デフォルトの名無しさん
17/09/24 08:32:31.64 LX+6AD0qM.net
>>372
> ○ コンパイラの不具合ではなく
誰もコンパイラの不具合なんて言ってない
偉そうに頓珍漢な講釈たれる前に日本語勉強し直してこい

383:デフォルトの名無しさん
17/09/24 08:36:33.73 LX+6AD0qM.net
>>373
メモリー同期と最適化は別の話
Posix は知らんけど CreateSection にはロック対象を知るすべはない

384:デフォルトの名無しさん
17/09/24 10:21:22.00 jg2xx4vD0.net
はあ、そうですか
共有リソースの排他アクセスのためのAPIなのに、ロック対象がわからないからロック無視して最適化しますと
それが真実ならWinAPIとVCが腐ってるんじゃないですか

385:デフォルトの名無しさん
17/09/24 10:22:36.14 gFeQddMX0.net
バカには使えないだけ

386:デフォルトの名無しさん
17/09/24 11:32:55.30 070pAcfa0.net
test

387:デフォルトの名無しさん
17/09/24 13:57:54.86 c233uqnI0.net
腐っているのでしょう

388:デフォルトの名無しさん
17/09/24 14:40:58.49 jg2xx4vD0.net
メモリバリアを跨いでオブジェクトへのアクセス命令を最適化するとか
そんな頓珍漢なことを言う腐った奴がいるとは思わなかったわ
volatileを何だと思ってんだか

389:デフォルトの名無しさん
17/09/24 15:53:44.93 gFeQddMX0.net
CreateSection の使い方ぐらい調べてから書けばいいのに...
まあ他人事だしどうでもいいけど w

390:デフォルトの名無しさん
17/09/24 16:31:41.65 jg2xx4vD0.net
CriticalSectionの話のつもりだったんだけど、CreateSectionに変わったの?
それならごめんだわ、>>378で唐突に出てきて誤字だとばかり
さすがにそんなアホな話題転換があるとは思わなかった

391:デフォルトの名無しさん
17/09/24 16:59:33.91 gFeQddMX0.net
>>385
ああすまん、予測変換で間違えてたわ
で、CriticalSection について調べたのかな?

392:デフォルトの名無しさん
17/09/24 17:30:54.77 jg2xx4vD0.net
>The following synchronization functions use the appropriate barriers to ensure memory ordering:
>Functions that enter or leave critical sections
>Functions that signal synchronization objects
>Wait functions
>Interlocked functions
URLリンク(msdn.microsoft.com)(v=vs.85).aspx
調べたけどCriticalSectionだけで十分そうだよ
Internallockedとかのほうが手軽そうだけどね


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