C ++ Struct ArrayWinフォームの破損

MathHelp回答

statsStructのデータは、プログラムがメインの1行目から開始した最初の2秒で破損します。なぜ、statsStructをグローバルとして宣言しようとすると、このようになるのかわかりません。編集:これは、値がすべてstatsstructで混乱し、テキストが破損し、値が323232であるだけでコンパイルされます

extern attributes statsStruct[];

statsStructは複数のcppのヘッダーファイルのexternですが、IvはstatsSTructだけが残るまですべてのソースコードを削除しましたが、グローバルにすることはできません。関数内で宣言すると、適切な値で機能しますが、複数のファイル間でグローバルに使用し、同じ値を共有する必要があります。

 // tess.cpp : main project file.

#include "stdafx.h"
#include "Form1.h"
#include "test.h"
using namespace tess;
struct attributes{
   std::string stat;
   int amount;  
};  
attributes statsStruct[] = {{"Acc",0},
                        {"Cri",0},
                        {"Cr",0},
                        {"Crit",0},
                        {"Cr",0},
                        {"Ev",0},
                        {"An",0}};

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
   // Enabling Windows XP visual effects before any controls are created
   Application::EnableVisualStyles();
   Application::SetCompatibleTextRenderingDefault(false); 

   // Create the main window and run it
   Application::Run(gcnew Form1());
   return 0;
}
ハンスパッサン

偶然ではなく、これを再現したと思います。これは、プロジェクトのコンパイラ設定が原因で発生します。これを修正するには、[ソリューションエクスプローラー]ウィンドウの[プロパティ]、[全般]でプロジェクトを右クリックします。共通言語ランタイムのサポート設定をから/clr:pure変更します/clr

説明に少し手を振る必要があります。/ clr:pureが有効な場合、コンパイラーは純粋なILのみを生成でき、マシンコードは生成できません。問題は、CLRがグローバル変数をサポートしていないことです。コンパイラーは、アンマネージ配列であるattributes []配列をエミュレートし、適切に初期化するために、いくつかのスタントをプルする必要があります。これはデバッガーを混乱させるのに十分であるように見えます。実際のstatsArrayデータの代わりに「statsArray」のシムに移動します。確かに、配列要素にゴミが表示されます。追加のポインター逆参照が必要であり、一部のデバッガーはこれを忘れます。

/clrアンマネージ宣言を使用する場合常に有効にコンパイルしてください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事