C言語なら俺に聞け 152

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (アウアウウー Sa4f-7DQ/)
垢版 |
2019/06/17(月) 18:27:10.41ID:3L1/L9kLa
!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
※前スレ
C言語なら俺に聞け 151
https://mevius.5ch.net/test/read.cgi/tech/1554171817/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/07/16(火) 00:24:39.33ID:UHx9kM+ca
>>491
いや、しろよ
493デフォルトの名無しさん (アウアウクー MM7b-WqwA)
垢版 |
2019/07/16(火) 00:48:27.21ID:/MIJx2vXM
プログラムは書く人によって千差万別
書く物によっては複雑な物を書かなきゃならない
そしてその上でのバグ千差万別
ルールブックなんてプログラム書かない管理者がこれを守れば大丈夫(キリッ
ってするものだろう
2019/07/16(火) 01:07:51.42ID:EySzsoWc0
普通は大勢で開発するときに必要な取り決めだけどな
そういう規模で仕事しないなら,何しても良いけど
2019/07/16(火) 01:37:13.82ID:UHx9kM+ca
>>494
MISRAは明らかに小規模なプログラムのための規約だと思うよ
2019/07/16(火) 02:37:59.80ID:EySzsoWc0
大規模なプロジェクトのコーディング規約を決める人がここにいるとは思わないからね
小規模だと思うなら,そのルールでやれば良いんじゃない?
497デフォルトの名無しさん (アウアウクー MM7b-WqwA)
垢版 |
2019/07/16(火) 03:09:26.20ID:FvAVzBqbM
大規模とか小規模とかじゃなく実際にプログラムを書いてると必要になったりとかあるって話で
プログラムを書いた事内物が大規模ではとかいってるのか
2019/07/16(火) 03:18:03.55ID:UHx9kM+ca
そうそう、MISRAはクソ
2019/07/16(火) 03:29:07.35ID:UHx9kM+ca
MISRAを尊重するひとって、returnを書く位置によって返る先が変わると思ってるんだよ
2019/07/16(火) 07:29:02.49ID:UAKGOqEv0
間違ったことばかり書いてあるわけじゃないけどね
現場にそぐわないスキル不足なやつを庇うところには同意しかねるわけよ

> ルール 8.14 必要 restrict型修飾子を使用してはならない

規格票が読めないようなアホの相手はやってらんね
C++が混ざるところでも対策は簡単だし
501デフォルトの名無しさん (ワッチョイ 17d2-rBUL)
垢版 |
2019/07/16(火) 07:43:27.01ID:1j77iOOZ0
トヨタのやってることは一つのミスでも人が死ぬということだよ
もしrestrictを使って人が死んだら責任とれるの?
2019/07/16(火) 07:45:28.75ID:/V8NdDl/M
それなら、人が死なないプロジェクトではMISRAは守る必要がないですね。
2019/07/16(火) 07:58:46.16ID:UAKGOqEv0
>>501
規格票を確認しないやつにミスがどうたら言われたかねえぜ
2019/07/16(火) 08:02:25.27ID:UAKGOqEv0
○○を使って人が死んだら責任とれるの?

○○に何でも突っ込めるウルトラクソ論法
ポインタ、共用体、仮定義、数学関数、それから?
2019/07/16(火) 08:50:54.07ID:7HVrvnq4a
>>501
お前が作ってるプログラムはテストしないのか?
2019/07/16(火) 09:07:55.77ID:csbTSCSc0
>>492
絶対守るべき指標と守った方がいい指標、といった具合に何段階かにわかれていて
別途ルールがあるならば守らなくても良い(無理して守るべきでない)指標もあるよ
2019/07/16(火) 09:35:00.37ID:UXD1By8p0
上司のバカかバカの上司でも理解できるまでに破壊されたC言語だろ
それを規格と言ってるだけだ

安全かもしれないけど対照実験がないでしょ
安全であることをどうやって確かめたのか論文の欠片も見つからなかった
だからMISRAの安全神話は神話かデマかフェイクニュースだよ
2019/07/16(火) 09:46:10.29ID:MyJUZjZxa
プライドだけは高いこの道30年の社畜が書いた様なルールだよ。
「してはいけない」ばかりでこうしろという記述が圧倒的に少ない。
フレームワークという発想がない。指摘だけ。すべて勘と経験という名の錯覚に基づいてる。

あと内容的に「最適化はしてはいけない」とか書いておけばいいんじゃないかと思う。次は入れて欲しい。
2019/07/16(火) 10:35:01.62ID:Yi/rfLM50
>>463
処理系依存や未定義だけどなんか上手く動いてる
というのは、ちょっと怖い
2019/07/16(火) 12:58:57.36ID:EySzsoWc0
たまたま動いているのは
処理系のバグかも知れない
2019/07/16(火) 13:18:30.94ID:uQ5be57j0
組込み系の開発経験者いなくて草
MISRA準拠が納品物の条件にあるんだよ
でもプロジェクト毎にカスママイズするから
100%適用するわけじゃないよ
わけわからんルールは適用除外してる
2019/07/16(火) 14:13:08.82ID:i1fbuZ/pM
>>511
> 組込み系の開発経験者いなくて草
ID:y88H95dP0 あたりは経験者だろ
2019/07/16(火) 15:01:33.68ID:csbTSCSc0
>>511
8進数使うな、とかいやだよね
2019/07/16(火) 15:05:03.91ID:Yi/rfLM50
エディタ上での見栄えで桁合わせに 空白を使わず 0 で補ってやらかす
2019/07/16(火) 15:14:31.06ID:EySzsoWc0
>>513
2進数や16進数は見慣れているんだが
8進数ってどういう時に使いたい?
2019/07/16(火) 15:27:11.60ID:UHx9kM+ca
バイトが6bitの時は便利だったとかいう話だけど、今要らんよね
emacs使っててエンコードがアレだと出てくるね
2019/07/16(火) 15:32:14.71ID:Yi/rfLM50
文字列で [ESC] を埋めるのに \033 を使ってるのを見るぐらい

(2進数のリテラルをマクロでなんとかするとき 一時的に8進化するけど 中の話)
2019/07/16(火) 15:40:10.80ID:uQ5be57j0
大昔のアーキテクチャは18bit,24bit とかで3bit 区切りが扱いやすかった
今は16,32,64と16進数が扱いやすいって話だね
ゼロ始まりは8進数というのはB言語からきたらしいよ
2019/07/16(火) 15:44:50.30ID:i1fbuZ/pM
>>513
いや、もうコンパイルオプションで禁止してもいいレベル

>>515-516
Unix/Linuxのファイルパーミッションが3ビット単位だからと言うのはあるけど今時直書きなんてしないし

>>517
それも "¥x1b" の方が馴染みがあると思う
2019/07/16(火) 16:30:56.95ID:SpxSpG+wx
\0 … 8進数
\x0 … 16進数
2019/07/16(火) 16:37:07.34ID:cpfSTA9t0
>>487
if の nest が深くなってしまう?
2019/07/16(火) 16:54:01.54ID:Yi/rfLM50
>>521
教条主義的に守るなら そうせざるを得ないだろうね

if (エラー) return ; // 即脱出
後続コード
return ; // 最終

即脱出を禁ずるなら
後続コードは即脱出条件とは排他的なので if (or else) 内に収めるしかない

if (!エラー) {
 後続コード
}
return ; // 最終
2019/07/16(火) 16:58:26.41ID:EySzsoWc0
goto ___exit; /* 震え声 */
2019/07/16(火) 16:59:45.97ID:Yi/rfLM50
多分 goto も塞がれてる気配w
2019/07/16(火) 17:24:48.72ID:uQ5be57j0
うちはreturnは最後に一つのみってやつは適用除外になってる
理由はネストが深くなって読みづらくなるから

gotoもネストしたループから一気に抜ける場合のみ使ってもよいことになってる
フラグ使ってbreakで抜けるより読みやすいからね
2019/07/16(火) 17:27:15.45ID:glyNXuyHa
もちろんgotoも禁止さ。
あと、各関数の頭で引数チェックも必須なのでreturn禁止とのコンボでほぼ必ず正常系処理のネストが一段以上深くなる。
引数チェック必須はISO26262だったかもしれん。
2019/07/16(火) 17:27:59.62ID:UHx9kM+ca
途中のreturn禁止を徹底するなら、ifとかelseの後に2行以上書くの禁止にした方がいいね。
代入だけ許容するくらいでいい。
2019/07/16(火) 17:28:40.15ID:T78CNDqDd
>>513
0は0x0とか書かなきゃいけないんかね
2019/07/16(火) 18:10:37.85ID:QICQY/wp0
>515
そりゃもう512色カラー設定に(ry
2019/07/16(火) 18:31:58.85ID:2nARKc5Ld
ここまできたらC言語も禁止だな。
pythonでコーディングしてコンパイルしてやればいい。
2019/07/16(火) 18:35:56.79ID:/Cc9wbE10
結構前から言われてない?
「C言語を使う必要が無いなら使うな」と
532デフォルトの名無しさん (アウアウウー Sa47-KZVA)
垢版 |
2019/07/16(火) 18:47:43.53ID:K50k857la
pythonを使って人が死んだら責任とれるの?
2019/07/16(火) 18:54:47.98ID:2nARKc5Ld
>>532
大丈夫さ。プログラム全体をtryで囲んで引っ掛かったらprint("手動運転に切り替てください")のコンボがある。
2019/07/16(火) 18:58:26.32ID:uQ5be57j0
pythonでOSやデバドラ書けるようになったら考えるわ
2019/07/16(火) 20:05:19.62ID:WsWptbblx
#define xxx 06
#define yyy 07
//#define zzz 08 // なぜかエラーになる
536デフォルトの名無しさん (アウアウウー Sa47-KZVA)
垢版 |
2019/07/16(火) 20:31:07.37ID:K50k857la
なぜかはひみつ
2019/07/16(火) 20:54:46.50ID:GCGNUpCjM
>>535
なんてありがちな…
2019/07/16(火) 21:03:30.93ID:GCGNUpCjM
ここらへん嫁
https://programming-study.com/technology/lets-learn-how-to-express-constants/#i
539デフォルトの名無しさん (アウアウウー Sa47-KZVA)
垢版 |
2019/07/16(火) 21:05:08.13ID:K50k857la
祈りが足りないからだな
2019/07/16(火) 21:08:14.38ID:uQ5be57j0
ちょっと前に8進数が〜ってやってるのに
あ、ネタかw
2019/07/16(火) 21:22:48.20ID:/Cc9wbE10
このスレの人って少し前のレス読まないよね
2019/07/16(火) 21:31:28.73ID:7JXDuVC90
const char *sの順番が納得いかない
直感的にはchar * const sだろうが!!
2019/07/16(火) 21:32:10.10ID:W8tOKWg20
char const*だろ?
2019/07/16(火) 22:16:46.03ID:Qe+dZ6A/0
* const char s
じゃね?
2019/07/16(火) 22:17:34.37ID:Qe+dZ6A/0
おれは何を言ってるんだ??
2019/07/16(火) 22:20:37.80ID:dxLim7GAx
>>542
>const char *sの順番が納得いかない
>直感的にはchar * const sだろうが!!

前者はポイントされる文字列が const で、後者はポインタ自体が const でしょ
2019/07/16(火) 22:42:49.53ID:uQ5be57j0
const char* const s
これも直感的じゃないって言うんだろうか
2019/07/16(火) 22:43:19.23ID:dxLim7GAx
546です
すみません、それを踏まえてということか…
2019/07/16(火) 22:50:32.56ID:g+WSNcLQ0
const は後置で書いたほうが整合性が取れる
char const * const s:
しかし、見た目的にかわいいのは前置である
const char * s;
私はかわいいのが好きである
よって前置は使わない
2019/07/16(火) 22:58:11.13ID:g+WSNcLQ0
そこで私が提案したいのが「strong」である
strongは修飾したデータをすべてconstにする
つまり
char const * const s;

strong char * s;
は等価である
2019/07/16(火) 23:13:59.86ID:ICazHXPW0
>>550
安易な予約語の追加は嫌われるよ
2019/07/16(火) 23:18:11.31ID:EySzsoWc0
「strongがやられたようだな…」
「フフフ…奴は四天王の中でも最弱…」
2019/07/16(火) 23:19:03.80ID:/Cc9wbE10
<strong>char* s</strong>
2019/07/16(火) 23:22:51.61ID:uQ5be57j0
stringと間違えそうで嫌だなw
readonlyはc#で使ってるしな
やっぱconstだな
555デフォルトの名無しさん (ワッチョイ 7602-24gz)
垢版 |
2019/07/16(火) 23:40:17.89ID:awioItM70
大文字で CONST にするとか。
2019/07/17(水) 04:24:07.40ID:CqcyHUxLd
フン
char *const_s
2019/07/17(水) 06:33:32.66ID:Pp4wfZXK0
>>546
const int a → constなint型のa
const char *s → constなchar *型のs
constなのはchar *つまりポインタ(直感)
char * const s → char *型のconstなs
constなのはsつまり文字列自体(直感)
なんで逆!!
2019/07/17(水) 06:46:44.61ID:NB17uhF90
> const char *s → constなchar *型のs

ギャグだよな?
2019/07/17(水) 06:57:50.40ID:i06pHchL0
宣言は右から左に読む
const等の修飾は左にかかる
char const * const s; // sは、const *である、const char型の

右にかかるなら↓のように書けないとおかしいがこれは構文エラーである
const char const *s;

変数名はただの識別子で、ある領域にsという名前を付けただけにすぎない
constやvolatileは型修飾子であり、これらが付くのは型に対してである
〜という領域を、以後sと呼ぶ、である
2019/07/17(水) 07:14:03.66ID:NB17uhF90
ちげーよ
宣言は真ん中から左右に読むんだよ
char const *(* const s)[1];
2019/07/17(水) 09:21:48.88ID:u050lnGw0
>>526
引数チェックに関しては、Java のコーディングルールでは、
外部の人用のAPI、つまりpublic な関数には、必要

一方、そのモジュール・クラスの実装者が使う、
内部的なAPI、つまりprivate な関数には、いらない

既にどこかで、エラーチェックしてるから、何回も同じエラーチェックするのは、無駄
2019/07/17(水) 21:08:01.97ID:E0YvS3zE0
const char *sは*sがconst
つまりポインタsの指すアドレスにある値が不変だけどsがどこを指すのかは可変

char *const sはsがconst
つまりポインタsがどこを指すかは不変だけどsの指すアドレスにある値は可変


大体こんな認識で合ってる?
2019/07/17(水) 23:04:57.90ID:Pp4wfZXK0
あってるけど納得いかないって話
1つ目がまず何で*sにかかるんだよ
自然に読んだらconstはchar *にかかるだろ
右から読むとか頭おかしいわ、アラビア語かよ
2019/07/17(水) 23:22:42.51ID:UrUB0t8/0
>>563

char * s;

に 1 個の const を追加するとき、形式的に追加できる場所は 4 箇所

a) char * s const;
b) char * const s;
c) char const * s;
d) const char * s;

