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
2025/01/30(木) 09:29:28.34ID:x87hbq3s0
コンパイラひバグが無いかぎりは高級言語のソース通りに動くから大丈夫だぞ
昔のファミコン並みに処理ステップ数に要するクロックを数えてラインスクロールさせるとかでもしない限りタイミングも気にする必要無いし
2025/01/30(木) 11:48:21.95ID:1fx7BZxf0
むしろマルチコアの問題のほうがでかい 自分も、高効率に書ける自信がない
2025/01/30(木) 12:22:11.10ID:K2FsQpfY0
C言語に限らずJavaでもPythonでもLispでも最終的にはブランチしまくりヒープアクセスしまくりなマシン語で動いてるんだから心配しても意味ない。
たまたまC言語はマシン語に近い距離にある言語なのでマシン語「でも」デバッグできてしまうだけの話。
2025/01/30(木) 16:25:32.68ID:dOgLqtqk0
コンパイラ最適化の時点で追うのが難しい
ましてや投機実行とくると…
2025/01/30(木) 16:27:29.00ID:dOgLqtqk0
思い出した continue や break は優遇されている印象
2025/01/31(金) 01:34:44.08ID:5fFn3R6V0
Pythonだって安全じゃないしな
俺この間自作したPythonプログラム動かしたら数秒後PCが落ちた
XPとかWindows7とかじゃないぜ、Windows11の最新が突如電源が切れたんだよプツンて
まじでビビった

ちなみに原因は日本語フォントを読み込むコードをカメラキャプチャのループ内(数十から数百ミリ秒ぐらい?)で実行していた
C言語のポインタは危険とか言うけどさ、一番危険なのは俺みたいな馬鹿なコード書く奴の存在だよ
2025/01/31(金) 09:59:26.90ID:4ClqIqkw0
君のPCが落ちる程度は許容範囲
2025/01/31(金) 11:00:00.59ID:uHjOTXCx0
考えようによっては、タチの悪いDoSじゃないかw
カメラごときで全体落としてんじゃねえよ > カーネル層

ロジックバグなんだろうけど、こういうのはしかし難しいね
2025/01/31(金) 11:20:36.48ID:h9+hJoTPp
ドライバの秘孔を突いただけだから
2025/01/31(金) 11:30:08.08ID:4ClqIqkw0
ドライバーに致命的不具合があったとしても
ブルスクになる程度で
電源断まで行くと言うのは考え難い
2025/01/31(金) 11:49:46.06ID:h9+hJoTPp
ドライバの秘孔を突いてカメラに搭載のチップが電源ライン直結になったとかじゃね?
2025/01/31(金) 18:44:56.94ID:5fFn3R6V0
原因はそっち(ドライバ)ではなくスリープなしのループ内でフォントファイルに連続攻撃したことだぜ、たぶん
簡単に書くとこんな感じ

fontpath ='C:\\Windows\\Fonts\\DFJGOTEB.TTC'
while True:
 put_ja(point, text)

def put_ja(point, text):
 font = ImageFont.truetype(fontpath, 32)
 draw.text(point, text, fill=color, font=font)

実際にはwhileじゃなくてafterでループさせてたけど
日本語出力の時、出力のたびにフォントファイル読み込んでたようで結果PCが落ちた
残像攻撃を受けた感じだったのかもしれん、コロ先生の分身みたいなやつ
2025/01/31(金) 19:36:45.83ID:R7Zj8Mog0
プリエンプティブカーネル使っててスリープなしのループごときでそんなことあり得るのか?
逆にそうなった仕組みが知りたい。
2025/01/31(金) 19:40:58.83ID:1pwkweKb0
インテルのTurboBoostだかで負荷もブーストされて排熱が間に合わずMBにダメージ与えつつ逝ったんじゃないの
PC買い換えた方がいいよ
2025/01/31(金) 19:54:38.13ID:R/wyJ37S0
ブルースクリーンもなしにおちるなんてハード不良
2025/01/31(金) 20:00:56.86ID:5fFn3R6V0
スレチで申し訳ないが、

