2024:07:04
7/4日記
プログラム
- 残り実装が必要そうなやつ
- ファイル読み込み(最初は同期、可能なら非同期読み込み)
まずは入力ストリームで読み込みを実装済み。 - Miniscriptプログラムのコンパイル
Interpreterを定義済み。読み込み準備もできた。 - 組込み関数の追加
- コンパイルしたデータとサウンドの譜面を紐づける実装
- ADSR、フィルタの実装、加えてエフェクトの実装
- 上記のうち、1.と2.については完了。1.は名前を入力すれば読み込めるようにしたのであとはGUIと処理を紐づければ対応可能。2.については手こずったけどどうにかした。下記参照。
プログラム2
- 今日はバグと格闘していた。
- いや何がって、以下の対応。
- スクリプト言語で使うString型とC++のstring型が別物。内容に少し相違があるため違いを理解するのに時間がかかった。言語に紐づいているため、下手に除去もできないけど、かと言って普通のstring型と使い勝手が違うので、どうしても両方使う必要がでてきてしまった。
- スクリプト言語のログ出力のタイミングがおかしく、Printf等の関数を実行しないとログ出力がされないという困った仕様。このため、「デバッガのフックが特定の処理を実行していないとできない」という謎の挙動してくれやがった。なのでコンソール出力は見えないようにして裏で出力するようにした。処理としてはデバイス取得も絡んで重いんだけど、連続で実行するわけでもないので影響ないと思ってる。余裕があれば削除したい。別の方法でストリームを流す処理ができればいいんだが。
- これはどちらのstring型もそうなんだけど、clearやTrimを行っても即座にデータが消えるわけではない(ウィークポインタとかつかってんだろか)ので、staticでもたせてるstringクラスを呼び出そうとしてうまく更新がされないことが発覚したため、メモリ確保消去を自分で行うことにした。ポインタだけ最初確保してnew/delete使う・できる限り全削除等、データが跡形も残らないようにして対応した。List<string>はclear()でうまく削除してくれたが、string単体だと削除してくれないケースもある模様。なので前述のnew/deleteで対応した。stringの仕様よくわからん。
- 間違えてスクリプトのソースコードをList<string>で何重にも読み込んでいた。おかげで処理が多重に実行されてログがおかしい出力されて、原因究明に時間を取られた。
- ということで久々に原因が分かりづらいバグで仕事が終わったあとずっと対応してた。5-6時間くらいデバッグしたりサードのライブラリの中身をハックしたりstringの仕様について調べたりしてた。
プログラム3
- MiniScriptのC++版では、Restartという関数が使うことができない。
- IFは用意してあるけど肝心の実装がなかった。ソースコードを読んで発覚した。
- こちらで作ってPR上げようかと思うくらいだが、スタックを戻す方法を調べてからの方がよさそうだ。
- どうもC#だとスタックの位置を別関数で戻す処理を入れてしまってるらしい。
- ただC++ではスタックは配列にしているため、雑に配列の数値指定してあげて、みたいなのでもよさそうな気がしてる。
プログラム参考資料
2024/07/04.txt · 最終更新: 2024/07/05 06:41 by machiaworx