Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Динамические массивы в Delphi XE7 - XE10 / 25 сообщений из 48, страница 1 из 2
13.08.2017, 10:15:38
    #39504529
Term
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
Добрый день!

Вот с чем столкнулся, понадобился динамический массив,
раньше размер задавал с помощью SetLength но в Delphi XE10 столкнулся с тем, что этой функции нет...

нашел вот эту статью

http://www.proghouse.ru/programming/31-delphi-xe7-array

но то что вижу там в примере,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
dynArray2: array of integer;

......................

begin

 dynArray2 := [7, 8, 9]; //Инициализация динамического массива.

end;



ну блин, так это же не динамический, это по сути тот же статический массив, только вид сбоку!
Как жить без SetLength, когда количество элементов заранее не известно???
...
Рейтинг: 0 / 0
13.08.2017, 10:44:59
    #39504533
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
Term,

это шутка что ли такая? SetLength есть во всех версиях делфи, включая Tokyo. Находится в System, с динамическими массивами работает как и полагается.
...
Рейтинг: 0 / 0
13.08.2017, 11:00:35
    #39504537
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
Term> SetLength но в Delphi XE10 столкнулся с тем, что этой функции нет...

System.SetLength ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.08.2017, 11:32:10
    #39504540
Term
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
Гаджимурадов РустамTerm> SetLength но в Delphi XE10 столкнулся с тем, что этой функции нет...

System.SetLength ?


да вот так сработало, странно глюк видать какойто
...
Рейтинг: 0 / 0
13.08.2017, 11:38:24
    #39504544
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
Что значит "глюк"? Ошибка выдавалась какая-то?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.08.2017, 11:42:39
    #39504546
Term
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
Гаджимурадов Рустам,

сказала что не известный идетификатор, хотя в юзезах модуль был
...
Рейтинг: 0 / 0
13.08.2017, 12:17:37
    #39504550
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
TermКак жить без SetLengthМежду прочим, неплохое названия для топика было бы. Люди могли бы поделиться опытом)
...
Рейтинг: 0 / 0
13.08.2017, 15:12:30
    #39504583
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
Termсказала что не известный идетификатор,
Ты, скорее всего, опечетался при наборе кода в редакторе

Termхотя в юзезах модуль был
System? Ты так и пишешь, uses System ?
...
Рейтинг: 0 / 0
13.08.2017, 18:09:09
    #39504616
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
TermКак жить без SetLength
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure SetDynArrayLength(var A: Pointer; elSize, elNum: NativeInt);
var
 ti:TDynArrayTypeInfo;
begin
 ZeroMemory(@ti, sizeOf(ti));
 ti.elSize := elSize;
 DynArraySetLength(A, @ti, 1, @elNum);
end;
...
Рейтинг: 0 / 0
16.08.2017, 10:05:44
    #39506104
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
TermКак жить без SetLength, когда количество элементов заранее не известно???
Использовать список TList, TObjectList или их подвиды<Generics> в новых версиях Delphi.

Ни разу не сталкивался с реальной необходимостью использовать динамические массивы.
Если только ты не пишешь какую нибудь игру и обработку видео.
...
Рейтинг: 0 / 0
16.08.2017, 10:44:41
    #39506127
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
Valery_BНи разу не сталкивался с реальной необходимостью использовать динамические массивы.


Открой исходники RTL/VCL, столкнись, наконец.
...
Рейтинг: 0 / 0
16.08.2017, 16:16:34
    #39506426
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
Valery_BНи разу не сталкивался с реальной необходимостью использовать динамические массивы.Если размер известен заранее, то массив, если нет - TList
...
Рейтинг: 0 / 0
16.08.2017, 16:19:10
    #39506427
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
ну, это смотря что хранить
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.08.2017, 16:23:07
    #39506429
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
_Vasilisk_Valery_BНи разу не сталкивался с реальной необходимостью использовать динамические массивы.
Если размер известен заранее, то массив, если нет - TList

Я бы не стал хранить типы с управляемым временем жизни в TList, а вот в динамическом массиве - стал бы.
...
Рейтинг: 0 / 0
16.08.2017, 16:24:05
    #39506431
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
_Vasilisk_, TList = DynArray )
...
Рейтинг: 0 / 0
16.08.2017, 16:27:18
    #39506435
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
schiЯ бы не стал хранить типы с управляемым временем жизни в TListИмелось в виду TList<>
Bred eFeM, TList = DynArray )+ Grow
...
Рейтинг: 0 / 0
16.08.2017, 16:38:35
    #39506441
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
_Vasilisk_Если размер известен заранее, то массив, если нет - TList
Динамический массив потому и динамический, что не нужно знать размер заранее.
...
Рейтинг: 0 / 0
16.08.2017, 16:39:21
    #39506442
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
_Vasilisk_schiЯ бы не стал хранить типы с управляемым временем жизни в TListИмелось в виду TList<>
Bred eFeM, TList = DynArray )+ Grow

