Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Увеличение размера динамического массива


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

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

Код

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
А нужно, чтобы по-человечески получалось.

Автор: Rennigth 25.4.2007, 16:37
Код

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;

Автор: Unforgiven 25.4.2007, 16:40
А если, к примеру, я не знаю сколько элементов массива у меня будет? Тогда как же? 

Автор: Rennigth 25.4.2007, 16:44
Код

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;

Автор: artemiy 25.4.2007, 16:44
Вот добавление одного элемента
Код

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

Таким образом ты можешь добавить сколько угодно элементов.

Автор: Unforgiven 25.4.2007, 16:48
Ничего подобного. Так получается прежний результат!

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

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

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

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

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

Добавлено через 1 минуту и 35 секунд
Кстати, твой пример коряво работать будет, т.к. первый элемент = -1

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

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

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

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

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

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

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

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

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

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

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

Автор: Rennigth 25.4.2007, 17:22
Цитата(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 используй чтобы не дай бог указатель не посеять)
Если что поправьте. В приципе с ними со всеми типами работай как с обычными динамическими массивами. Если есть все-таки траблы, выкладывай куски кода которые не можешь перевести, кто-нить поможет.

Автор: Unforgiven 25.4.2007, 17:27
Насколько я помню, в С++ нет такого понятия, как char. Их Char аналог нашего Byte

Добавлено через 3 минуты и 5 секунд
А если будут встречаться многомерные динамические массивы. Как быть? 

Автор: Rennigth 25.4.2007, 17:38
Цитата(Unforgiven @  25.4.2007,  17:27 Найти цитируемый пост)
Насколько я помню, в С++ нет такого понятия, как char. Их Char аналог нашего Byte

Сути не меняет.   smile 


Цитата(Unforgiven @  25.4.2007,  17:27 Найти цитируемый пост)
А если будут встречаться многомерные динамические массивы. Как быть?  

Тотже самый SetLength. Многомерные массивы объявляются как array of array [и тд] of [Type]

Автор: Unforgiven 25.4.2007, 17:41
Спасибо за помощь  и потраченное на меня время

Автор: ilya198293 1.6.2007, 09:24
Цитата

Тотже самый SetLength. Многомерные массивы объявляются как array of array [и тд] of [Type]

Как всё простоsmile

Автор: ilya198293 1.6.2007, 12:15
Хотя не всё так просто...а как копирование осуществить...
если у меня есть двумерный массив, то как к его ячейке сделать присвоение данных?

Автор: Alexeis 1.6.2007, 13:09
как и у обычного mas[i, j] либо mas[i][j].

Автор: ilya198293 1.6.2007, 14:11
У меня просто не правильно массив был описан, а так всё номана получилосяsmile

Автор: AlexxxM 1.6.2007, 16:41
Цитата(Unforgiven @ 25.4.2007,  16:21)
Подскажите пожалуйста, как мне изменять размер динамического массива, при это не теряя данных, которые в нем находятся. 

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

Код

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




Динамические массивы индексируются с нуля, а ты пытаешься записать переменную за массив 

нужно так:

Код

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


или так

Код

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

Автор: ilya198293 4.6.2007, 09:04
А как можно отчистить массив самым простым способ инициализированный так: DebitData:array of array[1..11] of string;?
При этом желательно освободить место. FreeMem что-то не догнал как работает и что нужно в ней указать.
И что содержится в ячейках такого массива после задания его размерности?

Автор: MetalFan 4.6.2007, 11:25
Цитата(ilya198293 @  4.6.2007,  09:04 Найти цитируемый пост)
А как можно отчистить массив самым простым способ инициализированный так: DebitData:array of array[1..11] of string;?

Finalize

Цитата(ilya198293 @  4.6.2007,  09:04 Найти цитируемый пост)
И что содержится в ячейках такого массива после задания его размерности? 

ничего. пустые строки

Автор: Alexeis 4.6.2007, 11:43
Цитата(MetalFan @  4.6.2007,  11:25 Найти цитируемый пост)
Finalize

Или DebitData := nil;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)