C言語なら俺に聞け 163

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 7bba-Lem2)
垢版 |
2024/07/16(火) 22:43:54.18ID:ZrsCjURC0
!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

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言語なら俺に聞け 162
https://mevius.5ch.net/test/read.cgi/tech/1698653580/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2024/12/16(月) 22:48:31.98ID:26oXJeTE0
配列の大きさを得るために配列のバイト数を配列要素のバイト数で割るのはごく一般的なイディオムなので何がわからないのかわからない。
475デフォルトの名無しさん (JP 0Hff-K+1m)
垢版 |
2024/12/16(月) 22:57:30.45ID:Q04ymynwH?2BP(1000)

これらのアイデアを実装するために取り組んでいる中で、EchoAPIが設計ワークフローを本当に効率化してくれた
2024/12/17(火) 00:02:56.65ID:KLd2kDAJ0
>>472
Unicodeの場合、2バイトで1文字を表現
@@AABBCCDDEEFFGGHH で9文字、18バイト

ANSIの場合、
@ABCDEFGH で9文字、9バイト

> sizeof(buf)/sizeof(TCHAR)

sizeof(buf)が指すのはバイト数、Unicodeなら18、ANSIなら9
sizeof(TCHAR)が指すのは1文字のバイト数、Unicodeなら2、ANSIなら1

そして stprintf_s の引数 sizeOfBufferはバイト数ではなく「格納する最大文字数」であること

引数がバイト数ならsizeof(buf)でいいけど、引数が文字数を求めているならsizeof(buf)ではおかしくなる
上の例で言えば、Unicodeは18バイト9文字で本来は9とするところを18と指定してしまうことになる
すると関数側はバッファが18文字分(バイトで32バイト)あると勘違いするわけでバッファオーバーフローを起こす

sizeof(buf)/sizeof(TCHAR) は18バイトの領域があって、それを1文字のバイト数で割って「9文字」ということ
2024/12/17(火) 00:05:50.03ID:KLd2kDAJ0
丸付き数字自体が1文字1バイトって意味じゃないからな
内部表現を表すために使用しただけで数字がx文字目として見て
478デフォルトの名無しさん (アウアウエー Sae2-N2kD)
垢版 |
2024/12/17(火) 10:25:09.48ID:hEkGaD6xa
_countof()
2024/12/17(火) 12:09:40.76ID:2fZmW/080
いやvc++使ってんならstd::sizeでいい
2024/12/17(火) 12:36:10.86ID:5c2Y3gwMp
C言語スレだろw
2024/12/17(火) 12:49:19.32ID:6SQ8uEd20
そこは禁欲しましょう
482デフォルトの名無しさん (ワッチョイ 33ef-iztn)
垢版 |
2024/12/18(水) 01:25:30.31ID:ILkVh3nA0
>>476
朝わかりやすいね
でもANSIって1バイトと2バイト混合できるよね?どうなっちゃうんだろう
2024/12/18(水) 02:49:26.43ID:NqM0X43U0
>>482
ANSIはバイト=文字数
そもそも論理的な文字数じゃなくて処理単位での文字数ね
だから strlen("あいう") = 6
strlen("123あ67い0") = 10 // 数字は半角(1バイト)、ひらがなは全角(2バイト)

