Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические массивы на C++Builder... 
:(
    Опции темы
Kurt
Дата 10.9.2003, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Обычно я работаю с Delphi, но тут пришлось использовать C++Builder.
Подскажите, пожалуйста, есть ли в C++Builder динамические массивы?
Если можно, приведите простенький пример как с ними работать.
Особенно нужен пример работы с аналогом Дельфового SetLength (если в C++Builder есть аналог такой функции).
Заранее спасибо.


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Vyacheslav
Дата 10.9.2003, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



см. STL: vector


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Kurt
Дата 10.9.2003, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Признаю свою непонятливость, но как с вектором работать я не сообразил.
Ладно, а если мне не недо сохранять данные перед изменением размера?
В общем задача в простой форме:
нужно выделить память под массив байтов, размер массива определяется run-time.
Знаю есть API-функции для этого (VirtualAlloc & GlobalAlloc.. кстати, какая разница?).
Но хотелось бы средствами C++...


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
RAN
Дата 10.9.2003, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Конечно, C++. new и delete.
int *arr = new int[n]; //выделить n*sizeof(int) байт под массив. Теперь пользуйся arr[0], arr[1], ... arr[n]
................
delete[] arr; //освободить память

Чтоб изменить размер массива делают так: (так делают известные мне реализации STL):
int *arr = new int[n];
......................
{
int *temp = 0; //Объявить временную переменную под новый блок памяти
temp = new int[new_size]; //создать новый массив
if(temp) CopyMemory(temp, arr, n * sizeof(int)); //скопировать содержимое старого массива в новый
delete[] arr; //освободить память, занятую старым массивом
arr = temp; //присвоить указатель на новый массив arr
}
......................
delete[] arr;


PM MAIL ICQ   Вверх
Kurt
Дата 10.9.2003, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Извини, а это n должно быть константой?
Или можно во время работы проги назначать?
Типа:
int n=10;
int *arr = new int[n];
Или?...
Просто в данный момент у меня нет доступа к C++Builder и я не могу проверить...


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
mr.DUDA
Дата 10.9.2003, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
Знаю есть API-функции для этого (VirtualAlloc & GlobalAlloc.. кстати, какая разница?).

Не советовал бы злоупотреблять VirtualAlloc, т.к. память выделяется целыми страницами по 4Кб.

Используй "кучу" (heap), и если не догоняешь "new/delete", но зато знаешь что такое Alloc, пользуйся парой функций "malloc/free" (кстати, оператор "new" в конечном итоге всё равно вызывает функцию malloc).

Цитата
а это n должно быть константой?
Или можно во время работы проги назначать?

Можно ставить значение в run-time.

Это сообщение отредактировал(а) mr.DUDA - 10.9.2003, 22:55


--------------------
user posted image
PM MAIL WWW   Вверх
RAN
Дата 10.9.2003, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



n - не константа.
PM MAIL ICQ   Вверх
Vyacheslav
Дата 11.9.2003, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Уточни тогда вопрос:что ты понимашь под динмическим массивом: массив, созданный динамически, или массив с динамически изменяемой длинной?

В качестве массива байтов можно использовать string
примеры использования

Код

#include <iostream.h>
#include <stl.h>

int main ()
{
 vector<int> years;
 years.push_back (1962);
 years.push_back (1992);
 years.push_back (2001);
 years.push_back (1999);
 sort (years.begin (), years.end ());
 vector<int>::iterator i;
 for (i = years.begin (); i != years.end (); i++)
   cout << *i << endl;
 return 0;
}


Код

#include <iostream.h>
#include <stl.h>

int main ()
{
 vector<char> v1; // Empty vector of characters.
 v1.push_back ('h');
 v1.push_back ('i');
 cout << "v1 = " << v1[0] << v1[1] << endl;
 vector<char> v2 (v1);
 v2[1] = 'o'; // Replace second character.
 cout << "v2 = " << v2[0] << v2[1] << endl;
 cout << "(v1 == v2) = " << (v1 == v2) << endl;
 cout << "(v1 < v2) = " << (v1 < v2) << endl;
 return 0;
}






--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 11.9.2003, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата

Чтоб изменить размер массива делают так: (так делают известные мне реализации STL)

{
int *temp = 0; //Объявить временную переменную под новый блок памяти
temp = new int[new_size]; //создать новый массив
if(temp) CopyMemory(temp, arr, n * sizeof(int)); //скопировать содержимое старого массива в новый
delete[] arr; //освободить память, занятую старым массивом
arr = temp; //присвоить указатель на новый массив arr
}



Такие реализации STL выбрасывать надо сразу. Такое поведение допустимо только для valarray, ну и bitset (может еще чего забыл). В других контейнерах должен использоваться operator=, а не CopyMemory.



--------------------
Волны гасят ветер...
PM MAIL   Вверх
RAN
Дата 11.9.2003, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Fantasist, смысл-то не в CopyMemory, а в том что, чтобы увеличить размерность STL создаёт новый массив и копирует в него новый. Для стандартных типов (int и т.д.) копировать можно, это же не классы.
PM MAIL ICQ   Вверх
Nastya
Дата 11.9.2003, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Существует несколько способов динамически работать с массива
1. Используя шаблон классов vector
2. Используя операторы new и delete, при этом подходе ты сам "вручную " пишешь функцию изменения размера массива и на твоей совести ее корректная работа
3. Использовать функции alloc, free, или их WinApi-шные при это ты не только следишь за тем что описанно в п.2, но если речь идет об массиве объектов, то и за корректным вызовом конструкторов и деструкторов.

Наиболее предпочтительный вариант 1. В форуме не раз заходила речь об STL и даже где-то были ссылки на учебники идоки.
Если проблема более конкретная опиши.


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
podval
Дата 12.9.2003, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 1
Всего: 62



Ребята, обратите внимание на вопрос:
Цитата
Обычно я работаю с Delphi, но тут пришлось использовать C++Builder.


В Дельфи динамические массивы - это особый тип.
Вот что сделано в Билдере (см. help):

Цитата
DynamicArray is the C++Builder analog for the Object Pascal dynamic array type.

Header

sysdyn.h

Description

A Dynamic Array is a resizable collection implemented as an array. C++Builder provides the DynamicArray template as an implementation of Dynamic Arrays. The DynamicArray template uses a binary layout compatible with Delphi's Dynamic Array implementation, enabling you to share DynamicArrays of types compatible with both Delphi and C++Builder using Pascal and C++ code.

Syntax

template <class T> class DELPHIRETURN DynamicArray;



PM WWW ICQ   Вверх
podval
Дата 12.9.2003, 07:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 1
Всего: 62



Вот, кстати, с того же help'a:

C++ DynamicArray example

Код

#include <sysdyn.h>
#include <stdio.h>
#include "dynpas.hpp"

class someobject
{
public:
 someobject()
 {
   printf("someobject::someobject() %p \n", this);
 }
~someobject()
 {
   printf("someobject::~someobject() %p \n", this);
 }

};


void dumpArrayOfString(const DynamicArray<AnsiString>& ds)
{
 for (int i=0; i<ds.Length; i++)
   printf("%s\n", ds[i].c_str());
}

void dump2DArrayOfString(const DynamicArray< DynamicArray<AnsiString> > & ds)

{
 for (int i=0; i<ds.Length; i++)
 {
   for (int j=0; j<ds[i].Length; j++)
     printf("%s ", ds[i][j].c_str());
   printf("\n");
 }
}

int main(void)
{
 DynamicArray<AnsiString> oneD;
 printf("Dimension: %d \n", oneD.DimCount());
 fillArrayOfString(oneD);
 dumpArrayOfString(oneD);

 DynamicArray<DynamicArray<AnsiString> > twoD;
 printf("Dimension: %d \n", twoD.DimCount());
 fill2DArrayOfString(twoD);
 dump2DArrayOfString(twoD);

 return 0;

}

© Borland
PM WWW ICQ   Вверх
DENNN
Дата 12.9.2003, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата
смысл-то не в CopyMemory, а в том что, чтобы увеличить размерность STL создаёт новый массив и копирует в него новый.

Вот и надо было так написать smile.gif
PM ICQ   Вверх
B2_Russia
Дата 15.9.2003, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В доску свой :)
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 3.7.2003
Где: Тверь

Репутация: нет
Всего: 1



Ничего не читал кроме вопроса топика, и давно не писал ничего ни на Делфях ни на Билдере, но по-моему очень удобно использовать CList гы Хотя уже не помню что это такое...
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.