このうち a) はコンパイルできない
b) c) は可能だが、の二つの間で意味は異なる
d) は本来ならエラーであるべきだと私は考えているが、実際には c) と一緒の意味になっている
2019/07/17(水) 23:34:56.30ID:RL7WDafS0
C言語使う時はいつ?
早いコードが欲しい時
メモリー消費に無駄のないコードが欲しい時
他ある?
2019/07/17(水) 23:39:48.74ID:UrUB0t8/0
>>565
他の言語はほとんどわからず(かじってはみたものの使えるまでにはMPがあがらず)、C/C++ でしかまともに書けないし発想できないからです…
2019/07/17(水) 23:42:49.57ID:FDkzfNlT0
>>563
実はアラビア語って可能性はないのか?
2019/07/17(水) 23:49:47.36ID:Pp4wfZXK0
そもそもconst char *sの宣言の時の切れ目がconst / char / *s なのも何だかなぁ
const / char * / s でconstはchar *にかかれよjk
現実に間違ってるのは渋々受け入れてるけど開発者が許せない
2019/07/18(木) 00:00:28.28ID:OLFUgkogx
>>564
自分は b or(and) d かなー
2019/07/18(木) 00:33:34.97ID:Nr80YdQr0
>>565
他に思い付くところとしては、
組み込み環境などで、C言語以外の選択肢がない、または他の言語で実行できる環境を整えるよりCを使った方が楽な場合。
外部のライブラリのインタフェースがC言語で、呼び出す部分をCで作る方が楽な場合。
バイナリファイルの操作などポインタ操作を使って実装しやすい場合。
2019/07/18(木) 00:48:28.58ID:Nr80YdQr0
>>568
単純なポインタのことしか考えないから、左から右にこだわってんだろ。
>>560も指摘している通り、変数宣言の構文は内から外だぞ。配列や関数ポインタも交えて、それらを多段階の組み合わせにしても一意に解釈できるのを理解すれば、合理的な物だとわかると思うよ。