Unicodeの場合でも正しい文字数になるわけじゃない、サロゲートペアの場合に文字数は2(4バイト)になる
2024/12/18(水) 09:23:44.77ID:w442kBzm0
Unicode だとサロゲートペアを脇においても異体字だの合成だのといったものがあるし、人間が紙の上に書くときの直感的な感覚で言うところの「文字数」とは定義が違うので、各文字コードの仕組みを知っておくしか仕方がない。
485デフォルトの名無しさん (ワッチョイ 3339-iztn)
垢版 |
2024/12/18(水) 17:31:07.70ID:ILkVh3nA0
>>483
>>484
つまりこの方法だとコンパイル時に気をつけるしか無いってことか、大変だね
テキストエディタみたいなの作ろうとすると禿げ上がりそう
2024/12/18(水) 17:41:39.49ID:NuF84nX60
文字コード問題よりC言語で作れってほうがハゲりそうだ
2024/12/18(水) 17:56:26.27ID:2i1n2GHXM
固定長ならそこまで禿げないかと
2024/12/18(水) 18:24:42.01ID:ccS3E3GJ0
>>485
方法が大変?
お前まだ理解できてないぞ
一般論として文字コードの扱いは大変だがTCHARの仕組みは単純だ
2024/12/18(水) 18:25:51.62ID:U+/f/ac80
CがC++だったとしても変わらんでしょ
VSCodeはレンダリングの都合でWebルレームワークとjavascriptで作られてるからC/C++製エディタと比較して遅いというデメリットがある
2024/12/18(水) 18:34:50.50ID:ccS3E3GJ0
c言語で文字列処理はクソ面倒でしょ
ライブラリの整備からやる必要がある上にコードがとっ散らかる
2024/12/18(水) 18:36:51.22ID:U+/f/ac80
Windowsの場合使用フォントに応じて描画幅を返すAPIに丸投げできるから大した手間にならないが
メモ帳の「右端で折り返す」相当を実装する場合右端のどこで切るかでその人センスが露になる
2024/12/18(水) 18:41:35.77ID:U+/f/ac80
>>480
何か誤解があるみたいだが開発言語にCを選ぶようなやつがそんなのを面倒に感じる事はないんだよ
2024/12/18(水) 22:35:54.78ID:w442kBzm0
アプリケーションを作るにあたって TCHAR が必要になる状況はそれほどない。
Unicode 対応をきちんとやるならそれとは別に ANSI 版も作るという必要性はないし、両方を作る必要性がないなら切り替えを意識する必要もないから。
最初から WCHAR で書けばよい。

ライブラリとしてまとめるならどちらにも対応したほうが良いこともあるかもしれんけど。
2024/12/18(水) 23:14:04.02ID:1nhczz8f0
テキストエディタ、アセンブラで作った奴いるだろう
ハゲてはいなかったと思う
495デフォルトの名無しさん (アウアウエー Sae2-N2kD)
垢版 |
2024/12/19(木) 15:05:41.21ID:p9TYuGiMa
>>483
strlen("123あ67い0") == 12 // utf-8
2024/12/19(木) 15:35:21.01ID:boHB/shj0
strcat()、実装大変そうだな
2024/12/19(木) 18:03:52.50ID:KNZC4rFA0
UTF-8のバイト数ではなく文字列の長さを調べるソース
https://drive.google.com/drive/folders/10jgzKVUYPXQhC566bBmrqnnBLJI4pEbL
2024/12/19(木) 18:29:36.25ID:ByBpVqn8M
>>497
Unicodeで文字列の長さって何?
書記素クラスタか?

って突っ込まれるから知ったかぶらないほうがいいぞ
2024/12/19(木) 18:32:55.82ID:KNZC4rFA0
>>498
文字数を数えられるように自分で書いたのだけど?
文字数数えられるけど知ったかとは?
2024/12/19(木) 18:34:44.41ID:hCGKCs/t0
👩🏽‍👩🏿‍👧🏻‍👧🏽
2024/12/19(木) 18:41:15.54ID:ByBpVqn8M
>>499
それがまさに知ったか
unicodeの基礎すらわかってない
そんなやつのライブラリなんで誰が使うんだよ
2024/12/19(木) 18:45:26.23ID:KNZC4rFA0
>>501
基礎ってなに?
ただ文字数数えれるプログラムとしてだしたのに
2024/12/19(木) 18:50:39.22ID:ByBpVqn8M
>>502
それは書記素クラスタか?ときいてるだろ
でもその言葉の意味がわからんのだろ?
2024/12/19(木) 18:52:55.31ID:KNZC4rFA0
>>503
なんで書記素クラスタって言葉にこだわってるの?
もしかして教科通りにU+数字じゃないから言ってるだけ?
2024/12/19(木) 19:11:26.12ID:hCGKCs/t0
﷽は1文字か?
2024/12/19(木) 19:27:41.47ID:KNZC4rFA0
>>505
1文字 3バイトみたいだね
ソースを変えて出力してみた
2024/12/19(木) 19:38:58.12ID:hCGKCs/t0
そうなんだ
よかったね

