X



C言語なら俺に聞け 153

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん (ワッチョイ 5fba-LL4R)
垢版 |
2019/08/17(土) 23:02:42.00ID:tN5mSQYg0
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言語なら俺に聞け 152
https://mevius.5ch.net/test/read.cgi/tech/1560763630/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
0869デフォルトの名無しさん (ワッチョイ e2ad-sLG6)
垢版 |
2019/12/31(火) 00:15:56.34ID:Qb6UeAHn0
>>825
これは危険なので普通はやらない。

scanf("%s", nextStr);
0873デフォルトの名無しさん (ワッチョイ 5dcd-kIX1)
垢版 |
2020/01/02(木) 09:27:06.04ID:9VSdJ8Nx0
ポインタを受け取る関数先頭では必ずnullチェックを行うコーティングルールが有るのですが
malloc失敗したポインタをそのまま渡した時ぐらいしか使い道が思い付きません…
0877デフォルトの名無しさん (ブーイモ MM62-kvXh)
垢版 |
2020/01/02(木) 10:24:26.88ID:Lvb+z/bpM
get_state()みたいな関数があって失敗時はnullを返す。それを知らずに別の関数に戻り値を直接渡してしまったとか、nullが誤って渡されるケースなんていくらでもあると思うが。

873が超天才でそんなミスは絶対ありえないとしても、他人のコードやドキュメントが間違ってる可能性もある
0878デフォルトの名無しさん (ワッチョイ c2a5-s4wZ)
垢版 |
2020/01/02(木) 10:39:04.82ID:Dgcghn810
Player*とEnemy*を取るRPGのバトル関数で
どちらかが死んでたらplayer->attack()関数は盛大に失敗する

この時の当該playerは消滅したわけでは無いが
enemyはメモリ上から消えている

ついでにこのattack関数が実は関数ポインタに付けられたプレイヤーのスキルだった場合、
attackがカラッポだと、徒手空拳になるか防御するか何もしないか、何故か敵味方全員が即死していきなりエンディングが始まるかのどれかになる
0879デフォルトの名無しさん (ワッチョイ e179-E95m)
垢版 |
2020/01/02(木) 11:31:53.70ID:FHRar1Ix0
安全性を取るならいついかなる時もNULLチェックは行うべき

だがそもそもパフォーマンス至上主義だから
Cという太古の言語を危険を冒してまで使っているということを考えると微妙

パフォーマンスが重要でないならCを使っていることからして論外
0880デフォルトの名無しさん (ブーイモ MMb6-vILD)
垢版 |
2020/01/02(木) 11:38:58.14ID:ZKet2vMyM
成否を含んだtupleを渡し実行時に判別、式全体を読み飛ばす粒度の小さい隠れた分岐構文みたいなの有ればいいのにねー
成否要素だけの反転は !!tulpevalue みたいな感じで

c言語の仕事じゃないだろうしそもそもtupleなんて持ってないし
うんこマが技巧駆使してわけわからんコード書くツールになるだけかもしれんし弊害いろいろ思いつくけど
0884デフォルトの名無しさん (アウウィフ FFa5-p4uH)
垢版 |
2020/01/02(木) 14:45:20.78ID:fRqsjLPxF
Release build だと assert 消えるって知らない人意外と多いんですね
0886デフォルトの名無しさん (アウウィフ FFa5-p4uH)
垢版 |
2020/01/02(木) 15:47:44.05ID:NYIo0K4bF
その意見を完全にスルーしてコメントしてる人がいるよね
0893◆QZaw55cn4c (ワッチョイ 2247-70g7)
垢版 |
2020/01/02(木) 19:35:59.09ID:VmmTWzwp0
C++11 の static_assert は便利なんですけれどもね…これ、C に入らないかな…
assert も static_assert と同じ用途・考え方で使うべきものかと思いますね
0901デフォルトの名無しさん (ブーイモ MM6d-vILD)
垢版 |
2020/01/02(木) 22:22:27.18ID:oLW+m36dM
深いところで拾ったエラーを浅層に戻して対応する必要がなく「ダメよ」と述べ落ち許されるプログラムならば
assert残すのも有りよね
実際#ifdef DEBUGで包んでるだけだし
imagemagickなんかも引数チェックを通った後の個々パラメータ内で不整合出たらassertでメッセージ流して落ちるし
0902◆QZaw55cn4c (ワッチョイ 2247-70g7)
垢版 |
2020/01/02(木) 22:27:00.54ID:VmmTWzwp0
>>900
assert が発動してアプリが止まるのは終わり方として最悪だとおもいますよ
もし assert が発動する可能性があるんだったら assert ではなくて、きちんとしたエラー処理を記述するべきなのでは?

