2017-01-26 15 views
0

私は大学にいるのですが、私たちは通常、g ++を通してパテを使ってコードをコンパイルします。 Visual Studioでコードをローカルでコンパイルしようとすると、スタックオーバーフローエラーが発生します。しかし、g ++でパテを使ってコンパイルすると、私はそうしません。putty上でg ++コンパイラを使用してコンパイルすると、私のコードがLinuxサーバに渡されますか?

私は、Windowsには1 MBのスタックがあり、Linuxには8 MBのスタックがあると仮定しています。 g ++を使用してパテを使用してコンパイルすると、自分のコードをLinuxマシンに渡しているので、スタックスペースが増えます。

誰かが私のためにこれをクリアすることはできますか?

+0

はい、sshでマシンにアクセスすると、そのマシンでコマンドを実行できます。その場合、あなたのコードはあなたの大学のコンピュータでコンパイルされます。あるシステムでエラーが発生する実際の理由は、コード内で未定義の動作が原因である可能性があります。つまり、おそらく間違っていると思われます。 –

+0

スケルトンでは、このタイプのパラメータを持つすべての関数を変更することが許可されています(変更は許可されていないため): void(int image [700] [700]) 私は、 (関数ヘッダ内の)スタック上に大きな配列を定義した結果、それが私のウィンドウ上でローカルにコンパイルされず、私の大学のLinuxを通してコンパイルされます。スタックサイズの違いが原因です。 –

+0

Visual Studioにはどのようなエラーがありますか? –

答えて

0

パテを使用している場合、あなたのLinuxサーバへのSSH接続があり、そのLinuxシステムでコードをコンパイルしています。

あなたのシェルがBASHならば、私はulimit -astacksizeを含むすべてのメモリ制限を明らかにすると信じています。シェルがcshまたはtcshの場合は、プロンプトでlimitと入力して、値を制限値に表示します。 echo $SHELLを実行することによって、あなたのシェルがどのタイプであるかを見ることができます。

私はSUSEを使用していますが、これらの設定は/etc/security/limits.confにあります。 stacksizeにあるデフォルトの8MBを調整することができます。 SUSE/SLES 10.1以来、私はスタックサイズのデフォルトの制限が8MBであることを経験しました。なぜ彼らはそれを8MBに設定し、どのようなセキュリティの影響があるのか​​分かりません。何年もの間、limits.confstacksizeに設定してunlimitedに変更しましたが、問題は一度もありませんでした。 このファイル名と場所が他のすべてのディストリビューションに当てはまるか、あるいは8MBが他のディストリビューションのデフォルトのスタックサイズ制限であるかはわかりません。

他の人は、大きな配列変数がmain()で宣言されていて、プログラムを実行するときにスタック上に配置されるため、他の関数内で問題の原因となっていると言いました。 Linuxオペレーティングシステムがハード/ソフトの制限を8MBに設定している場合は、スタックに8MB以上のメモリを必要とするプログラムを実行する=失敗する。

私は何年にもわたってLinuxでコードを実行していますが、何も問題なくコンパイルしてから実行してください。説明がなくて終了するかクラッシュするようです。オペレーティングシステムによってスタックサイズに制限されます。 stacksizeをunlimitedにすばやく変更すると、プログラムが完了するまで実行された場合にそれが原因かどうかが確認されます。

これをすばやく回避するには、.cまたは.cppファイルのmain()の外部にある大きな変数を宣言します。これが良いプログラミングかどうかは別の問題です。

linuxで自由度が増し、gccコンパイラでは、stacksizeに設定されたハード/ソフト制限を超える宣言された変数をチェックしたり告げることなく、コードをコンパイルできるようになります。宣言された変数がstacksizeの値を超えた場合、gcc、g ++、またはgfortranがコンパイル時にチェックするコンパイラオプションがあるかどうかはわかりません。宣言された変数が使用するメモリの量は、常に整数であれば、int myarray[700]なら2800バイト、int myarray[700][700]は1.869MBで1,960,000バイトです。

Microsoft Windowsでスタックサイズのデフォルト制限がわかっていません(それは1MBであると言われています)。しかし、Visual Studio(これはよく知られていません)ではチェックしても驚かないでしょうコンパイル時に、宣言された変数がオペレーティングシステムによってスタックサイズに設定された制限を超えた場合。

関連する問題