Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > ошибка обращения к памяти


Автор: kosta 25.5.2006, 15:02
подскажи плз, чот я не  пойму почему так происходит :

есть у меня класс, который я описал в отдельном файлике, и так как мне нужно чтобы объект этого класса был виден везде я в этом же заголовочном сделал указатель на объект, выглядит ето так

Код

//---------------------------------------------------------------------------

#ifndef CanalDescH
#define CanalDescH

//---------------------------------------------------------------------------

class TCanal
{
private:
    int Length; //OX
    int Height; //OY
    int Width;  //OZ
    double Lambda; // heat conductivity
public:
    TCanal(int,int,int);
    TCanal(int,int,int,double);
    void Draw();
    int GetLength();
    int GetHeight();
    int GetWidth();
    double GetLambda();

    __property int length = {read = GetLength};
    __property int height = {read = GetHeight};
    __property int width = {read = GetWidth};
    __property double lambda = {read = GetLambda};

};

TCanal *Canal;

#endif


так вот када я обращаюсь к методу   GetLength(); то при выполнении return Length;выдает ошибку Access violation  at adress 00403822 in module "Name.exe". Read of adress 00000000

плюс ко всему выдает ворнинги что символ Canal определен во всех обжектовских файлах приложения.

Вот тут у меня инициализируется сам обект
Код

void __fastcall TfrmSCMain::btnCreateCanalClick(TObject *Sender)
{
int l=StrToInt(edtLength->Text);
int h=StrToInt(edtHeight->Text);
int w=StrToInt(edtWidth->Text);
Canal = new TCanal (l,h,w);
frmSC3D->Enabled=True;
Canal->Draw();



и вот в функции Draw и случаеца ета лабуда при вызове ГетЛенгс

Добавлено @ 15:05 
еще пробовал троссировкой выловить ошибку, получилось что в вотчах показывается содержимое класса Канал, а когда переходит к ГетЛенгс, то там переменная Ленгс в вотчах отображается как ???? а Канал.Ленгс - как нормальное число 

Автор: kosta 25.5.2006, 15:39
Скорее всего он указатели клепает везде гле бзаю заголовочный файл с его описанием. Может подскажете как мне сделать Объект некоторого класса, чтобы он был виден везде а инициализация происходила при нажатии некоторой кнопки. Опишити плз в общем случае как вы делаете или покажите пример 

Автор: likehood 25.5.2006, 17:05
объяви указатель на объект так:
Код

extern TCanal *Canal;
 

Автор: kosta 25.5.2006, 17:19
пробовал, но пишет что неразрешенная внешняя ссылка =( 

Автор: likehood 25.5.2006, 17:20
Цитата(kosta @  25.5.2006,  18:19 Найти цитируемый пост)
пробовал, но пишет что неразрешенная внешняя ссылка =( 

поподробнее, где пишет? 

Автор: kosta 25.5.2006, 17:34
там где и все ошибки, он прожект не компилит. вот ошибка 
[Linker Error] Unresolved external '_Canal' referenced from D:\ХОЛОД\SC\BCB\SCMAIN.OBJ
 

Автор: likehood 25.5.2006, 17:39
Ах, ну да, совсем забыл. В том файле, где создается Canal, нужно обявить TCanal *Canal; (без extern'а) 

Автор: kosta 25.5.2006, 17:41
АЛИЛУЯ!!!! smile  огроменное спасиба 

Автор: likehood 25.5.2006, 17:42
всегда пжалста! 

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