C言語なら俺に聞け 158

■ このスレッドは過去ログ倉庫に格納されています
2021/12/25(土) 12:11:46.61ID:xxeaCAplM
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf

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/

※前スレ
C言語なら俺に聞け 157
https://mevius.5ch.net/test/read.cgi/tech/1624846971/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
210デフォルトの名無しさん (ワッチョイ 83b1-hSEA)
垢版 |
2022/02/22(火) 21:17:01.78ID:9avL3EWo0
>>201
「変数をバイナリーでファイルに出力する」と聞いてリーダーに求めたのは
メモリーマップ。当然、準備しているものだと思っていた。

ただ、メモリーマップなど知らないし意味も分からない、サンプルを見てくれ?
という指示だった。

バイナリーでのデータ交換をするのにメモリーマップを定めないことに関しては今でも気持ち悪さを感じている。
2022/02/22(火) 21:27:02.48ID:xH13yj0x0
>>209
> OSで保護された上で動くアプリケーションは

OS では解決できない。 だからリーナスはインテルにマジムカという話。

変数を何か所にも増やすのが意味ないというのは、それはそう。
どうやったってどうにもならんので考えるだけ無駄。
職人技でどうにかできるような規模の小さな組み込み分野ならともかく、
複雑高度なコンピュータで低レイヤが信頼できないなら信頼できない箇所にコストをかけて改善すべき。
2022/02/22(火) 21:56:15.32ID:ntDF8W1ma
>>208
それなら気持ちは分かる
意味は解せぬが
2022/02/22(火) 21:59:25.84ID:fFHtSmjBd
>>209
ハードウェアエラーが原因ならプログラムの実行バイナリも平等に化ける可能性あるよね
2022/02/22(火) 22:00:17.02ID:FDkOG5bL0
>>204
そんなんテスト通るんか?
テストもせずに放置?
2022/02/22(火) 22:07:46.87ID:6JePgkF30
アポロ計画だったか、3台のコンピュータに計算させて多数決で決めてたな
2022/02/22(火) 22:18:57.41ID:6JePgkF30
それとCのようにロジックが追え、時間さえあれば
人でも答えが出せる場合ではなく、
AIシステムのようにブラックボックス化していると、
複数台による合議制もあるかも知れない
2022/02/22(火) 22:31:59.79ID:xH13yj0x0
深層学習ってニューラルネットワークを多層構造にしたモデルなんだよね。
AI の仕組みの中に (重みづけされた) 多数決が既に組み込まれていると言えなくもない。
218デフォルトの名無しさん (ワッチョイ 83b1-hSEA)
垢版 |
2022/02/22(火) 23:00:22.43ID:9avL3EWo0
>>215
それなら分かる。計算結果を多数決専用のワイヤロジックで決め
また、3台の入力に戻して計算していれば。
219デフォルトの名無しさん (ワッチョイ 83b1-hSEA)
垢版 |
2022/02/22(火) 23:05:44.26ID:9avL3EWo0
>>213
そう思う。本当に冗長化するなら、ストアされているプログラムも
カウンタ変数も信頼性は平等だと思う。

