LINUX.ORG.RU

Стиль записи memcpy


0

1

Доброе утро!

Есть ли более изящный способ записи подобных конструкций на C (желательно без макроса):

        memcpy(sr->ptr, sb, sizeof(struct shm_header));
        sr->ptr += sizeof(struct shm_header);
        memcpy(sr->ptr, ibp, sizeof(struct shm_prelude));
        sr->ptr += sizeof(struct shm_prelude);
        memcpy(sr->ptr, hbuf, ibp->hlen);
        sr->ptr += ibp->hlen;
        memcpy(sr->ptr, paybuf, ibp->len);
        sr->ptr += ibp->len;


Последнее исправление: cs (всего исправлений: 1)

        memcpy(sr->ptr, sb, sizeof(struct shm_header));
        sr->ptr += sizeof(struct shm_header);
        memcpy(sr->ptr, sb, sizeof(*sb));
        sr->ptr += sizeof(*sb);

?

Deleted
()

> sizeof(struct shm_header)

Не нужен. Подставляй под sizeof конкретный объект.

geekless ★★
()

Может есть какой-либо аналог writev() для памяти, чтобы можно было просто передать массив (типа iovec) указателей и размеров?

cs
() автор топика
Ответ на: комментарий от cs

> Может есть какой-либо аналог writev() для памяти

Напиши. :)

желательно без макроса

Почему, кстати?

geekless ★★
()

а можно узнать, что скрывается за ptr. Там какая-то структура или кусок памяти? Заменить бы ее на структуру.

struct name {
   struct shm_header olol;
   struct shm_prelude olo;
   ...
};
И обращаться через .

rg-400
()
Ответ на: комментарий от Boy_from_Jungle

>а откуда ты можешь знать перекрываются они или нет?!

а почему вы спграшиваете?

anonymous
()

Что конкретно не нравится? Если хочется менее мусорного кода, то можно операцию вынести в отдельный макрос или функцию memappend(...). Простое хорошее правило: есть повторяющийся код - вынеси в функцию.

mashina ★★★★★
()
Ответ на: комментарий от rg-400

еще можно так.

sr->ptr.olol = sb;/* если sb структура */

sr->ptr.olol = *sb;/* если sb указатель на  структуру */

rg-400
()

Я подобный код всегда выношу в макросы по типу:

#define push(buf,eof,src)
#define pop (buf,eof,dst)

Они сами сдвигают указатель буфера и следят, как бы не выбраться за границы памяти (в случае push можно еще и автоматически расширять буфер при необходимости). Удобнее читать, удобнее отлаживать.

staseg ★★★★★
()

Как насчет

template <class T>
void writeValue(char*& outPtr, const T& inValue)
{
	*reinterpret_cast<T*>(outPtr) = inValue;
	outPtr += sizeof(T);
}

?

Pavval ★★★★★
()

> желательно без макроса

и без указателей... зачем тогда вообще на си писать?..

typedef struct { const void *ptr; size_t len; } T;
for (T *p = (T[]){{sb, sizeof *sb}, {ipb, sizeof *ipb}, {hbuf, ipb->hlen}, {paybuf, ipb->hlen}, {0}}; p->ptr; ptr += p++->len)
    memcpy(sr->ptr, p->ptr, p->len);

;)

arsi ★★★★★
()
Ответ на: комментарий от trex6

>Есть ли более изящный способ записи подобных конструкций на C (желательно без макроса):

на C


сори:)) Пятницо...

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.