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]


image->data + y * image->bytes_per_line + x * 4

wota ★★ ()

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

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

?

anonymous ()

Да уж... 4 байта через memcpy это круто.

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

gcc оптимизирует, т.к. размер константный

Да понятно, но сам факт. Говнокод редкостный.

dvl36 ()
Ответ на: комментарий от 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 ★★★★★ ()
Ответ на: комментарий от invy

Потому что нельзя. Надо объяснять почему, или если подумать, то до самого дойдёт?

anonymous ()
Ответ на: комментарий от 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 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.