レジスタに収納されてればより信頼性が上がると言われそうだが、
ループ変数だってメモリに退避されていることが多いから信頼性は同じだと思う。
2022/02/22(火) 23:14:07.01ID:AiPUeoxY0
>>211
> OS では解決できない。 だからリーナスはインテルにマジムカという話。
Xeon 使えばいいだけだろ
サーバーによってはECCだけじゃなくてミラーリングも使えたりするし
https://jp.fujitsu.com/platform/server/primergy/technical/pcserver-description/memory.html
2022/02/22(火) 23:21:36.39ID:xH13yj0x0
>>220
この場合は出来るハードウェアもあるってのは反論にならないんだよ。
出来ないハードウェアが世の中に溢れてるってのが問題なんだから。
2022/02/22(火) 23:34:31.66ID:AiPUeoxY0
>>221
溢れてて何が問題なんだ?
リーナスは金持ってるかもしれんが世の中ECCマシンを買える奴ばかりじゃないんだし
2022/02/23(水) 00:08:53.35ID:o4j3GXmb0
>>222
安ければデメリットもあるのもしょうがないといえばしょうがない話ではあるけどね。
デメリットはない (あるいは十分に小さい) と言い張ってインテルは ECC なし製品を推し進めたけど、
実際にはそうじゃないことがわかったとなれば文句を言いたくもなるだろう。
2022/02/23(水) 07:03:47.68ID:6oKgGQho0
>>223
> 実際にはそうじゃないことがわかったとなれば文句を言いたくもなるだろう。
そうじゃないと言ってるけど実際どれくらいあるんだ?
仕事で上に書いたようなサーバーでシステム構築してたけどメモリーエラーなんて見たことないし
2022/02/23(水) 08:03:17.13ID:FxZT1eeTd
>>210
WindowsでのBITMAPFILEHEADERとか主要なファイルヘッダの構造は全部構造体で定義されてるから気にしたことないなあ
ダミーパディング込みで
気になるなら定義部分を見てみるといい
余計なパディング入れないプラグマとかも使われているはず
2022/02/23(水) 08:27:04.99ID:JOM9/OKLa
https://www.itmedia.co.jp/news/articles/0602/13/news037.html

MS「ECCメモリを標準搭載にしろ」
インテル「やだ」
2022/02/23(水) 08:44:18.35ID:FxZT1eeTd
>>226
> それは、Microsoftは今調べているドライバの問題から、Windows XPのシステム・アプリケーションのクラッシュの主な原因がメモリの欠陥にあることを知ったからだ。

