Как заполнить Struct / Array записей с помощью Delphi?

Я хочу заполнить массив записей и с недавним воздействием на TMappedFile, я пытаюсь его дублировать, без фактического использования unFileMapping или BlockRead / Write. Цель состоит в том, чтобы оставить мои варианты открытыми только для этого. Проблема, которую я нахожу, либо не инициализируется, либо создаёт мой массив правильно.

Из того, что я видел до сих пор, заключается в том, что DataArrостанки nilпосле компиляции. И вызывает ошибку нарушения памяти (0x00000000), что означает, что она пуста / null. Мой инженер уже обратился ко мне о том, что размер массива может быть значительным для цели, а также упомянул, что я не могу делать то, что я хочу, если не буду относиться к указателю, например.DataArr^[0].value1

Я считаю, что моя путаница связана с несовместимыми типами E2008, которые кажутся противоположными интуитивным для динамического массива, поэтому я прокомментировал это. В противном случае я получаю сообщение об ошибке type TDataStruct = Record value1 : array[0..1] of Single; value2 : array[0..1] of Single; value3 : array[0..1] of Single; end; TDataStructArray = array[0..MaxInt div SizeOf(TDataStruct) - 1] of TDataStruct; PDataStructArray = ^TDataStructArray; var DataArr: PDataStructArray; begin //SetLength(DataArr,length(DataArr)+1); DataArr[0].value1[0] := 2; .

FillChar(DataArr,SizeOf(DataArr),0)

Другие вещи, которые я пробовал, используются, FillChar(DataArr[0], SizeOf(DataArr[0]) * Length(DataArr));а такжеDataArr: Array of TDataStruct;

Следующие ссылки были моими источниками

  1. Как удалить индекс динамического массива записей
  2. Использование New / Dispose с указателем записи, содержащим WideString
  3. Присвоение указателя записи массиву char в Delphi - снова?
  4. Как объявить массив, когда я не знаю длину до времени выполнения

arrays,delphi,record,

1

Ответов: 1


7 принят

Динамический массив является то , что это говорит: динамический.

Динамические массивы не имеют фиксированного размера или длины. Вместо этого память для динамического массива перераспределяется, когда вы назначаете значение массиву или передаете его в процедуру SetLength.

декларировать

SetLength(DataArr,Length(DataArr)+1); // Or preallocate as many as you wish to initialize

Используйте SetLength для распределения записей и их инициализации одновременно.

DataArr[0].value1[0] := 2;

Доступ к записи в массиве:

SetLength

В вашем примере не выделено выделение памяти, следовательно, ошибка. И SetLengthработает на динамических массивах, а не на указателях на статические массивы.

Вы можете управлять указателем с помощью GetMem / FreeMem и инициализировать с помощью ZeroMem, но это вызовет проблемы при создании и поддержании кода.

массивы, Дельфы, запись,
Похожие вопросы