Перейти к содержанию
    

Сдвинуть указатель в Delphi на нужную позицию

Есть указатель 

pVal : ^TType;

запись осуществляется так 

pVal := @Buf; //инициализация

pVal^ := XX; //нулевая позиция

inc(pVal);

pVal^ := YY; //первая позиция

inc(pVal);

pVal^ := ZZ; //вторая позиция


Как правильно сдвинуть указатель на вторую позицию сразу после инициализации? В сети ответа пока не нашёл. 

В си аналогичный код выглядел бы так:

TType* pVal;
pVal = &Buf[0];

*(pVal[2]) = ZZ;
или 

*(pVal + 2*sizeof(TType)) = ZZ;
 

 

 

Изменено пользователем ДЕЙЛ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал вот так:

procedure DataGraphAdd(val : Int64; DateTime: TDateTime);
  var
    pDGTmp : pDataGraph;
begin
  pDGTmp := FormGraph.pDG;

  inc(pDGTmp, FormGraph.DGiAct);

  pDGTmp^.val := val;
  pDGTmp^.dt := DateTime;
  inc(FormGraph.DGiAct);

  FormGraph.DGiAct := FormGraph.DGiAct and (MAX_CNT_DG - 1);
end;

Туповато, но лучше, чем передача массива в функции. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

55 минут назад, ДЕЙЛ сказал:

В си аналогичный код выглядел бы так:

TType* pVal;
pVal = &Buf[0];

*(pVal[2]) = ZZ;
или 

*(pVal + 2*sizeof(TType)) = ZZ;

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 minutes ago, jcxz said:

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

Возможно. Навскидку накидал. Вопрос не в си, а в том, как в делфи обратиться к элементу массива через указатель на этот массив.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, ДЕЙЛ said:

Как правильно сдвинуть указатель на вторую позицию сразу после инициализации?

inc(pVal, 2)  - не оно?

1 hour ago, ДЕЙЛ said:

чем передача массива в функции. 

А кто вам запрещает передать массив по ссылке? (var в формальном параметре)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, xvr said:

А кто вам запрещает передать массив по ссылке? (var в формальном параметре)

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

pDGTmp := pDG; 
inc(pDGTmp, poz);
Y := pDGTmp^;

Результат здесь. В форму с графиком передаю указатель на нужный буфер с данными. Объём буфера 32 МБ.  

 

 

Изменено пользователем ДЕЙЛ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 minutes ago, ДЕЙЛ said:

Принципиально ничего не улучшится.

Работа через массив + индекс более безопасна чем работа с указателем на массив - Delphi обеспечивает контроль за выходом за границу массива (если вы его не отключите).

Если ошибок нет (и ловить возможные ошибки вы не хотите), то разницы действительно нет 🙂

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...