assert って辞書をみると「断言」「主張」「出しゃばり」くらいの強い意味ですね
私は assert はコメントの一種一様態として使います=>>893
0904デフォルトの名無しさん (ワッチョイ 2252-rouQ)
垢版 |
2020/01/02(木) 22:30:49.81ID:+UNtt4nj0
>>901
assertに引っ掛かったときの挙動は置いとくとしても、assertの処理内容や頻度によっては実行時コストが問題になる可能性も無くはないから、単純にやってよしとはならないと思うぞ。
0905デフォルトの名無しさん (ブーイモ MM6d-vILD)
垢版 |
2020/01/02(木) 23:00:40.06ID:oLW+m36dM
効率厨はログ出力を見れるGNUemacsのeshell辺りででもwindowsプログラム立ち上げてみ?
プロプラ、オープンソースに関係なく大半のリリースビルドが膨大な出力を出しっパになってる現状に絶望するだろうから
0907デフォルトの名無しさん (ワッチョイ 2252-rouQ)
垢版 |
2020/01/03(金) 01:04:07.68ID:kXvb5Zcs0
>>905
処理内容や頻度によって実行時コストが問題になる可能性があると言っただけで効率厨扱いとはw
既存プログラムでログを大量に出しているからと反論しているが、だからそれがどうしたというのだ? ログを出しても性能的に問題ない範囲、頻度、量で出しているだけだろう。
0909デフォルトの名無しさん (ワッチョイ e173-ALt1)
垢版 |
2020/01/03(金) 08:42:01.33ID:3k7MKqlh0
組み込みだとタイミング込みで評価するから
ビルドを切り替えられないんだよね

assertはログだけ出すようにしてるが
ウォッチドッグを効かすってのもありかな

起こり得ないところで使うってのはその通り
0911◆QZaw55cn4c (ワッチョイ 2247-70g7)
垢版 |
2020/01/04(土) 21:11:48.66ID:rVQt0/h/0
uint64_t を配列の添え字に使えるかどうかって何か規格はありますか?
手元の環境は unsigned int のようなんですが、gcc/ming32-x64
0914デフォルトの名無しさん (ワッチョイ 42da-hqVv)
垢版 |
2020/01/04(土) 22:28:50.08ID:HbavYk5j0
>>911
ISO/IEC 9899:2011 (E)

6.5.2.1 Array subscripting
1 One of the expressions shall have type "pointer to complete object type", the other
expression shall have integer type, and the result has type "type".

7.19 Common definitions <stddef.h>
size_t
which is the unsigned integer type of the result of the sizeof operator;

どこにもunsigned intに限定するとは書いてねえぞ
unsigned integerと書いてあるのが
おまえはunsigned intに見えるのか?
0915◆QZaw55cn4c (ワッチョイ 2247-70g7)
垢版 |
2020/01/04(土) 23:21:44.72ID:rVQt0/h/0
>>912-914
コメントありがとうございます
uint64_t と int をいいかげんにチャンポンに使っていたための祟りに襲われてしまっているところでして…
a[i] = *(a + i)
を考えれば、i が int = int32_t, であろうと uint64_t であろうと、うまくやってくれると予想できますね
0918デフォルトの名無しさん (ワッチョイ 41e8-W/+2)
垢版 |
2020/01/05(日) 12:50:09.43ID:+e7zv/8B0
STLの配列の添え字は、std::size_tと同じ範囲が使えるように思う。
このstd::size_tには長さの制約は多分ない。
常識的に考えて、32ビットのプログラムで64ビットの配列を使うことはあまり現実的ではない。
なので、std::size_tの長さはNビットプログラムにフィットするようにコンパイル時にスイッチされる。はず。
0919デフォルトの名無しさん (ワッチョイ 42da-hqVv)
垢版 |
2020/01/05(日) 12:58:44.11ID:JLxpDEWT0
思うんじゃなく確認しろ、多分とか寝言ぬかしてねえで

N4713

26.2.1 General container requirements
Table 83 ? Container requirements
X::size_type
size_type can represent any non-negative value of difference_type

26.3.8.1 Class template deque overview
// element access
reference operator[](size_type n);
const_reference operator[](size_type n) const;
0920デフォルトの名無しさん (ラクッペ MM61-Gr30)
垢版 |
2020/01/05(日) 13:25:51.85ID:qO+R3XJXM
教官湧いててワロタ
0921デフォルトの名無しさん (ワッチョイ 9901-8/Ff)
垢版 |
2020/01/05(日) 13:55:25.64ID:+b/hvkzN0
教官使い倒そうぜ。
タダだし。
0922デフォルトの名無しさん (ワッチョイ 417b-wLQD)
垢版 |
2020/01/05(日) 15:43:26.81ID:Apdi0tl00
具体的な規格の文面を引用して示してくれるのは有難いことでしょ。
手元にPDFとかで持ってても場所を見つけるのが苦労で諦めることが多いし。

