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

 
Kак узнать длину массива созданного через new?
dimidrol
Отправлено: 28.02.2004, 13:44


Дежурный стрелочник

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



Люди, как узнать длину массива созданного через new?

например:

АnsiString *mass;
mass = new AnsiString[10];

по идее длину етого массива должна вернуть:

int length = sizeof(mass)/sizeof(mass[0]);

но етого непроисходит я так понял потому что массив создан через
оператор new.

так как еще можно получить длину???
Георгий
Отправлено: 28.02.2004, 21:12


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

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



sizeof — это фактически директива препроцессора т.к. она работает только для статических массивов.

по идее размер динамического массива должен знать программист и, как типовое решение, был в STL внесён класс vector, которые сам хранит свою длину.

но, узнать длину уже созданного с помошью new массива можно — в ячейке памяти предшествующей массиву, хранится число байт выделенное под этот массив.
CODE
void* ptrArr=new char[this->CSpinEdit1->Value];
this->Edit1->Text=*(((DWORD*)ptrArr)-1);
delete ptrArr;

выражение
CODE
*(((DWORD*)ptrArr)-1)
и есть реальный размер памяти выделенной под массив.
Сразу хочу предупредить — этот размер обычно больше, чем заказывал программист при выполнении оператора new.
dimidrol
Отправлено: 28.02.2004, 22:04


Дежурный стрелочник

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



СПАСИБО Георгий!

немог бы привести коротенъкий пример с использованием
класса vector: создание, инициализация, одним словом мини
рабочее приложение?
exp
Отправлено: 01.03.2004, 22:29


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

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



[CODE]
......
#include

vector DoubleVector(0) // пустой (без элементов.) вектор типа double

Добавление элемента:
double Chislo=2.718281828;
DoubleVector.push_back(Chislo);// запихивает Chislo в конец вектора
// Можно пользоваться функцией insert ;
Метнемся кабанчиком по индексам.
Только здесь в его роли выступает итератор. ("Тебе страшно? Мне — нет". Карлсон)
Итератор — указатель на элемент вектора. (если я не прав — поправьте плз.)

vector::iterator i; // объявим этого зверя
for(i=DoubleVector.begin();i!=DoubleVector.end();i++)
{
Memo1->Lines->Add(FloatToStr(*i)); // разыменуем итератор,
// переведем в стр.
}
функции DoubleVector.begin() и DoubleVector.end() возвращают итераторы на начало и конец вектора соответственно.

Хочешь узнать количество элементов вектора?
DoubleVector.size();

Ну вот так вот.
Ах да! удаление DoubleVector.erase(i) // i — итератор нужного элемента.
Asher
Отправлено: 02.03.2004, 10:09


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

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



Привет.
Exp — ты забыл закрыть тег и у тебя кое-что потерялось в тексте.
Надо
CODE
#include <vector>
vector<double> DoubleVector(0);


Отредактировано Asher — 02/03/2004, 12:19
dimidrol
Отправлено: 03.03.2004, 14:40


Дежурный стрелочник

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



СПАСИБО все работает просто супер!!!
тока при объявлении итератора нужно делать так:
vector<тип>::iterator ИМЯ;

слушайте может кто делал export в WORD причем с созданием там таблици???
Asher
Отправлено: 03.03.2004, 16:17


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

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



QUOTE
тока при объявлении итератора нужно делать так:
vector<тип>::iterator ИМЯ;

Да, точно, там тоже скобки вместе с содержимым съелись biggrin.gif

QUOTE
лушайте может кто делал export в WORD причем с созданием там таблици???

а может в поиск сходить? а если там нет, то новую тему открыть? а то здесь как то... того... этого...
dimidrol
Отправлено: 03.03.2004, 17:12


Дежурный стрелочник

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



да ходил уже в поиск, нету нифига
и тему открывал, тоже глухо :-/

как работает автомотизация я вкурил, тока как вот таблицу забацать.
ну ладно разберусь.

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