>>563
1つ目は、constがかかってるのはcharだぞ。内側から解釈するとsは*が付いているからポインタであり、それが指す型がconstなcharだ。
572デフォルトの名無しさん (ワッチョイ 4fd2-ulaa)
垢版 |
2019/07/18(木) 05:33:10.45ID:yO5P6Jqp0
char *s
の意味は*sはchar型だよって意味で
sはchar *型だよって意味じゃないよ
2019/07/18(木) 05:43:05.99ID:xY9KzRxOd
>>572
こう理解できてるとわかりやすいね。つまり
const char *s

*s(sの指す先)はchar型でさらにconstだよ
となる。
2019/07/18(木) 06:48:06.17ID:2qyz/4gG0
>>572
その宣言から以後、
sという式がchar*型
*sという式がchar型
2つの意味を同時に表現してるんだよ
2019/07/18(木) 07:54:18.60ID:kb0ZHGx0M
*と*const があると憶えるべき。
576デフォルトの名無しさん (アウアウウー Sad3-9T1T)
垢版 |
2019/07/18(木) 09:56:03.22ID:q9HPUerJa
>>563
ポインタを表す * が型にくっついてるんじゃなくて変数にくっついてるからでは?
分かりにくいなら typedef でポインタの型を作ってそれを使えばいいんじゃないな。

