2015-02-28 6 views
0

Как указано выше, я пытаюсь изменить немного кода, который я написал на прошлой неделе, старый код:Использование указателей-структуру в C

char *pixel_b = NULL; 
    char *pixel_g = NULL; 
    char *pixel_r = NULL; 

    for (i=0;i<416;i++) 
    { 
     for (j=0;j<576;j++) 
     { 
     pixel_b = &framebuff[GET_PIXEL_B(j,i)]; 
     pixel_g = &framebuff[GET_PIXEL_G(j,i)]; 
     pixel_r = &framebuff[GET_PIXEL_R(j,i)]; 

     *pixel_b = 255-*pixel_b; 
     *pixel_g = 255-*pixel_g; 
     *pixel_r = 255-*pixel_r; 
     } 
    } 

Этот успешный доступ байтов в массиве и изменил значения (используемые для инвертирования изображения).

Я хотел создать структуру, содержащую три значения пикселя, например, так:

struct Pixel { 
    char *pixel_b; 
    char *pixel_g; 
    char *pixel_r; 
}; 

Затем измените первый бит кода:

struct Pixel pixel; 

    for (i=0;i<416;i++) 
    { 
     for (j=0;j<576;j++) 
     { 
     pixel.pixel_b = &framebuff[GET_PIXEL_B(j,i)]; 
     pixel.pixel_g = &framebuff[GET_PIXEL_G(j,i)]; 
     pixel.pixel_r = &framebuff[GET_PIXEL_R(j,i)]; 

     pixel.*pixel_b = 255-pixel.*pixel_b; 
     pixel.*pixel_g = 255-pixel.*pixel_g; 
     pixel.*pixel_r = 255-pixel.*pixel_r; 
     } 
    } 

Однако, кажется, вы не можете просто сделайте это: P Итак, после некоторого осмотра, я подумал, что лучше всего изменить пиксель на * пиксель и не иметь указателей внутри него, однако это, похоже, тоже не работает. Есть ли хороший способ сделать то, что я пытаюсь сделать? Я не использовал структуры в C довольно долго, поэтому я частично ожидаю, что забываю что-то очень основное.

Любая помощь была бы принята с благодарностью.

ответ

2

Вы должны разыменовать struct.field, а не только поле. Приоритет для. оператор выше, чем оператор * разыменования, поэтому скобки не требуются.

struct Pixel pixel; 

for (i=0;i<416;i++) 
{ 
    for (j=0;j<576;j++) 
    { 
    pixel.pixel_b = &framebuff[GET_PIXEL_B(j,i)]; 
    pixel.pixel_g = &framebuff[GET_PIXEL_G(j,i)]; 
    pixel.pixel_r = &framebuff[GET_PIXEL_R(j,i)]; 

    *pixel.pixel_b = 255 - *pixel.pixel_b; 
    *pixel.pixel_g = 255 - *pixel.pixel_g; 
    *pixel.pixel_r = 255 - *pixel.pixel_r; 
    } 
} 
+0

Не могу поверить, что я не пробовал этого, подумал я. Большое спасибо :) От запуска в первый раз он чувствует себя немного медленнее, хотя это может быть просто мнимым, теоретически ли это будет медленнее, чем оригинальный метод? – GeorgeStorm

+0

В принципе нет оснований полагать, что он должен быть медленнее. . разворот обрабатывается во время компиляции. Конечно, компиляторы иногда могут быть глупыми. – caveman

0

Это синтаксис. Переключите pixel.*pixel_b на *(pixel.pixel_b).

Смежные вопросы