C言語なら俺に聞け 164

2025/07/23(水) 15:30:01.81ID:eCR5cXRr0
(新スレ立ての際上記コマンドを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

C23 最新ドラフト
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.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言語なら俺に聞け 163
https://mevius.5ch.net/test/read.cgi/tech/1721137434/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
158デフォルトの名無しさん (ワッチョイ 1f2f-5yZn)
垢版 |
2025/11/15(土) 03:54:57.59ID:61X/lnkN0
あら C99で空宣言使えなくなった?

typedef enum {} PINSTATE;

typedef struct s_pinobj {
bool(*sequence)(struct s_pinobj * obj);
uint16_t tickcount; // 10ms ticking
PINSTATE state;
.
.
} TXXX;
などと使っていたんだけど、エラーになるようだ。
循環参照対策はどうするんだろ?
159デフォルトの名無しさん (ブーイモ MM4f-ACTV)
垢版 |
2025/11/15(土) 08:31:52.06ID:u+2daHyUM
客→クレジット会社鯖→決済情報→商店
の流れを

客→決済情報→商店
だとよ

つまりクレジット会社鯖でやってる業務をすべてなりすまししてるわけだ
鯖と商店とのやり取りもザルだったってこと
2025/11/15(土) 11:24:07.72ID:nRXHw60f0
>>158
空宣言というのは enum の列挙子がゼロ個ということを言ってるの?
enum が導入された C89 の時点で列挙子はひとつ以上が必要ということになっていて列挙子がゼロ個で良かった時代は無い。
(出来たとしたら処理系の拡張。)

そして enum の宣言は必ず列挙子のリストを必要としている。
struct のように { } を書かなければ不完全型として宣言されるというようなことはないから前方宣言で名前だけ書いておいて後で中身を定義するということも出来ない。
不完全型の列挙型というものは存在できないってことね。
2025/11/15(土) 11:40:24.78ID:YWAh8Gcip
>>159
普通は後にこんな流れが加わってるはず
商店→クレジット会社→決済情報コンペア→決済確認→商店→決済完了
162デフォルトの名無しさん (ワッチョイ 1fc9-ACTV)
垢版 |
2025/11/15(土) 14:39:56.35ID:mkkTDyMO0
>>161
そうなってないから決済が完了し、商品が届けられて犯罪成立しちゃってる

あとになって入金が合わずに発覚しただけだからなぁ
2025/11/15(土) 15:15:39.55ID:jhUkF2/k0
>>162
システム考えた奴、頭悪いのかなぁ?
暗号化とか過信したのかなぁ?
164デフォルトの名無しさん (ワッチョイ 1fc9-ACTV)
垢版 |
2025/11/15(土) 15:38:28.29ID:mkkTDyMO0
例え決済情報を盗まれてもさ、アクセス先がクレジット会社でもないとこからのやつを
なんで正規なものとして受け取るかね?
いろいろおかしい
2025/11/17(月) 21:52:49.67ID:WNaQVVCp0
C言語とは直接関係ない話題だが、
カード情報が盗まれてそのまま決済が
通過してしまった事件が過去にあった。
カード持ち主には返金されたが、
損害を誰が負担するかで揉めてた。
カード会社が持つケースもあったが、
テナント企業が弱いと、涙を流すケースもあった。
2025/11/17(月) 21:56:21.37ID:ktJ33fIe0
直接どころかまったく無関係で草
2025/11/18(火) 00:14:16.54ID:Ie2Q8O000
Eコマースサイト作る上では必要な知識だからな
全く無関係って訳ではない
168デフォルトの名無しさん (ワッチョイ 259c-L2M8)
垢版 |
2025/11/18(火) 00:20:37.35ID:3HXouIV30
Cで作るの?
169デフォルトの名無しさん (ワッチョイ 5202-F/8Y)
垢版 |
2025/11/18(火) 16:36:11.76ID:d9hs+rsN0
cのcgiだって可能だしあってもいいだろ(?)
170デフォルトの名無しさん (アウアウウー Sa85-H7iN)
垢版 |
2025/11/18(火) 23:45:44.92ID:+AochNn2a
windows で
setlocale(LC_ALL, "ja-JP.UTF8"); とか
setlocale(LC_CTYPE, "ja-JP.UTF8"); とか
プログラムの先頭で設定しても無駄?
console は chcp 65001 してる
fopen() のファイル名に UTF8 で渡したいんだが
出来れば readdir() も UTF8 で取得したいのよ
2025/11/19(水) 07:24:28.12ID:1qR7LTyn0
ソースコードがSJISなら無駄
2025/11/19(水) 10:44:13.50ID:sa05/K8dd
opendir and readdir themselves work on bytes. They do not perform and reencoding.
Some filesystem drivers may impose contraints on the byte sequences.
I would expect the form returned by readdir to work when passed to opendir.
I'd like to know how you were able to find out that opendir and readdir do not perform any reencoding? 
You can trace it through the C library source and the kernel code.
If you run strace ls, you can directly start from the kernel entry point: the open syscall.
The generic filesystem support code passes all bytes other than null and / along unmodified.
It's only some filesystem drivers that transforms file names.
2025/11/19(水) 11:29:22.16ID:MnCaLNwG0
>>170
普通の入出力はテキストモードとバイナリモードがあって、ロケールの設定がテキストモードの振る舞いに影響するんだけど……
Windows の場合はテキストモード・バイナリモード・ユニコードモードに分かれていて _setmode でユニコードモードに設定する必要がある。
しかしユニコードモードの設定はワイド入出力系関数 (wprintf など) にしか影響を及ぼさない。

そんでその辺の設定をしても、入出力の内容に関してであってファイル名を UTF-8 で渡すのはたぶん駄目なはず。 (確認はしてない。 すまぬ。)
ファイル名はワイド文字 (UTF-16) に変換してから _wfopen で開くのが正当な方法だと思う。

Windows に readdir は無いので FindFirstFileW, FindNextFileW を使うのが普通の方法。

だいぶん前に調べたときは msvcrt と ucrt でちょっと振る舞いが違ったような記憶があるのでそこらにも注意が必要。
ucrt は色々と大きく改良されているみたいなのでひょっとするともっとモダンな方法があるかもしれない。
2025/11/19(水) 12:12:33.50ID:DtAPl5720
UTF16は廃止してほしい
175デフォルトの名無しさん (ワッチョイ ae25-Lseg)
垢版 |
2025/11/19(水) 13:55:46.72ID:95cnfr9u0
ANSI C以前のC処理系で、frexp()の第2引数が、intではなくdoubleへのポインタになってるやつってありましたっけ?
2025/11/20(木) 08:57:49.57ID:o66Cu/z90
>>175
無いです
2025/11/20(木) 10:19:51.08ID:WN+N3a+40
intで足りなくなったときに便利
178デフォルトの名無しさん (アウアウウー Sa85-H7iN)
垢版 |
2025/11/21(金) 10:02:41.70ID:VM+m9mUGa
doubleの方が有効桁数少ないんじゃね
2025/11/21(金) 10:06:53.94ID:VM+m9mUGa
>>173
>Windows に readdir は無いので FindFirstFileW, FindNextFileW を使うのが普通の方法。
もちろんそうだろうと思う有難う
だが WideCharToMultiByte とか MultiByteToWideChar をちょっとすっ飛ばしたかったんだ
2025/11/21(金) 11:13:01.47ID:G3R9bFuG0
>>179
Windows アプリケーション内部では UTF-16 で扱って、必要なら入出力のときに変換するというのが楽だよ。
モードの設定 (前述の _setmode) をしておけば入出力のときの変換は勝手にやってくれて明示的にプログラマが何かする必要がない。
Win32 API (64ビット版を含む) は UTF-16 が基礎なのでそれで統一しておけば文字コード変換が必要な場面は生じない。

マルチプラットフォームだとかサードパーティー製ライブラリと組み合わせるだとかし始めると色々と困ることもあるし、全体の設計は状況によるんだけど……
181デフォルトの名無しさん (ワッチョイ 5202-F/8Y)
垢版 |
2025/11/22(土) 01:33:08.03ID:CDycBrMu0
>>177
doubleの指数部11bitだったはずなので返る指数は±2**10-1 = ±1023の範囲だ
最低で±32767の範囲を表現できるintがあれば常に十分なはず
よってfrexpのexpはint型のみでいい>>175
2025/11/24(月) 09:05:52.94ID:StdCmM8J0
long longでいいじゃん
183デフォルトの名無しさん (ワッチョイ 67f6-WraW)
垢版 |
2025/11/25(火) 10:15:11.74ID:F0vSFTML0
frexp() の第2引数ってそもそも性質からして整数以外有り得ないんじゃね
むしろ第1引数も整数でも良いくらい
2025/11/25(火) 12:28:06.26ID:MC0j4mydM
複素数に拡張してくれ
核開発に使える
185デフォルトの名無しさん (スフッ Sd7f-Lg42)
垢版 |
2025/11/25(火) 13:48:33.82ID:rSIO8n1ld
質問です
int hoge(wchar_t *p);
な関数があって
int a = hoge(L"fuga"); だと正常で
int b = hoge("fuga"); だと誤動作します
理由は判りますが
そもそも引数がcompile errorにもwarningにもなりません
C++みたいにcompile errorにする方法は?
2025/11/25(火) 15:48:36.00ID:evMdha/k0
>>185
規格合致プログラム (conforming program) ではないので許容するとしたら処理系の拡張。
主要な処理系ではエラーになると思うけど、なんていう処理系を使ってるの?
2025/11/26(水) 10:42:02.61ID:ZGYu6bhA0
念のために仕様をよく読んで検討したら wchar_t が char の別名として定義されることは理屈の上では認められることを発見した。
そしてその上で文字列リテラルとワイド文字リテラルが異なる符号体系を持つということも可能ではある。
もしそういう処理系なら >>185 の事例は型が合った上で誤作動 (プログラマの想定と異なる動作) を引き起こすかもしれない。

実際にそういう処理系があるのかどうか知らんけど libc のドキュメント中で組み込みシステムではそういうのも妥当かもしれないという言及がある。
https://www.gnu.org/software/libc/manual/html_node/Extended-Char-Intro.html#index-wchar_005ft
2025/11/26(水) 11:37:21.77ID:g4n+mUAPa
>>186
VCで確認したら警告は出たがエラーではないので実行出来た上で誤作動(描かれた通りには動いている)
警告レベル替えればエラーにも出来るんだろうけど
文字列リテラルポインタからワイド文字列リテラルポインタへの自動キャスト(あるいはその逆のキャスト)以外のところにも影響出てエラーだらけになるかも
文字列リテラルポインタからワイド文字列リテラルポインタへの自動キャスト(あるいはその逆のキャスト)限定でエラーにならないかな
2025/11/26(水) 15:23:02.27ID:ZGYu6bhA0
>>188
MSVC がそんな馬鹿げた仕組みとは驚きだな。
合わない型 (本来は暗黙の型変換も認められない型) は一律にエラーになるべきだけれど、とりあえず自分のコードで型が合わないケースをエラーにしたいなら
#pragma warning(error : 4133)
とするくらいが落としどころじゃないかと思う。
2025/11/27(木) 05:19:27.44ID:KfDQEfrsd
ありがとうございます
>>188
よくみたらwarning出てたのみのがしてました
>>189
良い感じにcompile errorにしてくれました
2025/11/29(土) 18:02:47.96ID:MnjgLok40
固定小数点でも誤差が出ます
とかトンチンカンなこと言い出すやついるけど
割り算しなきゃほぼ誤差ないんだよ
192デフォルトの名無しさん (ワッチョイ 79f6-v69L)
垢版 |
2025/12/01(月) 12:04:42.29ID:HDTmHOXC0
gmp使ったソースだった
2025/12/03(水) 11:46:07.94ID:G3Cx7y7oa
これだ
https://www.youtube.com/watch?v=prVBoU6K9Hg#t=6s
6秒-
194デフォルトの名無しさん (ワッチョイ 6a4e-Qxko)
垢版 |
2025/12/03(水) 22:47:42.54ID:E5HetRmY0
>>1
JPCERT C コーディングスタンダード
に準拠しているか調べる無料で簡単なツールってない?
make/gcc の option でいける?
195デフォルトの名無しさん (ワッチョイ 6a4e-Qxko)
垢版 |
2025/12/03(水) 22:51:48.92ID:E5HetRmY0
こういうのも、流行のclaudeとかで聞くもんなんかな?
2025/12/09(火) 18:21:11.05ID:4lQ1LhG80
ツールを起動するだけで CERT C コーディングスタンダードに準拠か否か判定するというレベルの簡単なものはないというか無理。
機械的な検証が困難な項目は人が精査する必要がある場合もあるからツールはあくまでも補助だよ。
まずは項目を大まかに分類して機械的に出来るところは機械的にやって残りは人が検証 (レビューやテスト) する体制を整えるしかない。
きちんとやろうとすると技術的なことより組織の運営の話になるんじゃないかな……
2025/12/11(木) 01:14:00.20ID:VWVRinEO0
コーディングルールはサイトでの指定以外は気にしたことが無いなあ笑
198デフォルトの名無しさん (ワッチョイ 1f22-1bfe)
垢版 |
2025/12/16(火) 15:40:55.95ID:unxv0LoC0
C言語であるサブルーチンを作ろうとしてるんだけど、FILE* fで開いたファイルを一旦閉じて作業をして、また開きたいんだが、FILE* f だけを引数にしたい。そんなこと出来る?
開いたファイルの名前を引数にできれば、その名前で再度開けるが、FILE* f のポインタだけを引数にしてそんなこと出来るのかな?
2025/12/16(火) 16:02:20.55ID:BhrzwszF0
できない
FILEが生きているうちならパス名を調べるのは多分できるだろな
2025/12/16(火) 16:25:43.79ID:8p6wZKuQ0
>>198
閉じた時点で FILE* 型のハンドルは無効になる。
無効になったハンドルに対して出来ることは何ひとつない。

ファイルを開いている内に再び開くために必要な適用な情報を確保しておくしかない。
言語仕様上は細かい規定は無いのでホスト環境 (OS) に依存したなんらかの手段を使う必要がある。
Linux なら inode 番号あたりを保持しておけばファイル名を覚えておくより短くて済むからいいんじゃないかな?
まあ開くときにはたぶん一旦ファイル名を取得する必要はあるんだけど。
(他の OS でもだいたい似たような仕組みは有る。 Windows だと GetFileInformationByHandle を調べてみると良い。)
201デフォルトの名無しさん (ワッチョイ 1f22-1bfe)
垢版 |
2025/12/16(火) 17:12:42.21ID:unxv0LoC0
みなさんありがとう。OSはWindowsです
GetFileInformationByHandle も調べてみたけど、これではファイル名は出てきませんね
多分FILE* fからファイル名が出てこないと、無理っぽいですね
2025/12/16(火) 17:27:33.70ID:BhrzwszF0
GetFinalPathNameByHandle
geminiに聞いただけで期待通り動くかは知らん
2025/12/16(火) 17:47:00.48ID:fxmzBDbu0
windows の場合はファイル番号 (FRN) から直接にファイルを開くことができるっぽい。
204デフォルトの名無しさん (ワッチョイ 1f22-1bfe)
垢版 |
2025/12/16(火) 17:48:08.13ID:unxv0LoC0
>>202
GetFinalPathNameByHandleやってみたけど残念
まあ、考えたらWindowsではHANDLE。FILEではないからね。HANDLEなら多分うまくいくんだろうね
でもいい関数を教えてもらいました。ありがとう
FILEからHANDLEに変更して作り直すかな。他人が作ったソフトを改造してやってるので
そもそも、FILEとHANDLEって何が違うのかなコンバートって出来る?
HANDLEはWindows専用でやってそうだから無理そうね
2025/12/16(火) 18:25:26.73ID:BhrzwszF0
>>204
FILEからHANDLEは取り出せる
よく調べろ
2025/12/16(火) 19:25:00.08ID:fxmzBDbu0
Windows では FILE の下にファイルディスクリプタっぽいものがあって、その下に本来の Win32 API があるという三層構造になってる。
msvcrt.dll (または ucrt.dll) が C や POSIX の仕様に合わせた機能を提供しているが、必要に応じて Win32 API 用のハンドルを取り出すことはできる。
207デフォルトの名無しさん (ワッチョイ 1f22-1bfe)
垢版 |
2025/12/16(火) 19:50:18.68ID:unxv0LoC0
ありがとう。調べてみます
208デフォルトの名無しさん (ワッチョイ 72d0-AmFD)
垢版 |
2025/12/16(火) 21:05:39.33ID:ugyur8tL0
最近開いたファイル から引っ張ってこれないのか?
209デフォルトの名無しさん (ワッチョイ a77f-Iabs)
垢版 |
2025/12/16(火) 21:38:52.25ID:x7DniZMa0
>>198
階層設計間違ってるだけだと思うがな
https://atmarkit.itmedia.co.jp/bbs/phpBB/viewtopic.php?topic=33590&forum=7
2025/12/17(水) 00:35:55.40ID:9wOraPAW0
そのファイルを誰かが開くことは想定しなくて良いのか?
211デフォルトの名無しさん (ワッチョイ 12ad-FV3J)
垢版 |
2025/12/18(木) 01:16:26.13ID:qZgjLdb10
>>198
それ絶対に閉じないといけないのか? fflush() するだけじゃダメ?
2025/12/18(木) 09:00:10.06ID:T7xRzDCt0
DBとして機能するファイルならDBつかえよ?
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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