2013-11-17 3 views
0

Застрял на этом весь день. Данные в statsStruct становятся коррумпированными в первую секунду, когда программа начинается в главном в строке 1. Я не знаю, почему, когда я пытаюсь объявить statsStruct как глобальный, он становится сюда. EDIT: Это делает компилировать только значения все перепутались в statsstruct, текст поврежден и значение 323232C++ Struct Array Win Form corporation

extern attributes statsStruct[]; 

statsStruct является ехЬегп в файле заголовка для нескольких CPP, но 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; 
} 
+0

Вы должны указать, как вы можете сказать, что массив поврежден. Возможно, ваш код для чтения массива неверен. – john

+0

Пройдя через него с отладчиком, точка останова в первой точке в главном и посмотрите на него. Я также посмотрел на него в функциях, которые предполагают использовать его, и он тоже ошибался, поэтому я верю, что его объявление может быть объявлено? новый для этой формы. Код имеет нулевые проблемы без кода интерфейса. –

+0

Кажется, что один знает :( –

ответ

1

Я думаю, что получил репродуцирование для этого, скорее, случайно. Это вызвано установкой компилятора в вашем проекте. Чтобы исправить это, щелкните правой кнопкой мыши ваш проект в окне Solution Explorer, Properties, General. Измените настройку поддержки обычного языка Runtime от /clr:pure до /clr

Мне нужно немного помахать руками в объяснении. С/clr: чисто по сути, компилятор разрешен только для создания чистого ИЛ и никакого машинного кода. Проблема в том, что CLR делает не поддерживает глобальные переменные. Компилятор должен вытащить несколько трюков, чтобы эмулировать ваш массив атрибутов [], неуправляемый массив и правильно его инициализировать. Похоже, этого достаточно, чтобы запутать отладчик, он берет вас в прокладку для «statsArray» вместо фактических данных statsArray. Вы действительно увидите мусор в элементах массива. Требуется дополнительное разыменование указателя, а затем некоторые, отладчик забывает это сделать.

Обязательно компилируйте с помощью /clr, если вы используете неуправляемые объявления.

+0

Спасибо, это заставило меня сумасшедшие потраченные впустую дни. Это работает :) –