C言語なら俺に聞け 151

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ cf8f-fy95)
垢版 |
2019/04/02(火) 11:23:37.62ID:SQXqRaAc0
!extend:checked:vvvvv:1000:512
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/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/04/08(月) 23:30:36.72ID:dk5yj0CN0
visual studioで新しいプロジェクトを作成して始めてビルドする度に
/D _CRT_SECURE_NO_WARNINGS
に誘導されてます……
2019/04/08(月) 23:46:29.39ID:Z7UT2eMea
localtime_s 使ったら内部でmutex使ってて無茶苦茶遅いのはむかついた
2019/04/08(月) 23:48:18.87ID:Z7UT2eMea
>>30
なぜそんな古いものを…
引数にvoid入れるとびっくりするタイプ?
2019/04/08(月) 23:50:57.39ID:dk5yj0CN0
localtimeについては批判できねぇ。
マルチスレッドでlocaltime呼び出してたせいで正体不明のバグに数日間悩まされたからな。。。
2019/04/09(火) 03:49:52.59ID:jYkGM3GN0
>>30
C99 には無い。 C11 に入った。
Annex K (normative) Bounds-checking interfaces
って項目ね。
Wipkipedia でも言及がある。
https://ja.wikipedia.org/wiki/C11_(C%E8%A8%80%E8%AA%9E)#.E3.82.AA.E3.83.97.E3.82.B7.E3.83.A7.E3.83.B3.E6.A9.9F.E8.83.BD
2019/04/09(火) 07:47:37.12ID:lax+sHP30
>>22
> fprintf_s みたいな
> foo_s 系の関数実装って増えてるん?

「いや増えてない」←わかる
「俺は foo_s みたいな関数が嫌い」←わかる
「俺は foo_s みたいな関数が嫌いだから >>22 を強く批判する」←全く分からない

誰か解説してくれるのだろうか



私は「ガッコウのセンセイ」でもないし「ガッコウの教材」の著者でもないから何とも
新学期だから知恵袋とかに質問増えそうじゃん?
2019/04/09(火) 07:52:30.47ID:vvoqC9qD0
>>22 を批判してるんじゃなくて>>22 にかかれてるような状況を批判してるんじゃないの?
2019/04/09(火) 09:52:53.37ID:EB2iO7oh0
>>24
同感
いけ好かねえの多いよな
2019/04/09(火) 09:56:13.65ID:A5vZx8Gh0
>という視点で >>22 を強く批判する内容です

