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 ИМЯ; |
Да, точно, там тоже скобки вместе с содержимым съелись
QUOTE | лушайте может кто делал export в WORD причем с созданием там таблици??? |
а может в поиск сходить? а если там нет, то новую тему открыть? а то здесь как то... того... этого...
|
|
dimidrol |
Отправлено: 03.03.2004, 17:12 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
да ходил уже в поиск, нету нифига
и тему открывал, тоже глухо :-/
как работает автомотизация я вкурил, тока как вот таблицу забацать.
ну ладно разберусь. |
|