Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поле класса, Страшный глюк со сменой адреса 
V
    Опции темы
Gwendolen
Дата 4.12.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Ну совсем не понимаю smile 
Пол дня бился с поиском багов в своем классе, но проблему локализовал:
main.c
Код

#include <iostream>
#include <windows.h>

#include "cls.h"

typedef MyClass<DWORD> DWORDMyClass; 
//DWORDMyClass mycls; // можно объявить здесь 

void Test_(void)
{
DWORDMyClass mycls; // а можно объявить здесь 

mycls.myFunc();
}

int main() 
{
    Test_();
    return 0;
}


cls.h
Код

void value_ (PSTR file, int line, PSTR txt, void* value)
  {
    std::cout << "I: " << file << ": " << line << ": " << txt << " = "<< value << " in adress =" <<&value<< std::endl;
  }

#define DC_VAL(txt,value) value_(__FILE__,__LINE__,txt,value)

template <class TCls>
class MyClass
{
    private:
        HANDLE hnd;    
        TCls cl_var;
    public:
        MyClass();
        ~MyClass();
        void myFunc();
};

template <class TCls>
MyClass<TCls>::MyClass (void)
{
  DC_VAL ("HANDLE",  hnd);
  hnd = (void*) 0x01234567U;
  DC_VAL ("HANDLE",  hnd);
}   
template <class TCls>
MyClass<TCls>::~MyClass (void)
{
 DC_VAL ("HANDLE",  hnd);
}    
template <class TCls>
void
MyClass<TCls>::myFunc (void)
{
 DC_VAL ("HANDLE",  hnd);
}



В одном случае (локально) на консоль выводит:
Цитата

I: cls.h: 23: HANDLE = 0x77c25c94 in adress =0x22fecc
I: cls.h: 25: HANDLE = 0x1234567 in adress =0x22fecc
I: cls.h: 36: HANDLE = 0x1234567 in adress =0x22fecc
I: cls.h: 30: HANDLE = 0x1234567 in adress =0x22fecc

т.е. все ОК
, а в другом (глобально): 
Цитата

I: cls.h: 23: HANDLE = 0 in adress =0x22ff1c
I: cls.h: 25: HANDLE = 0x1234567 in adress =0x22ff1c
I: cls.h: 36: HANDLE = 0x1234567 in adress =0x22ff3c
I: cls.h: 30: HANDLE = 0x1234567 in adress =0x22ff20

т.е. в каждой процедуре свой адрес переменной... но инициализируется нулем ...
П О Ч Е М У ? ? ?
Какая разница где объявлен класс. Это что глюк компилятора?

P.S. В моем классе на 824 строки адрес не меняется при глобальном объявлении.

Добавлено @ 18:06 
P.P.S.
Компилятор - mingw32-gcc-3.4.2
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
Partizan
Дата 4.12.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



всё правильно....

Код

MyClass<TCls>::MyClass (void)
{
  DC_VAL ("HANDLE",  hnd);
  hnd = (void*) 0x01234567U;
  DC_VAL ("HANDLE",  hnd);
}  


при первом вызове DC_VAL значение hnd ничем не проинициализировано...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
JackYF
Дата 4.12.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Gwendolen @  4.12.2006,  17:59 Найти цитируемый пост)
но инициализируется нулем ...

В этом месте мог быть просто 0(изначально в памяти). Инициализация может и не проходить.



Цитата(Gwendolen @  4.12.2006,  17:59 Найти цитируемый пост)
П О Ч Е М У ? ? ?
Какая разница где объявлен класс. Это что глюк компилятора?


А какая тебе разница в конструкторе или деструкторе, какой адрес переменной? Приватной к тому же...

Ты проверяй, чтобы в функциях она не менялась...
А в конструкторе/деструкторе - ну, может быть...

Как писал Джефф Элджер(если не ошибаюсь), инициализация глобальных переменных напоминает сложный процесс с пением, танцами с бубном, и мантрами... smile

Я не видел на этот счет никаких гарантий...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Gwendolen
Дата 4.12.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Выяснил в чем проблема - Я пытался изменить значение HANDLE hnd в inline функции вне класса (общей для нескольких РАЗНЫХ классов) Ctrl+C &  Ctrl+V
 во внутрь функции класса и все заработало.

Цитата(JackYF @  4.12.2006,  18:37 Найти цитируемый пост)
А какая тебе разница

Я винил смену aдреса в том, что переменная не "запоминает" присвоенных в inline функции, в виде одного из параметров, значений. 

Это сообщение отредактировал(а) Gwendolen - 4.12.2006, 20:56
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.