俺も気にはなってるけどPC痛めつけてまでやる気にはなれない
試したいなら試してくれ、ただしどうなっても責任は負わんぞw

MicrosoftストアのPython Software Foundationってとこの奴
Python 3.13.1 (tags/v3.13.1:0671451, Dec 3 2024, 19:06:28) [MSC v.1942 64 bit (AMD64)] on win32

 OpenCVで日本語表示
 https://monomonotech.jp/kurage/raspberrypi/opencv_japanese.html
ここのputText_japaneseを参考にした(パスとかwindows用に書き換え)
んで、それを
 【簡単】QRコードの作成と読み取り in Python
 https://qiita.com/PoodleMaster/items/0afbce4be7e442e75be6
のcv2.putTextと置き換えるように書き換えたんよ
引数のfontはなくしてフォントサイズだけを渡す
ImageFont.truetypeがフォントサイズも引数にしているから、こうすれば動的なフォントサイズ変更にも対応できるな、ヨシ!って思ってね
それ実行したらPC落ちた
それでも数回やって問題なかった記憶はあるんだけどね(ただし数十秒程度の起動時間だった)
ちょっと長めに起動させたままにしたからリソース食いつぶしたのかな?と思ってる
593デフォルトの名無しさん (アウアウエー Sa52-FFa5)
垢版 |
2025/02/01(土) 12:06:57.91ID:Dm0gVBeEa
負荷掛け過ぎてコンデンサが爆発したんだろ
2025/02/09(日) 11:28:31.00ID:WswbN0Go0
全く関係の無いことですが、ここに書き込まさせてください。
あるサイトの問題集で、巨大な数の足し算を行うのに、整数型使えないから文字型使おうって書いてありました。
どうやったらその発想ができるんですか?
私プログラミング初心者なのですが、、、
2025/02/09(日) 11:34:40.48ID:sBzel75s0
頭の出来だろw
2025/02/09(日) 11:39:35.27ID:WswbN0Go0
プログラミングに頭の出来って関係あるんですか?
2025/02/09(日) 12:36:10.76ID:G/CYNigQ0
なんで関係ないと思うんだろうか
2025/02/09(日) 12:44:36.92ID:WswbN0Go0
誰でもプログラミングができるって言っている人がいたので。
2025/02/09(日) 12:52:16.03ID:WswbN0Go0
条件分岐とかループ処理のやつは解けるやつもあれば、解けないやつがあっても解説見れば次は出来ますが、文字列関係になると頭の中が[?]になるんです。
2025/02/09(日) 13:07:51.84ID:ql26y8Y/p
応用力…今の学校教育じゃ養われない能力が大切
2025/02/09(日) 13:16:44.53ID:WswbN0Go0
応用力ですか、。なんか、数学と同じ感じですね。基礎ができたと思っても応用ができないみたいな。
ちなみに、応用力ってどの様に勉強すれば身につくものなんですか?
2025/02/09(日) 13:46:11.17ID:k5BYzD4Y0
30桁くらいの2つの整数値を筆算で加算するときの手順をイメージして
それをプログラム化してみれば良い
そんなに難しくはないだろう
2025/02/09(日) 13:46:45.75ID:KfUn2qZi0
>>594
そのサイトクソだよ
2025/02/09(日) 14:22:12.60ID:WswbN0Go0
>>602
筆算のイメージはあるのですが、整数型でやろうとしたらエラーになって、実数型でやろうとしてもエラーになるので、なんでだろーって思って解説ん見てみたら、[文字列型にしましょう]って書いてあったので[?]ってなってしまうのです。
2025/02/09(日) 14:25:19.10ID:WswbN0Go0
>>602
筆算のイメージもそのサイトの解説みてから、そうなんだと思ったんですけど、どうも初見だとイメージが沸かないんですよ。
2025/02/09(日) 14:27:08.84ID:k5BYzD4Y0
イメージ湧かないなら、手を動かそう
そこに答えがあるよ
2025/02/09(日) 14:55:17.16ID:WswbN0Go0
>>606
なるほど、頭で考えるより、手で考えた方が良いのですか。
実践してみます。ありがとうございます!
2025/02/09(日) 17:03:10.36ID:TclGPY+C0
整数32bitでも64bitでも最大値は決まっている
でも大きい整数を表すのに64bit整数1つだけ使うとは決まっていない

