реклама на сайте
подробности

 
 
> Указатели на объекты С++ IAR EWAVR
VladimirYU
сообщение Sep 1 2009, 13:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Столкнулся с непонятной вещью. Имеется некий класс TBase

в хидере
Код
[/code]
class TBase
{
public: TBase( UCHAR par1, UCHAR par2) // конструктор с двумя параметрами

// Далее методы, данный и т.д.
.........
.........
};
[code]


В file.cpp реализация.

В прилложении создаются объявляются глообальные указатели и создаются два объекта
1 способ, не работает
Код
[/code]
TBase *Obj[2];

// далее вызов конструкторов

Obj[0] = new TBase( A, B);
Obj[1] = new TBase( C, D);

// Методы вызываются в основной программе
Obj[0] ->Method1();
Obj[1] ->Method1();
..........
[code]


Поведение программы, как будто создан только один объет Obj[0]
А если сделать вот так
Код
[/code]
TBase *Obj0;
TBase *Obj1;
// далее вызов конструкторов

Obj0 = new TBase( A, B);
Obj1 = new TBase( C, D);

// Методы вызываются в основной программе

Obj0 ->Method1();
Obj1 ->Method1();
[code]

Все работает корректно.
В чем может быть причина или где я не догоняю
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SmSp
сообщение Sep 18 2009, 11:43
Сообщение #2





Группа: Участник
Сообщений: 11
Регистрация: 26-02-08
Пользователь №: 35 394



Дык, ёлки!

Всё верно, точнее у VladimirYU ошибка. Он обявил указатель на массив из двух TBase:

TBase *Obj[2];

Не забываем что массив в си есть указатель на первый элемент массива, имеет тип *TBase. Так, Obj есть указатель на указатель на первый элемент массива из TBase.

Первой строкой разименовал указатель (Obj[0] == *(Obj+0)), записал туда указатель на свежесозданный экземпляр TBase. Имеем указатель на указатель на массив, первый элемент которого проинициализирован:

Obj[0] = new TBase( A, cool.gif;

Вторая строка записывает указатель на свжесозданный экземпляр TBase по адресу Obj + 1:

Obj[1] = new TBase( C, D);

А это ошибка, т.к. используем указатель как массив, в итоге обращаясь к незанятой ячейки памяти.

Всё равно что объявить

TBase* pointer1;

и затем обратиться

*(pointer1 + 1) = bla bla;

Отсюда и неправильное поведение программы. Надо внимательнее, это же си.

Сообщение отредактировал SmSp - Sep 18 2009, 11:46
Go to the top of the page
 
+Quote Post
visual_wind
сообщение Sep 18 2009, 13:22
Сообщение #3





Группа: Участник
Сообщений: 8
Регистрация: 29-04-09
Из: Харьков
Пользователь №: 48 442



To SmSp: Мое видение проблемы:

У VladimirYU в том коде, что он привел, ошибок нет. Он НЕ объявлял указатель на массив из двух TBase, для чего надо использовать объявление TBase (*Obj)[2]. Он объявил массив из двух указателей на TBase, для чего и использовал правильное объявление TBase *Obj[2]. Это разные вещи, согласитесь.

Чтобы не пускаться дальше в дискуссию об указателях на указатели и о том, что обозначает имя массива, я в Visual C++ Express Edition 2008 собрал простенький пример.

Код
class TBase
{
private:
    char char1;
    char char2;
public:
    TBase( char c1, char c2 ): char1( c1 ), char2( c2 ) {}
    void Method1(){ cout << char1 << char2; }
    virtual ~TBase(){}
};

TBase* tb[2] = { NULL, NULL };

int _tmain(int argc, _TCHAR* argv[])
{
    tb[0] = new TBase( '1', '2' );
    tb[1] = new TBase( '3', '4' );

    tb[0]->Method1();
    tb[1]->Method1();

    delete tb[0];
    delete tb[1];

    return 0;
}


У меня этот код работает правильно и печатает "1234". Можете проверить у себя.

На мой взляд, проблема у VladimirYU в другом, но пока не понятно в чем.

Сообщение отредактировал visual_wind - Sep 18 2009, 13:42
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- VladimirYU   Указатели на объекты С++ IAR EWAVR   Sep 1 2009, 13:09
- - Quasar   VladimirYU привели бы весь код, или подробнее объя...   Sep 6 2009, 19:42
- - SmSp   А если объявить так? TBase (*Obj)[2];   Sep 17 2009, 06:58
- - visual_wind   To SmSp: В этом случае получится не массив из двух...   Sep 17 2009, 08:13
|- - VladimirYU   Цитата(visual_wind @ Sep 17 2009, 12:13) ...   Sep 17 2009, 09:51
||- - visual_wind   To VladimirYU: Так а стало понятно, что не работа...   Sep 18 2009, 06:33
|- - SmSp   Цитата(visual_wind @ Sep 17 2009, 12:13) ...   Sep 18 2009, 06:48
|- - visual_wind   To SmSp: Могу и ошибаться. Чтоб лишний раз не спо...   Sep 18 2009, 08:57
- - jorikdima   Зачем в АВР динамически выделяемые объекты? И вооб...   Sep 18 2009, 06:27
|- - Quasar   Цитата(SmSp @ Sep 18 2009, 15:43) Он обяв...   Sep 20 2009, 22:07
|- - VladimirYU   Цитата(Quasar @ Sep 21 2009, 02:07) Vladi...   Sep 21 2009, 06:02
- - SmSp   visual_wind, ты же сам написал, что приоритет опер...   Sep 18 2009, 13:41
|- - visual_wind   То SmSp: По-моему, мы вместо помощи человеку нача...   Sep 18 2009, 14:01
- - SmSp   Вы правы. Сверился с Керниган/Ричи - объявлен масс...   Sep 22 2009, 12:37


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 20:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016