虚報太郎

書きます。Twitter→@iamsomepen

4/8 「時計館の殺人」・オーバーフロー

時計館の殺人を読んだ。サスペンスとしての出来が良く、すいすい読み進めれた。トリックに関しては、何となく察しがついてしまったので、思ったほどのカタルシスは得られなかったが、いい小説だと思う。

 

競技プログラミングコンテストの問題にC++で取り組んでいたら、大きめの入力に対してのみ、正しい回答が得られない。与えられた配列の合計を計算しており、その合計がオーバーフローしたんだと思い、まず配列の型をint→long long intに変えた。また、vectorだとサイズが数万くらいになると、使えなくなるとの記事を見つけて、arrayクラスに変えてみたりしたが、上手くいかない。合計の計算にaccumulateを使っていたので、そこを明示的にしてみたら上手くいった。

正直何が問題だったのかは、定かではないが、型の最大値やコンテナ型の要素数の限界、またメモリ確保には結構気を配らないといけないらしい。

 

下のサイトを見てみたら、accumelateの3つ目の引数(初期値)に"0"を使っていると、"0"がint型であるため、オーバーフローをすることがあるとのこと。"0LL"とlong long intであることを明示すればおkらしい。

qiita.com

あと、ついでにスタックオーバーフローというものもあるそうだ。

関数内で変数を確保する場合、スタック領域に確保されます。

スタック領域はメモリ量が少なめらしく、staticを使えばグローバル変数などと同じ静的領域に置かれるから解決するとあったが、staticを使うとそれはそれで取り扱いが変わりそうなので、どうなんだろう。競プロならそこまでプログラムが複雑になることはないからいいんだろうけど。

vectorはヒープ領域から領域を確保するから今回の場合とは関係ないらしい。

wikiwiki.jp

競プロのようにただ問題を解くのではなく、ソフトウェアを作ってみたいけど、何が作れるんだろう。