桁溢れをプログラム的に検出して
溢れた分を別の64bit整数に記録すれば大きな整数を扱える
64bit+64bit+....
で整数を表す感じ
2025/02/09(日) 17:04:41.81ID:TclGPY+C0
文字列って1Byte整数の配列でしょ?無駄が多いよ
8Byte整数の組合せを上で挙げたけど、8Byte整数の配列でも当然できる
2025/02/09(日) 17:14:14.93ID:sBzel75s0
無駄を省くより可読性の方が大切
8bit時代のファミコンじゃ無いんだから
そんなキリキリ詰め込んだってわけわからん事になるだけ
2025/02/09(日) 17:36:57.81ID:KfUn2qZi0
>>610
的外れ
いきるな初心者
2025/02/09(日) 18:12:23.04ID:sBzel75s0
桁上がりを別に判定しなきゃならないんだから扱えるギリギリの桁で計算するのはバカだろw
アセンブラなら桁あふれフラグ見て簡単に処理出来るだろうが、Cだと無理
2025/02/09(日) 18:46:42.50ID:fEimQ790M
>>604
どこのサイト?
それ書いてるやつ多分バカだぞ
参考にすんな
2025/02/09(日) 18:57:40.14ID:fEimQ790M
>>610
charでやるのは馬鹿だがアルゴリズムは同じなんだから可読性は変わらない
メモリもほぼ変わらない
2025/02/09(日) 19:00:51.12ID:TclGPY+C0
整数値それぞれ (左右どっちだっけ)シフト1bitやって(1/2の値)足したのが最大値の半分超えたら桁溢れ
上位桁に溢れるだけ加算
Cでもできるに決まっているじゃん これだけだよ
2025/02/09(日) 19:09:00.04ID:TclGPY+C0
文字列って溢れの分が1-9まであって大変そう
バイナリなら1bitだけでしょ
2025/02/09(日) 19:15:54.80ID:WswbN0Go0
>>615
それってシフト演算の話ですか?(違ってたらごめんなさい。)
私、シフト演算は苦手なんですよね。
ただシフトするだけなら参考書とサイトみたらできますけど、ノールックでさらに四則演算になるとできないんですよ。
2025/02/09(日) 19:34:02.21ID:TclGPY+C0
考えたらシフトは無駄だった
64bit整数のうち63bit整数で考えて最上位ビットを溢れ判定に使えばよいだけ
あんまり書くと宿題の手伝いになってそう
2025/02/09(日) 19:44:20.36ID:fEimQ790M
>>618
足したあとの結果から判定する
教えるなら定石を教えろや
2025/02/09(日) 19:51:22.43ID:vUYqd53r0
二進化十進はたとえば表示の処理なんかは簡単になるので無駄なわけではない。
2025/02/09(日) 20:03:35.95ID:sBzel75s0
いまどき文字も16bit時代にケチケチすんなw
2025/02/09(日) 22:27:12.88ID:WswbN0Go0
>>618
なるほどですね。因みにこれは宿題ではなく、自主学習のやつです。とあるサイトの解説がよくわからなくてこの板の方々に質問させていただきました。
ありがとうございます。
2025/02/10(月) 07:27:24.30ID:ZpC+jsE10
あと実数でやったと出たけど要注意
double verybignum;
verybignum += 1.0;
で1.0は桁を合わせると0に消えて足されない場合がある
624デフォルトの名無しさん (アウアウエー Sa82-R6kM)
垢版 |
2025/02/10(月) 11:48:59.09ID:Z13/KCo3a
吊りならともかく本物の初心者なら文字コードを知らないってこともあるだろうな
多倍長整数をバイト列(1桁0-255)じゃなくて文字列(1桁0-9)で表すのは無駄が多いがアルゴリズムは同じはず
それでもピンと来ないなら先に文字コードについて理解するべき
2025/02/10(月) 13:13:09.48ID:BwJhqJpr0
IntelのアセンブラならBCDを扱う命令があったと思うけど、Cでやるなら文字に代入する時点で &= 0x0F、計算して出力する前に |= 0x30(でいいんだっけ?)かなー
2025/02/10(月) 13:19:14.90ID:cWC6BpGk0
やや強引だがアドレスとして同じでも比較すると等しくないという結果になる例を作ってみた。
https://wandbox.org/permlink/hpAkiEeiZclvQJsn
概念的にはポインタはアドレスというのでも間違いではないけど実際には言語のルールを把握していないと引っかかることもある。

