19/07/12 19:56:09.31 zAF1v8/n0.net
\n
380:デフォルトの名無しさん
19/07/13 01:22:11.42 +XrRzYc00.net
>>378
結婚して///
381:デフォルトの名無しさん
19/07/13 06:35:45.40 GFbMPvry0.net
#defineを-Dでやれば1行にできるかも
URLリンク(www.ioccc.org)
382:デフォルトの名無しさん
19/07/13 07:12:15.59 THUdwCLa0.net
そもそも改行しないでプログラム書けば一行
383:デフォルトの名無しさん
19/07/13 13:07:12.18 BfevEbDR0.net
cppディレクティブは1個1行
384:デフォルトの名無しさん
19/07/14 22:19:01.35 uXqqdpfBM.net
int i = 0;
int s[2];
s[i] = i++ + 1;
printf("%d", s[1]);
これの出力が1になります。これは理解できません。
事実、3行目は以下のようにすると出力は0になります。
s[i++] = 1;
また、3行目は以下のようにすると出力は0になります。
s[i] = i++;
385:デフォルトの名無しさん
19/07/14 22:22:40.77 /MgLlV8v0.net
>>384
URLリンク(www.kouno.jp)
386:蟻人間
19/07/14 22:30:43.07 uXkiDi0Ud.net
「式の評価」という言葉はわかるか?
1+1という式を評価すると2になる。
C/C++の後置演算子では、全ての評価が終わった後で変数を書き換える。
i++は、++がiの後ろについているから、後置だ。i++を評価すると、評価した瞬間の値はiであり、そして式全体の評価が終わると、iはプラスいちになる。
後置の反対は前置演算子であり、式全体の評価の前に変数を+1もしくは-1する。
387:デフォルトの名無しさん
19/07/14 22:48:05.04 uXqqdpfBM.net
演算規則に従い、インクリメント後置なので、元の3行目の式は
s[i(==0)] = i(==0) + 1
i = i + 1
の順に行われて結果、
s[0]に0が代入されてs[1]の値は初期値0だと思うのですが。
事実、3行目がs[i] = i++;なら上の通りの順で実行されます。
演算規則が無視されて結果がコンパイラ依存になる理由は何ですか?
388:デフォルトの名無しさん
19/07/14 22:48:51.03 uXqqdpfBM.net
私は間違えました、s[0]に1が代入されます。
389:デフォルトの名無しさん
19/07/14 22:52:20.27 uXqqdpfBM.net
また、3行目を以下の通りにすると演算規則通りに結果2が得られます。
s[i] = ++i + 1;
390:デフォルトの名無しさん
19/07/14 22:53:42.53 uXqqdpfBM.net
順番はこの通りです、
i = i + 1
s[i(==1)] = i(==1) + 1
391:蟻人間
19/07/14 23:13:20.84 uXkiDi0Ud.net
>>387
主な原因は順序が決められないことと最適化のためらしい。詳しくは知らん
392:デフォルトの名無しさん
19/07/14 23:15:43.21 uXqqdpfBM.net
i = i++;
これの結果が未定義なのは直感的に理解できます。
代入とインクリメント増分の関係が不明だからです。
s[i] = i++;
これの結果が未定義なのは直感的に理解できません。
演算規則に従えば、iはインデックスとしての間接参照でしかないからです。
393:デフォルトの名無しさん
19/07/14 23:18:12.85 XOVWGW1L0.net
>>387
左辺と右辺の評価順序は未定義だからだ
gccとclとか違う環境で試してみれば分かる
394:デフォルトの名無しさん
19/07/14 23:28:34.66 uXqqdpfBM.net
int x = 2*i + i++;
それでは、これの結果もまた未定義ですか?
395:デフォルトの名無しさん
19/07/14 23:55:54.94 XOVWGW1L0.net
iの評価は何回だ?
評価が複数回入る式は書くなということだ
仕事でそんなコード書いたらどやされるぞ
396:デフォルトの名無しさん
19/07/15 00:20:47.65 wok43DsHM.net
私は勉強のためにコードを書いています。
コードがどのような動きをするか興味があります。
int a = 1;
int x = (a = a) + a;
それでは、この式ではxは定義されますか?
左辺と右辺の評価順序に関わらず、答えは同じです。
397:デフォルトの名無しさん
19/07/15 00:33:43.29 mPPf+F39a.net
されます
398:デフォルトの名無しさん
19/07/15 00:46:03.12 E9YINa1F0.net
そんな無意味なコードから何を学ぼうとしているのか分からんわ
399:デフォルトの名無しさん
19/07/15 00:55:35.98 wne2EA+X0.net
優先順位や式の評価順が曖昧かもって考えるソース、
書いてて気持ち悪くなりませんか?私はなりますよ。
400:デフォルトの名無しさん
19/07/15 01:14:29.35 Voexy70f0.net
>>394
副作用完了点でググってこい
401:デフォルトの名無しさん
19/07/15 02:04:55.42 wok43DsHM.net
while((s[i++] = t[j++]) != '\0') ;
元々気になったのは、tをsにコピーするこのコードです。
これを見て、他にインクリメントで簡略化出来そうなコードを考えています。
402:デフォルトの名無しさん
19/07/15 02:10:16.53 wok43DsHM.net
for(;t[j] != '\0'; j++){
s[i] = t[j];
i++;
}
s[i] = t[j];
従来の私なら、このようにコードを書いていました。
新しいコードの記述なら1行で書けます。
403:デフォルトの名無しさん
19/07/15 02:19:48.51 wok43DsHM.net
while((s[i++] = t[i + 1]) != '\0') ;
そこでtをsに1つずらしてコピーするコードをこのように書けないか考えていたら、未定義の問題が生じました。
私は演算規則から考えてこのコードは上手く働くと思いました。
404:デフォルトの名無しさん
19/07/15 03:09:03.53 mPPf+F39a.net
俺はmemcpy使う
性能は知らん
405:デフォルトの名無しさん
19/07/15 07:21:57.18 ex33LrHm0.net
せっかくC-FAQのリンク書いたのに…
バカって人の言う事聞かないからバカのままなんだな…
406:デフォルトの名無しさん
19/07/15 07:41:01.06 Voexy70f0.net
>>401
「簡略化」とは、何を目指しているんだ?
行数が少ない方がいいとか考えているならバカな考えだからやめとけ。
コンパイラの最適化で同じコードになるような範囲の変形で行数を減らしたところで、可読性を下げてるだけで何のメリットもないぞ。
407:デフォルトの名無しさん
19/07/15 08:20:49.21 wok43DsHM.net
私は行数の少なさというよりはむしろ見た目の単純さで読みやすいと感じます。
C-FAQのリンクは事実が書かれているのみで演算規則が無視される理由が理解できませんでした。
408:デフォルトの名無しさん
19/07/15 08:32:41.44 Voexy70f0.net
>>407
演算規則って何のことだ?
構文解析や演算子の結合の優先順序と副作用の発生するタイミングはまた別の話だぞ。
409:デフォルトの名無しさん
19/07/15 09:10:34.41 ex33LrHm0.net
どうせちゃんと読んでないか理解する能力がないんだろうな…
410:デフォルトの名無しさん
19/07/15 09:22:44.79 IpJNQ16e0.net
>>389
それはおかしいだろう
算術プラスの第1オペランドと第2オペランドの評価順序は未規定だぞ
411:デフォルトの名無しさん
19/07/15 10:07:24.78 Voexy70f0.net
>>410
未規定の動作がたまたま自分の期待する動作と同じになったということが理解できてないんだろうね。人の話を聞かない相手に何を言ってもダメそうだね。
412:デフォルトの名無しさん
19/07/15 10:40:21.72 r5uSGSCiM.net
愛繆私は未定義な理由について理解できません。
なぜなら、演算規則に従い前置インクリメントを代入の評価より先に行えば、389の結果は一つと決まるからです。
しかし、評価順序が未定義となりコンパイラに依存となる理由は何ですか?
この式を定義することによる問題の例を理解したいです。
413:デフォルトの名無しさん
19/07/15 10:44:14.06 mPPf+F39a.net
左辺は
414:デフォルトの名無しさん
19/07/15 10:45:20.28 r5uSGSCiM.net
つまり、私は未定義と規定されている理由を知りたいです。
定義することで発生する問題の例などです。
415:デフォルトの名無しさん
19/07/15 10:49:35.01 6m2OA1zn0.net
この人の言ってる「演算規則」って何なんだろうね。
「C言語 "演算規則"」でググっても、それらしきものは出てこないし。
416:デフォルトの名無しさん
19/07/15 10:57:10.32 r5uSGSCiM.net
int i = 0, j = 0;
int x = i++;
int y = ++j;
これです。xでは代入の後に後置インクリメントされます。(x = 0)
yでは代入の前に前置インクリメントされます。(y = 1)
s[i] = ++i + 1;
つまりこの式では代入の前に前置インクリメントされます。(次と等価です、)
i = i +1;
s[i(==1)] = i(==1) + 1;
417:デフォルトの名無しさん
19/07/15 10:59:07.47 mPPf+F39a.net
>>414
だから、左辺は
418:デフォルトの名無しさん
19/07/15 10:59:28.08 r5uSGSCiM.net
これは、未定義と規定されていますが、理由が理解できません。
私が示した通り、定義することによる問題の例は何ですか?
419:デフォルトの名無しさん
19/07/15 11:01:03.87 r5uSGSCiM.net
389の中では、左辺はs[1]です。
なぜなら、代入より前にiが前置インクリメントされます。
420:デフォルトの名無しさん
19/07/15 11:01:37.73 r7SsHRFS0.net
i++のポストインクリメントとi+1の評価順が不定だから
421:デフォルトの名無しさん
19/07/15 11:02:04.90 E9YINa1F0.net
これ読んで分からないなら諦めろ
未規定の動作とは、複数考えられる動作のうち、どれが実行されるかの要求が課されない動作のこと。
未規定の動作への依存で移植性が低下します。
未規定の動作
・部分式が評価される順序、及び副作用が発生する順序。
ただし関数呼出しの()、&&, ||, ?:, カンマ演算子は除く。(6.5)
・代入演算子のオペランドが評価される順序。(6.5.16)
未規定の動作
URLリンク(www.c-lang.org)
未定義の動作
URLリンク(www.c-lang.org)
422:デフォルトの名無しさん
19/07/15 11:04:11.05 r5uSGSCiM.net
i++のポストインクリメントとi+1の評価順が不定な理由は何ですか?
423:デフォルトの名無しさん
19/07/15 11:07:31.48 r5uSGSCiM.net
i = i++;
これが未定義なのは理解できます。
しかし、389の中で私が示した通り、の定義をすると発生する問題の例は何ですか?
424:デフォルトの名無しさん
19/07/15 11:09:44.83 ex33LrHm0.net
未定義な理由?
言語作った奴がそう決めたから
要するに「仕様だから」
そう決めた理由は想像になるけど最適化しやすい(と言うかそうしないと最適化の妨げになる)と考えたんだろうと思うよ
425:デフォルトの名無しさん
19/07/15 11:12:06.88 mPPf+F39a.net
>>419
なんで?
その添字いつ評価されんの?
演算子[]の中身だよ
カッコだけどvoid書いちゃだめだよ
426:デフォルトの名無しさん
19/07/15 11:12:37.37 3cpTbRIL0.net
インクリメントは式全体の前か後に実行されるからだろ
式の途中で実行されるとかあるの?
427:デフォルトの名無しさん
19/07/15 11:19:52.48 r5uSGSCiM.net
定義すると最適化の妨げになるという理由は、私には反論する知識は全くないので了承します。私は理解しました。
428:デフォルトの名無しさん
19/07/15 11:22:41.60 r5uSGSCiM.net
425の中で、書かれているように、実際には、演算規則でsのインデックスは0でした。
私は[]の優先を見落としていましたが、私が述べたかったことは、演算規則の優先で順番は決定できると思うことでした。
429:デフォルトの名無しさん
19/07/15 11:23:12.12 3cpTbRIL0.net
最適化の妨げにはならないだろ
コンパイラー簡単に作れるとかじゃないの
430:デフォルトの名無しさん
19/07/15 11:25:19.08 b7u0RgVG0.net
現行のCの仕様に文句があるなら、ANSI?ISO?の仕様策定に参加でもすればいいんじゃね?
431:デフォルトの名無しさん
19/07/15 11:29:05.40 IpJNQ16e0.net
>>411
すまん
俺はとんでもない失言をしていて
突っ込まれるの覚悟しておとなしく待ってたんだが
432:デフォルトの名無しさん
19/07/15 11:36:42.62 ZvCggxzR0.net
一通り勉強しましたが、次に何をやったらいいのか分かりません!
何も作れません!
どうしたらいい?
433:デフォルトの名無しさん
19/07/15 11:38:20.09 mPPf+F39a.net
>>428
そりゃ決定するための規則を作れば決定するけど、めんどくさいじゃん
434:デフォルトの名無しさん
19/07/15 11:39:31.38 E9YINa1F0.net
>>432
作りたいものが無いなら無理に作らんでもいいじゃん
435:デフォルトの名無しさん
19/07/15 11:40:09.15 3cpTbRIL0.net
>>432
散歩したり 景色を見たり…
昼寝したり 何もしない
そのうちに急に書きたくなるんだよ
436:デフォルトの名無しさん
19/07/15 12:05:05.25 ex33LrHm0.net
>>426, >>429
> インクリメントは式全体の前か後に実行されるからだろ
> 式の途中で実行されるとかあるの?
どのように実装してもいい
並列に処理することすら可能
と言うような最適化を妨げないための仕様
437:デフォルトの名無しさん
19/07/15 12:24:44.13 E9YINa1F0.net
要するに++,--は混ぜるな危険ってこと
438:デフォルトの名無しさん
19/07/15 12:36:46.00 IpJNQ16e0.net
能なしど低脳
439:デフォルトの名無しさん
19/07/15 12:47:17.16 0wrdUuzC0.net
>>403
>while((s[i++] = t[i + 1]) != '\0') ;
for(;(s[i] = t[i + 1]) != '\0';++i) ;
これじゃ駄目な理由ってなんだろう
440:デフォルトの名無しさん
19/07/15 12:55:44.11 wne2EA+X0.net
評価順序以前にループ条件が直感的に分かりにくい様なコードは書くべきでない
441:デフォルトの名無しさん
19/07/15 12:56:34.33 14ut6KBx0.net
for(①;②;③)
この123が全部必要だと思ってるんじゃね
442:デフォルトの名無しさん
19/07/15 13:04:03.21 Voexy70f0.net
>>431
こちらこそすまん。>>411は>>410宛ではなく>>409宛だった。
443:デフォルトの名無しさん
19/07/15 14:30:35.03 y88H95dP0.net
MISRA-C 2004 の100ルールを守っていないソースコードは、読むに値しないw
まず、コーディングルールを5年勉強しろ!w
444:デフォルトの名無しさん
19/07/15 14:33:44.55 Voexy70f0.net
>>443
その特徴的な書き方はいつものRuby大好きマンか?
バカなこと言ってないで巣に帰れ。
445:
19/07/15 15:05:29.64 Nn+acajv0.net
>>443
MISRA なんて鎖や束縛を作りたがる「管理職」の思考法でしょう?なんでそんなものに従わなければならないのでしょうかね
446:デフォルトの名無しさん
19/07/15 15:14:40.80 mPPf+F39a.net
ルールはあってもいいけど、MISRAはあれアホだよね。
考えたやつお前はCを使うなよっていう。
447:デフォルトの名無しさん
19/07/15 15:25:22.82 ex33LrHm0.net
>>446
どこがアホなのか詳しく書いてみ
448:デフォルトの名無しさん
19/07/15 15:26:34.84 mPPf+F39a.net
>>447
rubyが嫌になったってことですか?
449:
19/07/15 15:28:03.17 Nn+acajv0.net
>>446
あの阿呆なMISRAを制定した人間の種族はなにか、どんな属性か?得意な思考方法、苦手な思考方法は?信条・信念は?
というところには興味があります、そのためだけに MISRA を読んでいたりします
450:デフォルトの名無しさん
19/07/15 16:02:12.44 3UWFYY1V0.net
>>432
自分が作りたいものを作れ。
作る技術がまだ足りないならそれについて学習したり研究したりしろ。
一つ間違えてはいけないことは、自分の作りたいものを今の自分が持っている技術力で出来る範囲内に無理に収めないようにすることだ。
収めれば実現はたやすいが飛躍はできず本当にやりたかったことには届かない。
451:デフォルトの名無しさん
19/07/15 16:06:07.03 QcIx6aGf0.net
MISRAは実際の不具合を分析して作られたいわばバットノウハウ集だけど、言い換えると最低限のバカ避け。
バカがバカな不具合出すもんだからその他の人が迷惑を被る。
ま、バカはプログラム作るなって事だ。
452:443
19/07/15 16:14:22.25 y88H95dP0.net
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
この研究会は、トヨタなど大企業から、数十人のベテが集まって、
欧州人に聞きながら、完成された本w
未だに、コーディングルールのバイブルだろがw
元々は、Andrew Koenig の本
C Traps and Pitfalls, 1988, c1989
Cプログラミングの落とし穴
453:デフォルトの名無しさん
19/07/15 16:20:24.64 3cpTbRIL0.net
自分が馬鹿だとしっている賢い人はMISRAを使うということか
454:デフォルトの名無しさん
19/07/15 16:26:07.09 IpJNQ16e0.net
ブランドにすがるだけで自分の頭で考えないやつは相手にならん
あれ読んでて異論を持つことが全くないやつはその疑いが強い
455:デフォルトの名無しさん
19/07/15 16:34:38.99 ex33LrHm0.net
>>454
だからどこに異論持ってるのか書けよ
もしかしてグダグダ言うだけ君なの?w
456:デフォルトの名無しさん
19/07/15 16:42:13.17 IpJNQ16e0.net
命令すんな
そもそも自分が書かねえくせに
457:
19/07/15 16:43:21.75 Nn+acajv0.net
>>452
>この研究会は、トヨタなど大企業から、数十人のベテが集まって、
トヨタってコーディングを製造と言い切っちゃう人たちの集まりでしょう?そんな人たちの考え方って信じていいのでしょうかね…
458:デフォルトの名無しさん
19/07/15 16:48:48.65 ex33LrHm0.net
>>456
どうせ書けないんだろ、無理すんなよw
459:デフォルトの名無しさん
19/07/15 16:49:33.71 ex33LrHm0.net
>>457
信じるのはダメだと思うよ
内容見て判断しなきゃ
460:デフォルトの名無しさん
19/07/15 16:51:54.40 Voexy70f0.net
>>452
お前さんはいつも、有名な誰それがこう言った!とか、なんとかの本にこう書かれていた!とか、他人の発言を字面だけなぞって記憶するだけだから、中身の本質も適用すべき場面も長所短所も理解せずに垂れ流して害悪にしかならないから、もういい加減消えてくれないか?
461:デフォルトの名無しさん
19/07/15 17:02:08.44 14ut6KBx0.net
多分MISRAはΣ計画とセットだったんじゃねえの
とするとゾンビだよ
462:443
19/07/15 17:25:49.24 y88H95dP0.net
>>457
日本の研究会の考え方・思想は、ほとんどない!
MISRA-C は、Andrew Koenig の本を参考にして、欧州人が作ったから
日本の研究会は、各ルールの例題を作って、誰でもわかるように解説した。
各ルールは、こういう事を言ってます、という解説書
江添 亮の「C++11/14 コア言語」のみたいな本。
無数の例題を並べて、各ルールを解説した本
だから、この2冊は、神の書と言える!
463:デフォルトの名無しさん
19/07/15 17:32:05.00 dKUxLoi20.net
ルールとかくそどうでもよくね
動いて読めればそれでいい
464:デフォルトの名無しさん
19/07/15 17:32:21.62 IpJNQ16e0.net
>>458
ブーメラン乙
465:デフォルトの名無しさん
19/07/15 17:43:32.93 ex33LrHm0.net
>>464
バカなのか?
俺は別に異論があるとは言ってない
異論があるなら書けよって言ってるだけ
俺に何を書けって言ってるんだよw
466:デフォルトの名無しさん
19/07/15 17:46:56.60 IpJNQ16e0.net
>>465
またブーメランかよ、ワンパターンなやつだな
俺はさっき相手にならんと言ったはず
467:デフォルトの名無しさん
19/07/15 17:47:07.64 biXPcN21d.net
落ちものゲーム作れたと思ったけど落下処理の度に今表示中のものが上にズレて処理後のが新しく表示される仕組みのせいで目が死んだ
これダメな奴だ
468:デフォルトの名無しさん
19/07/15 18:01:17.82 ex33LrHm0.net
>>466
ハイハイ、結局具体的には何も言えないグダグダ君だったなw
469:デフォルトの名無しさん
19/07/15 18:41:39.94 IpJNQ16e0.net
煽っても情報は得られない
インタビューの下手な人だな
470:デフォルトの名無しさん
19/07/15 19:25:33.92 ex33LrHm0.net
情報持ってない奴からなにか得ようとしてるってか?
心配するなよ、お前に期待なんてしてないからw
471:デフォルトの名無しさん
19/07/15 20:06:52.59 14ut6KBx0.net
githubに存在するMISRA適合のソースコードとかどんだけあるんだよ
472:443
19/07/15 20:23:31.95 y88H95dP0.net
そのルールを守らないという、逸脱手続きをすれば、OK
トヨタでも、MISRA-C で採点したら、5/100点(ルール)しか取れなかったとかw
70~80点は、欲しい
473:デフォルトの名無しさん
19/07/15 20:27:21.89 QcIx6aGf0.net
>>472
それはそうなんだけど、逸脱したらレビューと品質記録が必須になるので逸脱しない方向へのバイアスが強くなる。
結果、強制されてるのと同じになっちゃう。
474:デフォルトの名無しさん
19/07/15 20:28:56.79 dKUxLoi20.net
ちなMISRAってどんなの?
pdfのリンクはってれ
475:443
19/07/15 20:31:45.40 y88H95dP0.net
例えば、Linux では、関数の冒頭部分に、return がよくある。
冒頭部分で、処理しないものをはじいてしまう
でも、MISRA-C では、関数内で、return は、最後に1つしか使えない。
複数箇所に、出口があってはならない
そのルールを守らないなら、逸脱手続きをすればよい。
その代わりに、点数が下がっていく
476:デフォルトの名無しさん
19/07/15 20:32:43.56 ex33LrHm0.net
>>471
ほとんどないんじゃね
>>451が言う通りバカ避けだから
>> 関数は、その最後に1つだけの出口を持たなけらばならない
みたいに適合させようとすると人によってはちょっと書き辛いルールもあったりするし
477:デフォルトの名無しさん
19/07/15 20:33:46.38 ex33LrHm0.net
あっ、被ったわ
みんな結構このルールに抵抗あるんだなw
478:443
19/07/15 20:35:21.08 y88H95dP0.net
>>474
「misra-c 2004」「misra-c 2012」で検索して!
479:443
19/07/15 20:37:59.21 y88H95dP0.net
他にも、MISRA-C では、2重ループ内から、一気に脱出できないから、フラグを持ちまわる事になる
このルールも嫌われる
480:443
19/07/15 20:48:48.44 y88H95dP0.net
組み込みとか医療用では、バグると簡単に人が死ぬから、
MISRA-C を勉強していない香具師が、コーディングするとヤバイ!
だから、コーディングできる資格を作るべきだっていう話も聞く
481:デフォルトの名無しさん
19/07/15 20:50:33.69 dKUxLoi20.net
なんでルールブックが有料やねんあほか勝手にやってろ
482:デフォルトの名無しさん
19/07/15 21:07:10.69 IpJNQ16e0.net
>>476
語るに落ちたな
ブランドvsブランドの対戦成績を
自分の頭で考えないブランド志向なやつに出せるわけがない
483:デフォルトの名無しさん
19/07/15 21:19:39.89 pdudwpaZ0.net
>>481
検索したら出てきた
URLリンク(www.c-lang.org)
484:デフォルトの名無しさん
19/07/15 21:36:18.18 r7SsHRFS0.net
4.12 必要 動的なメモリ割り当てを使用してはならない
って酷くね
485:デフォルトの名無しさん
19/07/15 21:47:13.82 Xch0qlQL0.net
俺以外は絶対守れよって思うルールも多々ある
486:デフォルトの名無しさん
19/07/15 21:57:44.30 ex33LrHm0.net
>>482
何を言ってるのか自分でもわかってないだろww
ブランドとかバカじゃね
487:デフォルトの名無しさん
19/07/15 21:58:24.78 QcIx6aGf0.net
関数の中盤以降からreturnするならともかく、早期returnまでも認めないのはナンセンスだよな。
杓子定規すぎるわ。
488:デフォルトの名無しさん
19/07/15 22:00:39.84 ex33LrHm0.net
>>484
組込みだと実行時間が読めなくなるのとフラグメンテーションで総容量足りててもエラーになることがあるからしょうがない
489:デフォルトの名無しさん
19/07/15 22:06:28.61 IpJNQ16e0.net
>>486
おまえがすがっているのはブランド以外の何物でもない
とぼけたら誤魔化せると思っているならおめでたいやつだ
490:デフォルトの名無しさん
19/07/15 22:43:50.22 ex33LrHm0.net
MISRAをブランドとか言うアホがいるんだ…
まあ具体的な内容には突っ込めないグダグダ君だしなぁww
491:デフォルトの名無しさん
19/07/15 22:45:14.79 ex33LrHm0.net
そもそもうちはMISRAは参考にしてるけど全面適用なんてしてないし
492:デフォルトの名無しさん
19/07/16 00:24:39.33 UHx9kM+ca.net
>>491
いや、しろよ
493:デフォルトの名無しさん
19/07/16 00:48:27.21 /MIJx2vXM.net
プログラムは書く人によって千差万別
書く物によっては複雑な物を書かなきゃならない
そしてその上でのバグ千差万別
ルールブックなんてプログラム書かない管理者がこれを守れば大丈夫(キリッ
ってするものだろう
494:デフォルトの名無しさん
19/07/16 01:07:51.42 EySzsoWc0.net
普通は大勢で開発するときに必要な取り決めだけどな
そういう規模で仕事しないなら,何しても良いけど
495:デフォルトの名無しさん
19/07/16 01:37:13.82 UHx9kM+ca.net
>>494
MISRAは明らかに小規模なプログラムのための規約だと思うよ
496:デフォルトの名無しさん
19/07/16 02:37:59.80 EySzsoWc0.net
大規模なプロジェクトのコーディング規約を決める人がここにいるとは思わないからね
小規模だと思うなら,そのルールでやれば良いんじゃない?
497:デフォルトの名無しさん
19/07/16 03:09:26.20 FvAVzBqbM.net
大規模とか小規模とかじゃなく実際にプログラムを書いてると必要になったりとかあるって話で
プログラムを書いた事内物が大規模ではとかいってるのか
498:デフォルトの名無しさん
19/07/16 03:18:03.55 UHx9kM+ca.net
そうそう、MISRAはクソ
499:デフォルトの名無しさん
19/07/16 03:29:07.35 UHx9kM+ca.net
MISRAを尊重するひとって、returnを書く位置によって返る先が変わると思ってるんだよ
500:デフォルトの名無しさん
19/07/16 07:29:02.49 UAKGOqEv0.net
間違ったことばかり書いてあるわけじゃないけどね
現場にそぐわないスキル不足なやつを庇うところには同意しかねるわけよ
> ルール 8.14 必要 restrict型修飾子を使用してはならない
規格票が読めないようなアホの相手はやってらんね
C++が混ざるところでも対策は簡単だし
501:デフォルトの名無しさん
19/07/16 07:43:27.01 1j77iOOZ0.net
トヨタのやってることは一つのミスでも人が死ぬということだよ
もしrestrictを使って人が死んだら責任とれるの?
502:デフォルトの名無しさん
19/07/16 07:45:28.75 /V8NdDl/M.net
それなら、人が死なないプロジェクトではMISRAは守る必要がないですね。
503:デフォルトの名無しさん
19/07/16 07:58:46.16 UAKGOqEv0.net
>>501
規格票を確認しないやつにミスがどうたら言われたかねえぜ
504:デフォルトの名無しさん
19/07/16 08:02:25.27 UAKGOqEv0.net
○○を使って人が死んだら責任とれるの?
○○に何でも突っ込めるウルトラクソ論法
ポインタ、共用体、仮定義、数学関数、それから?
505:デフォルトの名無しさん
19/07/16 08:50:54.07 7HVrvnq4a.net
>>501
お前が作ってるプログラムはテストしないのか?
506:デフォルトの名無しさん
19/07/16 09:07:55.77 csbTSCSc0.net
>>492
絶対守るべき指標と守った方がいい指標、といった具合に何段階かにわかれていて
別途ルールがあるならば守らなくても良い(無理して守るべきでない)指標もあるよ
507:デフォルトの名無しさん
19/07/16 09:35:00.37 UXD1By8p0.net
上司のバカかバカの上司でも理解できるまでに破壊されたC言語だろ
それを規格と言ってるだけだ
安全かもしれないけど対照実験がないでしょ
安全であることをどうやって確かめたのか論文の欠片も見つからなかった
だからMISRAの安全神話は神話かデマかフェイクニュースだよ
508:デフォルトの名無しさん
19/07/16 09:46:10.29 MyJUZjZxa.net
プライドだけは高いこの道30年の社畜が書いた様なルールだよ。
「してはいけない」ばかりでこうしろという記述が圧倒的に少ない。
フレームワークという発想がない。指摘だけ。すべて勘と経験という名の錯覚に基づいてる。
あと内容的に「最適化はしてはいけない」とか書いておけばいいんじゃないかと思う。次は入れて欲しい。
509:デフォルトの名無しさん
19/07/16 10:35:01.62 Yi/rfLM50.net
>>463
処理系依存や未定義だけどなんか上手く動いてる
というのは、ちょっと怖い
510:デフォルトの名無しさん
19/07/16 12:58:57.36 EySzsoWc0.net
たまたま動いているのは
処理系のバグかも知れない
511:デフォルトの名無しさん
19/07/16 13:18:30.94 uQ5be57j0.net
組込み系の開発経験者いなくて草
MISRA準拠が納品物の条件にあるんだよ
でもプロジェクト毎にカスママイズするから
100%適用するわけじゃないよ
わけわからんルールは適用除外してる
512:デフォルトの名無しさん
19/07/16 14:13:08.82 i1fbuZ/pM.net
>>511
> 組込み系の開発経験者いなくて草
ID:y88H95dP0 あたりは経験者だろ
513:デフォルトの名無しさん
19/07/16 15:01:33.68 csbTSCSc0.net
>>511
8進数使うな、とかいやだよね
514:デフォルトの名無しさん
19/07/16 15:05:03.91 Yi/rfLM50.net
エディタ上での見栄えで桁合わせに 空白を使わず 0 で補ってやらかす
515:デフォルトの名無しさん
19/07/16 15:14:31.06 EySzsoWc0.net
>>513
2進数や16進数は見慣れているんだが
8進数ってどういう時に使いたい?
516:デフォルトの名無しさん
19/07/16 15:27:11.60 UHx9kM+ca.net
バイトが6bitの時は便利だったとかいう話だけど、今要らんよね
emacs使っててエンコードがアレだと出てくるね
517:デフォルトの名無しさん
19/07/16 15:32:14.71 Yi/rfLM50.net
文字列で [ESC] を埋めるのに \033 を使ってるのを見るぐらい
(2進数のリテラルをマクロでなんとかするとき 一時的に8進化するけど 中の話)
518:デフォルトの名無しさん
19/07/16 15:40:10.80 uQ5be57j0.net
大昔のアーキテクチャは18bit,24bit とかで3bit 区切りが扱いやすかった
今は16,32,64と16進数が扱いやすいって話だね
ゼロ始まりは8進数というのはB言語からきたらしいよ
519:デフォルトの名無しさん
19/07/16 15:44:50.30 i1fbuZ/pM.net
>>513
いや、もうコンパイルオプションで禁止してもいいレベル
>>515-516
Unix/Linuxのファイルパーミッションが3ビット単位だからと言うのはあるけど今時直書きなんてしないし
>>517
それも "¥x1b" の方が馴染みがあると思う
520:デフォルトの名無しさん
19/07/16 16:30:56.95 SpxSpG+wx.net
\0 … 8進数
\x0 … 16進数
521:デフォルトの名無しさん
19/07/16 16:37:07.34 cpfSTA9t0.net
>>487
if の nest が深くなってしまう?
522:デフォルトの名無しさん
19/07/16 16:54:01.54 Yi/rfLM50.net
>>521
教条主義的に守るなら そうせざるを得ないだろうね
if (エラー) return ; // 即脱出
後続コード
return ; // 最終
即脱出を禁ずるなら
後続コードは即脱出条件とは排他的なので if (or else) 内に収めるしかない
if (!エラー) {
後続コード
}
return ; // 最終
523:デフォルトの名無しさん
19/07/16 16:58:26.41 EySzsoWc0.net
goto ___exit; /* 震え声 */
524:デフォルトの名無しさん
19/07/16 16:59:45.97 Yi/rfLM50.net
多分 goto も塞がれてる気配w
525:デフォルトの名無しさん
19/07/16 17:24:48.72 uQ5be57j0.net
うちはreturnは最後に一つのみってやつは適用除外になってる
理由はネストが深くなって読みづらくなるから
gotoもネストしたループから一気に抜ける場合のみ使ってもよいことになってる
フラグ使ってbreakで抜けるより読みやすいからね
526:デフォルトの名無しさん
19/07/16 17:27:15.45 glyNXuyHa.net
もちろんgotoも禁止さ。
あと、各関数の頭で引数チェックも必須なのでreturn禁止とのコンボでほぼ必ず正常系処理のネストが一段以上深くなる。
引数チェック必須はISO26262だったかもしれん。
527:デフォルトの名無しさん
19/07/16 17:27:59.62 UHx9kM+ca.net
途中のreturn禁止を徹底するなら、ifとかelseの後に2行以上書くの禁止にした方がいいね。
代入だけ許容するくらいでいい。
528:デフォルトの名無しさん
19/07/16 17:28:40.15 T78CNDqDd.net
>>513
0は0x0とか書かなきゃいけないんかね
529:デフォルトの名無しさん
19/07/16 18:10:37.85 QICQY/wp0.net
>515
そりゃもう512色カラー設定に(ry
530:デフォルトの名無しさん
19/07/16 18:31:58.85 2nARKc5Ld.net
ここまできたらC言語も禁止だな。
pythonでコーディングしてコンパイルしてやればいい。
531:デフォルトの名無しさん
19/07/16 18:35:56.79 /Cc9wbE10.net
結構前から言われてない?
「C言語を使う必要が無いなら使うな」と
532:デフォルトの名無しさん
19/07/16 18:47:43.53 K50k857la.net
pythonを使って人が死んだら責任とれるの?
533:デフォルトの名無しさん
19/07/16 18:54:47.98 2nARKc5Ld.net
>>532
大丈夫さ。プログラム全体をtryで囲んで引っ掛かったらprint("手動運転に切り替てください")のコンボがある。
534:デフォルトの名無しさん
19/07/16 18:58:26.32 uQ5be57j0.net
pythonでOSやデバドラ書けるようになったら考えるわ
535:デフォルトの名無しさん
19/07/16 20:05:19.62 WsWptbblx.net
#define xxx 06
#define yyy 07
//#define zzz 08 // なぜかエラーになる
536:デフォルトの名無しさん
19/07/16 20:31:07.37 K50k857la.net
なぜかはひみつ
537:デフォルトの名無しさん
19/07/16 20:54:46.50 GCGNUpCjM.net
>>535
なんてありがちな…
538:デフォルトの名無しさん
19/07/16 21:03:30.93 GCGNUpCjM.net
ここらへん嫁
URLリンク(programming-study.com)
539:デフォルトの名無しさん
19/07/16 21:05:08.13 K50k857la.net
祈りが足りないからだな
540:デフォルトの名無しさん
19/07/16 21:08:14.38 uQ5be57j0.net
ちょっと前に8進数が~ってやってるのに
あ、ネタかw
541:デフォルトの名無しさん
19/07/16 21:22:48.20 /Cc9wbE10.net
このスレの人って少し前のレス読まないよね
542:デフォルトの名無しさん
19/07/16 21:31:28.73 7JXDuVC90.net
const char *sの順番が納得いかない
直感的にはchar * const sだろうが!!
543:デフォルトの名無しさん
19/07/16 21:32:10.10 W8tOKWg20.net
char const*だろ?
544:デフォルトの名無しさん
19/07/16 22:16:46.03 Qe+dZ6A/0.net
* const char s
じゃね?
545:デフォルトの名無しさん
19/07/16 22:17:34.37 Qe+dZ6A/0.net
おれは何を言ってるんだ??
546:デフォルトの名無しさん
19/07/16 22:20:37.80 dxLim7GAx.net
>>542
>const char *sの順番が納得いかない
>直感的にはchar * const sだろうが!!
前者はポイントされる文字列が const で、後者はポインタ自体が const でしょ
547:デフォルトの名無しさん
19/07/16 22:42:49.53 uQ5be57j0.net
const char* const s
これも直感的じゃないって言うんだろうか
548:デフォルトの名無しさん
19/07/16 22:43:19.23 dxLim7GAx.net
546です
すみません、それを踏まえてということか…
549:デフォルトの名無しさん
19/07/16 22:50:32.56 g+WSNcLQ0.net
const は後置で書いたほうが整合性が取れる
char const * const s:
しかし、見た目的にかわいいのは前置である
const char * s;
私はかわいいのが好きである
よって前置は使わない
550:デフォルトの名無しさん
19/07/16 22:58:11.13 g+WSNcLQ0.net
そこで私が提案したいのが「strong」である
strongは修飾したデータをすべてconstにする
つまり
char const * const s;
と
strong char * s;
は等価である
551:デフォルトの名無しさん
19/07/16 23:13:59.86 ICazHXPW0.net
>>550
安易な予約語の追加は嫌われるよ
552:デフォルトの名無しさん
19/07/16 23:18:11.31 EySzsoWc0.net
「strongがやられたようだな…」
「フフフ…奴は四天王の中でも最弱…」
553:デフォルトの名無しさん
19/07/16 23:19:03.80 /Cc9wbE10.net
<strong>char* s</strong>
554:デフォルトの名無しさん
19/07/16 23:22:51.61 uQ5be57j0.net
stringと間違えそうで嫌だなw
readonlyはc#で使ってるしな
やっぱconstだな
555:デフォルトの名無しさん
19/07/16 23:40:17.89 awioItM70.net
大文字で CONST にするとか。
556:デフォルトの名無しさん
19/07/17 04:24:07.40 CqcyHUxLd.net
フン
char *const_s
557:デフォルトの名無しさん
19/07/17 06:33:32.66 Pp4wfZXK0.net
>>546
const int a → constなint型のa
const char *s → constなchar *型のs
constなのはchar *つまりポインタ(直感)
char * const s → char *型のconstなs
constなのはsつまり文字列自体(直感)
なんで逆!!
558:デフォルトの名無しさん
19/07/17 06:46:44.61 NB17uhF90.net
> const char *s → constなchar *型のs
ギャグだよな?
559:デフォルトの名無しさん
19/07/17 06:57:50.40 i06pHchL0.net
宣言は右から左に読む
const等の修飾は左にかかる
char const * const s; // sは、const *である、const char型の
右にかかるなら↓のように書けないとおかしいがこれは構文エラーである
const char const *s;
変数名はただの識別子で、ある領域にsという名前を付けただけにすぎない
constやvolatileは型修飾子であり、これらが付くのは型に対してである
~という領域を、以後sと呼ぶ、である
560:デフォルトの名無しさん
19/07/17 07:14:03.66 NB17uhF90.net
ちげーよ
宣言は真ん中から左右に読むんだよ
char const *(* const s)[1];
561:443
19/07/17 09:21:48.88 u050lnGw0.net
>>526
引数チェックに関しては、Java のコーディングルールでは、
外部の人用のAPI、つまりpublic な関数には、必要
一方、そのモジュール・クラスの実装者が使う、
内部的なAPI、つまりprivate な関数には、いらない
既にどこかで、エラーチェックしてるから、何回も同じエラーチェックするのは、無駄
562:デフォルトの名無しさん
19/07/17 21:08:01.97 E0YvS3zE0.net
const char *sは*sがconst
つまりポインタsの指すアドレスにある値が不変だけどsがどこを指すのかは可変
char *const sはsがconst
つまりポインタsがどこを指すかは不変だけどsの指すアドレスにある値は可変
大体こんな認識で合ってる?
563:デフォルトの名無しさん
19/07/17 23:04:57.90 Pp4wfZXK0.net
あってるけど納得いかないって話
1つ目がまず何で*sにかかるんだよ
自然に読んだらconstはchar *にかかるだろ
右から読むとか頭おかしいわ、アラビア語かよ
564:
19/07/17 23:22:42.51 UrUB0t8/0.net
>>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) と一緒の意味になっている
565:デフォルトの名無しさん
19/07/17 23:34:56.30 RL7WDafS0.net
C言語使う時はいつ?
早いコードが欲しい時
メモリー消費に無駄のないコードが欲しい時
他ある?
566:
19/07/17 23:39:48.74 UrUB0t8/0.net
>>565
他の言語はほとんどわからず(かじってはみたものの使えるまでにはMPがあがらず)、C/C++ でしかまともに書けないし発想できないからです…
567:デフォルトの名無しさん
19/07/17 23:42:49.57 FDkzfNlT0.net
>>563
実はアラビア語って可能性はないのか?
568:デフォルトの名無しさん
19/07/17 23:49:47.36 Pp4wfZXK0.net
そもそもconst char *sの宣言の時の切れ目がconst / char / *s なのも何だかなぁ
const / char * / s でconstはchar *にかかれよjk
現実に間違ってるのは渋々受け入れてるけど開発者が許せない
569:デフォルトの名無しさん
19/07/18 00:00:28.28 OLFUgkogx.net
>>564
自分は b or(and) d かなー
570:デフォルトの名無しさん
19/07/18 00:33:34.97 Nr80YdQr0.net
>>565
他に思い付くところとしては、
組み込み環境などで、C言語以外の選択肢がない、または他の言語で実行できる環境を整えるよりCを使った方が楽な場合。
外部のライブラリのインタフェースがC言語で、呼び出す部分をCで作る方が楽な場合。
バイナリファイルの操作などポインタ操作を使って実装しやすい場合。
571:デフォルトの名無しさん
19/07/18 00:48:28.58 Nr80YdQr0.net
>>568
単純なポインタのことしか考えないから、左から右にこだわってんだろ。
>>560も指摘している通り、変数宣言の構文は内から外だぞ。配列や関数ポインタも交えて、それらを多段階の組み合わせにしても一意に解釈できるのを理解すれば、合理的な物だとわかると思うよ。
>>563
1つ目は、constがかかってるのはcharだぞ。内側から解釈するとsは*が付いているからポインタであり、それが指す型がconstなcharだ。
572:デフォルトの名無しさん
19/07/18 05:33:10.45 yO5P6Jqp0.net
char *s
の意味は*sはchar型だよって意味で
sはchar *型だよって意味じゃないよ
573:デフォルトの名無しさん
19/07/18 05:43:05.99 xY9KzRxOd.net
>>572
こう理解できてるとわかりやすいね。つまり
const char *s
は
*s(sの指す先)はchar型でさらにconstだよ
となる。
574:デフォルトの名無しさん
19/07/18 06:48:06.17 2qyz/4gG0.net
>>572
その宣言から以後、
sという式がchar*型
*sという式がchar型
2つの意味を同時に表現してるんだよ
575:デフォルトの名無しさん
19/07/18 07:54:18.60 kb0ZHGx0M.net
*と*const があると憶えるべき。
576:デフォルトの名無しさん
19/07/18 09:56:03.22 q9HPUerJa.net
>>563
ポインタを表す * が型にくっついてるんじゃなくて変数にくっついてるからでは?
分かりにくいなら typedef でポインタの型を作ってそれを使えばいいんじゃないな。
右から読む事に関しては英語を日本語に翻訳する時に順序を入れ換えた方が自然な感じになる事があるのでなんとも言えんな。漢文のレ点みたいなものもあるしな。
日本語とは逆順の方が自然な表現になる言語はある。そして歴史的な事情で混在してしまっているのもある(アメリカでの年月日が月日年の順だとか)。
生まれながらにしてその言語使ってればその人にとってはそれが一番自然な表現だからな。
577:デフォルトの名無しさん
19/07/18 10:04:50.81 xY9KzRxOd.net
>>574
結果はいっしょでも解釈の仕方は複数ある感じだね。
自分にとって理解しやすいので
char *s
↓
sの指す先はchar型、つまりsはポインタ
って言う風に捉えてる。
578:デフォルトの名無しさん
19/07/18 21:25:27.83 PbeogWAD0.net
この話は何時も混乱するんだけど
結局の所は
自分の言葉で理解するまでやる
これをやらないと混乱してしまう
なぜそうなってしまったのか?
という視点で解釈しようとしないと
なかなかにc言語って難しい
その辺は例のc言語ポインタにのみついて書かれた本
あれを読んで
後は何とか自分の言葉で理解して解釈するしか方法が無い
それとこんなになってしまっている原因に
キーボード上の記号が少ない
というのもある
basic何かでは記号類は四則演算類だけ使って
なるだけ英単語?を使って記述するようになっている
だから使う場所によって記号の意味が違う
なんていうのが起こりにくくなってる
ある意味c言語が普及してしまったのはプログラミング世界にとっては不幸なのかもしれない
579:デフォルトの名無しさん
19/07/18 21:30:10.98 1zgaXsge0.net
C言語って初心者向けに作られたものではないと思う
580:
19/07/18 21:32:28.55 /oDno/7H0.net
>>578
私も最初に C をやったときには、ここまで流行るとは思わなかったんです、むしろ pascal の方が筋がいいと思っていたのですが、どうしてこうなってしまったのでしょうか?
581:
19/07/18 21:34:00.28 /oDno/7H0.net
>>579
当時は初心者用とかは特に無くて、BASIC でもある程度できる人はすぐに peek, poke を連発するようになったものです、最近の人は甘えていると思います
582:デフォルトの名無しさん
19/07/18 21:41:19.07 AzHVv8Pq0.net
>>580
UNIXがCで云々というのもあるけど、良い意味で高級アセンブラとして使い勝手が良かったからじゃないかな?
583:デフォルトの名無しさん
19/07/18 22:00:46.19 8m1lI2X40.net
厳格で融通がきかないと嫌われる
pascalはそんな感じ
584:
19/07/18 22:15:37.33 /oDno/7H0.net
>>583
delphi は結構流行ったと思ったんですけれど…
585:デフォルトの名無しさん
19/07/18 22:18:08.64 0kCblb2b0.net
pascal失速最大の原因は:=だろう
これを採用している言語はもう一つも無い
プログラミング業界最大かつ唯一にして不可侵の大例外を抱えてるのがpascalだ
586:デフォルトの名無しさん
19/07/18 22:30:23.30 1zgaXsge0.net
pascalで開発したアプリっていうと
JaneStyleが有名かな?
587:デフォルトの名無しさん
19/07/18 22:32:00.45 1zgaXsge0.net
厳格で融通がきかないのは、教育用として最適だと思う
588:デフォルトの名無しさん
19/07/18 22:35:15.64 ugDCzjFC0.net
pascalでUNIX張りのOS書いていれば流行ったかもね
589:デフォルトの名無しさん
19/07/19 00:19:03.24 7Hdy7m6i0.net
>>585
Modula-2は:=だったような気がする。
590:デフォルトの名無しさん
19/07/19 00:22:05.35 7Hdy7m6i0.net
>>588
Delphiみたいに拡張されてれば可能だとは思うがコードが大きくなりそうなので昔のPCでは苦しいかもね。
ただし、Androidみたいに元のOSの上に乗っけて動くOSなら行けるかも。
591:デフォルトの名無しさん
19/07/19 00:25:42.16 Mih8lrFJ0.net
もう一つが奥の深さでC言語ではポインタが奥の深い箇所にあたる
この難易度が絶妙で難しい難しいと言われていて初学者には適度に難しいので挫折者が増える、
挫折者の総量が言語の価値を決定する
教育用に作られた言語は難しい箇所とか理屈に合わない箇所とか奥の深い箇所とかが無いのでオカルトとしての魅力が無い
学習曲線がいびつじゃないと流行しない
592:デフォルトの名無しさん
19/07/19 00:30:44.87 QK1dwfXD0.net
ポインタはただの入り口だろ
Cは入り口で躓く奴が多いだけで奥は寧ろ浅い
593:デフォルトの名無しさん
19/07/19 00:36:04.81 nbu0jJrl0.net
ポインタ使わないでもC言語ってプログラム書けるんだよな
無理して難しいことをしなくても良いと思う
ちゃんと動くかどうかの方が重要
594:デフォルトの名無しさん
19/07/19 00:38:14.85 QK1dwfXD0.net
ポインタを使わないならCを使わない方がいい
595:デフォルトの名無しさん
19/07/19 01:10:46.83 0vO2r76S0.net
超無理矢理ならポインタ使わずになんでもできるんかな?
いずれにせよポインタ理解してないとライブラリ使えなくて詰むでしょ。たぶん突然落ちたりメモリリークだらけのプログラムができあがるはず。
596:デフォルトの名無しさん
19/07/19 01:25:31.41 nbu0jJrl0.net
グローバル領域に予め必要な変数や配列確保しておけば
メモリーリークが発生する余地はないw
597:デフォルトの名無しさん
19/07/19 01:28:45.01 QK1dwfXD0.net
ネタで言ってるのか本気で言ってるのか判断が付かない
598:デフォルトの名無しさん
19/07/19 01:46:29.51 ZOnA3nWq0.net
ポインタ難しいって言われてるけどそんなに難しいか?
メモリイメージできれば理解できると思うけどな
599:デフォルトの名無しさん
19/07/19 02:19:29.42 1jezjf9K0.net
俺はポインタは難しいことがわかってたから、一度にすべて理解しようとしなかった
数年使って徐々に理解した
それが正解だった
600:デフォルトの名無しさん
19/07/19 02:49:16.94 ApXEphk20.net
初期化してないポインタにアクセスするとどうなっちゃうの
とか危険そうなのは試してないからわからないが
ハードウェアのイメージがあれば難しさはあまりない
(命名規則で Xxx_p と書いておけば
601:デフォルトの名無しさん
19/07/19 06:09:16.79 8762T9lH0.net
> (命名規則で Xxx_p と書いておけば
システムハンガリアンは大大大大大嫌い
602:デフォルトの名無しさん
19/07/19 07:17:09.85 gH0zRzIgM.net
>>585
ada, APLも知らない情弱知ったかは黙っとけ
>>589
まあ作者は同じだから後継って感じだし
603:デフォルトの名無しさん
19/07/19 09:10:50.31 EJb/7aTM0.net
>>599
そういう人もいるのか
おれはアセンブラもやってたので秒で理解した
604:デフォルトの名無しさん
19/07/19 09:29:24.25 uab/wKdga.net
>>580
マイコン用の小さいコードも作れるから。
昔のマイコンやPCはメモリが物凄く少ないのでその辺は重要。
少なくとも毎回でかいランタイムライブラリがくっついてしまうようではダメだ。
それと元々 UNIX の記述用に使ってた言語なので Linux 等の互換OSでも使われていて、そういうのが徐々に広まっていったので、それを通してCが流行った面もあると思う。
605:デフォルトの名無しさん
19/07/19 09:39:17.61 uab/wKdga.net
>>603
アセンブラできるとポインタについては理解が楽だよね。
アセンブラの方では普通に使う考え方だし。(というかないとプログラム作れないぐらい重要)。
606:デフォルトの名無しさん
19/07/19 11:29:42.41 1jezjf9K0.net
>>603
はじめてのプログラミング言語がCだったからな
けっこう苦労したよ、先輩
607:デフォルトの名無しさん
19/07/19 11:43:44.67 nbu0jJrl0.net
プログラムはZ80からなので、当たり前のようにアセンブラから学習した
CPUの仕組みを学ぶのにちょうど良かった気がする
608:デフォルトの名無しさん
19/07/19 12:47:23.54 8762T9lH0.net
Z80だとパイプラインとかあんまり憶えないよな
でRISCブームのとき苦労させられたと
609:デフォルトの名無しさん
19/07/19 13:03:51.18 hLCIQJ7mx.net
まぁZ80全盛期にパイプラインしてたCPUなんて限られてたしな。
そういう汎用コンピータはほぼ高級言語使われてたし。
610:デフォルトの名無しさん
19/07/19 13:07:02.40 8762T9lH0.net
6502とか
611:デフォルトの名無しさん
19/07/19 13:28:17.26 EJb/7aTM0.net
>>606
C++とかじゃ未だにオーバーライドとオーバーロードを間違えるので
レベル的にはおまえとドッコイだよ、後輩
612:デフォルトの名無しさん
19/07/19 14:13:06.92 ZOnA3nWq0.net
ムカデ長老を見習え
613:デフォルトの名無しさん
19/07/20 21:04:06.20 lWqONft90.net
泣いてる顔文字→( ; ; )がforの無限ループにしか見えないのですが、職業病でしょうか?
614:デフォルトの名無しさん
19/07/20 21:31:18.65 TRa6Slo50.net
8086のアセンブラはセグメントで挫折する・・・と言われてたけど
Z80やってたらすんなり理解できたな。
615:デフォルトの名無しさん
19/07/21 01:27:26.84 3tY7pLz50.net
>>613
煽りとかで()とか書かれてると関数に見えるときある
例: 職業病()とか言われましても
616:デフォルトの名無しさん
19/07/21 04:14:55.91 Nmc6oncn0.net
>>615
草、見えたことないわw
617:デフォルトの名無しさん
19/07/21 06:51:52.49 F3an1Rtm0.net
>>613
はい。
>>614
セグメントすごくわかりやすいと思うけどな。まともに説明出来る人と巡り会えなかったのだろうか。
618:デフォルトの名無しさん
19/07/21 08:20:20.57 /atv33Bt0.net
>>608
わかりやすいけど面倒だよね
619:デフォルトの名無しさん
19/07/21 15:59:50.66 FmQzr+LX0.net
>>613
forで無限ループつかうの?
おれはwhileかなw
620:デフォルトの名無しさん
19/07/21 16:10:09.79 g8U8cyIO0.net
forの方が短くてすむじゃないか
621:デフォルトの名無しさん
19/07/21 16:20:48.28 PhbbaTTy0.net
>>614
Z80にセグメントの概念なんてあったけっけ?
メモリバンク切り替えは機種によってはあったけど、あれはZ80の機能ではないし。
622:デフォルトの名無しさん
19/07/21 16:27:59.21 m/GaQUZU0.net
空白のcontinue節みたいなのに入る必要がないから
ちょっとwhileのほうが早いイメージ
623:デフォルトの名無しさん
19/07/21 16:43:59.35 g8U8cyIO0.net
>>622
インタープリターじゃないんだからさ
624:デフォルトの名無しさん
19/07/21 16:52:32.65 /atv33Bt0.net
>>619-620
俺はfor(;;)だな
while(TRUE)は警告表示されることが多かったから
625:デフォルトの名無しさん
19/07/21 18:08:15.14 Q0wcPMRB0.net
for (;;) とwhile (1) がどっちがぱっと見分かりやすいか戦争勃発しますか?
あとfor派は;;周りにスペースを入れるか入れないかでさらに細かく派閥が分かれていると聞きました!
626:デフォルトの名無しさん
19/07/21 18:19:58.86 FmQzr+LX0.net
>>625
まさに永久ループ戦争!
627:デフォルトの名無しさん
19/07/21 18:30:02.78 +S54SSox0.net
字下げのいらないgotoも参戦
628:デフォルトの名無しさん
19/07/21 18:32:50.79 Q0wcPMRB0.net
あ、do {} while(1);派も出てくるとおもうので皆さん頑張ってください応援してます
629:デフォルトの名無しさん
19/07/21 18:38:59.23 g8U8cyIO0.net
do while(0)は便利
630:
19/07/21 18:39:57.32 vddupZNY0.net
>>629
それは #define で使うときだけでしょう?
631:デフォルトの名無しさん
19/07/21 18:44:37.26 g8U8cyIO0.net
いや、エラー判定とかでもよく使うだろ?
632:デフォルトの名無しさん
19/07/21 18:48:06.96 I0JRxlnTx.net
for (;;) は forever と読むとか
633:デフォルトの名無しさん
19/07/21 18:50:32.60 /atv33Bt0.net
バッドノウハウに近いが
do {
if(...) break;
…
if(…) break;
…
} while(0);
みたいなのは昔書いてたわ
634:デフォルトの名無しさん
19/07/21 18:52:10.72 Q0wcPMRB0.net
do {} while (0); の意味と目的【do while false イディオムの利点】 | MaryCore
URLリンク(marycore.jp)
635:デフォルトの名無しさん
19/07/21 18:58:23.23 FmQzr+LX0.net
flag=true;
while(flag)
{
flag=(....);
}
636:デフォルトの名無しさん
19/07/21 19:09:32.73 /atv33Bt0.net
>>634
do {
if (that(value)) break;
if (value == -1) break;
if (value == 0) break;
puts("有効な値です");
} while (0);
みたいなのは
do {
if (
that(value)
|| value == -1
|| value == 0
) break;
puts("有効な値です");
} while (0);
って書けばいいだけ
do {
if (that(value)) break;
value = f(…);
if (value == -1) break;
value = g(…);
if (value == 0) break;
puts("有効な値です");
} while (0);
みたいに間に処理をはさまる場合が難しい
637:デフォルトの名無しさん
19/07/21 19:18:11.94 Q0wcPMRB0.net
このスレって直接ここに複数行のソース書き始める人多いよね
638:デフォルトの名無しさん
19/07/21 19:37:52.68 m/GaQUZU0.net
>>633
小さなスコープを作るため?
639:デフォルトの名無しさん
19/07/21 19:39:13.75 g8U8cyIO0.net
breakが使えるスコープね
640:デフォルトの名無しさん
19/07/21 20:14:20.69 /SITzbMm0.net
#define fe for( ; ; )
が最強
641:デフォルトの名無しさん
19/07/21 20:35:26.43 +S54SSox0.net
>633
おかしな事してるのが一目で、continue が外に漏れるこれ オススメ
switch(0)default:{
642:デフォルトの名無しさん
19/07/21 20:45:42.22 R+Rb+3j1d.net
gotoが便利すぎて禁止されがちなのが悪い。ちゃんと使えばコードが見やすくなることこの上なしなのに。
643:デフォルトの名無しさん
19/07/21 21:09:22.26 /atv33Bt0.net
>>642
そう言うこと
なので最近は素直にgotoで書くことが多い
一部の言語の様にブロックに名前付けて
break 名前;
でそのブロックを抜けられるようにしてくれれば良いのにと常々思う
644:デフォルトの名無しさん
19/07/21 21:21:29.94 m/GaQUZU0.net
ないものねだりではありますが
perlのようにブロックやループの頭にラベルをつけて、
redo next last があったらもっと良い
do {...} while(0); も {} と簡潔
645:デフォルトの名無しさん
19/07/21 21:42:59.10 ZJZWYLqf0.net
>>642
便利すぎってどういうことだよ
教条主義的goto禁止論の域を出とらんだろうが
646:デフォルトの名無しさん
19/07/21 21:46:07.68 AbjqA2h30.net
>>621
インデックスのことかも
647:デフォルトの名無しさん
19/07/21 22:36:03.44 c+HlyquL0.net
>グローバル領域に予め必要な変数や配列確保しておけば
>ネタで言ってるのか本気で言ってるのか判断が付かない
実際に仕様なんかがしっかりしているタイプで
メモリー確保が動的に大きく変化しないものなら
実際にそういう風に作っているのを聞いた事は有る
配列式だと動的に確保したり開放したりが無く
リークしたり無効になったりしない分かなり安全
実行開始時に使用する領域が完全に確保されているから
648:デフォルトの名無しさん
19/07/21 23:24:53.03 R+Rb+3j1d.net
>>645
すまん、そんなに深い意味はない。
649:デフォルトの名無しさん
19/07/22 00:04:19.79 PN8KKKdJa.net
静的な所にプール作るのはメモリ制限ある組込では割とあったと思いますよ
650:デフォルトの名無しさん
19/07/22 15:35:08.24 vmYUDJ0Ja.net
>>643
最近の言語ではそういうのあるね。
とはいってもJavaには既にあったのでかなり前からあるな。
Java以前はあるかどうか俺は知らん。
651:デフォルトの名無しさん
19/07/22 15:37:04.86 vmYUDJ0Ja.net
あ、Perlもループにラベル付けてlastで抜けるなんてのあるな。
652:デフォルトの名無しさん
19/07/22 16:18:33.80 QnLUYAOH0.net
break ラベル で、多重ループから一気に抜けられると便利なんだがな
653:デフォルトの名無しさん
19/07/22 16:35:14.27 rxI3cfFL0.net
gotoが便利すぎというより
単純な break returnで間にあわないときには
それしか制御がないのでは
654:デフォルトの名無しさん
19/07/22 17:24:33.59 7pc0Xm6O0.net
二重ループから抜けるにはgotoが一番
gotoを廃止した言語制作者は天罰を受けるべき
655:デフォルトの名無しさん
19/07/22 17:30:50.79 rxI3cfFL0.net
goto はそれで使われている保障がないから、
保守性のためにも
ループなどに名前付けて、それを抜けると明記したい
656:デフォルトの名無しさん
19/07/22 17:54:19.31 e8FkVPqsa.net
まず多重ループを避けろと
657:デフォルトの名無しさん
19/07/22 18:05:34.66 LktYqlpm0.net
gccで X Window System (x11) でウインドウつくって画像合成するのって
どうすればできますか? なにかサンプルプログラムなど無いでしょうか?
658:デフォルトの名無しさん
19/07/22 18:22:30.58 QnLUYAOH0.net
>>656
二次元配列を総なめする場合に
ループを 1変数でやるのかな?
659:蟻人間
19/07/22 18:36:31.65 zh10SCAHd.net
>>657
古本を漁ればやり方が書いてあるかも。
XScreenSaverのソースみれば参考になるかも。
660:蟻人間
19/07/22 18:39:10.09 zh10SCAHd.net
いにしえのシステムなら、関数名をmanコマンドで引けば、X Windowの関数のマニュアルが見られるはず。
661:デフォルトの名無しさん
19/07/22 18:42:21.76 LktYqlpm0.net
>>659
linuxOSだとSDL(Simple DirectMedia Layer)で書いたほうが情報が多く
描画書き換え速度もはやい気がします
SDLに移行したほうがやはり無難でしょうか?
662:デフォルトの名無しさん
19/07/22 18:50:51.45 QnLUYAOH0.net
質問者自身で決定すれば良いと思うが
663:蟻人間
19/07/22 18:54:21.58 zh10SCAHd.net
>>661
X11は将来、Waylandにバトンを渡すらしい。新しい端末ではX11が採用されない状況が考えられる。クロスプラットフォームの方が安心かな?
664:蟻人間
19/07/22 18:56:55.15 zh10SCAHd.net
暗号化されてないX11をネットワークで見たら丸裸だからあんまり使いたくないよね。
665:デフォルトの名無しさん
19/07/22 19:02:32.68 LktYqlpm0.net
ネットワーク環境はsshしか使ったこと無いのですが
SDL_net などは関数に暗号化などがふくまれているのですか?
666:蟻人間
19/07/22 19:08:12.59 zh10SCAHd.net
>>665
ソーシャルゲームを作るなら、暗号化は必須。暗号化方式を決めて、それに合った暗号化専用のライブラリーを使う形になる。
667:デフォルトの名無しさん
19/07/22 19:10:57.83 LktYqlpm0.net
>>666
C言語の暗号化ライブラリで使いやすいのおせーてください
668:蟻人間
19/07/22 19:22:24.63 zh10SCAHd.net
ソーシャルゲームは専門ではないが、暗号化なら
URLリンク(ja.m.wikipedia.org)
669:デフォルトの名無しさん
19/07/22 19:25:19.41 MRg17CtQa.net
いろいろあるんですけど、ライセンス的にopensslでいいやみたいな感じになりましたね
waylandは5年後くらいにはなんとかなるんかな。どういうレイヤでサービス提供したいのかよくわからん所がある。
670:デフォルトの名無しさん
19/07/22 21:33:35.10 tAjmkx+m0.net
同じくopensslでいいんじゃないかと思いますな
671:デフォルトの名無しさん
19/07/23 03:25:09.81 /ZO3BTO70.net
gchar **command = (gchar *[]){"./Hello.exe","World",NULL};
を gcc6 で compile すると以下の2種類の warning が出ます。
warning: ISO c++11 does not allow conversion from string literal to 'gchar *' (aka 'char *') [-Wwritable-strings]
warning: pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression [-Waddress-of-array-temporary]
どう書くのが正解なのでしょうか? 教えてください。最後の NULL がなければ、
gchar **command = (gchar **)((char [][20]){"./Hello.exe","World"});
で良いと思うのですが、最後の NULL も必要です。よろしくお願いします。
672:デフォルトの名無しさん
19/07/23 04:01:15.67 XJs/DfWFa.net
要素の文字列をそれぞれキャストしてみるとか?
でも別に文字列の実体を用意した方が無難では。
673:デフォルトの名無しさん
19/07/23 05:54:57.80 XS6t8zxL0.net
char * const command[3] = {"./Hello.exe","World"};
674:デフォルトの名無しさん
19/07/23 09:58:47.20 J+ZHGa1Mr.net
初心者で勉強中なんですが、
switch文は
if文みたく
switch(a >0)のように()の中に関係演算子を使った式はかけないんでしょうか?
エラーがでるので無理なのかなと思ったんですが
675:デフォルトの名無しさん
19/07/23 10:46:29.88 DdnFitx+M.net
エラーじゃなくて警告では?
動かない理由はないと思うのでgccで試してみたけど、ちゃんと動いたよ。
ただ、結果は1か0の2値しかないのでif文使ったほうが良いと思うよ
676:デフォルトの名無しさん
19/07/23 10:51:17.50 unlUKZmGx.net
本当は
switch (a) {
case a > 0:
...
的なことをしたかったのではないかとエスパーしてみる。
677:デフォルトの名無しさん
19/07/23 11:36:41.71 LSxEgoA20.net
>>674
これなんか意味あるの?
具体的に何がしたいか知りたいなあ
678:デフォルトの名無しさん
19/07/23 11:42:11.95 CU39ntZ20.net
>>676
switch(true) って裏技 あれマジで気色悪いよね
679:デフォルトの名無しさん
19/07/23 11:44:08.90 SF2VCGvmM.net
case に何を書けばいいんだ?false は 0 でいいだろうけど、true は?
680:671
19/07/23 11:49:30.09 /ZO3BTO70.net
>>673
>char * const command[3] = {"./Hello.exe","World"};
ありがとうございます。これでも1つめの warning "does not allow conv..." は出ました。皆さんの所では出ませんか?
それと、 command はどうしても char ** 型である必要があります。
仮想端末で何かを実行させる関数 vte_terminal_spawn_async() に与えるためです。
URLリンク(developer.gnome.org)
引き続きアドバイスをお願いします。
681:デフォルトの名無しさん
19/07/23 11:53:01.06 4sm3RNn+0.net
>>674
書くことはできる
関係式は int 型の 0 または 1 という結果を生じるので
switch (a > 0) は a の値により
switch (0) もしくは
switch (1) と等価になる
おまえさんが言いたいのは switch で範囲チェックができるのか
ということだろうがそれはできない
a と case に指定した定数の == 比較しかできないのが switch だ
不等号や != が使いたければ if 文か3項演算子ということになる
682:671
19/07/23 12:04:01.45 /ZO3BTO70.net
>>672
ありがとうございます。具体的にはどうしたら良いでしょうか?
char list[2][20] = {"./Hello.exe","World"};
gchar **command = (gchar **){ (char *)list[0], (char *)list[1], NULL};
だと、↓のエラーになります。
error: function-style cast to a builtin type can only take one argument
正しいやり方をお願いします。
うーむ。どうしたものか。 gchar ** 型をどうやって作るのかさっぱり分からない。。。
ダブルポインタがよく分かってない。もう warning は放っておくしかないのかな?
683:デフォルトの名無しさん
19/07/23 12:10:49.21 XJs/DfWFa.net
その前に、671の警告でC++11って出てるのはなぜなのか。
複合リテラルってあれキャストではないよな。知らんけど。
684:671
19/07/23 12:21:12.41 /ZO3BTO70.net
>>672
gchar list1[][20] = {"../Exe/H2O.exe","World"};
gchar *list2[] = {(gchar *)list1[0], (gchar *)list1[1], NULL};
gchar **command = (gchar **)list2;
いろいろ試したところ、↑だと warning でなくなりました。意図されたのはコレでしょうか?コレで良いでしょうか?
685:デフォルトの名無しさん
19/07/23 12:21:15.34 d2s+lfJ+0.net
>>682
URLリンク(ideone.com)
これなら警告出ないけど、やりたいことと合ってるかどうかは知らん
686:デフォルトの名無しさん
19/07/23 12:22:08.73 7yf4dx7Q0.net
>>680
文字列リテラルは書き換え不可なので当然の警告。
char const* const command[] なら警告は出ないだろうけど、渡した先で書き換えしない保証がないならアウト。
渡した先で書き換えしない保証がないなら、リテラルでの初期化は無理だと思う。
687:671
19/07/23 12:24:46.80 /ZO3BTO70.net
>>683
なんかおかしいですよね。
でも Makefile に書いていいて実際に compile に使っているのは間違いなく gcc6 です。
warning が g++6 と共通なのですかね?
688:デフォルトの名無しさん
19/07/23 12:30:44.31 d2s+lfJ+0.net
URLリンク(ideone.com)
そもそもgcharってなんなの?
charのエイリアスかなんか?
689:デフォルトの名無しさん
19/07/23 12:33:40.67 d2s+lfJ+0.net
> warning: ISO c++11 does not allow conversion from string literal to 'gchar *' (aka 'char *') [-Wwritable-strings]
charのエイリアスか
なら最初に書いとけよ
690:デフォルトの名無しさん
19/07/23 12:38:30.05 XJs/DfWFa.net
>>684
そういう話です。
691:671
19/07/23 13:18:08.85 /ZO3BTO70.net
>>688
ありがとうございます。スマートですね。参考にします。
gchar は char の別名です。すみません。
692:671
19/07/23 13:24:51.89 /ZO3BTO70.net
>>683
Makefile には gcc6 と書いてあるのですが、出力をみると c++ でコンパイルしていました。。。
今気づきました。 -std=c++11 もつけてある。
Cのソースを c++ でコンパイルするとマズいですか?今のところ何も問題はないです。
693:デフォルトの名無しさん
19/07/23 14:56:41.16 XJs/DfWFa.net
>>692
C++に複合リテラルないんじゃないかな。なくても困らんか。
あとさっきの配列の要素にstrdup突っ込むとconstにしなくていいかもな。
もしくはmemcpy(malloc(100),"hoge",5)とか。
標準に沿った書き方かどうかは知らん。
694:671
19/07/23 17:13:31.67 TCk4qRZWa.net
>>693
ありがとうございます。なるほど、複合リテラルですね。調べてみます。
自分、C で書いていて compile も C でやっているつもりだったんですが、コンパイラが c++ だった。。。
これは c++ 用の Makefile を流用した為です。
最初 c++ でアプリを作ろうとして、Makefile を用意して、ソースを書き始めたのですが、途中で仮想端末オブジェクトが c++ ではうまく使えない事が判明して、
ソースを C に書き変えたのです。Makefile はフラグ等あるので流用してしまった...
これ以上は困らないですかね。困った時にはコンパイラが c++ な為を疑ってみます。
strdup と memcpy も試してみます
これをヒントに検索していて g_strsplit なる関数もある事を発見しました。
695:デフォルトの名無しさん
19/07/23 18:36:28.60 5chEKyGia.net
C++ には引数に void だけって関数がないらしいぞ。
その他細かい違いがあるかも知れないので要注意だ。
696:デフォルトの名無しさん
19/07/23 18:58:12.02 Ffr5F2PG0.net
どちらかというと()の解釈が違う
c++だと()は(void)と同じ
cは()が(void)と同じになる文脈とそうでない文脈がある
697:デフォルトの名無しさん
19/07/23 19:36:26.79 5chEKyGia.net
こうしてまた(void)論争が始まり3スレぐらい消費されるのであった。
698:デフォルトの名無しさん
19/07/23 19:42:24.88 FnKSwmbm0.net
生兵法家しかいないスレだから仕方ないね
699:デフォルトの名無しさん
19/07/23 19:45:15.53 5chEKyGia.net
また一つ燃料が投下された
700:デフォルトの名無しさん
19/07/23 20:15:50.53 xWhG5FgG0.net
線香花火程度
701:デフォルトの名無しさん
19/07/23 20:23:08.15 d2s+lfJ+0.net
strdupはいつになったら標準ライブラリに入るんですか?
702:デフォルトの名無しさん
19/07/23 20:55:09.99 4sm3RNn+0.net
> cは()が(void)と同じになる文脈とそうでない文脈がある
ほほう、それはどんな場合だ? 具体的なコードで示せるか?
703:デフォルトの名無しさん
19/07/23 20:56:28.16 LLlz9dHQ0.net
>>668
>>669
>>670
ありがとう!
なんとかがんばってやってみます
704:デフォルトの名無しさん
19/07/23 21:08:17.10 Ffr5F2PG0.net
int f();
int f()
{
return 1;
}
705:
19/07/23 21:21:24.40 JcFEdZGk0.net
>>702
①(void) と同じ
void f() { return; }
②(void)と違う
void f();
706:デフォルトの名無しさん
19/07/23 21:47:42.09 4sm3RNn+0.net
>>705
URLリンク(paiza.io)
URLリンク(ideone.com)
URLリンク(codepad.org)
707:
19/07/23 21:55:11.77 JcFEdZGk0.net
>>706
thx 納得しました
URLリンク(ideone.com)
708:デフォルトの名無しさん
19/07/23 21:58:12.31 Ffr5F2PG0.net
>>706
URLリンク(ideone.com)
709:デフォルトの名無しさん
19/07/23 22:01:20.82 4sm3RNn+0.net
>>708
ん、何が言いたい?
710:デフォルトの名無しさん
19/07/23 22:13:17.57 Ffr5F2PG0.net
>>709
()と(void)が違う例
1行目のコメントはずして、2行目にコメントつけたらコンパイル通る
定義の時は()は(void)と同じで引数の無い関数の定義になる
711:
19/07/23 22:19:55.80 JcFEdZGk0.net
>>710
>定義の時は()は(void)と同じで引数の無い関数の定義になる
そ、れ、が…
URLリンク(ideone.com)
712:デフォルトの名無しさん
19/07/23 22:31:08.37 cffvmBp10.net
プロトタイプ宣言で引数部分を空にすると引数チェックがされなくなる
例えばこんなコードも動く
URLリンク(ideone.com)
713:デフォルトの名無しさん
19/07/23 22:43:31.16 Ffr5F2PG0.net
URLリンク(softwareengineering.stackexchange.com)
draftだから正規版で変わった可能性もあるが
n1570の133,134ページに記載がある
714:デフォルトの名無しさん
19/07/23 23:42:31.01 4sm3RNn+0.net
>>710
すまんが、寝落ちする
明朝またくる
715:デフォルトの名無しさん
19/07/24 02:42:47.45 S0ZgllDI0.net
はっ。ちょっと目を離したスキに(void)ネタだけでもうこんなに書き込みが。
716:デフォルトの名無しさん
19/07/24 03:03:06.58 VPRaWuN40.net
2進数で表現されている多倍長整数を10進数の文字列に変換する場合、機械語レベルではどうするのが現代風ですか。
レジスタ長までならBCD変換でしょうか?
例えば、Cのprintf(“%d”, 12345)はどういう実装がされますか。
多倍長ならまた違ってきますか。
717:
19/07/24 05:30:33.02 +4E3jW9F0.net
>>716
C++ ですが多桁長演算を書いています。
スレリンク(tech板:51番)
std::ostream &operator<<(std::ostream &stream, mpz_base_class c)
std::ostream &operator<<(std::ostream &stream, mpz_class c)
718:デフォルトの名無しさん
19/07/24 06:54:11.66 VPRaWuN40.net
>>717
ありがとうございます。
多倍長演算では内部2進数のまま演算しているのですね。
719:デフォルトの名無しさん
19/07/24 06:55:28.24 VPRaWuN40.net
改めて質問します。
2進数で内部表現されている整数を10進数の文字列に変換する場合、
機械語レベルではどうするのが現代風ですか。
レジスタ長までならBCD変換でしょうか?
例えば、Cのprintf(“%d”, 12345)はどういう実装がされますか。
720:デフォルトの名無しさん
19/07/24 09:34:09.57 UuFmwqvta.net
現代風?
現代だろうが古代だろうが10で割った余りを並べながら10で割る事は変わらんと思うが。(CPUによってはBCDに一発変換なんて命令あるのかな?あればそれ使うと速いだろうね)。
721:デフォルトの名無しさん
19/07/24 10:27:00.90 H/U9sRCS0.net
JIS X3010:2003
6.7.5.3 関数宣言子(関数原型を含む)
意味規則 宣言“T D1”においてD1 が形式
D ( 仮引数型並び )
又は
D ( 識別子並びopt )
をもつ場合,次のとおりとする。
識別子並びは,関数の仮引数の識別子だけを宣言する。関数定義の一部である関数宣言子で識別子並びが空の場合,関数が仮引数をもたないことを指定する。関数定義の一部でない関数宣言子の識別子並びが空の場合,仮引数の個数及び型の情報がないことを指定する(124)。
(124) “今後の言語の方針”(6.11.6 参照)。
(125) 両方の関数型が“古い形式”の場合,仮引数の型は比較されない。
6.11.6 関数宣言子 空の括弧を伴う関数宣言子(関数原型形式の仮引数型並びではない。)の使用は,廃止予定事項とする。
6.11.7 関数定義 仮引数の識別子並びと宣言並びを別々に与える関数定義(関数原型形式の仮引数の型及び識別子の宣言ではない。)の使用は,廃止予定事項とする。
722:デフォルトの名無しさん
19/07/24 10:30:48.21 sKxa8jzv0.net
>>719
こうなっているらしい
printf()のソースコードで、ソースコードリーディングのコツを身に付ける (2/3):main()関数の前には何があるのか(5) - @IT
URLリンク(www.atmarkit.co.jp)
723:デフォルトの名無しさん
19/07/24 10:35:17.11 q7vPBAFqa.net
ソースのコメントで変数毎に「16進整数」とか「10進整数」とか区別してるのあったけど意味わからんかった。
全部intなのに。
724:デフォルトの名無しさん
19/07/24 10:50:43.56 H/U9sRCS0.net
void f() {} //関数定義の一部である関数宣言子で識別子並びが空の場合,関数が仮引数をもたないことを指定する。
void g(); //関数定義の一部でない関数宣言子の識別子並びが空の場合,仮引数の個数及び型の情報がないことを指定する(124)。
int main()
{
f(1); //NG: 0個の仮引数に1個の実引数
g(1); //OK: 任意の仮引数に1個の実引数
}
void f(); //両方の関数型が“古い形式”の場合,仮引数の型は比較されない。
void g() {} //両方の関数型が“古い形式”の場合,仮引数の型は比較されない。
/*
D:\learn\c>cl 710.c /W4 /nologo /c
710.c
D:\learn\c>gcc 710.c -Wall -std=c18 -c
D:\learn\c>clang-cl 710.c /W4 /c
710.c(6,8): warning: too many arguments in call to 'f'
f(1); //NG: 0<8C><U+0082>?<BC><88><F8><90><94><82><C9>1<8C><U+0082>?<C0><88><F8><90><94>
~ ^
1 warning generated.
D:\learn\c>
*/
725:デフォルトの名無しさん
19/07/24 12:11:20.90 /HKiGEdd0.net
>>723
ひょっとして変数の接尾語に10進数や16進数を表す3文字以下のものを
付けるべきなのでは?
他のところの計算の時に間違えてしまう可能性が減ると思う
726:デフォルトの名無しさん
19/07/24 12:43:12.82 PgWkyPpkM.net
>>720
Z80やx86にはBCD関連の命令がありました。
最近のレジスタビット数の大きいプロセッサは知りませんので伺いました。
10で割った余りだと桁数nとしてO(n^2)の計算量になりますよね。
流石にそれはないかなと思っています。
727:デフォルトの名無しさん
19/07/24 12:53:46.86 iTtNhbrVM.net
URLリンク(days-of-programming.blogspot.com)
728:デフォルトの名無しさん
19/07/24 13:07:48.35 q7vPBAFqa.net
O(n)じゃないか?
x64はもう命令ないんだね
729:デフォルトの名無しさん
19/07/24 13:17:22.40 /roNvT5Ja.net
O(n)だね。
文字列変換時にBCDにするのではなく演算からBCDとして扱うプログラムを見たことある。
あまり効率が良いとは思えなかったが。
730:デフォルトの名無しさん
19/07/24 17:12:57.35 s/qhJVlP0.net
x64の場合、ALUでやる2ケタの加減乗除の方は廃止だが、FPUでやる18ケタの10進と2進の間の変換はまだ使える
731:デフォルトの名無しさん
19/07/24 17:15:31.56 rxR1MP+Fd.net
聞くのはここでいいのか微妙だけど質問です
abzのエンコーダで回転方向を検知したいんですがzパルスでリセットされるときに回転方向が正しく検知されなくなってしまうところの解決方法どなたか知ってますか
732:デフォルトの名無しさん
19/07/24 17:21:50.17 PgWkyPpkM.net
>>728
mod 10でO(n)、
それを桁数nに比例した分繰り返すからO(n^2)
と考えています。
O(n)で内部2進表現の整数→10進数の文字列に変換ができればいいのですけどね。
あるいはdecimal型を持つ言語がありますが、そのような型では内部でBCDで持ってたりするのでしょうか。
733:デフォルトの名無しさん
19/07/24 17:55:29.62 YVgDjaZ/M.net
1桁分のmod 10だけなら計算量は固定なのでO(1)
n桁分を繰り返すなら計算量はO(n)
すべての計算量のオーダーとしてはO(n)
734:デフォルトの名無しさん
19/07/24 18:22:37.58 +vIzXAhOd.net
>>733
わかりました。
剰余を固定命令数でできる桁数内であればO(n)でできるということですね。
現在、内部2進表現の整数を10進数の文字列に変換する方法としては、mod 10の繰り返しがメジャー(ベスト)ですか?
printfの%dもこの実装が主流でしょうか。
735:デフォルトの名無しさん
19/07/24 18:23:32.53 q7vPBAFqa.net
modの計算量が固定ってこともないんじゃ?
除数にかなり依存しそうな
736:
19/07/24 19:18:26.26 +4E3jW9F0.net
>>718
そうです、10進法変換は表示のときにはじめて実施します
737:
19/07/24 19:20:00.24 +4E3jW9F0.net
>>719
単純に 10 で割った余りを並べるだけですが、ただ >>717 で紹介したコードでは幾分かの最適化が追加されています
738:
19/07/24 19:21:21.51 +4E3jW9F0.net
>>726
いや、10 で割った余りそのものであり、他に方法はありません
ただ、最適化の余地はあり、それは >>717 に示しました
739:
19/07/24 19:22:41.56 +4E3jW9F0.net
>>729
BCD はインプリメントする側としてはやる気が起きないものだ、と思いますよ
足し算、引き算はいいとして、掛け算、割り算は BCD では実装できないのです