Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Член указатель глобальной переменной


Автор: Saphir 25.2.2010, 19:24
Здравствуйте.
Создал проект MFC, в нем 3 диалога: главный диалог, диалог для ввода данных и диалог для вывода. Передавать данные я хочу через глобальные переменные. Объявляю глобальную переменную в диалоге ввода, там инициализирую ее, вызывая метод, в котором выделяю память и инициализирую члены, в том числе член-указатель этой памятью. Отладчик показывает, что все члены объекта были правильно инициализированы. Далее в диалоге вывода я объявляю эту переменную с параметром extern, и в конструкторе диалога вывода я вызываю метод этой глобальной переменной, пытаясь инициализировать переменные диалога. При вызове этого метода в отладчике значение члена-указателя - Bad Ptr.
Вопросы: почему там Bad Ptr и как получить вместо Bad Ptr нормальный указатель?..

Автор: Andrey44 26.2.2010, 05:50
Saphir, покажи как объявляешь.
Работа с глобальными переменными - не есть хорошо.

Автор: Saphir 26.2.2010, 10:51
Andrey44, это моя первая программа, использующая MFC. Поэтому сначала решил попробовать такой способ и наткнулся на эту ошибку...
Код

class CTv
{       
        wchar_t* manufacturer;
 
public:
        CTv();
        void m_in(wchar_t* m);
        void m_out(wchar_t* m);
        ~CTv(void);
};
 
CTv::CTv()
{
}
 
void CTv::m_in(wchar_t* m)
{
        if (m) 
        {
                manufacturer = new wchar_t[wcslen(m)];
                wcscpy(manufacturer,m);
        }
}
 
void CTv::m_out(wchar_t* m)
{
        m = new wchar_t[wcslen(manufacturer)];
        wcscpy(m,manufacturer);
 
}
 
CTv::~CTv(void)
{
}


В реализации диалога ввода
Код

CTv tv;
 
void CIn::OnBnClickedOk()
{
        UpdateData();
        tv.m_in(v_tv_m.GetBuffer());
        // TODO: Add your control notification handler code here
        OnOK();
}


В реализации диалога вывода
Код

extern CTv tv;
 
COut::COut(CWnd* pParent /*=NULL*/)
        : CDialog(COut::IDD, pParent)
        , v_tv_m(_T(""))
{
        tv.m_out(v_tv_m.GetBuffer());
}

Автор: Andrey44 26.2.2010, 11:52
Код

static CTv tv;

Автор: Saphir 26.2.2010, 12:52
Теперь вылезает Out.obj : error LNK2001: unresolved external symbol "class CTv tv" в реализации диалога вывода, несмотря на то что там есть #include "In.h" (заголовочный файл диалога ввода)

Автор: Andrey44 26.2.2010, 15:45
Цитата(Saphir @  26.2.2010,  12:52 Найти цитируемый пост)
Теперь вылезает

ну да, конечно
Лучше тогда глобальный объект делать указателем, потому что его надо инициализироватьж
Код

static CTv *tv = NULL;

Автор: Saphir 26.2.2010, 16:13
Все та же ошибка линковки осталась.  smile  Может быть решение где-то в настройках проекта?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)