ホスト規制でしばらく書き込めなかったので遅レスですまぬ。
627デフォルトの名無しさん (ワッチョイ 6a56-WFrT)
垢版 |
2025/02/10(月) 16:46:22.93ID:xKid5uSQ0
よく分からないがこうなる理由が分からないという意味の質問かな?
まあそうだとして、C言語では異なるオブジェクトへのポインタを比較出来ないってルールがある
それが行われているので、未定義の動作といってこのプログラムではコンパイラがどんな事をしてもいいことになってる
そのどんな事の中にはnot equalを表示するという動作も含まれているので、たまたまそうなったんでしょう
初心者がよくやるFAQレベルのミスなので、ポインタとオブジェクトを理解する意味でその辺も読んでみればもっと上達するでしょう
他にもヘンな部分があるので色々他の人のコードとかも読むといいね
2025/02/10(月) 17:14:00.11ID:cWC6BpGk0
>>627
ポインタにはアドレスが入ってるだけという話題が出てたからそんなことはないという注意喚起。
2025/02/10(月) 17:18:14.15ID:cWC6BpGk0
>>623
文意がよくわからんが初期化されてないから不定値になってるんじゃない?
2025/02/10(月) 17:44:23.62ID:1DQgWNxh0
>>627
> よく分からないがこうなる理由が分からないという意味の質問かな?
このスレは初めてか?
はちみつさんがそんな質問するわけないだろ
2025/02/11(火) 00:58:16.10ID:nkHTE6y60
これはどういうことなんだ?
foo、barの順にスタックに積まれる
bazにはfooの次の(intの境界の)番地(barと同じ)が入り、quzにはbarの番地が入る
bazとquzには同じ番地(値)が入っている
までは分かる
bazもquzもint型を指している
が、bazとquzの内容を比較するとことなる
なんじゃこりゃ〜
酔ってなくても分からなそう
2025/02/11(火) 01:04:37.69ID:nkHTE6y60
>>627がいうことがそれなのか
未定義だと
アセンブラ脳だと同じとみなしてくれてよさそうだけど、難しいね…
2025/02/11(火) 08:30:33.47ID:YWsMUNTvp
型変換すればOK
2025/02/11(火) 11:05:12.56ID:0+q77CUl0
>>632
強調しておくけど未定義は何が起こってもよい。
この場合は一応は式が式として評価されたかのように動作してるので比較的マシな部類で、未定義を踏んでいる箇所とは遠く離れた箇所で意味不明の動作が起こることもある。(起こってもよい。)
低レイヤから入った人は未定義をナメてることが結構あるとは思う。
どのような機械語にコンパイルされるか想像できる (と本人は思っている) 故の弊害だなぁ。
2025/02/11(火) 11:22:08.87ID:kmJe274sp
Cなんてポインターは全部void*だろ
2025/02/11(火) 11:37:41.91ID:7Jzkf7ZG0
ご無体な
2025/02/11(火) 12:35:30.87ID:m4FoXgHJ0
>>626 は僕のgccのパージョンだと
-O2 ありだと "not equal"
最適化なしだと "equal"

-S つけて .s をみると、-O2 ありのときポインタの比較すらせず単純に
puts("not equal");
とするコードを出力していた
"equal" のリテラルすらコードにはない

降参
2025/02/11(火) 13:33:00.20ID:jMpjlVqA0
strict aliasingのルールがなぜあるか理解してたらある程度予想つくだろ
639デフォルトの名無しさん (ワッチョイ de76-/Fy3)
垢版 |
2025/02/11(火) 14:32:56.35ID:VhWouMxY0
そもそも 8Byteや4Byte変数のポインタが例えば奇数の数値が許されるのかとか
2025/02/11(火) 14:40:28.60ID:7Jzkf7ZG0
文字列を指すポインタなら、一文字ずつインクリメント出来ないと困るよね
2025/02/11(火) 14:52:06.30ID:+ybAiMfGp
>>639
CPUによる
2025/02/11(火) 15:43:23.98ID:jMpjlVqA0
>>639
それどこへのレス?
2025/02/11(火) 16:44:48.97ID:ZUCQJ4rmM
>>640
いつ困るんだ?
2025/02/11(火) 16:59:49.92ID:MJELNENN0
>>627
最適化されると出力されるコードを推測することは無理だ、ということね
2025/02/11(火) 17:19:32.60ID:jMpjlVqA0
無理はいいすぎ
やったことないやつがしったかすんな
2025/02/11(火) 17:20:33.85ID:0gFNLz1yp
ARM系はほんと無理
2025/02/11(火) 18:37:22.58ID:2gjYX+K80
貴方みたいな人はほんと無理
とか言われたら傷ついちゃう
2025/02/11(火) 21:27:22.00ID:JzAdQ4dR0
とりあえず読むべし
旧石器時代のポインタをご利用の皆様へ 〜provenance入門〜
https://qiita.com/__pandaman64__/items/1788a90ae5be79cc908b
2025/02/11(火) 21:52:04.81ID:m4FoXgHJ0
>>648
thx!
2025/02/11(火) 21:58:43.75ID:VhWouMxY0
こんなの分割コンパイルしたら分からないし ライブラリならなおさら
実行時にどのオブジェクト由来なんて情報持っておけるのか?

int func(int *ip, int *iq)
{
if (ip == iq) {
} else {
}
}
2025/02/11(火) 22:39:07.83ID:jMpjlVqA0
コンパイル時に決まってんじゃん
652デフォルトの名無しさん (スップ Sd4a-26Jk)
垢版 |
2025/02/11(火) 23:02:33.92ID:DgpMDse2d
このコテハンの人いつもこんなだよね
まともに出来るのが規格のコピペみたいな事だけで、それ以外だとすぐとんちんかんな事言い出して突っ込まれてる
2025/02/11(火) 23:17:19.29ID:0+q77CUl0
>>650
わかる範囲でやるってだけ。
わからないところは保守的なコードを生成する。
ただ、今は LTO があるのでわかる範囲がだいぶん広い。

わからないからこそプログラマは未定義なことをしないと仮定した最適化をする (未定義を踏んでたらむちゃくちゃになる) という場合もある。
2025/02/12(水) 10:25:19.84ID:WVzDbo940
>>648
ポインタpとqの値が同じにならないんだけど…
2025/02/12(水) 10:28:46.36ID:p1VJlK94p
Cに余計なもん付けたらいにしえのLinux由来のコードが通らなくなるだろ
656デフォルトの名無しさん (ワッチョイ 6a4d-WFrT)
垢版 |
2025/02/12(水) 11:20:54.68ID:OojhOsKe0
未定義の動作がどういうことなのかよく分かっていない人がいるみたいなので補足しておく

>>628
未定義の動作を引き起こすプログラムを提示しても結果が分からないし毎回違う可能性もある点でこれだと何も示せてない
きつい言い方かもしれないが注意喚起になっていない
>>634の2行目を見るとコードの動き方に対しての認識として不定の動作と未定義の動作を混同して勘違いしてるかも知れないね
657627 (ワッチョイ 6a4d-WFrT)
垢版 |
2025/02/12(水) 11:21:58.36ID:OojhOsKe0
>>631
未定義の動作なので2行目から7行目のような事が起きるかどうかは分からない
仮に未定義の動作がなかったとしても行目を自明のように仮定することは出来ない
アーキテクチャが色々ある中そういう処理系もあればそうでない処理系もあるしCでは何も規定してない
スタックの仕組みがないものもあればポインタをそもそも数値や番地で扱わないアーキテクチャもある
後段も同様
658627 (ワッチョイ 6a4d-WFrT)
垢版 |
2025/02/12(水) 11:22:39.59ID:OojhOsKe0
>>644
コンパイラの動作に対して必要条件が何も設定されない状態になるという話で最適化は全く関係ない

ちなみに今回の話はK&Rの頃からあるルールなので>>648とはちょっと違う
ただ内容は大体同じでポインタはオブジェクトを指してるもので、その内部形式や扱い方はユーザーが知る必要はない
2025/02/12(水) 11:47:09.26ID:cXwd7RB80
>>658
言語仕様上で未定義動作とされている状況が実際の機械の上でどう動作するか (その動作は想像できない) という文脈でヤバさを伝えるためになるべく想像外な結果を生む実例を出そうとしているので最適化は関係ある。
2025/02/12(水) 11:50:24.83ID:XyTZkBHop
最適化しないと無駄なコードや無意味なコードも忠実に出力されるからなぁ
2025/02/12(水) 12:49:03.57ID:J/UI6pYQ0
>>658
未定義だから不明を連呼されても大して参考にならんわけで
なぜ現実のgccではあのような結果になるのか理由を説明できないのか?
わかってないようだけど最適化は大いに関係してるぞ
2025/02/12(水) 13:26:30.21ID:7GgOweZ60
えーと未定義や環境依存を使ったりとかは
Cおよびコンピュータの理解が不十分な
質の劣るプログラマが存在するからでしょうに

そういう人達に重要プログラムを書かせる責任問題でもある
2025/02/12(水) 15:09:37.68ID:+Pz/j8Me0
相手に過大に説明を要求して、自分は分かろうとしない者は嫌われちゃうよ
2025/02/12(水) 15:17:35.67ID:iId2MJ1V0
gccのフォーラムで質問出してみたら?
参考にできる回答が得られるかも知れないよ
2025/02/12(水) 15:52:05.07ID:WVzDbo940
>ポインタにはprovenanceという,どのオブジェクト由来かの情報が含まれています

↑まずこれがおかしい
2025/02/12(水) 16:26:28.23ID:I956D6cKp
ランタイムじゃなくてコンパイル時の静的なルールだろうね
2025/02/12(水) 17:12:16.79ID:1bCkYFVx0
投資家はRustを信頼するって言ってるんだから、Rustとおんなじようにすればいいだけ