右から読む事に関しては英語を日本語に翻訳する時に順序を入れ換えた方が自然な感じになる事があるのでなんとも言えんな。漢文のレ点みたいなものもあるしな。
日本語とは逆順の方が自然な表現になる言語はある。そして歴史的な事情で混在してしまっているのもある(アメリカでの年月日が月日年の順だとか)。
生まれながらにしてその言語使ってればその人にとってはそれが一番自然な表現だからな。
2019/07/18(木) 10:04:50.81ID:xY9KzRxOd
>>574
結果はいっしょでも解釈の仕方は複数ある感じだね。
自分にとって理解しやすいので
char *s

sの指す先はchar型、つまりsはポインタ
って言う風に捉えてる。
578デフォルトの名無しさん (ワッチョイ 3f28-t2IU)
垢版 |
2019/07/18(木) 21:25:27.83ID:PbeogWAD0
この話は何時も混乱するんだけど
結局の所は
自分の言葉で理解するまでやる
これをやらないと混乱してしまう

なぜそうなってしまったのか?
という視点で解釈しようとしないと
なかなかにc言語って難しい
その辺は例のc言語ポインタにのみついて書かれた本
あれを読んで
後は何とか自分の言葉で理解して解釈するしか方法が無い

それとこんなになってしまっている原因に
キーボード上の記号が少ない
というのもある
basic何かでは記号類は四則演算類だけ使って
なるだけ英単語?を使って記述するようになっている
だから使う場所によって記号の意味が違う
なんていうのが起こりにくくなってる
ある意味c言語が普及してしまったのはプログラミング世界にとっては不幸なのかもしれない
2019/07/18(木) 21:30:10.98ID:1zgaXsge0
C言語って初心者向けに作られたものではないと思う
2019/07/18(木) 21:32:28.55ID:/oDno/7H0
>>578
私も最初に C をやったときには、ここまで流行るとは思わなかったんです、むしろ pascal の方が筋がいいと思っていたのですが、どうしてこうなってしまったのでしょうか?
2019/07/18(木) 21:34:00.28ID:/oDno/7H0
>>579
当時は初心者用とかは特に無くて、BASIC でもある程度できる人はすぐに peek, poke を連発するようになったものです、最近の人は甘えていると思います
2019/07/18(木) 21:41:19.07ID:AzHVv8Pq0
>>580
UNIXがCで云々というのもあるけど、良い意味で高級アセンブラとして使い勝手が良かったからじゃないかな?
2019/07/18(木) 22:00:46.19ID:8m1lI2X40
厳格で融通がきかないと嫌われる
pascalはそんな感じ
2019/07/18(木) 22:15:37.33ID:/oDno/7H0
>>583
delphi は結構流行ったと思ったんですけれど…
2019/07/18(木) 22:18:08.64ID:0kCblb2b0
pascal失速最大の原因は:=だろう
これを採用している言語はもう一つも無い
プログラミング業界最大かつ唯一にして不可侵の大例外を抱えてるのがpascalだ
2019/07/18(木) 22:30:23.30ID:1zgaXsge0
pascalで開発したアプリっていうと
JaneStyleが有名かな?
2019/07/18(木) 22:32:00.45ID:1zgaXsge0
厳格で融通がきかないのは、教育用として最適だと思う
2019/07/18(木) 22:35:15.64ID:ugDCzjFC0
pascalでUNIX張りのOS書いていれば流行ったかもね
589デフォルトの名無しさん (ワッチョイ ff02-lraP)
垢版 |
2019/07/19(金) 00:19:03.24ID:7Hdy7m6i0
>>585
Modula-2は:=だったような気がする。
590デフォルトの名無しさん (ワッチョイ ff02-lraP)
垢版 |
2019/07/19(金) 00:22:05.35ID:7Hdy7m6i0
>>588
Delphiみたいに拡張されてれば可能だとは思うがコードが大きくなりそうなので昔のPCでは苦しいかもね。
ただし、Androidみたいに元のOSの上に乗っけて動くOSなら行けるかも。
2019/07/19(金) 00:25:42.16ID:Mih8lrFJ0
もう一つが奥の深さでC言語ではポインタが奥の深い箇所にあたる
この難易度が絶妙で難しい難しいと言われていて初学者には適度に難しいので挫折者が増える、
挫折者の総量が言語の価値を決定する

教育用に作られた言語は難しい箇所とか理屈に合わない箇所とか奥の深い箇所とかが無いのでオカルトとしての魅力が無い
学習曲線がいびつじゃないと流行しない
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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