そう解釈してやっても良いが、この日本語はおかしい
2019/04/09(火) 10:28:57.92ID:AXiDgdzZd
話それちゃうよ?
41デフォルトの名無しさん (アウアウウー Sac5-T5wd)
垢版 |
2019/04/09(火) 13:13:25.92ID:xq+Mg1lAa
漢なら localtime_r()
2019/04/09(火) 13:25:42.77ID:AXiDgdzZd
真の漢なら
#ifdef _win32
localtime_s()
#else
localtime_r()
#endif
2019/04/09(火) 13:27:54.07ID:jYkGM3GN0
>>42
__STDC_LIB_EXT1__ を使った方がポータブルじゃない?
2019/04/09(火) 13:29:27.93ID:AXiDgdzZd
>>43
先生、それはなんですか?
2019/04/09(火) 16:24:32.16ID:jYkGM3GN0
>>44
ググって。
2019/04/09(火) 16:29:41.88ID:obpichI70
C11 以降か…
2019/04/09(火) 18:39:32.35ID:AXiDgdzZd
>>43
ググってヒットした件数的にこんなん使えませんわ。
2019/04/09(火) 19:07:14.53ID:jYkGM3GN0
>>47
件数じゃなくて、用途に対する妥当性で考えてよ
2019/04/09(火) 21:04:38.62ID:AXiDgdzZd
質問スレっぽいスレタイなのにそこまで考えさせられるのかよw
あんまり使われてないっぽいものは使わないってスタンスは崩さないよ、俺は。
2019/04/09(火) 21:11:11.26ID:e3amBytd0
使われてないものは使わない
つまりC言語自体・・・(ボソッ
2019/04/09(火) 21:27:21.27ID:AXiDgdzZd
言語を自分で選べるほど偉くないんですよ
2019/04/09(火) 21:47:18.63ID:ssMdw0XF0
>>35
ほえ〜
Annex K は確かにみじんも記憶に残っていません…でした
ご教示いただき感謝いたします
2019/04/09(火) 21:52:14.86ID:ssMdw0XF0
>>33
実は K&R2 のみが正義、K&R2 こそ必要にしてかつ十分、という立場なので、そんな私が C99 を推挙した時点で、すでにして大幅に compromise しているつもりなのでした…
2019/04/09(火) 21:55:42.64ID:EB2iO7oh0
K&R2って妥協の産物だろ
K&R1こそ原理主義者の拠り所だ
2019/04/09(火) 22:05:25.20ID:jYkGM3GN0
でもまあ JIS の最新は C99 相当だしな。
英語を読むのはしんどいし、
日本語の資料があるなら日本語の方がいいわ。
2019/04/09(火) 22:25:14.01ID:ssMdw0XF0
>>54
>K&R2って妥協の産物

それも理解できます
K&R2 の最大の改悪部分は「構造体の実体渡しができること」
配列の実体を丸まま関数に渡せないくせに、構造体では出来るって意味わかんない
もしかして
struct S {
int a[65536];
};
とかいう構造体があったら、それを全部スタックに載せるつもりなのか?そういうことをする奴が現れる可能性を考えたのか?と小一時間問い詰めたい気分になりました…
2019/04/09(火) 22:31:23.50ID:lax+sHP30
struct S {
long long ago0[1048576*1048576];
long long ago1[1048576*1048576];
long long ago2[1048576*1048576];
long long ago3[1048576*1048576];
};
2019/04/09(火) 22:32:15.47ID:KCu43/3wa
>>56
それは、配列の方が悪いんでしょうに
構造体はコピーを渡すのが全然正しいじゃないの
2019/04/09(火) 22:45:54.00ID:A5vZx8Gh0
>>54
K&R1原理主義って、素敵?
2019/04/09(火) 22:48:12.12ID:PvJWb3nJ0
in a galaxy far,
far away...
2019/04/09(火) 23:05:49.72ID:A5vZx8Gh0
/* not reach here outside the universe */
2019/04/10(水) 01:12:36.88ID:sw3hAH5+0
jedi = get_force();
2019/04/10(水) 01:49:22.11ID:57hoitEO0
>>58
構造体といえどもアドレスを渡すのが真に正しく、配列なら言語仕様でそれを強要される、なぜ構造体には甘い顔を見せる必要があるのか?
2019/04/10(水) 04:59:47.74ID:mOo8C1VR0
>>56
極端なことが「できてしまう」のが問題ということですか? そもそも C なんてそんなものでしょう。
状況を見て適当に使い分けるべきで、駄目な使い方をしたら何だって駄目ですよ。
2019/04/10(水) 06:18:28.03ID:qyNiIlQC0
>>63
ド素人の勝手な推測だけれども

「配列だとマジでサイズどんだけか分かったもんじゃないじゃん」
「構造体のメンバ」に配列が来る場合はあるけど、そのサイズは多寡が知れてるじゃん」

という考えかもアリかもしんない
2019/04/10(水) 06:47:52.31ID:bjp/36w+M
むしろ勝手にアドレス渡しになる配列が甘やかされすぎ
文字列がcharの配列だからしょうがないけど
2019/04/10(水) 07:49:55.31ID:PtgOSD4Jx
配列の実引数をポインタ仮引数で受けれるという仕様上、配列のサイズ情報が失われコンパイラは何バイトコピーすれば良いか分からないから致し方ない。
68デフォルトの名無しさん (アウアウウー Sac5-T5wd)
垢版 |
2019/04/10(水) 09:42:54.83ID:G/tPYfHxa
>>56
昔々初心者の頃にやっちゃって物凄く遅くなって気づいた事があったw
69デフォルトの名無しさん (アウアウウー Sac5-T5wd)
垢版 |
2019/04/10(水) 09:49:26.10ID:G/tPYfHxa
構造体も const で渡されたらこっそりポインタ使って読むだけのアクセスするコード作っちゃっても良いのにな。
マルチスレッドで動くプログラムの時に死ぬかも知れんが。
2019/04/10(水) 10:06:17.49ID:QqefTxrga
そもそも[]が無ければ誤解も減ったと思うよ
いい年した大人が、引数で渡ってきた配列の sizeof 取ろうとするの良く見るぜ
2019/04/10(水) 10:42:39.87ID:ryP68qDF0
現代教えられてる言語で60年代中期の古さを引きずってる言語だからだ

配列に対してsize適用すれば長さを取れるのは現代じゃあ普通で、
取れないC言語のほうがおかしい、
これ、誤解でも何でもないからな
2019/04/10(水) 10:46:50.33ID:Y6MOlOQR0
sizeofで取れるのは要素数じゃないけどな
2019/04/10(水) 11:14:25.33ID:9YALwuYf0
>>58
事実上、構造体はほとんどの場合ポインタで渡すよな
実体で渡すという特殊なケースがデフォになってて
ポインタで渡すという主要な使い方でアドレス演算子が必須って
おかしくね?
2019/04/10(水) 11:16:06.57ID:9YALwuYf0
>>70
だよな
[]こそ諸悪の根元
自動変数と仮引数と外部宣言でみんな意味違うとか
気が狂ってるとしか思えない
75デフォルトの名無しさん (アウアウウー Sac5-T5wd)
垢版 |
2019/04/10(水) 11:23:36.81ID:7gi5m8N9a
そして「C言語はおかしい」と満場一致で結論が出て、また新たな言語が作られるのであった。

        完
76デフォルトの名無しさん (ワッチョイ 7d02-w1lf)
垢版 |
2019/04/10(水) 11:25:19.17ID:lv7m7vwC0
ここが変だよC言語って本が昔売られてたな。。。
2019/04/10(水) 12:05:09.58ID:JKE/90g3a
>>73
俺は安全のために実体渡すし返すよ、割と
2019/04/10(水) 12:29:04.23ID:bjp/36w+M
>>73
たまから、構造体はint, doubleとかの変数と同じく値渡しで一貫してる
配列がおかしいだけ
2019/04/10(水) 14:02:32.11ID:pgm3XBSH0
不定と未定義がある限り、C言語はおかしくあり続けるのだ。
2019/04/10(水) 14:28:30.84ID:qyNiIlQC0
>>77
仮引数にconstはダメ?
2019/04/10(水) 14:46:53.80ID:9YALwuYf0
>>77
const使わんの? ・・・て、先に誰か言ってるな
2019/04/10(水) 14:49:44.54ID:9YALwuYf0
>>78
intが値渡しと決められた理由は理解してるか?
配列みたいに暗黙のアドレス演算子にもやればできた話で
そのほうがおまえさんの主張する一貫性にも叶うわけだが
2019/04/10(水) 14:51:22.98ID:hStfijf/0
by val と by ref でうあぁぁぁ
2019/04/10(水) 15:21:31.93ID:Y9aQW1ZLa
>>80
そりゃ、付けられるときは基本いつでもconstですよ
だからなに
2019/04/10(水) 15:49:26.74ID:qyNiIlQC0
>>84
付けられないときってどんなときでしょう
2019/04/10(水) 15:56:55.75ID:9YALwuYf0
>>84
77で「安全のために」って言っているのを
誤って変更してしまうのを防ぐためと読んでいたが
これがそもそも違うのか?
2019/04/10(水) 16:15:30.28ID:Y9aQW1ZLa
>>86
変更しようがしまいが、意図があろうがなかろうが、コンテクストを分けるためですよ。
2019/04/10(水) 16:36:22.97ID:9YALwuYf0
>>87
へー、じゃあ関数を呼び出すたびごとにプロセス生成とかすんの?
2019/04/10(水) 16:51:52.86ID:Y9aQW1ZLa
>>88
なんで?
チミは頻繁にグローバル変数を使うってこと?やめたほうがええよ
2019/04/10(水) 16:58:14.51ID:9YALwuYf0
>>89
なんでグローバル変数を使っちゃいかんのだ?
スタックにしまえば安全だと思っているならおめでたいやつよ
2019/04/10(水) 17:08:01.10ID:Y9aQW1ZLa
>>90
グローバル変数だめでしょ。
スタックってなんのこと?まさか関数呼び出しとスタックがセットだと思ってる?
2019/04/10(水) 17:12:08.62ID:9YALwuYf0
>>91
なんでと聞いている
答えてくれ
2019/04/10(水) 17:16:15.00ID:Y9aQW1ZLa
>>92
そんなもん、密結合・低凝集を実現する目的でしか役に立たんからですよ。
2019/04/10(水) 17:18:23.20ID:9YALwuYf0
>>93
仮引数と自動変数が置かれるスタックもグローバルなんだが
そのせいで密結合・低凝集になったりしているか?
2019/04/10(水) 17:20:34.39ID:qyNiIlQC0
記憶領域確保に失敗したとき
落ちないように頑張ってくれるのと
即落ちるのと

どっちがどうだったか忘れた
最近読んだどっかに書いてあった筈だけど思い出せん…

x86 限定で良いので挙動とコーディングの関係に心当たりのある方御教示ねがいます。。。
2019/04/10(水) 17:34:07.04ID:VhJLBw5p0
こんな便所みたいなところでばっちばちでワロタ
2019/04/10(水) 17:36:28.06ID:Y9aQW1ZLa
>>94
そうそう、だからポインタを使わないのがいいね
2019/04/10(水) 17:39:25.15ID:Y9aQW1ZLa
構造体に限った話でもないが、グローバル変数のポインタが引数として渡され、更にそういう関数が多段に続いたコードとか地獄だよ。
誰かが止めねばならんよ。
2019/04/10(水) 17:44:54.12ID:9YALwuYf0
>>97
あ、おまえさんそっち系か
・・・なんでCなんか使うの?
2019/04/10(水) 17:46:05.16ID:9YALwuYf0
>>98
グローバル変数をポインタ渡しは意味あるでしょ
スコープを指定する、的なやつ
2019/04/10(水) 17:48:27.03ID:Y9aQW1ZLa
>>100
マジ意味わからん
2019/04/10(水) 17:52:02.02ID:9YALwuYf0
>>101=97
二度も言わなくていいよ
2019/04/10(水) 18:00:58.67ID:9QKNNv28a
>>102
いや、100の解説してくれや
2019/04/10(水) 18:05:19.14ID:9YALwuYf0
>>103
#include <stdio.h>

int x, y;

int main(void)
{
scanf("%d", &x);
scanf("%d", &y);

return 0;
}
暗黙にxに書き込む関数とscanfは
どっちが汎用性が高いか
どっちが見通しがいいか
考えてみな
2019/04/10(水) 18:07:33.40ID:Y9aQW1ZLa
>>104
xとyを比較したらええんか?
2019/04/10(水) 18:09:36.68ID:9YALwuYf0
>>105
おまえさんに解らせることはもう諦めた
放っといてくれ
2019/04/10(水) 18:17:20.49ID:9YALwuYf0
俺はいま103に説明しているんだ
2019/04/10(水) 18:41:36.83ID:BTPtEuL0a
いや、同一人物だぞ
2019/04/10(水) 19:37:58.47ID:WZ2DAnxG0
>>82でイミフなこと言ってるなって思ったら単なる基地外やんw
2019/04/10(水) 20:25:42.75ID:qyNiIlQC0
結局「constを仮引数に使えないとき」というのがどんなときなのが全く分からず
「規格通りに書いてはならない」ケースが実在したのかしら
2019/04/10(水) 20:33:10.76ID:Y9aQW1ZLa
>>110
え、毎回書いてるの?
2019/04/10(水) 21:26:31.69ID:qyNiIlQC0
いや
仕事で使ってませんから
そもそも「毎回」っていうほど書いてませんし

何らかのツールで勝手に入るので「敢えて書く必要性がない」ということなのでしょうか
それとも一律に「書くな」というルールが定着している組織が実在しているのでしょうか
2019/04/10(水) 21:33:55.83ID:9YALwuYf0
>>109
そうか、82がおまえさんはイミフなのか
悪いけど匙を投げるね
2019/04/10(水) 21:37:03.36ID:qyNiIlQC0
>>104 にて
scanf("%d", &x);

と書かれているのですが、ターミナルから9を80字入力されたらどうなさるおつもりなのでしょうか
また、signedともunsignedとも指定されておりませんが、その点はどのように汎用性を確保なさるのでしょうか
2019/04/10(水) 21:55:23.88ID:9YALwuYf0
>>114
俺に聞くな、規格票を嫁
http://kikakurui.com/x3/X3010-2003-01.html

104のコードが規格厳密合致プログラム(strictly conforming program)であることのみここに宣言する
この命題を反証されたら、潔く敗北を認める

では貴殿の返答を待つ
2019/04/10(水) 21:59:49.17ID:QzOhMry80
intだけだったらsigned intになるっしょ。
近代的な環境なら、正しく書式を設定すればscanfはオーバーフローしない。
2019/04/10(水) 22:19:22.09ID:QzOhMry80
shortはsigned short、
longはsigned longだが、
charはコンパイラの設定によりsignedにもunsignedにもなる。普通はsignedだがな。
2019/04/10(水) 23:14:07.61ID:qyNiIlQC0
>>115
> 規格厳密合致プログラム

残念ながら、リンク先の日本語文章に定義が無く意味不明だったため
これから英文を読むことにします
型の件含め、皆様の御教示に感謝します
2019/04/10(水) 23:41:09.21ID:qyNiIlQC0
"shall" の訳文に、筆者の苦悩のようなものが見受けられました
その点ふくめ、私は知らないことが非常に多いようで、ご迷惑をおかけしました
2019/04/10(水) 23:46:11.63ID:57hoitEO0
>>65
>>56
struct S {
int a[65536];
};
2019/04/10(水) 23:49:04.71ID:57hoitEO0
>>119
規格の中に現れる shall は十中八九「話者の意思」を示す
例文:You shall die.
超訳:「死ね!」
2019/04/11(木) 00:04:19.55ID:SPJO7XdY0
>>121
> 例文:You shall die.
> 超訳:「死ね!」

さすがにそれは…

日本語の文章の方に "shall" は書かれてなかったもんで把握、と
示唆したつもりだったのですが、通じなかったようで、表現力につき反省する所しきりであります
2019/04/11(木) 00:44:10.66ID:Nah1Abkj0
I shall return 0.
124デフォルトの名無しさん (ワッチョイ fb02-XGqV)
垢版 |
2019/04/11(木) 01:53:26.52ID:5ienNbe20
  *'``・* 。
  |     `*。
 ,。∩彡⌒ミ   *    みんなハゲにな〜れ
+  (´・ω・`) *。+゚
`*。 ヽ、  つ *゚*
 `・+。*・' ゚⊃ +゚
 ☆   ∪~ 。*゚
  `・+。*・ ゚
2019/04/11(木) 07:54:50.71ID:YCq7KtVA0
>>118
4. 規格合致性
規格厳密合致プログラム(strictly conforming program)は,この規格で規定する言語機能及びライブラリ
だけを使用しなければならない(2)。さらに,いかなる未規定の動作,未定義の動作又は処理系定義の動作に依存する出力も生成してはならず,しかもどのような最低限の処理系限界も超えてはならない。

(2)規格厳密合致プログラムは,どの処理系でもサポートしているわけではない機能(附属書 F の中に例
がある。)を使うことができる。ただし,その機能を使うことができるのは,それが適切なマクロをもつ#ifdef 指令とそれに対応する#endif 指令とに囲まれている場合に限る。次に示すプログラム片がその例である。

#ifdef _ _STDC_IEC_559_ _ /* FE_UPWARD

が定義されている */

/* ... */

fesetround(FE_UPWARD);

/*

... */

#endif
2019/04/11(木) 09:09:31.46ID:AbBe4c020
RFCなんかである要請の強度( MUST SHALL MAY ) みたいに使う用語の縛りはない?
2019/04/11(木) 20:58:24.95ID:mnND5pqz0
>>122
あくまで私見ですが、現代英語では will に単純に置き換えられるような shall の使い方はもうありえなく、
shall を使うのは shall を使う必然性があるから、だから、shall は辞書でいうところの「意志未来」であり、したがって shall を訳出しないのは不誠実な訳だとどうしても私は感じてしまいます…
2019/04/11(木) 21:23:32.90ID:SPJO7XdY0
「英文読解」の場ではなかったので控えていたのですが

>>127
個人的には「こんなのを訳出させられた人は凄い」と思ってます

「原典は英語で日本語訳がある」もので「日本語訳が意味不明」の場合
原典で確認すると「訳出で明確ではない」部分が確認できるケースが多々あります

"shall" をどのように訳出するかは個人差ありますし
今回の箇所が「以前同じ文言があったので単純にコピペした」ものかどうかは確認していません


もちろん>>126さんが仰るように「強度の要請で助動詞を変える」ものもありえますが
C99の文書の場合は丁寧に "shall" の定義から書かれていますし、
何より "strictly conforming program" という表現は、明確に 4.5 での新情報です
129デフォルトの名無しさん (トンモー MM4d-Ouf2)
垢版 |
2019/04/13(土) 04:36:48.17ID:/Uq84pFNM
昔の話。
若い頃K&Rの日本語版を買ってきて読み始めて、
間違いというか
サンプルとしてよろしくない
ところを見つけていた。

それが7年後に役立って
沢山仕事が入ってくるようになった。

本はキチンと読みましょう!
2019/04/13(土) 12:55:05.18ID:hvrKDDfY0
>>129
面白そうな話の気もするが、抽象的すぎてよくさっぱりわからん。
せっかくだしもう少し詳しく教えて欲しい。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況