https://www.unicode.org/Public/emoji/latest/emoji-zwj-sequences.txt
2024/12/19(木) 19:46:58.36ID:zv08w2oi0
main関数用のヘッダファイル用意してて草
2024/12/19(木) 19:59:42.44ID:iU+Lg9qY0
unicode怖ひ
2024/12/19(木) 20:00:17.69ID:y/hB6qNpr
退勤前に>>497見て、
ああ、"フロッピーディスク"って入れたら8が返り、"ハードディスク"って入れたら2.5が返るような関数だろ。
って思いつつ帰宅したら、またお前らときたら
2024/12/19(木) 22:28:22.60ID:uLfYubV70
>>509
自然言語がぶっ壊れてるんだよ。
Unicode は自然言語のぶっ壊れをどうにかこうにかコンピュータで扱える形にしただけ。
512デフォルトの名無しさん (ワッチョイ eb78-RqoG)
垢版 |
2024/12/20(金) 15:28:36.64ID:raronLtC0
JAIST、「並行量子通信プロトコル」の完全な自動形式検証を実現
http://news.mynavi.jp/techplus/article/20241220-3090485/
513デフォルトの名無しさん (JP 0Hff-K+1m)
垢版 |
2024/12/20(金) 23:42:16.35ID:yXvtHThaH?2BP(1000)

最近のRESTful APIについての議論に触発されてEchoAPIを試してみたところ、エンドポイントのシミュレーションツールがテストプロセスを非常に効率化してくれた
514デフォルトの名無しさん (ワッチョイ 3351-iztn)
垢版 |
2024/12/21(土) 07:13:36.08ID:37tGDg2N0
IsWindowVisible
IsWindowEnabled
EnableWindow
のダイアログ版教えてくりゃ
515デフォルトの名無しさん (アウアウエー Sae2-N2kD)
垢版 |
2024/12/21(土) 10:49:43.14ID:bIHzWCsda
GetWindowHandle
516デフォルトの名無しさん (ワッチョイ 3351-iztn)
垢版 |
2024/12/21(土) 21:59:52.73ID:37tGDg2N0
>>515
つまりどういうことだってばよ
2024/12/21(土) 22:49:23.50ID:Bjr5M2i00
>>516
Win32の板できけ
518デフォルトの名無しさん (ワッチョイ eb53-XATa)
垢版 |
2024/12/22(日) 02:23:50.05ID:SmvDArN50
>>517
なるほど
2024/12/29(日) 08:16:36.48ID:5Nra/jss0
%*d
こんなの初めて知った
B1.3 Formatted Inputに載ってたけど読んでなかった
2024/12/29(日) 10:03:55.05ID:RHfwjsVRa
(s)scanfのフォーマット引数もパターンマッチのように使えて便利だったり
521デフォルトの名無しさん (ワッチョイ 9aad-Udw9)
垢版 |
2024/12/30(月) 16:23:40.30ID:QwWcwTek0
>>519
俺はそれ20年以上前に知ったような気がする。
フォーマットの文字列をわざわざ別に作らなくて済んで素晴らしいと思った記憶がある。
522デフォルトの名無しさん (アウアウエー Sa52-fscC)
垢版 |
2024/12/31(火) 13:18:32.28ID:dvbSbmj1a
実は正規表現が使えるんだぜ
2024/12/31(火) 13:46:40.77ID:KJy4fxay0
ネイピア数や円周率を誤差ナシで扱えると嬉しい
2025/01/02(木) 15:48:37.33ID:8mwDch1n0
円周率って math.h とかに入っているの?
それとも
pi = 4.0 * atan(1.0);
とかで持ってくるものなの?
2025/01/02(木) 19:46:55.76ID:dC27qXct0
>>524
言語仕様にはないが、処理系によっては有ることもある。
特定の環境でコンパイル・実行できればよいならそれを使えばいいし、そうでないなら工夫も必用だろうし……
どのくらい移植性に配慮するかによるんじゃないの。
2025/01/02(木) 19:58:10.79ID:dC27qXct0
double の精度が有限な以上は無理数を誤差なく扱うのは不可能だし、どうしてもやりたいなら数値計算ではなく解析的な計算をするしかない。
ただ、工学的な用途だと誤差をゼロにする意味はあまりないことが多くて、誤差の程度が保証されることが需要。
たとえば分子一個分より小さい桁の部分で正確でも何にも使えないから考えるだけ無駄でしょ。
2025/01/02(木) 22:08:15.15ID:8mwDch1n0
ちょっと解析的な計算というのが正確にわかっていない

