Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / модификация приведенного указателя / 7 сообщений из 7, страница 1 из 1
25.11.2015, 15:28
    #39113253
iMerlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
модификация приведенного указателя
Привет!
Никак не соображу, подскажите кто разбирается:
Есть задача копирования сложной структуры. По некоторым причинам мне удобно использовать указатели на char для адресации исходного (pf) и приемного (pt) буферов, но в процессе копирования мне приходится некоторые блоки рассматривать не как массив char, а как DWORD, double или более сложные структуры.
Копирование организовано как цепочка независимых шагов копирования, по окончании каждого шага pf и pt должны указывать на подлежащие копированию на следующем шаге области структуры.
Вот кусок кода для одного из шагов:

Код: plaintext
1.
2.
3.
4.
5.
	if(pprtp)
	{
		CopyMem(pf,pt,pprtp-pf);
		((DWORD*)pt)++=PartType;
	}



где CopyMem копирует определенную часть структуры, после чего я пытаюсь вставить в копию DWORD (соответственно сдвинув указатель), но компилятор не понимает моего желания, говорит что де не lvalue слева от ++.
Конечно, можно написать что то вроде ((DWORD*)pt)=PartType;pt+=sizeof(DWORD); но это как то некошерно. Подскажите пожалуйста, можно ли применять к приведенным к другому типу указателям операцию постинкремента и если да, то как правильно записать.
...
Рейтинг: 0 / 0
25.11.2015, 15:32
    #39113261
iMerlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
модификация приведенного указателя
Извините, не нашел где изменить, там звездочку забыл:
Код: plaintext
1.
2.
3.
4.
5.
if(pprtp)
	{
		CopyMem(pf,pt,pprtp-pf);
		*((DWORD*)pt)++=PartType;
	}
...
Рейтинг: 0 / 0
25.11.2015, 15:38
    #39113266
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
модификация приведенного указателя
iMerlinКонечно, можно написать что то вроде
((DWORD*)pt)=PartType;pt+=sizeof(DWORD); но это как то некошерно.
Ну, во-первых, это не работоспособно. Точнее, оно выкинет весьма забавную ошибку когда ты
этого меньше всего ждёшь. Если уж писать, то так:
Код: sql
1.
2.
memcpy(pt, &PartType, sizeof(PartType));
pt += sizeof(PartType);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.11.2015, 15:46
    #39113280
iMerlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
модификация приведенного указателя
Ну, PartType имеет тип DWORD и заморачиваться с вызовом функции ради копирования четырех байт (организация стека, цикла, вывод результата (memcpy же вроде чего то да возвращает?)) крайне нерационально. А что Вы имеете ввиду про ошибку? x64? так DWORD вроде и в африке DWORD, или я ошибаюсь?
...
Рейтинг: 0 / 0
26.11.2015, 09:32
    #39113749
iMerlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
модификация приведенного указателя
Ладно, жаль конечно, что по сути никто не ответил, воспользовался записью

*((DWORD*)pt)=PartType;pt+=sizeof(DWORD);

Всем спасибо.
...
Рейтинг: 0 / 0
26.11.2015, 10:26
    #39113789
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
модификация приведенного указателя
iMerlin,

Ты, вероятнее всего, не с той стороны телеги лошадь привязываешь.

Сделай структуру классом, с конструктором копирования и оператором присваивания.
Мемберы просто присваивай, а заботиться об оптимальности оставь компилятору.
...
Рейтинг: 0 / 0
26.11.2015, 14:27
    #39114049
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
модификация приведенного указателя
iMerlinНу, PartType имеет тип DWORD и заморачиваться с вызовом функции ради копирования четырех байт (организация стека, цикла, вывод результата (memcpy же вроде чего то да возвращает?)) крайне нерационально. ... или я ошибаюсь?

Ошибаешься. Функции могут встраиваться, и это очень эффективно.

Про DWORD ты тоже ошибаешься.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / модификация приведенного указателя / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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