えっ?w
2022/02/23(水) 09:11:50.93ID:pngadACwM
リーナスもMSもECCメモリーがーって騒ぐ前にやることがあるだろw
229デフォルトの名無しさん (ワッチョイ 83b1-hSEA)
垢版 |
2022/02/23(水) 09:34:02.54ID:vebGIGPQ0
>>224
20年間プログラマをやってたが、勝手に値が変わっていたことは一度もない。
(全てOSで保護されたアプリケーションレベルの経験)
230デフォルトの名無しさん (ワッチョイ 83b1-hSEA)
垢版 |
2022/02/23(水) 09:37:11.21ID:vebGIGPQ0
>>225
https://docs.microsoft.com/ja-jp/windows/win32/api/wingdi/ns-wingdi-bitmapfileheader
これでファイルの読み書きしても良いんだ。
MS公式文書で書かれているということで、今まで引っかかっているところが解消した感じ。
2022/02/23(水) 09:42:44.82ID:hrDKDc9G0
昔宇宙線だかなんだかがメモリデータを破壊するとかそんな記事を読んだ気がそこはかとなく(ry
2022/02/23(水) 10:39:13.43ID:6oKgGQho0
>>229
万が一書き換わってても気付かない事の方が多いだろ
2022/02/23(水) 10:44:14.42ID:6oKgGQho0
>>231
アルファ線とか宇宙線中性子とか
https://www.hitachi.co.jp/rd/glossary/jp_so/sofutoeraa.html

メモリーを心配するならFPGAも心配しろよ
https://www.hitachi.co.jp/rd/sc/story/softerr/index.html
2022/02/23(水) 11:25:09.62ID:o4j3GXmb0
>>229
勝手に書き換わっているかどうかどうやって検証したんだ?
ICE とかでわかるもんなの?
2022/02/23(水) 12:31:11.32ID:v1sPphh80
Windowsならメモリーエラーでブルースクリーンになるよな
2022/02/23(水) 12:39:56.12ID:stefKGxD0
ならねえよ
「何となく調子悪い」PCがmemtest86で問題発覚はあるけどな
2022/02/23(水) 12:54:35.71ID:FxZT1eeTd
再現性がまったくないから
端子の接触不良か熱暴走で片付けられると思う
238デフォルトの名無しさん (ワッチョイ 83b1-hSEA)
垢版 |
2022/02/23(水) 13:35:22.91ID:vebGIGPQ0
Cで変数を分散するって話は人生で一回だけ。
それ以降は、どの言語でも意図して変更していなければ絶対に変数は変わらないという事を前提にコーディングしている。
でも、問題は無い。
2022/02/23(水) 13:42:56.07ID:n4QLtIZ70
eccメモリ積んだサーバー使えばいいじゃん
240デフォルトの名無しさん (ワッチョイ 83b1-hSEA)
垢版 |
2022/02/23(水) 13:44:37.23ID:vebGIGPQ0
>>231
ケースをシールドしたり、信号ラインを絶縁して対応していると思われる。
241デフォルトの名無しさん (ワッチョイ 83b1-hSEA)
垢版 |
2022/02/23(水) 16:46:51.15ID:vebGIGPQ0
while(1){

a(&x);
if(x==1) break;
b();
}

ってコーディングを禁止している案件もあった。break文じゃなく、しっかりと条件式がfalseになるように書けとのことだった。
ただ、このやり方って入門書にも書いてある普通な方法だと思うけど。ループの中間くらいで抜けたいときはその後の処理をifで実行できないようにしていたので可読性は悪かった。
もちろん continue も封印されていた。

while(x!=1){
a(&x);
if(x!=1) b();
}

みたいに
2022/02/23(水) 16:49:25.49ID:n4QLtIZ70
whileの中で関数呼べばいいじゃん
2022/02/23(水) 17:07:12.12ID:FxZT1eeTd
inline関数ならオーバーヘッドもないはずだしな
それで何が聞きたいんじゃ?
2022/02/23(水) 17:08:55.71ID:6oKgGQho0
俺なら
a(&x);
while(x == 1){
b();
a(&x);
}
って書くかな
2022/02/23(水) 19:16:45.48ID:Q2o1N4Td0
理不尽だと思われるコーディングルールも歴史があってそうなってたりするから
長いものに巻かれるしかない
2022/02/23(水) 22:15:21.75ID:PssNo99E0
俺なら嫌味のように
{
bool need_break=false;
while(... && !need_break){
//前半処理
if(!(need_break=...)){
//後半処理
}
}
}
とでも書くかな
2022/02/23(水) 22:33:27.74ID:ek+gncWLM
for (;;)

なんでみんなこれ使わないの?
2022/02/23(水) 22:36:06.79ID:v1sPphh80
泣いてるみたいで悲しい
2022/02/23(水) 23:22:31.05ID:lJym8p+qM
あと制御文の括弧前にスペース入れるのは少数派なんだろうか…
2022/02/23(水) 23:26:41.88ID:o4j3GXmb0
個々の場面で不適切でもチーム全員が適切に判断できないようなら
比較的マシそうな側に統一するルールにも合理性はある。

それとか「わからんかったらこうしとけ」みたいな口伝が
拡大解釈されていったりするのもありそうな話だ。
2022/02/24(木) 00:03:57.70ID:KIw+63Ii0
>>249
Google のガイドでは if や for の後に空白を入れる方針になってる。
私は入れないけど。
2022/02/24(木) 00:21:21.22ID:KIw+63Ii0
>>247
それが無限ループになるというのが読み取り難いからではないかな。
初期化やインクリメントの部分を省略したら単に何もしないのだろうと類推できるけど、
省略された条件式が真に判定されるのか偽に判定されるのかというのは例外規則として知ってなきゃわからない。

慣用句 (イディオム) と化してるので慣れてしまうと普通に読めるけど、
while(1) のほうが明示的な分だけわかりやすいのかもしれない。
2022/02/24(木) 00:27:00.80ID:DLFV0+Dqa
関数っぽさをなくすためにスペース空ける方がいいと思う
2022/02/24(木) 02:22:52.59ID:9O+r6lMKM
>>252
while文で無限ループを作れるにも関わらず
Rustではloop式を導入してる点が興味深いよね
loop文ではなくloop式なのでbreak 値; で値を返せて凄く便利
2022/02/24(木) 02:31:22.55ID:KIw+63Ii0
>>254
ループとしては無限ループにしておいて break で抜けるような構造は良くないといえばあんまり良くないんだけど、
そうは言っても存在する以上はその場合を明示的に表せるような構文があると便利ってのも確かで、
そのあたりは設計思想の違いとしか言いようがないよな……。
2022/02/24(木) 02:44:45.66ID:9O+r6lMKM
>>255
その構造が良くないというのは自分も昔はそうだったが単なる思い込みだと気付いたw
さらにwhileは先頭でif break、do whileは最後でif breakしているだけであるし
ある程度計算を進めてから途中でようやくif breakできないとwhileだと困ることもloop式で解決された
さらにループを抜けてbreakしたい時は値を返したい時が多いからloop文ではなくloop式が非常に便利
2022/02/24(木) 05:13:17.42ID:SpBJKMB7H
>>251,249
K&R2 では if や for, switch の後にはスペースを入れますね
私は基本的に K&R2 に沿って書きますが、関数の始まりを示す { は例外的に宣言に続けて書きます

int main() {
return 0;
}
2022/02/24(木) 06:47:25.50ID:iDpw9I/70
>>247
俺は使うよ
while(1) だと警告出るから
2022/02/24(木) 06:53:42.23ID:MBzpszCI0
俺もマジックナンバーがないほうが好き
2022/02/24(木) 08:03:43.62ID:PbuedMT9d
#define FOREVER for(;;)
2022/02/24(木) 08:20:28.13ID:MBzpszCI0
>>260
こう書くとbreakやgotoが嘘つきに見えるな
262デフォルトの名無しさん (ワッチョイ 8310-iDSx)
垢版 |
2022/02/24(木) 11:30:55.34ID:XK2EQ9NF0
#define DEATH_MARCH for(;;)
2022/02/24(木) 12:02:15.07ID:7WoYZRJzd
#define DISALLOW_BREAK for(;;)
#define FOREVER for(;;)

DISALLOW_BREAK FOREVER{
...
if(...)break;
}
264デフォルトの名無しさん (ワッチョイ 83b1-hSEA)
垢版 |
2022/02/24(木) 17:23:09.91ID:bIfpVEhP0
>>261
正規表現ライブラリとか使って、複雑な制御を見えなくするのも一つの手かも?
自分のところのbreak continueは嫌がられるが、他所なら見えないので。

結局機械語になれば、中でGoto(jmp)しまくっているわけなので。
2022/02/24(木) 17:32:25.81ID:MBzpszCI0
jmp命令は構造化プログラミングで問題視されるgotoとは違うぞ
2022/02/24(木) 17:36:24.61ID:KIw+63Ii0
抽象度が違う話だからなぁ。
2022/02/24(木) 17:36:30.96ID:MBzpszCI0
ダイクストラは「高級言語では」という限定をつけてgotoを問題視していたのであって
アセンブラや機械語に出てくる分岐命令はあの議論の対象外だ
2022/02/24(木) 17:38:56.51ID:KIw+63Ii0
>>267
だから >>264 は見えないところでやってる分には知らんって言ってるんだろ。
2022/02/24(木) 17:43:46.24ID:MBzpszCI0
>>268
てことは結局何も言ってないのと同じだな
Cを使えばjmpが見えなくなるなんてくだらん話は
break continueを禁止する理由とは無関係だ
2022/02/24(木) 17:44:23.55ID:5fQRd2wi0
SQL埋め込みのC言語goto使いまくってた
2022/02/24(木) 17:50:29.88ID:PbuedMT9d
K&Rでもgotoは醜いが使わないと余計な変数や不自然な構造が必要になるからねーとクギをさしてる
2022/02/24(木) 17:53:57.59ID:8VCxJpwXa
コードが80x120に収まれば俺はgotoなんて気にしない
2022/02/24(木) 17:55:30.50ID:9O+r6lMKM
>>271
そういうのもloop式導入で解決するから導入しよう
2022/02/24(木) 21:02:28.06ID:Qe3Dm4uv0
抜け出しgotoは分かる
飛び込みgotoはつらい
2022/02/25(金) 13:00:32.72ID:2Pynziee0
構造化プログラミングを盲信する気は毛頭ないが
それは違うぞ

抜けだしであろうが飛び込みであろうが
ループの端に設定された条件に従わない分岐は
ダイクストラが問題視する対象だ
2022/02/25(金) 13:19:00.10ID:Eg3DloqN0
MISRA-C でも、制御パスを変える、
goto, 複数return, (多重脱出からの?)break/continue などは禁止。
だから、ループ内で、やたらとフラグを持ち回る

でも、Linux では、
早期return, goto でエラー処理をまとめたりするから、フラグを持ち回らない
2022/02/25(金) 13:35:54.50ID:aDhOSI3tM
>>275
そんな無意味な制約を課しているとダメなプログラマーになってしまうね

>>276
MISRA-Cは本末転倒としか言いようがないね
結局その無意味な制約によって目的としたメモリ安全性などの成果を得られなかった
その長年の未解決だった課題はRustが全く別方向からようやく解決した
2022/02/25(金) 16:58:20.86ID:2Pynziee0
>>277
おまえさんもダイクストラみたいに学会誌に投稿したら?
2022/03/01(火) 11:42:38.47ID:iGO9Qf02a
break;とかcontinue;はいいの?
2022/03/01(火) 12:15:17.30ID:qblu1Z+O0
switch以外のbreakは制御式にない条件での脱出
continueは違う
2022/03/01(火) 12:24:02.66ID:QP0iZO8FM
どこでもexit
282デフォルトの名無しさん (ワッチョイ 03b1-65e0)
垢版 |
2022/03/03(木) 13:53:35.02ID:2Y1y5HDI0
グローバル変数禁止プロジェクトがあって、固定値が全てリテラルでばらまかれていたので、仕様変更でチーム員は苦労してた。
自分の担当箇所は謎関数を一つ作り、そこから値を得ていた。
2022/03/03(木) 14:05:48.79ID:o7MH0vY5M
グローバル変数禁止なのになんで定数まで禁止なんだ
2022/03/03(木) 14:16:38.79ID:bgg8zGG60
>>282
グローバル「変数」と「固定」値がリテラルでばら撒かれてるのは全然違う話だが?
苦労してるのはお前さんの能力に問題があるんじゃ…
2022/03/03(木) 14:18:42.95ID:iO+E/Lewd
マクロは使わんのか?
ただの素人のスパゲッティだな
2022/03/03(木) 15:16:49.50ID:dDnSjvDO0
センス悪いやつがいるせいで
必要なものまで制限されるんだよな

ロクに精査もせずに横暴な制限を作るやつらも
センス悪いやつの一員
2022/03/03(木) 15:48:11.59ID:NNobhPIrM
昔グローバル変数はなるべく使わないようにねってお願いしたら、グローバル変数が関数内のstatic変数になって返ってきて状況悪化させしまったことを思い出した…
依頼は正確でないとな
2022/03/03(木) 15:52:02.14ID:nN/xu0Sn0
>>287
望んだ改善ではないにしてもグローバル変数よりは関数内static変数のほうがマシで、悪化はしてないのでは?
2022/03/03(木) 15:55:02.85ID:7Ur+27OW0
必要なものが制限されるのは腹立たしいだろうけど、
現実にセンスないやつが今、現場にいる状況で比較的マシにしようと思ったら制限も已むなし。
2022/03/03(木) 15:55:56.96ID:9ZWmTo8BM
君は関数内static変数の破壊力を知らない
2022/03/03(木) 16:02:36.91ID:dDnSjvDO0
int *just_function(void)
{
static int not_global_variable;
return &not_global_variable;
}

struct common_variables
{
int fool;
int jerk;
int idiot;
};

struct common_variables *a_function(void)
{
struct common_variables cv;
return &cv;
}
2022/03/03(木) 16:03:41.51ID:dDnSjvDO0
static struct common_variables cv;
だった

笑い処でミスってどうするw
2022/03/03(木) 16:09:12.32ID:7Ur+27OW0
やりたいことは分割統治なんだよね。 プログラムを機能単位ごとに分割して部品にしたいの。
部品を束ねた部品があって、それを束ねて大きな部品にして……という綺麗に階層的な依存関係にしたいの。
色んなところからアクセスされるものがあるのが目に付くと綺麗に分割できてねぇなあと感じるという話であって
言語機能としての「グローバル変数」を使わないようにすれば綺麗になるというわけではない。
2022/03/03(木) 16:17:38.32ID:9ZWmTo8BM
グローバル変数一つ新規に作るのに何枚も書類を書かないといけないプロジェクトがあって、
その時は一つだけ管理テーブルという名称の構造体を作成登録した。
その後は必要に応じて構造体にメンバーを追加した。
追加の場合には許可がいらない。
2022/03/03(木) 16:23:37.12ID:dDnSjvDO0
俺のジョークそのまんまかw
2022/03/03(木) 16:28:52.42ID:rhQumEoNd
int型のグローバル変数が2つあればvoid*アドレスを分割して突っ込める

291みたいなstructへのポインタ突っ込んどきゃやりたい放題だよやったね!
2022/03/04(金) 08:30:10.22ID:kn6yruMU0
C++ の singleton クラスと
関数内static から戻ってくるのも 似たようなものになる?のか?
298デフォルトの名無しさん (ワッチョイ 0f24-84yK)
垢版 |
2022/03/06(日) 14:20:18.71ID:RiucPZY70
ref class SampleCls
{
internal:
property int A[int]
{
int get(int n)
{
int value = n * 100;
return value;
}
void set(int index,int n)
{

}
}
};
SampleCls objを実体化させた後に
s = s + "n= " + obj.A[i]+ "\n";
を5回繰り返したら0,100,200,300,400になったのですが
0に100をかけると100になるのでしょうか?
299デフォルトの名無しさん (ワッチョイ 0f24-84yK)
垢版 |
2022/03/06(日) 14:24:03.50ID:RiucPZY70
A[i]の値がどんなふうに決まっているのか知りたいのですがよくわかりません
どなたか教えていただければ幸いです。
300デフォルトの名無しさん (ワッチョイ 0f24-84yK)
垢版 |
2022/03/06(日) 14:42:22.06ID:RiucPZY70
すみません、解決しましたSet()とget()の動きをちゃんと理解していなかったことが
原因でした。
2022/03/06(日) 16:10:19.16ID:g5zD4gJoM
まず、自分が何の言語で書いてるか理解したらもっと早く答えが手に入ると思うよ…
302デフォルトの名無しさん (ワッチョイ 9fad-Djfv)
垢版 |
2022/03/07(月) 04:27:05.03ID:t70FSnsj0
ダイクストラって名前を聞くたびに大工が屋根の上で仕事をしている姿が浮かんでしまう
2022/03/07(月) 06:18:54.97ID:RhJCMKRm0
キャスバルレム大工ん
2022/03/08(火) 12:29:53.09ID:Ki3D6geg0
アルゴリズム系でかっこいい名前はダイクストラとラグランジュ
2022/03/08(火) 14:05:47.68ID:0fUGXJlMd
構造化プログラミングはアルゴリズムじゃない
2022/03/08(火) 20:30:43.45ID:Ki3D6geg0
ダイクストラ法な
2022/03/09(水) 01:38:28.31ID:D4BPG9+J0
大屑虎
2022/03/10(木) 20:38:39.30ID:kXeE1dtK0
malloc,freeを多用すると断片化でいずれOSが落ちるってのは
Windows11やLinuxでも起きる問題ですか?
2022/03/10(木) 20:42:14.86ID:4CPsM6xv0
使い方間違えていればOS問わず不味いだろ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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