size_type can represent any non-negative value of difference_type
の部分を見ると size_t の大きさは difference_type の大きさに依存する、
少なくとも difference_type の正の範囲より広い、で合ってるかな。
ならば difference_type の範囲はどうなってるの? って具合に
疑問の先が移動するね。答えに近づいたけれど到達はしてない感じ。
0923デフォルトの名無しさん (アウアウエー Sa4a-p4uH)
垢版 |
2020/01/05(日) 20:35:48.07ID:eK7nc1Ssa
添え字は size_t が良き
0930デフォルトの名無しさん (ワッチョイ 9901-skQ4)
垢版 |
2020/01/06(月) 13:04:19.40ID:UJayP8xu0
いつになるか激的アーキテクチャの進化でも迎えない限り
64bitでmsbまで使い切る正数アドレスなんて無いから
相対はヌルチェック+自動整数変換に頼っときゃいいんじゃね
fseek/off_tはなんかもやもや放置気味?誰が完全な解決をもたらすのか
0931デフォルトの名無しさん (ワイーワ2 FF8a-p4uH)
垢版 |
2020/01/06(月) 19:21:49.21ID:OSGVopulF
変なセグメント跨がないだけまだマシ
0933デフォルトの名無しさん (ワッチョイ 42ad-cEPd)
垢版 |
2020/01/07(火) 00:34:22.49ID:MpiZXKP+0
>>925
しかし俺の心の中にあるのだ。
0938デフォルトの名無しさん (ワッチョイ 5f2c-fsjN)
垢版 |
2020/01/10(金) 20:53:06.96ID:z03T2m7q0
2019年に成長したプログラミング言語ランキング、第1位は? 2020/01/10 09:18 後藤大地
https://news.mynavi.jp/article/20200110-952052/

TIOBE Softwareがこのほど、2019年に最もインデックス値を伸ばしたC言語が2019年のプログラミング
言語・オブ・ザ・イヤーに輝いたと伝えた。第2位はC#で、これにPythonとSwiftが続いている。

C言語のインデックス値が伸びた理由として、IoTおよび小型のインテリジェントデバイスにおいて需要が
高いためだという。C言語は短時間で習得が可能な上、すべてのプロセッサにおいてCコンパイラを利用
できる。TIOBE Softwareは、こうした状況がC言語のインデックス値上昇を招いたのではないかと分析
している。

発表された2019年におけるインデックス増加率と順位は次のとおり。[順位]プログラミング言語(増加率)
[1]C(+2.4%)、[2]C#(+2.1%)、[3]Python(+1.4%)、[4]Swift(+0.6%)、

2019年のプログラミング言語・オブ・ザ・イヤーは、2018年に引き続きPythonが受賞するだろうと考え
られていた。これは、Pythonが2018年に入ってから長期にわたって増加傾向を維持しているためだ。
しかし、2019年はC言語の増加率がPythonを超えて1位となった。C言語は2016年に一気にインデッ
クス値を下落させており、2017年後半から逆に増加に転じている。ずでに減少以前の水準まで戻って
きており、今後も同様のペースで増加を続けるかどうかはわからない。

仮に、今後も同様のペースでC言語の増加傾向が続いた場合、JavaとC言語のポジションが逆転して
C言語が首位になる月が出てくる可能性もある。しかし、過去の動向として、JavaとC言語は推移が同調
する傾向が強く、Javaが第1位でCが第2位という順位のまま推移する可能性もある。(中略)

TIOBE Programming Community Index (PCI)は、複数の検索エンジンの検索結果から、対象となる
プログラミング言語がどれだけ話題になっているかをインデックス化したもの。2020年1月におけるイン
デックスは次のとおり。

1月TIOBE Programming Community Index / 円グラフ
https://news.mynavi.jp/article/20200110-952052/images/002.jpg
0946デフォルトの名無しさん (ワッチョイ ff8c-GYCx)
垢版 |
2020/01/11(土) 10:17:43.71ID:MvVD+3kL0
APIでいろいろある。
0948デフォルトの名無しさん (ワッチョイ 7fad-W3qw)
垢版 |
2020/01/11(土) 16:02:03.38ID:j7/IvFvR0
Kotlin もよろしく
0949デフォルトの名無しさん (ワッチョイ df35-e1y7)
垢版 |
2020/01/11(土) 16:06:43.26ID:tdQ2h9sk0
覚えることが少ないというか物理的で直感的だからわかりやすい
クラスとか言われても初心者には「?」だし
0950デフォルトの名無しさん (ワッチョイ 7f47-soYg)
垢版 |
2020/01/11(土) 16:32:40.71ID:Mi8oZktw0
C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために
さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが
簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを
追っぱらうため *だけ* だったとしても、それ自体、C を使う強力な理由になりうる。

C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら
Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、
それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる:

- うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が
安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、
もはや笑えるレベルを超えている)

- 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに
効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の
コードがその素晴らしいオブジェクトモデルに依存していて、直すためには
アプリ全体を書き直さなきゃなんない。

言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある
C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに
限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい
「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
0951デフォルトの名無しさん (ワイーワ2 FF7f-Eg5K)
垢版 |
2020/01/11(土) 17:09:55.20ID:l/QLWHKHF
const 禁止のことを言ってるなら同意
レス数が950を超えています。1000を超えると書き込みができなくなります。

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