C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
размер динамического массива sizeof
Дмитрий
Отправлено: 07.04.2004, 00:11


Не зарегистрирован







День добрый!

я создаю динамический массив, а функция sizeof возвращает какую-то ерунду! А я ее хотел использовать для определения количества элементов в массиве...
вот код:
CODE

struct TNook
  {
     TPanel *Panel;
     TPaintBox *SmallGraf;
     TImage *InfoPanel;
     TColor OwnColor;
     bool ShowPoints;
     bool ShowLines;
  }*Nook;

  Nook=(TNook*)calloc(10,10*sizeof(TNook));
  ShowMessage(IntToStr(sizeof(Nook));



то что нужное количество элементов создается — это точно, но вот почему функция возвращает 4 байта, я не могу понять.
Даже в хелпе написано, что для определения количества элементов нужно сделать так:
CODE

sizeof(Nook)/sizeof(TNook)

а если -1 то это будет индекс последнего элемента...

я где-то ошибаюсь?

Дмитрий
Отправлено: 07.04.2004, 00:14


Не зарегистрирован







А, еще

если я теперь допишу

CODE

Nook[0].Panel= new TPanel;


то linker ругается словами

... no match TPanel::TPanel()


тоже не могу понять почему...
Георгий
Отправлено: 07.04.2004, 00:16


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



CODE
sizeof(Nook)/sizeof(TNook)

это для статический массивов.

почему не хочешь использовать класс vector ?
klen
Отправлено: 07.04.2004, 00:40


Машинист паровоза

Группа: Участник
Сообщений: 239



Радной мой, sizeof мерит тебе размер указателя TNook, он 4 байтам — размер любого указателя. Если ты напишишь Sizeof(TNook) то он тебе даст размер структуры. Число элементов янапример не зная как достоверно померять без заморочек, либо пиши связанный список , либо в самой структуре еще чето доворачивай.

Единственный способ — узнать обьем памяти выделенной calloc ( она дает адрес начала выделленого блока, предыдущее двойное слово содержит размер выделленого блока), но проблема в том выделяется регионы памяти не равные щапрошенным, например попросишь ты 2 блока по 2 байта = 4 байта, а выделит она тебе не меньше 14 байт, тут выравнивание данных в памяти играет большую роль. Поэтому метод не я вляется надежным.
Valdemar
Отправлено: 07.04.2004, 08:22


Мастер участка

Группа: Участник
Сообщений: 433



CODE
Nook[0].Panel= new TPanel;

Линкер на это ругается, потому что не может найти конструктор TPanel без параметров.
Дмитрий
Отправлено: 07.04.2004, 11:01


Не зарегистрирован







QUOTE

Радной мой, sizeof мерит тебе размер указателя TNook, он 4 байтам — размер любого указателя. Если ты напишишь Sizeof(TNook) то он тебе даст размер структуры. Число элементов янапример не зная как достоверно померять без заморочек, либо пиши связанный список , либо в самой структуре еще чето доворачивай.


Все это долго, я хочу как в дельфи — setlength и нет проблем.
Все ясно, будем бороться!

QUOTE

Единственный способ — узнать обьем памяти выделенной calloc ( она дает адрес начала выделленого блока, предыдущее двойное слово содержит размер выделленого блока)


спасибо, действительно не знал

QUOTE

CODE
 
sizeof(Nook)/sizeof(TNook)
 

это для статический массивов.

почему не хочешь использовать класс vector ?


потому что для выделения памяти этому классу размером 10мб требуется несколько секунд — это никуда не годится.
а обычному calloc или realloc (аналог setlength в delphi) на это требуется 200мс


Вернуться в Вопросы программирования в C++Builder