数値的な計算というのは有限差分法とか用いて近似的な解を求める方法だよね?

解析的な計算というのは a *x^2 + b * x + c = 0 なら手計算で解けるよというやり方?
使ったこと無いけどマスマティカとかそういうソフトだっけ?
2025/01/02(木) 23:00:55.85ID:dC27qXct0
>>527
そう。 要は数式の変形で解くやりかたってこと。
どのくらいのものを扱いたいかによるけど四則演算と巾乗くらいからなる簡単な式を扱えればよいなら C で書いてもそれほど高度というほどではない。
リスト構造を作って切り貼りするってだけなので。
とはいえ、計算を始めたいときにやる下準備としてはかなり面倒臭いだろうとは思うけど。
2025/01/03(金) 13:18:29.38ID:4R6C6cdS0
なるほどね、解を公式化しておいて虚数が必要か判定する感じだろうね
530デフォルトの名無しさん (アウアウエー Sa23-Y8TR)
垢版 |
2025/01/05(日) 10:58:58.82ID:8kdOFrcZa
πをπのまま計算して最後にmπで出力してくれれば良いのにと思うことは多い
2025/01/05(日) 11:04:48.60ID:caTYcs4C0
数式処理の基礎の基礎ならこのあたりがオススメできると思う。

C言語による標準アルゴリズム事典
https://gihyo.jp/book/2018/978-4-7741-9690-9
532高卒工員 ◆rysjzJ5XpQ (ドコグロ MMde-pbJa)
垢版 |
2025/01/13(月) 10:59:54.95ID:EpHsvAOYM
「」
533デフォルトの名無しさん (アウアウウー Sa91-HZB4)
垢版 |
2025/01/17(金) 16:58:25.38ID:GO6/DX25a
Cの糞仕様でmath.hインクルードしてなくても
int hoge(int) って解釈されるから
本当は double hoge(double) だったり float hoge(float) だったりしても
コンパイルだけ通ってリンク後に問題起こすってのが昔はあったな
534デフォルトの名無しさん (ワッチョイ 862a-Zdzc)
垢版 |
2025/01/17(金) 18:21:44.43ID:eoeaxZuy0
error: implicit declaration of function 'hoge' にならないの?
535デフォルトの名無しさん (ワッチョイ 555b-pCI4)
垢版 |
2025/01/17(金) 18:47:49.86ID:is0uPVRE0
1のサンプルコードでコンパイル通らなかったから2のコードのようにキャストしたんだけど動き的には同じだよね?

1,pStrIndex = malloc(sizeof(TCHAR*) * count);
2,pStrIndex = (TCHAR**)malloc(sizeof(TCHAR*) * count);
536デフォルトの名無しさん (ワッチョイ 6a17-wArI)
垢版 |
2025/01/17(金) 19:25:43.49ID:aSzNgrb80
だまってC++のスレいけよ
2025/01/17(金) 19:31:42.24ID:frJzdCet0
先に心療内科の外来に相談した方が良い
2025/01/17(金) 21:10:14.26ID:SH5Lw3P50
>>533
厳密に言うと extern int hoge(); と暗黙に宣言したかのように扱うルールだった。 C89 では。
C99 で削除されたルールだけど今でも警告付きで通してしまう処理系はあるな。
2025/01/17(金) 23:50:49.72ID:SH5Lw3P50
>>535
C では void* から他のポインタへ暗黙の型変換が許されるが C++ では許されない。
コンパイルエラーになってるならたぶん C++ を書いてる。
(処理系によってはオプションでエラーや警告を制御できることもあるけど。)
2025/01/19(日) 13:12:34.18ID:pnTgRmOE0
二次方程式を式変形で解くのは「代数的」な解法な気がする

