ページ 11

数値を大きくすると動かなくなる

Posted: 2023年1月10日(火) 01:08
by 絵にかいた餅
現在GAを用いたナーススケジューリング問題について勉強しています。そこでは二次元配列を用いるのですが、配列の要素数を大きくすると動かなくなってしまいます。ある一定の数までは動くためプログラミング自体はできているとおもうのですが。。
いろいろ自分なりに考えて改良をしていったのですが、そもそも動かなくなってしまったりと、泥沼にはまってしまいます。
自分の考えとしてはメモリを使いすぎてしまっているのかなと思っているのですが、対処法がわかりません。
皆さんの考えをお聞きしたいです。よろしくお願いします。
(コードを載せようとしましたが500行を超えてしまっているため、お見苦しいかなと思い原因についてお聞きしました。)

Re: 数値を大きくすると動かなくなる

Posted: 2023年1月10日(火) 01:18
by box
ソースコードが提示されてへんから何とも言えんけど、
配列をstaticにしてみるとか?

Re: 数値を大きくすると動かなくなる

Posted: 2023年1月10日(火) 01:24
by 絵にかいた餅
実はそれすでに試したのですが”外部シンボルが未解決です”というエラーが出てしまいます。

Re: 数値を大きくすると動かなくなる

Posted: 2023年1月10日(火) 01:30
by box
外部シンボルが未解決っちゅうんは
配列のサイズの問題やなくて
関数名のスペリングが間違うてるとかいう感じで
あるはずのない関数を呼んでしもてる、とかとちゃうかな?
確認してみては?
あるいは、そのときのエラーメッセージを提示するとか?

Re: 数値を大きくすると動かなくなる

Posted: 2023年1月10日(火) 01:43
by みけCAT
「動かなくなる」というのは
・コンパイルが通らなくなる
・コンパイルは通るけど、実行すると異常終了する
・コンパイルは通り、実行でき、なかなか結果が出ない
どれですか?

また、「一定の数」というのはどの程度ですか?
数によっては、本当にメモリを使いすぎかもしれません。
目安として、1要素が4バイトの場合
1024×1024 → 4MiB
2048×2048 → 16MiB
8192×8192 → 256MiB
16384×16384 → 1GiB
32768×32768 → 4GiB
65536×65536 → 16GiB
となります。
同じ要素数・要素のサイズの配列を複数用いる場合、記憶容量もそれに応じて大きくなります。
32bitのプロセスだと、最大でも約4GiBくらいまでしかRAMを使えない可能性もあります。

Re: 数値を大きくすると動かなくなる

Posted: 2023年1月10日(火) 01:49
by 絵にかいた餅
関数名を間違えてるといったことはなかったです。
エラーメッセージは
”外部シンボル"public:static int(*shift::nurse_work)[30])"(?nurse_work@shift@@2PAY0BO@HA)は未解決です”となっています。下のURLからするとビルドができなかったのでコンパイルに何か原因ができた感じでですかね?

https://learn.microsoft.com/ja-jp/cpp/e ... w=msvc-170

Re: 数値を大きくすると動かなくなる

Posted: 2023年1月10日(火) 01:55
by 絵にかいた餅
コンパイルは通っているけど何も結果が出ずに終了するといった感じです。(staticをつけない場合)
一定の数というのは構造体に二次元配列を定義していて、構造体の数は100個、二次元配列の大きさは4*10で、表のテーブルとしては4000です。ただ、別の配列に一つ一つ置き換えていたり、ループ回数もかなり使ってはいます。

Re: 数値を大きくすると動かなくなる

Posted: 2023年1月12日(木) 10:10
by dic
どこかに発見されていないバグがあるとしか
いいようがないですね

Re: 数値を大きくすると動かなくなる

Posted: 2023年1月12日(木) 20:06
by みけCAT
絵にかいた餅 さんが書きました:
1年前
エラーメッセージは
”外部シンボル"public:static int(*shift::nurse_work)[30])"(?nurse_work@shift@@2PAY0BO@HA)は未解決です”となっています。
メンバの定義ではなく、インスタンスの定義 (構造体の変数宣言) に static をつけるとどうなりますか?