ДЕЙЛ 30 23 июля, 2023 Опубликовано 23 июля, 2023 (изменено) · Жалоба Есть указатель 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; Изменено 23 июля, 2023 пользователем ДЕЙЛ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 30 23 июля, 2023 Опубликовано 23 июля, 2023 · Жалоба Сделал вот так: 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; Туповато, но лучше, чем передача массива в функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 23 июля, 2023 Опубликовано 23 июля, 2023 · Жалоба 55 минут назад, ДЕЙЛ сказал: В си аналогичный код выглядел бы так: TType* pVal; pVal = &Buf[0]; *(pVal[2]) = ZZ; или *(pVal + 2*sizeof(TType)) = ZZ; Похоже вы очень плохо знаете си, раз пишете такую белиберду. И тем более считаете это идентичным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 30 23 июля, 2023 Опубликовано 23 июля, 2023 · Жалоба 28 minutes ago, jcxz said: Похоже вы очень плохо знаете си, раз пишете такую белиберду. И тем более считаете это идентичным. Возможно. Навскидку накидал. Вопрос не в си, а в том, как в делфи обратиться к элементу массива через указатель на этот массив. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 23 июля, 2023 Опубликовано 23 июля, 2023 · Жалоба 2 hours ago, ДЕЙЛ said: Как правильно сдвинуть указатель на вторую позицию сразу после инициализации? inc(pVal, 2) - не оно? 1 hour ago, ДЕЙЛ said: чем передача массива в функции. А кто вам запрещает передать массив по ссылке? (var в формальном параметре) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 30 23 июля, 2023 Опубликовано 23 июля, 2023 (изменено) · Жалоба 1 hour ago, xvr said: А кто вам запрещает передать массив по ссылке? (var в формальном параметре) Принципиально ничего не улучшится. Передал в итоге указатель на массив и использовал промежуточный указатель, который инкрементирую на нужную позицию и через него считываю данные. pDGTmp := pDG; inc(pDGTmp, poz); Y := pDGTmp^; Результат здесь. В форму с графиком передаю указатель на нужный буфер с данными. Объём буфера 32 МБ. Изменено 23 июля, 2023 пользователем ДЕЙЛ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 23 июля, 2023 Опубликовано 23 июля, 2023 · Жалоба 24 minutes ago, ДЕЙЛ said: Принципиально ничего не улучшится. Работа через массив + индекс более безопасна чем работа с указателем на массив - Delphi обеспечивает контроль за выходом за границу массива (если вы его не отключите). Если ошибок нет (и ловить возможные ошибки вы не хотите), то разницы действительно нет 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться