2022/3/23(水)

昨日、なんか急に限界を感じたので、起きるだけ起きて寝るだけ寝ることにした。3時半くらいまで起きて11時くらいまで寝て、12時くらいにぱっちり目が覚めた。良い感じのリフレッシュになった。

たまには生活習慣を破壊して、というより体と心が求めるままに寝起きして、本当に求めているものを再確認するのもいいのかもしれん。

夜寝れるか心配になったが、今日は夜にはちゃんと眠くなった。よかった。


今日解いた問題。

ARC120-C 自力AC。移動操作と共に値が変わるという一見面倒そうな問題だが、ちょっと実験したら「同じ値が同じ位置にくるなら同じ値になる」ことが分かる。各要素に+iすれば位置独立の値に直せるので、あとはソートのための最小交換回数を求めるだけ。ちょっと迷ったが「同じ値を同じ順序で対応させるのが最善」というのを前になんかの問題で見た気がするので、BITを使ったら簡単に解けた。

ARC-Cの割にはいやに簡単だったな。


Vulkanの記事執筆をちょっとだけ進めた。今日はリフレッシュに努めるつもりだったのであまり頑張らなかった。


FatFsによるファイル読み込みの際のバグを調べたが、ファイルポインタ云々の問題ではなかった。FAT32のクラスタ境界での処理に起因するバグだった。FATの勉強は沼になるだろうから深くやらないつもりでいたのだが、結局バグ解明のために勉強することになった。(基本構造としては思ったよりは簡単だった。FATファイルシステム>クラスタ(~32KByte)>セクタ(512Byte)という構造になっていてクラスタがチェーンになって接続されてるらしい)

クラスタ境界でなぜバグるのかを調べたのだが、どうやらファイルシステムの種類(FAT12, FAT16, FAT32)を保持する変数がいつの間にか書き換わっている。しかも原因がまったく不明で、マルチスレッドなわけがないのにいつの間にか書き換わっている。二回連続でデバッグ出力をしたらもう書き換わっていた。そんなことある?

いろいろ実験した結果、関数から戻ることをトリガとして変数が書き換わっているようだった。printfも関数は関数なのだからそれなら納得できる。関数から戻ることをトリガとしているということは、どこかでスタックオーバーフローなどを起こしている可能性がある。

Categories: