crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Посчитать количество элементов в sizeof
AD
  опции профиля:
сообщение 3.2.2010, 10:35
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Имеется несколько априори определенных структур. Это - MAC4Header и MAC4ChartHeader. Их размеры, соответственно - sizeof(MAC4Header), sizeof(MAC4ChartHeader).
Мне необходимо узнать размер динамического массива в следующей строчке:
// Где-то ранее
CMappingView view;

///////////////////////////
MAC4ChartHeader* pChartsList = reinterpret_cast<MAC4ChartHeader*>(view.pChar() + sizeof(MAC4Header));


Для того, чтобы понимать это за view, то приведу структуру описания view.
class CMappingView
{
private:
    PVOID pvAddress;
public:
    CMappingView(): pvAddress(NULL) {}
    CMappingView(PVOID pv): pvAddress(pv) {}
    CMappingView(CMappingView& mv): pvAddress(mv.pvAddress) { mv.pvAddress = NULL; }
    virtual ~CMappingView() { Close(); }
    operator PVOID() { return pvAddress; }
    char* pChar() { return static_cast<char*> (pvAddress); }
    short* pShort() { return static_cast<short*> (pvAddress); }
    int* pInt() { return static_cast<int*> (pvAddress); }
    long* pLong() { return static_cast<long*> (pvAddress); }
    bool Invalid() { return pvAddress == NULL; }
    CMappingView& operator=(CMappingView& mv);
    BOOL Init(PVOID pv);
    BOOL Close();
};


MAC4ChartHeader* pChartsList - Это всего лишь динамический массив, к элементам которого потом идет обращение через индекс. В старой программе он определен так, как я указал выше. Мне просто надо знать сколько элементов следует выделить под этот массив, поэтому я прошу помочь разобраться в этой строке:
// Где-то ранее
CMappingView view;
///////////////////////////
MAC4ChartHeader* pChartsList = reinterpret_cast<MAC4ChartHeader*>(view.pChar() + sizeof(MAC4Header));

Сейчас я хочу сделать так:
MAC4ChartHeader* pChartsList = new MAC4ChartHeader[/*<размер массива>*/];

Заранее спасибо!


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 3)
Влад
  опции профиля:
сообщение 3.2.2010, 11:12
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


MAC4Header какую структуру имеет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 3.2.2010, 11:17
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Влад @ 3.2.2010, 11:12) *
MAC4Header какую структуру имеет?

Не могу сказать. Единственное - в ней присутствует поле, отвечающее за количество структур MAC4ChartHeader.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 3.2.2010, 11:20
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Если в этом хедере есть поле, отвечающее за число карт - пусть называется chart_count, то new MAC4ChartHeader[chart_count];
Но в общем имей в виду, что MAC4ChartHeader* pChartsList = new MAC4ChartHeader[/*<размер массива>*/]; небезопасно в смысле потери ресурсов (памяти и хз еще чего) при исключениях. Поэтому лучше оберни в вектор или shared_array или собственный класс, реализующий RAII.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 2:24