「数値的」解法はコンピュータ利用?、「解析的」解法?
2025/01/19(日) 13:18:38.18ID:ix4t29qjM
そんな用語の意味ごとき自分で調べてわからんか?
542デフォルトの名無しさん (アウアウウー Saa7-C2Lh)
垢版 |
2025/01/20(月) 13:48:58.08ID:G+ryJ45Ga
「二次方程式を式変形で解く」の意味が
ax^2+bx+c=0 の解 α, β をそれぞれ a, b, c の式で表す
という意味なら代数的解法か?単に構文解析の気もするが
α, β を浮動小数点数(複素数を含む)で表す
という意味なら数値的解法か?解析的解法か?
単に解の公式に代入してるなら解析的解法の訳が無い罠
543デフォルトの名無しさん (ワッチョイ 7f9a-eCkH)
垢版 |
2025/01/20(月) 15:06:20.10ID:rx9N4QIY0
元の発言はたぶん円周率を近似値に置き換えないぐらいのことが言いたかっただけでしょ
5chのコテハンなんだからたいして考えてモノ言ってるわけじゃないだろうよ
2025/01/20(月) 17:55:23.24ID:CIg2w/Qm0
円周率は大体3
2025/01/20(月) 20:30:52.25ID:pd7YCKBV0
奥村先生のアルゴリズム事典に二次方程式を解くコードが載ってる
解の公式だけで解くと桁落ちが生じるので解と係数の関係も使ってる。
2025/01/20(月) 23:33:08.85ID:acq30m6X0
ポインタについて分かりやすく説明してくんろ
2025/01/21(火) 08:28:35.17ID:yRL5l1cZa
最近どっかで観た流れだな
はちみつのコピペか
2025/01/21(火) 19:43:21.46ID:OWL66YDB0
コンピュータのマシン語は高級言語で言うところの「変数名」による識別子は存在しない
なにによって識別するかは
レジスタの固有名詞か
メモリでの記憶場所を示すメモリアドレス

メモリアドレスを記憶させる変数やレジスタを
特にポインタ変数やポインタレジスタと呼んでいる
2025/01/22(水) 00:18:16.97ID:4EbDFbn90
生ポは人類には早かったってばっちゃんが言ってた
2025/01/22(水) 01:06:34.38ID:pXnIX9Zj0
ポインタには型があってだな、
intとか自分で定義した構造体とかの型が

ポインタが指すアドレスを起点にそれらの型(ポインタの型)が配置されているかのようにメモリにアクセスするできるようにすることだよ

アドレスには型がないけど(変な言い方だけど)そこにintがあるとかFILE構造体があるとか、そこにその型があるとしてポインタが指すからある
そうでなければただのバイトの列

intとかcharなどのプリミティブな型でなく、構造体からイメージした方が分かりやすくないかな
2025/01/22(水) 01:50:31.22ID:NkElh8NB0
そうだね p++ で数値が sizeof(*p)増える
2025/01/22(水) 17:48:11.49ID:NkElh8NB0
CもだけどC++やJavaなり関数や変数、メソッドやメンバーを参照できる範囲を絞って
安全を確保しようとしているよね

でもコンパイル後の実行コードで関数や変数のスコープチェックとかしていないしできないよね
スコープがどうであれポインタ経由で場所がわかっちゃうんだし

