Копировать данные из указателя? - PullRequest
3 голосов
/ 02 ноября 2010
...
  PAnalyzeInfo = ^TAnalyzeInfo;
  TAnalyzeInfo = record
    pPitch: array of Single;
    pEnergy: array of Single;
    pPitchAccent: array of Single;
    pEnergyAccent: array of Single;
    pDicAccent: array of Single;
    pScore: array of Single;
    pBoundary: Integer;
    szRecWord: array of array of AnsiChar;
    nRecWordNum: Integer;
    nFrameNum: Integer;
  end;
...

У меня есть pDataSource: PAnalyzeInfo, который содержит данные, и я хочу скопировать их в новую независимую переменную.MyData : TAnalyzeInfo.

Можно ли скопировать всю структуру или добавить ее один за другим?

Ответы [ 3 ]

5 голосов
/ 02 ноября 2010

В Delphi вы можете скопировать запись, просто присвоив ее, благодаря магии компилятора.

MyData := DataSource^;

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

Если вы не хотите, вы можете скопировать их по отдельности:

MyData.pPitch = Copy(pDataSource^.pPitch, Low(pDataSource^.pPitch), 
                                          High(pDataSource^.pPitch);
4 голосов
/ 02 ноября 2010

Нет, динамические массивы нельзя скопировать с помощью одной команды копирования.Вам необходимо:

  1. Скопировать каждое поле, не являющееся массивом
  2. Для каждого массива
    1. Создать новый массив правильного размера в целевом объекте
    2. Скопируйте элементы массива через

Было бы намного проще, если бы массивы были статическими.В этом случае возможно копирование всего блока памяти.

1 голос
/ 02 ноября 2010

вы можете использовать процедуру перемещения, объявленную в системном блоке: system.move (pDataSource ^, MyData, sizeof (TAnalyzeInfo));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...