Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Увеличение размера динамического массива 
:(
    Опции темы
Unforgiven
Дата 25.4.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Подскажите пожалуйста, как мне изменять размер динамического массива, при это не теряя данных, которые в нем находятся. 

Предположим:

Код

var
  i:byte;
  x:array of byte;
begin
  for i:=1 to 10 do begin
       setlength(x,i);
       x[i]:=i;
  end;
end;


Результатом этой программы будет: x[1]=0, x[2]=0, ... ,x[10]=10
А нужно, чтобы по-человечески получалось.

Это сообщение отредактировал(а) Unforgiven - 25.4.2007, 16:24
PM MAIL   Вверх
Rennigth
Дата 25.4.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Код

const
  C_ARR_LENGTH = 10;
var
  i: Byte;
  x: array of Byte;
begin
  SetLength(x, C_ARR_LENGTH);
  for i:=0 to C_ARR_LENGTH - 1 do        
    x[i]:=i;
end;



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Unforgiven
Дата 25.4.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А если, к примеру, я не знаю сколько элементов массива у меня будет? Тогда как же? 
PM MAIL   Вверх
Rennigth
Дата 25.4.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Код

var
  i: Byte;
  x: array of Byte;
begin
  i := 0;
  while not RS.EOF(к примеру) do
  begin
    SetLength(x, Length(x) + 1);
    x[High(x) - 1] := i;
    Inc(i);
  end;
end;



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
artemiy
Дата 25.4.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот добавление одного элемента
Код

 SetLength(x,Length(x)+1);

Таким образом ты можешь добавить сколько угодно элементов.
PM MAIL   Вверх
Unforgiven
Дата 25.4.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ничего подобного. Так получается прежний результат!
PM MAIL   Вверх
Rennigth
Дата 25.4.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Цитата(Unforgiven @  25.4.2007,  16:48 Найти цитируемый пост)
Ничего подобного. Так получается прежний результат! 

Меня терзают смутные сомнения.  smile

Добавлено через 3 минуты и 40 секунд
Unforgiven, Приводи больше кода который не работает. А так гадать в чем у тебя проблемма нехочется.

Добавлено через 4 минуты и 48 секунд
 smile  Шаманы, колдуны, и экстросенсы на других форумах наверное обетают.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Unforgiven
Дата 25.4.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А если теперь попробовать сделать таким же способом динамически изменяемый буфер в памяти. Получится ли и если да, то как?

Добавлено через 1 минуту и 35 секунд
Кстати, твой пример коряво работать будет, т.к. первый элемент = -1
PM MAIL   Вверх
Rennigth
Дата 25.4.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Цитата(Unforgiven @  25.4.2007,  16:56 Найти цитируемый пост)
динамически изменяемый буфер в памяти.

Что ты подразумеваешь под этим?

Добавлено через 1 минуту и 29 секунд
Цитата(Unforgiven @  25.4.2007,  16:56 Найти цитируемый пост)
Кстати, твой пример коряво работать будет, т.к. первый элемент = -1 

Ну а не фига индекс делать byte. Меняй смело на Integer.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexeis
Дата 25.4.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Unforgiven @  25.4.2007,  16:56 Найти цитируемый пост)
А если теперь попробовать сделать таким же способом динамически изменяемый буфер в памяти. Получится ли и если да, то как? 

  Все это весьма кривой способ. Изменение длинны массива таким образом очень нежелательно, так как при этом каждый раз выделяется новый буфер, в него копируются все элементы, а старый удаляется. Выделять так уже сразу на 5 элементов, а в дальнейшем изменять его длину не на 1 элемент, а на 50% его прежней длины, тогда операции выделения, освобождения памяти станут весьма редкими. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Unforgiven
Дата 25.4.2007, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну то есть, грубо говоря, создать подобие структуры С++ "unsigned char* pBuffer "
PM MAIL   Вверх
Rennigth
Дата 25.4.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Цитата(Unforgiven @  25.4.2007,  17:05 Найти цитируемый пост)
Ну то есть, грубо говоря, создать подобие структуры С++ "unsigned char* pBuffer " 

Зачем? В Делфях это как я понимаю PChar. Только зачем он тебе?

Объясни конкретнее что ты хочешь реализовать.


Это сообщение отредактировал(а) Rennigth - 25.4.2007, 17:10


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Unforgiven
Дата 25.4.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Перевожу дурацкий сишный код. А там таких структур очень много. Кроме того есть unsigned float* pBuf, short int* pBuf и т.д. Как все это нормаль перевести?
PM MAIL   Вверх
Rennigth
Дата 25.4.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Цитата(Unforgiven @  25.4.2007,  17:11 Найти цитируемый пост)
Перевожу дурацкий сишный код. А там таких структур очень много. Кроме того есть unsigned float* pBuf, short int* pBuf и т.д. Как все это нормаль перевести? 

В C++ особо не силен но похоже что: 
unsigned float* pBuf - array of Extended;
short int* pBuf - arrray of Byte;
unsigned char* pBuf - PChar; (А лутше string используй чтобы не дай бог указатель не посеять)
Если что поправьте. В приципе с ними со всеми типами работай как с обычными динамическими массивами. Если есть все-таки траблы, выкладывай куски кода которые не можешь перевести, кто-нить поможет.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Unforgiven
Дата 25.4.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Насколько я помню, в С++ нет такого понятия, как char. Их Char аналог нашего Byte

Добавлено через 3 минуты и 5 секунд
А если будут встречаться многомерные динамические массивы. Как быть? 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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