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

 
 
> Указатели на объекты С++ 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
Quasar
сообщение Sep 20 2009, 22:07
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(SmSp @ Sep 18 2009, 15:43) *
Он обявил указатель на массив из двух TBase:

Ни чего он такого не объявлял.

Цитата('SmSp' date='Sep 18 2009 @ 15:43' post='651718')
Надо внимательнее, это же си.

Вот именно.

Возмите, да под какой-нибудь системой(которая способна ошибку сегментации выдать) соберите код:
Код
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(void){
    int i,*arr[10],*arr2[10];
    printf("Part 1\n");
    for (i = 0; i < (sizeof(arr)/sizeof(int*));i++){
        printf ("i = %d\n",i);
        arr[i] = (int*)malloc(sizeof(int));
        *arr[i] = i;
    }
    for (i = 0; i < (sizeof(arr)/sizeof(int*));i++){
        printf ("n = %d\n",*arr[i]);
    }
    printf ("Part 2\n");
    for (i = 0; i < (sizeof(arr2)/sizeof(int*));i++){
        printf ("i = %d\n",i);
        *arr2[i] = i;
    }
    return 0;
}


VladimirYU
Проблема где-то не в массиве.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Sep 21 2009, 06:02
Сообщение #4


Местный
***

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



Цитата(Quasar @ Sep 21 2009, 02:07) *
VladimirYU
Проблема где-то не в массиве.

Я тоже к этому склоняюсь, но дело в том, что объекты в моем случае это физические приборы обращение к которым от "мамы" по SPI шине. Реализация класса, поддерживающего их, скрыта, есть только интерфейс .h и .r90. В общем пока обхожу эту проблему, но в дальнейшем придется разбираться. Всем спасибо за участие, за одно и лишний раз в стандарте покапался.
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
|- - visual_wind   To SmSp: Мое видение проблемы: У VladimirYU в том...   Sep 18 2009, 13:22
- - 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 Текстовая версия Сейчас: 30th July 2025 - 07:36
Рейтинг@Mail.ru


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