C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
前
http://mevius.2ch.net/test/read.cgi/tech/1500293207/
http://www.geocities.jp/c_cpp_cs/about_c/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
探検
C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 8a6f-bDrV)
2017/08/10(木) 20:21:23.44ID:hEocmkh50102デフォルトの名無しさん (エーイモ SEf3-Ufa9)
2017/08/22(火) 11:47:40.32ID:przmPyd7E typedef struct hoge {
int a;
int b;
} hoge;
hoge h = {1, 2};
構造体に含まれるメンバ名と値を全て出力する方法を教えてください
上の構造体なら
a,1
b,2
と出力したいです
int a;
int b;
} hoge;
hoge h = {1, 2};
構造体に含まれるメンバ名と値を全て出力する方法を教えてください
上の構造体なら
a,1
b,2
と出力したいです
103デフォルトの名無しさん (ワッチョイ 596f-MAnB)
2017/08/22(火) 11:59:42.09ID:GCxyf0Da0104デフォルトの名無しさん (JP 0H5d-C/ZS)
2017/08/22(火) 12:08:53.86ID:R9ds2cCvH105デフォルトの名無しさん (ワッチョイ 110d-JJVS)
2017/08/22(火) 12:11:18.37ID:xXPB4eWM0106デフォルトの名無しさん (ワッチョイ 596f-MAnB)
2017/08/22(火) 12:14:35.93ID:GCxyf0Da0 >>102
変数名はあくまで人間が扱いやすいように何らかの領域(一般的にメモリアドレス)に付けるあだ名であって
プログラム(コンピュータ)的にはメモリアドレスのほうが扱いやすいのであだ名は不要(アドレスのほうはプログラム的に出せる)
なのであだ名のほうが欲しいなら以下のように直書きするしかない
printf("%s,%d\n", "a", h.a);
変数名はあくまで人間が扱いやすいように何らかの領域(一般的にメモリアドレス)に付けるあだ名であって
プログラム(コンピュータ)的にはメモリアドレスのほうが扱いやすいのであだ名は不要(アドレスのほうはプログラム的に出せる)
なのであだ名のほうが欲しいなら以下のように直書きするしかない
printf("%s,%d\n", "a", h.a);
107デフォルトの名無しさん (エーイモ SEf3-Ufa9)
2017/08/22(火) 12:52:42.46ID:przmPyd7E108デフォルトの名無しさん (JP 0H5d-3KK3)
2017/08/22(火) 13:00:37.52ID:u9fcDp43H デバッグ目的ならデバッガで
109デフォルトの名無しさん (ワッチョイ 096f-jLVh)
2017/08/22(火) 13:20:20.96ID:chgkyZKA0 >>101,104、ありがとうございます、
PCとUSBシリアルで通信する組み込み機器のドライバをメンテしていて
受信したテキストの終端検出にEOLはキャラクタで扱っているし
送信する固定テキストは改行含めてリテラルにしたく
プリプロセッサの#か##で連結でなんとかできないか悩んでました。
PCとUSBシリアルで通信する組み込み機器のドライバをメンテしていて
受信したテキストの終端検出にEOLはキャラクタで扱っているし
送信する固定テキストは改行含めてリテラルにしたく
プリプロセッサの#か##で連結でなんとかできないか悩んでました。
110デフォルトの名無しさん (ワッチョイ d3d7-vbeK)
2017/08/22(火) 13:21:07.96ID:bF0tRsYk0 コンパイルしたらメンバー名と型の情報は消える
111C言語ますたー《ますたー軍団(常時募集)の長》 ◆Cmaster.sY (ラクッペ MMed-UZV0)
2017/08/22(火) 15:44:32.04ID:tfXVsICTM メモリアドレスを出力させればいいんじゃない?
%pで&aを表示できるはず
%pで&aを表示できるはず
112デフォルトの名無しさん (ワッチョイ 110d-JJVS)
2017/08/22(火) 16:43:27.00ID:xXPB4eWM0 与えられた変数から、メンバ名とその値を再帰的に列挙して欲しいんだろうけど
そんな都合の良い言語じゃないから自分で並べるしかない
必要に応じて毎回並べるか
並べて出力したものを関数化しといてそれを呼び出すか
そんな都合の良い言語じゃないから自分で並べるしかない
必要に応じて毎回並べるか
並べて出力したものを関数化しといてそれを呼び出すか
113デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
2017/08/22(火) 17:44:12.68ID:NIldwpVs0 再帰的に列挙は自動だととんでもない情報量になったりするからな
そこから欲しい情報をどうやって抜き出すかが頭の使いどころ
そこから欲しい情報をどうやって抜き出すかが頭の使いどころ
114デフォルトの名無しさん (ワッチョイ 936f-jLVh)
2017/08/22(火) 22:53:39.27ID:YwU2BQ/U0 >>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);
}
#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);
}
115デフォルトの名無しさん (ワッチョイ 6123-oL0b)
2017/08/22(火) 22:53:45.07ID:hpqXPKX70116デフォルトの名無しさん (ワッチョイ 6123-oL0b)
2017/08/22(火) 22:56:32.37ID:hpqXPKX70 あ。もうちょっとできたので今修正した。
117デフォルトの名無しさん (ワッチョイ d3d7-vbeK)
2017/08/22(火) 23:26:16.15ID:bF0tRsYk0 >>115
これってさ、メンバ名をconst char*にするんだよね?
これってさ、メンバ名をconst char*にするんだよね?
118デフォルトの名無しさん (ワッチョイ 8123-jLVh)
2017/08/22(火) 23:41:21.22ID:D8nSL4rC0119デフォルトの名無しさん (ワッチョイ 6123-oL0b)
2017/08/23(水) 00:06:55.83ID:b0JJUPNx0120デフォルトの名無しさん (ブーイモ MMb3-3KK3)
2017/08/23(水) 00:14:59.00ID:PJzK0CC4M 構造体のメンバ名がほしいとかデバッグ以外に何があるの
121デフォルトの名無しさん (ワッチョイ 8123-jLVh)
2017/08/23(水) 00:22:23.00ID:CuDbJhab0 >>120
有名どころはGUIのバインディング。
例えばWPFは自動的にリクレクションを使ってこれをやってくれる。詳細は以下参照。
http://www.atmarkit.co.jp/ait/articles/1010/08/news123.html
ただ、Cのアプリでこれは要らんし、今時生CでGUIもないよな?
有名どころはGUIのバインディング。
例えばWPFは自動的にリクレクションを使ってこれをやってくれる。詳細は以下参照。
http://www.atmarkit.co.jp/ait/articles/1010/08/news123.html
ただ、Cのアプリでこれは要らんし、今時生CでGUIもないよな?
122デフォルトの名無しさん (ワッチョイ c111-JJVS)
2017/08/23(水) 06:05:17.73ID:x0fRL5lg0 テキストベースで構造体の値のファイルへの保存と読み込みをしたいのかな
123デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
2017/08/25(金) 05:26:20.30ID:vC6ff47f0 マクロでどうにかできるかとも考えたが壊れる対処のし様がない
#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"});
#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"});
124デフォルトの名無しさん (ワッチョイ e96f-oKtA)
2017/08/25(金) 05:30:42.91ID:hNG5yKqv0 Cはウンコ言語なのでリフレクションはありませんの一言で終わる質問
125デフォルトの名無しさん (ワッチョイ d623-0bAf)
2017/08/25(金) 08:26:26.12ID:degYWVoy0 C言語はもう 気ままにリフレクション
126デフォルトの名無しさん (スップ Sdca-wqH8)
2017/08/25(金) 08:28:37.56ID:+VfvF6y6d >>124
うんこじゃない言語もコンパイラはうんこ言語(お前に言わせるとC言語)でつくられてるけどな
うんこじゃない言語もコンパイラはうんこ言語(お前に言わせるとC言語)でつくられてるけどな
127デフォルトの名無しさん (スップ Sdca-vlGO)
2017/08/25(金) 08:31:15.05ID:mWX/padLd 本当にうんこならとっくの昔に消えてるよ
128デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/25(金) 15:42:32.73ID:RGmsOxnq0 Cはうんことかほざくやつ
まさかLinuxなんか使ってねえだろな
まさかLinuxなんか使ってねえだろな
129デフォルトの名無しさん (スップ Sdca-vlGO)
2017/08/25(金) 17:02:40.42ID:mWX/padLd linuxはうんこ
130デフォルトの名無しさん (ワッチョイ b500-2x4P)
2017/08/25(金) 17:44:02.80ID:GY4pXB3S0 Cがウンコとか言ってる奴に限ってRubyでしか書けないとかいうオチだったら笑えるんだけどな
131デフォルトの名無しさん (ワッチョイ 41db-4xUk)
2017/08/25(金) 21:36:12.81ID:BZOsNf+t0 高級アセンブラ最高じゃん
132デフォルトの名無しさん (スップ Sdca-wqH8)
2017/08/25(金) 22:36:16.04ID:+VfvF6y6d >>131
ほんそれ
ほんそれ
133デフォルトの名無しさん (ワッチョイ caea-6Dzw)
2017/08/25(金) 22:45:39.22ID:IHFV3+gX0 むしろ Ruby で自由にコードを書ける人を尊敬する今日この頃。
最近やってるんだけど、どうしても馴染めない。普通には組めるけど、違和感が残るというか抵抗があるというか。
最近やってるんだけど、どうしても馴染めない。普通には組めるけど、違和感が残るというか抵抗があるというか。
134デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/26(土) 00:06:54.39ID:F7j6CSPU0 リフレクションを使う気がなければリフレクション自体がウンコだよ。
・ソースコードがだだ漏れ
・実行体が無駄に膨らむ(ソースコード情報を含むため)
・リクレクションが必要な用途なら、動的言語でついでに型無しの方が断然楽
GUIとかね。
ウンコと言われ続けたJavaScriptを誰も殺せず、
ついにはElectronとか言い出してデスクトップ側にも進出してきてるだろ。
やれば分かるがGUIに関しては動的型無しHTML(=JavaScript)は最強。
C言語はC言語が目指した範囲での仕様は美しいよ。
ただそこには今後ともリクレクションは必要ないね。
唯一引っかかるのは>>122か。
>>133
どの辺が?
俺はRuby使いではないが、それよりも酷いとされるJavaScriptには馴染んでしまったから、
ある程度は答えられるかも。
・ソースコードがだだ漏れ
・実行体が無駄に膨らむ(ソースコード情報を含むため)
・リクレクションが必要な用途なら、動的言語でついでに型無しの方が断然楽
GUIとかね。
ウンコと言われ続けたJavaScriptを誰も殺せず、
ついにはElectronとか言い出してデスクトップ側にも進出してきてるだろ。
やれば分かるがGUIに関しては動的型無しHTML(=JavaScript)は最強。
C言語はC言語が目指した範囲での仕様は美しいよ。
ただそこには今後ともリクレクションは必要ないね。
唯一引っかかるのは>>122か。
>>133
どの辺が?
俺はRuby使いではないが、それよりも酷いとされるJavaScriptには馴染んでしまったから、
ある程度は答えられるかも。
135デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
2017/08/26(土) 00:48:52.34ID:acOQPPj10 lua等の組込み言語とやり取りする container生成用補助構文群が有ってもいい
関数では前方宣言とか scopeが邪魔して対処しきれないだろうから
うまくすれば文字列操作表示も標準libraryから追い出せる
関数では前方宣言とか scopeが邪魔して対処しきれないだろうから
うまくすれば文字列操作表示も標準libraryから追い出せる
136デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
2017/08/26(土) 00:52:27.30ID:acOQPPj10 pr(test_t, (test_t){.i=999; .s="abc";});
137デフォルトの名無しさん (ワッチョイ b632-+Jgu)
2017/08/26(土) 14:20:33.57ID:rkE5GYva0138デフォルトの名無しさん (ワッチョイ 6aab-M74o)
2017/08/29(火) 00:26:03.40ID:+Y8D6iZy0 >>134
規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
TypeScriptとかFlowとか
速度を稼ぐ目的でwasmも今後主流になっていくだろう
巨大ストレージ、OSSが主流な時代にメタデータのサイズやソース隠蔽は気にしなくなったし
規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
TypeScriptとかFlowとか
速度を稼ぐ目的でwasmも今後主流になっていくだろう
巨大ストレージ、OSSが主流な時代にメタデータのサイズやソース隠蔽は気にしなくなったし
139デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/29(火) 02:58:14.41ID:Uz0lh6nE0 >>138
> 規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
違うね。今の流れは「選べる」だ。つまり、
・型無し言語に型情報を付加し、恩恵を受ける---TypeScript
・型あり言語に型推論やジェネリックを追加し、型情報を記述する煩わしさを回避---C#/C++/Java
どっちも出来ることはほぼ同じ。ほぼ全ての言語がここを目指してるでしょ。(Cを除く)
要するにいいとこ取りを目指しているわけで、自然な流れだ。
型があった方が助かるのなら書け、煩わしいだけなら書かなくて済む、という方向に進化しつつある。
なお、GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
> 速度を稼ぐ目的でwasmも今後主流になっていくだろう
ならんと思うし、C使いにとってはなったとしてもああそうですか、でしかないと思うが。
> 巨大ストレージ、OSSが主流な時代にメタデータのサイズやソース隠蔽は気にしなくなったし
OSSについては歪んでいて、本来は選べるべきだよ。
JavaScriptのようにソース曝露必須というのは問題ではある。
富豪どころか大富豪プログラミングを自由に出来る時代ではあるが、
何だかんだで速度=バッテリの持ち/快適さなので、実際は、「気にしなくていい環境も増えた」だよ。
とはいえCレベルでのチューニングが必要なこともそうないが。
> 規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
違うね。今の流れは「選べる」だ。つまり、
・型無し言語に型情報を付加し、恩恵を受ける---TypeScript
・型あり言語に型推論やジェネリックを追加し、型情報を記述する煩わしさを回避---C#/C++/Java
どっちも出来ることはほぼ同じ。ほぼ全ての言語がここを目指してるでしょ。(Cを除く)
要するにいいとこ取りを目指しているわけで、自然な流れだ。
型があった方が助かるのなら書け、煩わしいだけなら書かなくて済む、という方向に進化しつつある。
なお、GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
> 速度を稼ぐ目的でwasmも今後主流になっていくだろう
ならんと思うし、C使いにとってはなったとしてもああそうですか、でしかないと思うが。
> 巨大ストレージ、OSSが主流な時代にメタデータのサイズやソース隠蔽は気にしなくなったし
OSSについては歪んでいて、本来は選べるべきだよ。
JavaScriptのようにソース曝露必須というのは問題ではある。
富豪どころか大富豪プログラミングを自由に出来る時代ではあるが、
何だかんだで速度=バッテリの持ち/快適さなので、実際は、「気にしなくていい環境も増えた」だよ。
とはいえCレベルでのチューニングが必要なこともそうないが。
140デフォルトの名無しさん (ワッチョイ ad7f-vgeI)
2017/08/29(火) 07:49:01.20ID:pPJ906sN0 >・型無し言語に型情報を付加し、恩恵を受ける---TypeScript
>・型あり言語に型推論やジェネリックを追加し、型情報を記述する煩わしさを回避---C#/C++/Java
後者は型を明示的に書かなくてもいというだけで最初からすべて型検査してるぞ。
型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
>・型あり言語に型推論やジェネリックを追加し、型情報を記述する煩わしさを回避---C#/C++/Java
後者は型を明示的に書かなくてもいというだけで最初からすべて型検査してるぞ。
型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
141デフォルトの名無しさん (ワッチョイ d623-0bAf)
2017/08/29(火) 08:29:00.57ID:E7mhir0G0 動かす前にバグが見つかる仕掛けがちゃんとあるなら
動的型付けでも構わんよ
動的型付けでも構わんよ
142デフォルトの名無しさん (ワッチョイ 41db-4xUk)
2017/08/29(火) 14:42:19.23ID:/UmWkn6m0 無理ゲーっぽくね?
143デフォルトの名無しさん (ワッチョイ 41db-4xUk)
2017/08/29(火) 14:47:49.09ID:/UmWkn6m0 んなことはないみたいだぬ
144デフォルトの名無しさん (ドコグロ MM72-+ULf)
2017/08/29(火) 18:55:09.32ID:qEt/+AkhM 100%は無理
そこそこなら行ける
そこそこなら行ける
145デフォルトの名無しさん (ワッチョイ 2aef-vgeI)
2017/08/29(火) 20:04:11.09ID://zGX0GI0 option explicit +中間言語コンパイル,なら使えそうだ
146デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/29(火) 22:43:29.12ID:Uz0lh6nE0 >>140
> 型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
これは事実としてはその通りだが、理由はこれが型あり言語の正義だからであって、
現実は型検査がウザイだけの時も多いだろ。
C++のtemplateとか、varで書いたら勝手にtemplate化してくれ、という場合も多い。
込み入ったことをやるとコンパイルを通すだけの為に苦労したりするが、
あんなのは完全に時間と手間の無駄だ。
また、他でもよく言われているが、確かに関数ポインタを常用し始めた場合、
型あり『しか出来ない』言語は壮絶にウザイ。どうでもいい型が氾濫するだけだし。
言語として出来る/出来ないではなく、
ユーザーがやりたい時には出来る/やりたくない時には切れる、が正解なんだよ。
型無し言語はこれを認めていて、欠点を修正し始めてる。
型あり言語はこれを認められず、まだ自分たちの正義(型検査は必須)を押し売りしてるだけ。
C(と言うかC++)ではconstがこの状況に近いのではないかな?
通説ではconstは付けるべき、となっているが、俺は付けてない。理由は、
・そもそも俺はconstで苦労したことがない(必要性を感じない)
・中途半端に付けてると余計に面倒になるだけ
・const_castとか、ただの馬鹿としか思えない
なんだが、同様の意見の奴もある程度はいるだろ。
過剰な型検査ってのはあるんだよ。それが人によって異なるってだけで。
やればいいって物ではない。
> 型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
これは事実としてはその通りだが、理由はこれが型あり言語の正義だからであって、
現実は型検査がウザイだけの時も多いだろ。
C++のtemplateとか、varで書いたら勝手にtemplate化してくれ、という場合も多い。
込み入ったことをやるとコンパイルを通すだけの為に苦労したりするが、
あんなのは完全に時間と手間の無駄だ。
また、他でもよく言われているが、確かに関数ポインタを常用し始めた場合、
型あり『しか出来ない』言語は壮絶にウザイ。どうでもいい型が氾濫するだけだし。
言語として出来る/出来ないではなく、
ユーザーがやりたい時には出来る/やりたくない時には切れる、が正解なんだよ。
型無し言語はこれを認めていて、欠点を修正し始めてる。
型あり言語はこれを認められず、まだ自分たちの正義(型検査は必須)を押し売りしてるだけ。
C(と言うかC++)ではconstがこの状況に近いのではないかな?
通説ではconstは付けるべき、となっているが、俺は付けてない。理由は、
・そもそも俺はconstで苦労したことがない(必要性を感じない)
・中途半端に付けてると余計に面倒になるだけ
・const_castとか、ただの馬鹿としか思えない
なんだが、同様の意見の奴もある程度はいるだろ。
過剰な型検査ってのはあるんだよ。それが人によって異なるってだけで。
やればいいって物ではない。
147デフォルトの名無しさん (ワッチョイ ad7f-vgeI)
2017/08/29(火) 22:56:30.74ID:pPJ906sN0 なんだ?>>139の「違うね」ってのは現状認識が違うって話じゃなくてあんたの理想と違うってことか?
そりゃ正解はあんたにしかわからんわ。
そりゃ正解はあんたにしかわからんわ。
148デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/29(火) 23:14:00.57ID:Uz0lh6nE0149デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/29(火) 23:17:01.52ID:/SLQJmZn0 > コンパイルを通すだけの為に苦労したりするが、
> あんなのは完全に時間と手間の無駄だ。
そうだねえ
自分の考えがはっきりしてなくて筋が通らないのを
コンパイラに突っ込まれ、そのたびに右往左往じゃ
下手の考え休むに似・・いや如かずってやつ
> あんなのは完全に時間と手間の無駄だ。
そうだねえ
自分の考えがはっきりしてなくて筋が通らないのを
コンパイラに突っ込まれ、そのたびに右往左往じゃ
下手の考え休むに似・・いや如かずってやつ
150デフォルトの名無しさん (ワッチョイ ad7f-vgeI)
2017/08/29(火) 23:31:56.37ID:pPJ906sN0 「今の流れってこうだよね」
「俺の欲しいものは違う」
会話にならねぇ。
「俺の欲しいものは違う」
会話にならねぇ。
151デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/29(火) 23:53:00.65ID:Uz0lh6nE0 >>150
そうとしか取れないのは君が未熟だからだね。
「流れ」ってのは原因ではなく、大多数が希望した「結果」なんだよ。
君は初心者だから、毎日コード書いている連中が何を求めているのか分からない。
それだけだね。
そうとしか取れないのは君が未熟だからだね。
「流れ」ってのは原因ではなく、大多数が希望した「結果」なんだよ。
君は初心者だから、毎日コード書いている連中が何を求めているのか分からない。
それだけだね。
152デフォルトの名無しさん (ワッチョイ 6aab-M74o)
2017/08/29(火) 23:57:29.58ID:+Y8D6iZy0 >>139,146
>GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
見てわかる程度の規模の場合は型無しでもよいだろうね
>型検査がウザイだけの時も多いだろ
どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
COM除けばJSONやXMLの処理で楽するときぐらい?それでも本番用ならちゃんと書くなぁ
>どうでもいい型が氾濫
ジェネリックで型指定するだけだから氾濫しなくね?
あと、constはプログラマーがミスを防ぐためのものであると同時にコンパイラーへのヒントでもある
const修飾されていれば大胆な最適化が可能な場合も多い
>GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
見てわかる程度の規模の場合は型無しでもよいだろうね
>型検査がウザイだけの時も多いだろ
どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
COM除けばJSONやXMLの処理で楽するときぐらい?それでも本番用ならちゃんと書くなぁ
>どうでもいい型が氾濫
ジェネリックで型指定するだけだから氾濫しなくね?
あと、constはプログラマーがミスを防ぐためのものであると同時にコンパイラーへのヒントでもある
const修飾されていれば大胆な最適化が可能な場合も多い
153デフォルトの名無しさん (ワッチョイ 2a89-GW8T)
2017/08/30(水) 00:01:54.97ID:3iEZIBUv0154デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/30(水) 00:53:26.35ID:F1WQhw000 >>152
> >GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
> 見てわかる程度の規模の場合は型無しでもよいだろうね
規模にかかわらず、見ずにチェックするGUIなんて無いだろ。
> どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
おー、C#はやはり進んでいるというか、痒いところに手が届いているね。
要するに楽をさせてくれでしかないのだが、ぱっと思いつく遭遇したケースは、
・callbackでdelegateの型チェックがウザイ。グダグダ言わずにcallbackしてこい。
・リフレクション時がかなり最悪。(C#なら問題ないが、
VC++2008とかだと、MSDNで型を調べながら型を書くという本末転倒の事態になる)
以下にはJSONガーとか書いてあるけど、JSONをC++で受けたことはないので実感はない。
http://ufcpp.net/study/csharp/sp4_dynamic.html#what
後は型無しだとデタラメなパッチが可能だというのもあるし、俺は常用してるけど、
これ自体はあまり推奨されることではないね。
俺はJavaScriptで型をかかないことに慣れてしまったので、
再びVC++で型を書く時にウザくて仕方ない。
(ただしこれはVC++しかやってない時には全く感じなかった)
要するに型情報は具ではなく、ただのチェック用付加情報でしかないんだよ。
例えれば、当たり前に読める漢字にもいちいち全部ルビを付けている感じか?二度手間がウザイ。
ただし二重チェックをしたい部分もあるので、そういうところは書かせろ、とも思うが。
コンパイラにプログラマが合わせるのではなくて、プログラマにコンパイラが合わせるべき。
> ジェネリックで型指定するだけだから氾濫しなくね?
C#は多分そうだね。C#では解決済みかも。
> const修飾されていれば大胆な最適化が可能な場合も多い
この説はよく聞くが、具体的にどういうケースよ?
> >GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
> 見てわかる程度の規模の場合は型無しでもよいだろうね
規模にかかわらず、見ずにチェックするGUIなんて無いだろ。
> どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
おー、C#はやはり進んでいるというか、痒いところに手が届いているね。
要するに楽をさせてくれでしかないのだが、ぱっと思いつく遭遇したケースは、
・callbackでdelegateの型チェックがウザイ。グダグダ言わずにcallbackしてこい。
・リフレクション時がかなり最悪。(C#なら問題ないが、
VC++2008とかだと、MSDNで型を調べながら型を書くという本末転倒の事態になる)
以下にはJSONガーとか書いてあるけど、JSONをC++で受けたことはないので実感はない。
http://ufcpp.net/study/csharp/sp4_dynamic.html#what
後は型無しだとデタラメなパッチが可能だというのもあるし、俺は常用してるけど、
これ自体はあまり推奨されることではないね。
俺はJavaScriptで型をかかないことに慣れてしまったので、
再びVC++で型を書く時にウザくて仕方ない。
(ただしこれはVC++しかやってない時には全く感じなかった)
要するに型情報は具ではなく、ただのチェック用付加情報でしかないんだよ。
例えれば、当たり前に読める漢字にもいちいち全部ルビを付けている感じか?二度手間がウザイ。
ただし二重チェックをしたい部分もあるので、そういうところは書かせろ、とも思うが。
コンパイラにプログラマが合わせるのではなくて、プログラマにコンパイラが合わせるべき。
> ジェネリックで型指定するだけだから氾濫しなくね?
C#は多分そうだね。C#では解決済みかも。
> const修飾されていれば大胆な最適化が可能な場合も多い
この説はよく聞くが、具体的にどういうケースよ?
155デフォルトの名無しさん (ワッチョイ 5923-pgRk)
2017/08/30(水) 00:58:09.18ID:ry+Kms2n0156デフォルトの名無しさん (ワッチョイ 5923-pgRk)
2017/08/30(水) 01:17:46.58ID:ry+Kms2n0 型どうこうで考えるべきは依存関係なんだが
静的型言語はすぐに依存関係ができる
そのためにやれ継承だのインタフェースだのデザパタだのとごちゃごちゃ考えなきゃならん
しかもデザパタで実現できる疎結合は完全じゃないからね
静的型言語はすぐに依存関係ができる
そのためにやれ継承だのインタフェースだのデザパタだのとごちゃごちゃ考えなきゃならん
しかもデザパタで実現できる疎結合は完全じゃないからね
157デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/30(水) 01:56:29.11ID:F1WQhw000 >>156
それは型ではなくてラムダの利点だと思うが。
ただ、ラムダを積極活用すると型が邪魔だってのはあるし、
結果的に関数型が型無しor型推論に突き進んだのはこれが理由だと思うが。
しかもデザパタって使い物にならんだろ。
というか元々Javaという関数ポインタもラムダもない言語で(キリッされても、
他の言語ならもっとマシに出来るんじゃね?ってのが多いというか、
なんで縛りプレイに付き合わないといけないの?っていうか、
だいたい説明自体もイミフなのが多いし。
それは型ではなくてラムダの利点だと思うが。
ただ、ラムダを積極活用すると型が邪魔だってのはあるし、
結果的に関数型が型無しor型推論に突き進んだのはこれが理由だと思うが。
しかもデザパタって使い物にならんだろ。
というか元々Javaという関数ポインタもラムダもない言語で(キリッされても、
他の言語ならもっとマシに出来るんじゃね?ってのが多いというか、
なんで縛りプレイに付き合わないといけないの?っていうか、
だいたい説明自体もイミフなのが多いし。
158デフォルトの名無しさん (ワッチョイ 6aab-M74o)
2017/08/30(水) 02:00:40.60ID:vF4qFgfn0 >>154
コンポーネントとかイベントの引数の型を間違えたり変更時に修正漏れが出たりはよくあるでしょ
>callbackでdelegateの型チェックがウザイ
async/awaitがある言語だとコールバックを使うことはあまりないしなぁ
どういうのを望んでるのかよくわからんが、型安全と最適化を投げ捨ててまでやることには見えん
コールバックの処理が適切なことはテストとかで保証するとか考えるとそっちが面倒そうに見えるが
>リフレクション時がかなり最悪
VC++でリフレクションって、どの話だ
>チェック用付加情報・二度手間がウザイ
どうせドキュメントとかテストに書いてくんだから二度手間は避けられん
定義が面倒な分、静的型言語では戻り値の型やメンバーが即座に確実に補完されるので非常に快適
全参照を書き換えるリファクタとかもできるし
新しい言語はそこら辺かなり解決されてる
コンポーネントとかイベントの引数の型を間違えたり変更時に修正漏れが出たりはよくあるでしょ
>callbackでdelegateの型チェックがウザイ
async/awaitがある言語だとコールバックを使うことはあまりないしなぁ
どういうのを望んでるのかよくわからんが、型安全と最適化を投げ捨ててまでやることには見えん
コールバックの処理が適切なことはテストとかで保証するとか考えるとそっちが面倒そうに見えるが
>リフレクション時がかなり最悪
VC++でリフレクションって、どの話だ
>チェック用付加情報・二度手間がウザイ
どうせドキュメントとかテストに書いてくんだから二度手間は避けられん
定義が面倒な分、静的型言語では戻り値の型やメンバーが即座に確実に補完されるので非常に快適
全参照を書き換えるリファクタとかもできるし
新しい言語はそこら辺かなり解決されてる
159デフォルトの名無しさん (ワッチョイ 5923-pgRk)
2017/08/30(水) 02:07:48.34ID:ry+Kms2n0160デフォルトの名無しさん (ワッチョイ 6aab-M74o)
2017/08/30(水) 02:25:01.52ID:vF4qFgfn0 >>154
constはどちらかというと、x + y = zみたいな変な呼び出しを禁じたいからつけてるから、最適化についてはパッとでは極端な例しか思いつかんな・・・
hoge(&a,&b);
c = a + b
でhogeの引数がconstなら処理を無視してa+bを静的に確定できるとか
根本的にC++は「型安全とバイナリの性能>>>楽をしたい」という発想の言語だから静的な型の確定を妨害するような機能は理念に反するでしょ
javascriptにポインタが欲しいぐらいの不自然さ
constはどちらかというと、x + y = zみたいな変な呼び出しを禁じたいからつけてるから、最適化についてはパッとでは極端な例しか思いつかんな・・・
hoge(&a,&b);
c = a + b
でhogeの引数がconstなら処理を無視してa+bを静的に確定できるとか
根本的にC++は「型安全とバイナリの性能>>>楽をしたい」という発想の言語だから静的な型の確定を妨害するような機能は理念に反するでしょ
javascriptにポインタが欲しいぐらいの不自然さ
161デフォルトの名無しさん (ワッチョイ e96f-oKtA)
2017/08/30(水) 06:22:36.60ID:dAnuHQ8p0 早く夏休み終わらないかな…
162デフォルトの名無しさん (ワッチョイ b500-2x4P)
2017/08/30(水) 07:01:40.06ID:AqkMSzAW0 いや終わらなくていいよ
電車混むし
電車混むし
163デフォルトの名無しさん (スップ Sdca-CsPo)
2017/08/30(水) 08:10:07.81ID:Li+Lo8rKd 大学生のは未だ続くで
164デフォルトの名無しさん (エーイモ SEb2-dmBu)
2017/08/30(水) 13:51:14.27ID:AB0hyKA3E すいません
Windowsでvirtualboxとかcygwinとかmsysみたいな名前のをインストールする予定はないんですが
WindowsでCを書く場合はVC++を使うのが定番なのでしょうか?
gccとclangを使うのはあんまりおすすめしないですか?
Windowsでvirtualboxとかcygwinとかmsysみたいな名前のをインストールする予定はないんですが
WindowsでCを書く場合はVC++を使うのが定番なのでしょうか?
gccとclangを使うのはあんまりおすすめしないですか?
165デフォルトの名無しさん (アウアウカー Sa85-HImR)
2017/08/30(水) 13:58:51.95ID:1qHN72hha GUIないならgccでも問題ない
166デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/30(水) 14:33:39.82ID:BJd10UjW0 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なんかがいるんで適宜追加しる
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なんかがいるんで適宜追加しる
167デフォルトの名無しさん (ドコグロ MM45-62g8)
2017/08/30(水) 18:06:52.31ID:S+MvNVsbM Windows版のgccある?
168デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/30(水) 18:24:32.41ID:BJd10UjW0169デフォルトの名無しさん (ドコグロ MM45-62g8)
2017/08/30(水) 18:31:00.76ID:S+MvNVsbM mingw 入ってない環境だとバイナリ使えないよね。
コンパイルして実行したいだけなのに。
コンパイルして実行したいだけなのに。
170デフォルトの名無しさん (ワッチョイ cd11-oKtA)
2017/08/30(水) 18:43:05.43ID:LRl1+/WB0 実行ファイルの配布の意図?
mingwでコンパイルできれば、実行もできる環境が整ってるんじゃないの?
mingwでコンパイルできれば、実行もできる環境が整ってるんじゃないの?
171デフォルトの名無しさん (ワッチョイ 096f-pmc4)
2017/08/30(水) 19:17:06.22ID:58Rp2mqQ0172デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/30(水) 19:17:51.85ID:BJd10UjW0 あのなー・・・
cygwinがそういう批判を受けていたのを踏まえて
「本当のミニマリスト」を目指したのがmingwなんだよ
それすらいやなら、あとはM$純正のbashくらいだぞ
cygwinがそういう批判を受けていたのを踏まえて
「本当のミニマリスト」を目指したのがmingwなんだよ
それすらいやなら、あとはM$純正のbashくらいだぞ
173デフォルトの名無しさん (ワッチョイ 0951-TBjh)
2017/08/30(水) 19:21:14.37ID:qx/wlZ6S0174デフォルトの名無しさん (ワッチョイ 86e3-2x4P)
2017/08/30(水) 20:36:36.61ID:ViOUv0iA0175デフォルトの名無しさん (ワッチョイ c61c-9BKz)
2017/08/30(水) 20:41:41.90ID:BJd10UjW0 >>168だって本当に最小限のmingwが黙って入るから意識せずに使えるぞ
で最小限じゃないmingwが欲しくなったらmsys2とか入れるんだよ
で最小限じゃないmingwが欲しくなったらmsys2とか入れるんだよ
176デフォルトの名無しさん (ワッチョイ 1932-RHs9)
2017/08/30(水) 20:52:42.57ID:t1uAI5x90 こういう枝葉でゴチャゴチャやるぐらいなら、さっさとVC入れたほうが良い
windowsで開発するなら、VCさえあれば十分
windowsで開発するなら、VCさえあれば十分
177デフォルトの名無しさん (ワッチョイ ca1e-62g8)
2017/08/30(水) 21:46:54.45ID:1xtdX2a20 コンソールアプリくらいならgccでコンパイルできても良さそうなもんだけどな。
関係ないけど .NET に JS コンパイラが入ってるの知らなかった。
関係ないけど .NET に JS コンパイラが入ってるの知らなかった。
178デフォルトの名無しさん (ドコグロ MM72-62g8)
2017/08/30(水) 22:05:25.61ID:AIW55pOFM179デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/30(水) 23:02:07.68ID:F1WQhw000 >>158
> 引数の型を間違えたり変更時に修正漏れが出たり
ねえよ。正確に言うと、『これが型検査で都合よく引っかかるのは』ねえよ。
型があってコンパイル時に落とせるのは明確なtypoだけで、それ以外は期待出来ない。
xxxx2とxxxx3とかを間違えた場合、通常、型は同じでしょ。
ただそれ以前にJavaScriptだと修正漏れ自体がないっつうか、修正しなくていいというか。
型検査は基本的にソース全体で辻褄が合っているかを検査する。
だから例えば機能追加で関数の引数が増えた場合、コンパイラは修正漏れを全て検出し、修正を促してくる。
ところがJavaScriptにはそういう機能はないから、漏れてしまう、というのがそちらの意見だと思うが、
そもそも漏れても動作するように作られてるから問題ない、というのがJavaScriptの思想。
具体的には、
・同じ関数が引数の数が違っても呼べるから、エラーにはならない。(引数の型/個数はシグニチャに入らない)
・足りてない引数は、undefind(falsy)になっているから、if (addedParameter) で簡単に対応出来る。
だから修正するパス(その機能が追加される動作パス)の部分だけ修正して、後は放置で問題ない。
もちろんこれだとソース内で引数の数の一致なんて無くなってしまう。
これでいいのか?とも思うが、俺が試した範囲では特に問題はなかった。
C#はIDEがいいから、全ソースをリファクタとかも簡単に出来るようだ。これはこれで一つの完成形だ。
そうではなく、手修正だと漏れる、だからコンパイラがそれを検出する、というのも一つの手だが、(C++)
漏れる漏れない以前に、関係ないところは修正の必要がそもそも無い、というのも一つの手だよ。(JavaScript)
ちまちま全修正するのが面倒だし危険だから、
受け側で引数違い毎にラップ(オーバーロード)してたらなんだかなぁ(俺的C++)、
みたいなのとは発想が逆だった。
> 引数の型を間違えたり変更時に修正漏れが出たり
ねえよ。正確に言うと、『これが型検査で都合よく引っかかるのは』ねえよ。
型があってコンパイル時に落とせるのは明確なtypoだけで、それ以外は期待出来ない。
xxxx2とxxxx3とかを間違えた場合、通常、型は同じでしょ。
ただそれ以前にJavaScriptだと修正漏れ自体がないっつうか、修正しなくていいというか。
型検査は基本的にソース全体で辻褄が合っているかを検査する。
だから例えば機能追加で関数の引数が増えた場合、コンパイラは修正漏れを全て検出し、修正を促してくる。
ところがJavaScriptにはそういう機能はないから、漏れてしまう、というのがそちらの意見だと思うが、
そもそも漏れても動作するように作られてるから問題ない、というのがJavaScriptの思想。
具体的には、
・同じ関数が引数の数が違っても呼べるから、エラーにはならない。(引数の型/個数はシグニチャに入らない)
・足りてない引数は、undefind(falsy)になっているから、if (addedParameter) で簡単に対応出来る。
だから修正するパス(その機能が追加される動作パス)の部分だけ修正して、後は放置で問題ない。
もちろんこれだとソース内で引数の数の一致なんて無くなってしまう。
これでいいのか?とも思うが、俺が試した範囲では特に問題はなかった。
C#はIDEがいいから、全ソースをリファクタとかも簡単に出来るようだ。これはこれで一つの完成形だ。
そうではなく、手修正だと漏れる、だからコンパイラがそれを検出する、というのも一つの手だが、(C++)
漏れる漏れない以前に、関係ないところは修正の必要がそもそも無い、というのも一つの手だよ。(JavaScript)
ちまちま全修正するのが面倒だし危険だから、
受け側で引数違い毎にラップ(オーバーロード)してたらなんだかなぁ(俺的C++)、
みたいなのとは発想が逆だった。
180デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/30(水) 23:03:09.90ID:F1WQhw000 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++の型チェックだと変更がソース全体に及ぶしこれを断れない。
引数の型とか個数を間違えた場合、普通は根本的に動かないなら、テストでは当てさえすれば検出出来る。
そんな簡単なエラーチェックの為にコンパイルを通すだけの為にいちいち型を合わせたり、
変更がソース全体に波及するのが危険でウザイって事。
理由は、
・外側関数(上位階層)の変数は全部クロージャになっていて読み出せる。
・関数はどこにでも書ける。
から。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++の型チェックだと変更がソース全体に及ぶしこれを断れない。
引数の型とか個数を間違えた場合、普通は根本的に動かないなら、テストでは当てさえすれば検出出来る。
そんな簡単なエラーチェックの為にコンパイルを通すだけの為にいちいち型を合わせたり、
変更がソース全体に波及するのが危険でウザイって事。
181デフォルトの名無しさん (ワッチョイ ad23-vgeI)
2017/08/30(水) 23:04:03.99ID:F1WQhw000 > コールバックの処理が適切なことはテストとかで保証するとか考えると
どのみちテストはやらんと駄目でしょ。と言うか、逆に、
「コールバックの処理が適切なことは『型検査』で保証する」ってのは無理でしょ。
Haskellのキチガイ共はそういう思想らしいが。
「型安全」ってのはバグの一つの形「インタフェース(接続部)の間違い」を検出するだけであって、
処理の中身が間違っている場合は全く検出出来ない。つまりテストは省略出来ない。
それで「型安全」にするために払うコストと、それによって受ける恩恵を考えた場合、
俺にとっては「無いよりマシ」程度で、「投げ捨ててまで」って程の価値はないね。
とはいえtypoを検出する機能だけは欲しいんだが、逆に言えばそれだけで十分だ。
>>160
多分、constで最適化ガーってのはやっぱり無いんだよ。
想定されるケースはそちらの挙げたとおりで、
void someFunc(){
// (A)
hoge(&a, &b); // (B)
// (C)
}
で、(B)で変更されないことを保証されれば、
(A)時点の&a, &bのキャッシュ(というかローカル変数に取ったもの)が
(C)でも有効です、ってだけだが、そもそもこのケースがないだろ。
自関数内で変更してるかどうかはコンパイラには明確に分かるんだから、
考えられるのはこのように他関数をまたいだケースなんだけど、
それなら最初から(A)(C)(B)の順に処理しろ、でしかないし。
((B)で変更されるから(C)は(B)の後ろなのであって)
どのみちテストはやらんと駄目でしょ。と言うか、逆に、
「コールバックの処理が適切なことは『型検査』で保証する」ってのは無理でしょ。
Haskellのキチガイ共はそういう思想らしいが。
「型安全」ってのはバグの一つの形「インタフェース(接続部)の間違い」を検出するだけであって、
処理の中身が間違っている場合は全く検出出来ない。つまりテストは省略出来ない。
それで「型安全」にするために払うコストと、それによって受ける恩恵を考えた場合、
俺にとっては「無いよりマシ」程度で、「投げ捨ててまで」って程の価値はないね。
とはいえtypoを検出する機能だけは欲しいんだが、逆に言えばそれだけで十分だ。
>>160
多分、constで最適化ガーってのはやっぱり無いんだよ。
想定されるケースはそちらの挙げたとおりで、
void someFunc(){
// (A)
hoge(&a, &b); // (B)
// (C)
}
で、(B)で変更されないことを保証されれば、
(A)時点の&a, &bのキャッシュ(というかローカル変数に取ったもの)が
(C)でも有効です、ってだけだが、そもそもこのケースがないだろ。
自関数内で変更してるかどうかはコンパイラには明確に分かるんだから、
考えられるのはこのように他関数をまたいだケースなんだけど、
それなら最初から(A)(C)(B)の順に処理しろ、でしかないし。
((B)で変更されるから(C)は(B)の後ろなのであって)
182デフォルトの名無しさん (ワッチョイ 096f-pmc4)
2017/08/30(水) 23:14:59.21ID:58Rp2mqQ0 ただmsvcrtを使うということはvcがサポートするC規格に引きずられるのを留意しておくこと
最新のmsvcrtでもたしかC99止まりでinttypes.hをインクルードしてもPRId64とか使えない
C11の機能が欲しければ素直にlinux+gcc|clangの環境をオススメする
最新のmsvcrtでもたしかC99止まりでinttypes.hをインクルードしてもPRId64とか使えない
C11の機能が欲しければ素直にlinux+gcc|clangの環境をオススメする
183デフォルトの名無しさん (スフッ Sdea-NYHg)
2017/08/30(水) 23:55:33.72ID:FdjUx67gd 最適化かけないと通るけど、最適化かけるとセグフォ
プリントデバッグしたらプリント文置いたり減らしたりするだけで最後に表示されるものが変わる
なんだこれ
プリントデバッグしたらプリント文置いたり減らしたりするだけで最後に表示されるものが変わる
なんだこれ
184デフォルトの名無しさん (アウアウカー Sa07-6oPJ)
2017/08/31(木) 00:01:55.43ID:B2+zi4Baa 最後に¥0を付けてないとか
185デフォルトの名無しさん (ワッチョイ a34b-hEpb)
2017/08/31(木) 00:06:31.32ID:M/UQy7Jt0 >>183
malloc/free使ってる?
malloc/free使ってる?
186デフォルトの名無しさん (スフッ Sd1f-hbUo)
2017/08/31(木) 00:15:15.17ID:AFctto/wd187デフォルトの名無しさん (ワッチョイ cfe3-X0kF)
2017/08/31(木) 00:22:21.25ID:Mr6ZzHeH0 配列サイズを越えて代入しているとか
188デフォルトの名無しさん (ワッチョイ b36f-r+mQ)
2017/08/31(木) 00:28:32.21ID:K0ByhO+S0 つかソース晒せないの?
189デフォルトの名無しさん (スフッ Sd1f-hbUo)
2017/08/31(木) 00:28:58.33ID:AFctto/wd 配列の代入とは関係ないところで死んでるっぽいこともあるんだけど、それでも配列の範囲外アクセスとかあるものかなあ……
190デフォルトの名無しさん (スフッ Sd1f-hbUo)
2017/08/31(木) 00:31:52.88ID:AFctto/wd >>188
そこそこ依存ファイルあるし、一応研究室の研究で書いているので、失礼ながらソースは上げられないです
そこそこ依存ファイルあるし、一応研究室の研究で書いているので、失礼ながらソースは上げられないです
191デフォルトの名無しさん (スフッ Sd1f-hbUo)
2017/08/31(木) 00:32:55.14ID:AFctto/wd よく考えたらそんな状態で相談することが間違いか
やっぱり撤回します。スレ汚しすいませんでした
やっぱり撤回します。スレ汚しすいませんでした
192デフォルトの名無しさん (ワッチョイ a34b-hEpb)
2017/08/31(木) 00:34:49.91ID:M/UQy7Jt0 >>190
メモリリークをチェックしてみたら
メモリリークをチェックしてみたら
193デフォルトの名無しさん (ワッチョイ a323-X0kF)
2017/08/31(木) 02:33:47.40ID:KfXpPD/x0 最適化の有無で変わった事と言うと、この前こんなことがあった。
(以下の 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 のように重なってしまっておかしくなったと。
(以下の 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 のように重なってしまっておかしくなったと。
194デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
2017/08/31(木) 03:22:36.47ID:IR3nOS0l0 >>179
いや、もっと単純に、APIの仕様変更で取得できる情報や型が変化したけど、エラー処理とか偶然うまく見える場合とかは目視では見落としがあるよねということ
テストを書く前に簡単に修正箇所がわかれば便利みたいな話だけど、まぁ、やり方やライブラリによって違うのかもね
少なくともAngularとかはTypeScript採用だし、型あったほうが便利派は少なからずいるよとだけ
いや、もっと単純に、APIの仕様変更で取得できる情報や型が変化したけど、エラー処理とか偶然うまく見える場合とかは目視では見落としがあるよねということ
テストを書く前に簡単に修正箇所がわかれば便利みたいな話だけど、まぁ、やり方やライブラリによって違うのかもね
少なくともAngularとかはTypeScript採用だし、型あったほうが便利派は少なからずいるよとだけ
195デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
2017/08/31(木) 03:58:43.17ID:IR3nOS0l0 >>180,181
C#でも同じようにラムダ式やローカル関数で変数をキャプチャできるぞ
というかC++でもできるはず
コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
新しいライブラリとかはPromiseで返すのが当たり前になって来てるし、今後の言語もasyncに舵をきるんじゃないかな
>関数ポインタを差し込む時にいちいち考える必要がない
C++でどうやって実現すんの?
char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ
コンパイルエラーじゃなくてテストで保証するとになればなおさら変
C#でも同じようにラムダ式やローカル関数で変数をキャプチャできるぞ
というかC++でもできるはず
コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
新しいライブラリとかはPromiseで返すのが当たり前になって来てるし、今後の言語もasyncに舵をきるんじゃないかな
>関数ポインタを差し込む時にいちいち考える必要がない
C++でどうやって実現すんの?
char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ
コンパイルエラーじゃなくてテストで保証するとになればなおさら変
196デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
2017/08/31(木) 04:15:22.77ID:IR3nOS0l0 >>181
>最初から(A)(C)(B)の順に処理しろ
何言ってんだBとかCに副作用があるなら入れ替えちいかんだろ
コードは適当だけど、
void test(a,b)
{
hoge(&a,&b);
piyo(a+b);
}
test(1,2)
みたいに静的に確定するなら、piyoの引数をコンパイル時に計算してpiyo(3)みたいなコードをはいてくれたりもする
>最初から(A)(C)(B)の順に処理しろ
何言ってんだBとかCに副作用があるなら入れ替えちいかんだろ
コードは適当だけど、
void test(a,b)
{
hoge(&a,&b);
piyo(a+b);
}
test(1,2)
みたいに静的に確定するなら、piyoの引数をコンパイル時に計算してpiyo(3)みたいなコードをはいてくれたりもする
197デフォルトの名無しさん (ブーイモ MMa7-yL/R)
2017/08/31(木) 05:12:55.38ID:egwbmqN8M スタックフレームの破壊は明白なんだから関数内で宣言してる配列全部の
範囲チェック入れてみな
範囲チェック入れてみな
198デフォルトの名無しさん (ワッチョイ 430d-b8Mh)
2017/08/31(木) 11:26:29.57ID:e5ym4hpC0 やりそうなこと
□ 要素数 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 が配列ではなくポインタだった為
処理したい要素数が渡っていない
□ 要素数 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 が配列ではなくポインタだった為
処理したい要素数が渡っていない
199デフォルトの名無しさん (ワッチョイ fff0-6h2J)
2017/08/31(木) 13:55:57.05ID:wUqC2S3T0 >>183
研究室から出せない秘伝のソース、
なら特殊なハードウェアで、実はvolatileが欠かせない、とかじゃねえの
ソースの向こうのハードウェアが実は核分裂制御装置でした!……とかでももう驚かねえよ
研究室から出せない秘伝のソース、
なら特殊なハードウェアで、実はvolatileが欠かせない、とかじゃねえの
ソースの向こうのハードウェアが実は核分裂制御装置でした!……とかでももう驚かねえよ
200デフォルトの名無しさん (スプッッ Sddf-b5LN)
2017/08/31(木) 16:11:13.20ID:aZ9Rj489d 創業当時から継ぎ足した秘伝のソース
201デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
2017/08/31(木) 16:17:00.98ID:JYM1pg890 半分使って、半分継ぎ足しを繰り返すと79回目あたりで
アボガドロ定数の逆数くらいに薄まるよね
アボガドロ定数の逆数くらいに薄まるよね
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 自民・麻生太郎 副総裁 石破政権の1年は「どよーん」 高市政権の発足で「何となく明るくなった」「世の中のことが決まり動いている」 [Hitzeschleier★]
- 東京都「都民の税金1.5兆円が国に奪われている」「全国に分配されている」に地方民ブチギレ [Hitzeschleier★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ [蚤の市★]
- 【27歳会社員】「自慰行為に使うために」コインランドリーの乾燥機から24歳女性の下着など計11点(時価8万2080円相当)盗んだ疑い [nita★]
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★4 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- トランプ、G7に代わるcore 5を発表 [805596214]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★5
- 為末大「ラーメン屋の行列を、年寄りが1万円渡してきて順番譲ってくれと言ったら? 答えられない問題だよ。」 [592058334]
- 麻生太郎が石破政権の1年を酷評「どよーんとして何も動かない感じだったな。それに引き換え高市政権は物事が動いている」 [597533159]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★4
- 【悲報】日本共産党、ツイッター速報にブチギレ法的措置WWWWWWWWWWWWWWWWWWWWWWWWWWWW [935793931]