無能プログラマの糞コード避けにはなるけどマルウェア対策にはならないということかな
2025/01/22(水) 19:26:53.41ID:6faY8jOE0
ぬるぽ
2025/01/22(水) 19:44:26.98ID:9LZoVYPp0
このスレで良い度胸してるぜ笑
2025/01/23(木) 00:44:38.67ID:fx1H86wZ0
>>546
ポインタをテーマにした本がある。
丁寧に説明しようとすれば本一冊分程度の分量は語れるってことだ。
それを掲示板で書ける程度の分量でより分かりやすくするのは無理だよ。
まずは入門書を読んだ上でわからないことがあれば具体的に質問して。
2025/01/23(木) 19:20:25.44ID:ruQDamXZ0
ポインタがすっと理解できない人はC言語は向いてないと思う
2025/01/23(木) 19:58:25.66ID:vkyBSe+H0
メモリの番地を直接指してるってだけの話なのに文法が意味不明なのが悪い
2025/01/23(木) 20:11:15.05ID:aOKdPI1Y0
Basicみたいに配列で操作すれば分かりやすいぞ 笑
2025/01/23(木) 20:41:15.58ID:1Dl3E2N00
前橋和弥って人の本読んで理解した 長らく絶版だったようだが後継本がある
2025/01/23(木) 21:30:26.88ID:auGoEn4C0
>>559
私もあれで学んだ ドロイド君みたいな表紙の旧版
わかりやすいと思う
2025/01/25(土) 14:13:44.88ID:6VZytBSB0
秘伝C言語問答 ポインタ編
562デフォルトの名無しさん (ワッチョイ cf2a-wVPw)
垢版 |
2025/01/25(土) 20:08:03.53ID:ZNC43F5H0
ポインタと云うは死ぬ事と見付けたり
2025/01/25(土) 20:36:32.21ID:KsLTQwZH0
ポインタには殺傷能力があります。
使う人は銃器の取扱免許が必須です。
564デフォルトの名無しさん (アウアウエー Sa52-FFa5)
垢版 |
2025/01/26(日) 22:56:06.95ID:s+0AyHDZa
ただのアドレッシング
++したり+=1したら判る
2025/01/28(火) 10:28:12.96ID:q8xQ82Vup
ねえよ
おまえらなら配列ですら殺傷能力あるだろw
2025/01/28(火) 14:54:54.74ID:CBv6ZpxK0
配列で死ぬ奴は四天王でも最弱な奴
2025/01/28(火) 20:42:19.32ID:C7gY9jH/0
だからさぁ 変数や関数スコープって アドレスでアクセスされたら
アクセス拒否できる仕組みは無いよね?
2025/01/29(水) 06:54:15.10ID:NyAjG/eE0
で?
2025/01/29(水) 15:06:45.80ID:S8KruiE+0
あったらCの柔軟性が失われると思います
2025/01/29(水) 15:10:06.13ID:8Al2cjCTp
さすがにセグメント違反は弾かれるぞ
まあ、CPUやOSの機能だけどな
2025/01/29(水) 15:25:45.05ID:ViyYX/ol0
雑談として
いろいろチェックのついたポインタがあっても、それをOFFにできれば問題ないんだぞ

スピードの要らないところにもCは使われているので、そういう部分は、「ごてごて」でもいいんだよ
572デフォルトの名無しさん (ワッチョイ 0e76-Vgbt)
垢版 |
2025/01/29(水) 19:33:45.26ID:0piGtrVr0
いやポインタのはなしをしたいのではなくて
高級言語で設計制限を行うことで可読性や設計ミスが高まるという言説があるよね
構造化プログラミングやオブジェクト指向の類

でも実際稼働するのはコンパイル後のマシン語で
gotoというかジャンプ命令もあれば
プライベートへのアクセスを実行時にチェックする機構とか無いわけでしょ

不具合調査はソースコードも大事だけどマシン語の流れも追わなけば
本当のところはわからんよね
更には投機実行や分岐予測もあるわけで
実際の稼働はソースコードによらないしマシン語とも異なる可能性が存在する
2025/01/29(水) 19:43:26.10ID:4AeLlQVLp
え?
最終的にCPUはマシン語として解釈して動くだけだからなぁ
人間がどう捉えようがそこは変えようが無いんだ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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