俺はC/C++派なので、どんどんRustの実績をぶんどってくるべきって思ってる
2025/02/12(水) 17:47:13.48ID:cXwd7RB80
>>667
Rust のようにやるなら Rust のほうが巧くやれる。
当たり前だろ。
2025/02/13(木) 00:32:14.00ID:rym7RjTu0
移植性が求められることばかりでもないし、最適化などのオプションも頻繁に取ったりつけたりしないし、思い通りに動かなければアセンブルリストみたりするけど、コンパイラが出力するコードが予想通りかなんて観点はないし、実践的ではないけど、人を小馬鹿にしたりしなければ勉強になって面白い話なのに
2025/02/13(木) 00:34:29.37ID:rym7RjTu0
実践的でない、はちょっと違うか
671デフォルトの名無しさん (ワッチョイ 8655-u07z)
垢版 |
2025/02/15(土) 13:31:47.16ID:vKfoke/00
Arduino (ESP32)で文字列変換をしたいです。
tの文字列をtm structに変換したいんですが,タイムゾーンのオフセット部分の+9:00の扱いが分かりません。
%Zはタイムゾーンのオフセットを分を指定する場合で、%zだとUTCなどタイムゾーン名を指定する場合に使うみたいでした。
どうやるんでしょうか?

tps://pastebin.com/Jcyj8BG5
2025/02/15(土) 15:04:44.95ID:ewglApEf0
strptime で %z や %Z でタイムゾーンを扱えるのは glibc の拡張 (他で真似している場合もあるかもしれんけど) なんだけど、 Arduino の C ライブラリは glibc ベースなの?
そうじゃないなら各ライブラリのドキュメント (またはソースコード) を読まないとわからないし、そもそもそんな機能はないのかもしれない。
673デフォルトの名無しさん (ワッチョイ 5357-u07z)
垢版 |
2025/02/15(土) 16:19:42.94ID:BNBq5D0N0
>>672
どうもありがとうございます
%zのようなのを使わず+の前後で分けてまず前だけでtm structに変換して後ろはエポック秒が何かに変換して使うのがベターでしょうか?
2025/02/15(土) 16:25:20.46ID:Q9F/iLI2M
やり方思いついたならやれ
2025/02/15(土) 16:39:17.28ID:ewglApEf0
>>673
どうやら Arduino は newlib ベースの模様。
newlib の strptime はタイムゾーンをサポートしてない。

どうにかしてタイムゾーンを扱いたい場合にどうやって実装するかは個々の事情によると思うのでなんとも言えない。
実績のある実装をどこかから持ってきたほうが良いんじゃないかと個人的には思う。
https://www.google.com/search?q=strptime+implementation+c
パースするだけならたいして複雑なものではないので自分で書いてみてもいいかな。

ちなみにタイムゾーンを略称で扱うのは面倒な事情が絡む。
タイムゾーンを標準時からの差の時間で表すときはその時点での差があれば十分なので簡単なんだけど、略称で表すときはサマータイムの情報もいる。
たとえばニューヨークのタイムゾーン (EST) は普段は -05:00 だけどサマータイム中は -04:00 になる。
単に EST=-05:00 というわけではない。

そんでもってこのへんの扱いが面倒なのは変わることは割とよくあるということ。
サマータイムの期間が変わったりずらす時間が変わったり、あるいはゾーンが増えたり減ったりするのは政治的な判断なので情報を定期的に更新する前提じゃないときちんと運用できない。
パソコンの OS だと適当なタイミングで更新する仕組みがあるのが普通だけど組み込みシステムだとそうもいかないこともある。
2025/02/15(土) 21:12:02.85ID:ewglApEf0
基本的なことを書き忘れてた。
strptime は C の言語仕様には無い関数で、 POSIX (UNIX 系 OS の統一仕様) にある。
POSIX は最低限の共通部分だけをまとめたもので実装には雑多な拡張を入れる前提なので各実装によってサポート内容が違う。
POSIX 準拠ではない環境で部分的に POSIX を真似てるだけ (POSIX の最低限の要求も満たしてない) ということもある。
677デフォルトの名無しさん (アウアウエー Sa13-9cJ9)
垢版 |
2025/02/16(日) 12:03:53.19ID:rAQQ2/+ca
最初からtmstructをUTCで取得した方が楽ジャマイカ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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