私は c++ での OpenGL の初心者向けチュートリアルに従っていますが、ac# プログラマーとして始めたので、多くのことを当然のことと考えてしまいました。そのため、FPSの読み取り値を出力にデバッグ印刷しているときに問題が発生しました。メソッドは頭のてっぺんから DebugPrintString のようなもので、char* を受け取り、基本的に「FPS: x」を出力していたと思います。scanf_s を使用して fps 値を文字配列に配置していましたが、ここに問題があります。文字配列の大きさはどのくらいですか?
もう少し詳しく説明しましょう。通常、フレーム/秒は適切な数値ではないため、私の FPS の読み取り値は float として保存されます。つまり、私の番号は 60 かもしれませんし、59.12345 かもしれません。60 には 2 バイトしか必要なく、59.12345 には 8 (ピリオドに 1) が必要です。それで、「ああ、桁数を数えなければならない、問題ない!」と思いました。男の子は私がショックを受けていました。
桁数を数える方法を作成しました。小数点以下の左側を数えるのは簡単でした。まず、整数としてキャストして小数点を削除し、10 で除算します (実際には、ビットシフトがあったと思います)。 0 になるまで何回できるかを数えます。右辺の桁を数えます。10 を掛けて、その桁を引きます。これを 0 になるまで繰り返します。このメソッドは通常 32 を返します。それで、私はWTF'dしてデバッグでそれを見ました.浮動小数点数を掛けると、よく知られている精度の問題のために数字の列を効果的に上に移動すると、別の数字が追加されたことがわかりました!
私はいくつかの主要なグーグルを行いましたが、実際には char str[128] と scanf if in then do strlen(str) - 1 (null ターミネータ) の上に何も見つかりませんでした。しかし、私はよりエレガントなソリューションを望んでいました。最後に、それをintとしてキャストし、9999 fpsに十分な値を許可し、fps> 9999かどうかを確認するチェックも追加しましたが、それが起こるとは思いません. SEG FAULTよりも安全です:(
TLDR: float の桁数を取得する方法はありますか? scanf はどのようにそれを行いますか?!
長い投稿で申し訳ありませんが、私の欲求不満を共有したかっただけです >:D
編集:スペルミス