Мне часто приходится иметь с дело с версиями Delphi, где нет <>
Sad but true.
...
Рейтинг: 0 / 0
16.08.2017, 17:05:08
    #39506458
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
Kazantsev AlexeyДинамический массив потому и динамический, что не нужно знать размер заранее.Нифига. Потому, что размер неизвестен на этапе компиляции

Никто не мешает писать
Код: pascal
1.
SetLength(Data, Length(Data) + 1)

но что из этого получится - сам знаешь
schiМне часто приходится иметь с дело с версиями Delphi, где нет <>Боль. Я на 2006 написал свой TList, который на Add делал GetMem, а на Delete - Finalize + FreeMem. Но там под каждый управляемый тип нужно было писать своего наследника и переопределять два метода FinalizeItem и CopyItem. Ну и Get если хотелось строгой типизации
...
Рейтинг: 0 / 0
16.08.2017, 17:11:11
    #39506462
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
_Vasilisk_,

Я посмотрю, как вы набор байтов будете в TList хранить...
...
Рейтинг: 0 / 0
16.08.2017, 17:22:35
    #39506471
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
alekcvpЯ посмотрю, как вы набор байтов будете в TList хранить...Для набора байт неизвестной длины придуман TMemoryStream
...
Рейтинг: 0 / 0
16.08.2017, 17:30:25
    #39506474
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
_Vasilisk_alekcvpЯ посмотрю, как вы набор байтов будете в TList хранить...Для набора байт неизвестной длины придуман TMemoryStream

Для набора байт неизвестной длины придуман TBytes. Удобно, знаете ли.
...
Рейтинг: 0 / 0
16.08.2017, 17:32:56
    #39506476
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
schi_Vasilisk_пропущено...
Для набора байт неизвестной длины придуман TMemoryStream

Для набора байт неизвестной длины придуман TBytes. Удобно, знаете ли.

Т.е. array of Byte.
...
Рейтинг: 0 / 0
16.08.2017, 17:36:24
    #39506479
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
_Vasilisk_Нифига. Потому, что размер неизвестен на этапе компиляцииА я о чём написал?

_Vasilisk_но что из этого получится - сам знаешьНичего страшного.

_Vasilisk_Для набора байт неизвестной длины придуман TMemoryStreamДурь какая... А если мне не нужен интерфейс стрима, зачем огород-то городить?
...
Рейтинг: 0 / 0
16.08.2017, 17:38:50
    #39506481
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в Delphi XE7 - XE10
schiTBytes. Удобно, знаете ли.На любителя. Нет, конечно, если Вас не смущает постоянные реаллоки + бешеное фрагментирование памяти, то используйте, на здоровье. А если Вы скажете, что будете реаллоцировать память постранично, так Вы и получите вот это
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function TMemoryStream.Realloc(var NewCapacity: Longint): Pointer;
begin
  if (NewCapacity > 0) and (NewCapacity <> FSize) then
    NewCapacity := (NewCapacity + (MemoryDelta - 1)) and not (MemoryDelta - 1);
  Result := Memory;
  if NewCapacity <> FCapacity then
  begin
    if NewCapacity = 0 then
    begin
      FreeMem(Memory);
      Result := nil;
    end else
    begin
      if Capacity = 0 then
        GetMem(Result, NewCapacity)
      else
        ReallocMem(Result, NewCapacity);
      if Result = nil then raise EStreamError.CreateRes(@SMemoryStreamError);
    end;
  end;
end;

К слову, чуть ниже там же есть
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function TBytesStream.Realloc(var NewCapacity: Longint): Pointer;
begin
  if (NewCapacity > 0) and (NewCapacity <> FSize) then
    NewCapacity := (NewCapacity + (MemoryDelta - 1)) and not (MemoryDelta - 1);
  Result := Pointer(FBytes);
  if NewCapacity <> FCapacity then
  begin
    SetLength(FBytes, NewCapacity);
    Result := Pointer(FBytes);
    if NewCapacity = 0 then
      Exit;
    if Result = nil then raise EStreamError.CreateRes(@SMemoryStreamError);
  end;
end;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Динамические массивы в Delphi XE7 - XE10 / 25 сообщений из 48, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]