LINUX.ORG.RU

cast to pointer from integer of different size [-Wint-to-pointer-cast]

 


0

1
void setcolor(XImage * image, int color, int x, int y)
{
    memcpy((void *)image->data[y * image->bytes_per_line + x * 4],
           &color, 4);
}

image.data = char *

Выдает предупреждение. Как лечить? Работать должно как на 64 так и на 86.

Без приведения предупреждение такое:

предупреждение: passing argument 1 of 'memcpy' makes pointer from integer without a cast [enabled by default]



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

Имелось ввиду

memcpy((void *) & image->data[y * image->bytes_per_line + x * 4],
           &color, 4);

?

anonymous
()
Ответ на: комментарий от dvl36

А если запустить на архитектуре, не умеющей запись невыровненных слов? Предложишь более универсальный способ, чем memcpy?

d ★★★★
()

почему не написать например так:

void setcolor(XImage * image, uint32_t color, unsigned x, unsigned y)
{
    (uint32_t)image->data[y * image->bytes_per_line + x * 4] = color;
}

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

А если запустить на платформе, где биг-ендиан (или странный ендиан) и 64 бита, вообще будет нулями забивать. Надо колор порезать на компоненты битовыми масками и сдвигами, а потом присвоить в нужные чар-смещения. Решения с кастами — эталонный g-code.

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

Можно

void setcolor(XImage * image, uint32_t color, unsigned x, unsigned y)
{
     * ( (uint32_t*) & image->data[y * image->bytes_per_line + x * 4] ) = color;
}

Ну или

void setcolor(XImage * image, uint32_t color, unsigned x, unsigned y)
{
      ( (uint32_t*) & image->data[y * image->bytes_per_line + x * 4] ) [0] = color;
}

Если ну очень хочется

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