Дмитрий |
Отправлено: 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мс
|
|