2015-09-01 4 views
1

Мы создали структуру hsv, как определено ниже.Обновление структуры в функции

struct hsvoutput { 
    float hue; // angle in degrees 
    float saturation; 
    float value; 
}; 

и

struct hsvoutput hsv[img->x * img->y]; 

где размер вытягивается от размера изображения.

int RGBtoH(int r, int g, int b, struct hsvoutput hsv, int i) 
{ 

    float h; 
    float s; 
    float v; 
    RGBtoHSV(r, g, b, &h, &s, &v); 
    hsv.hue[i]= h; 
    hsv.saturation[i] = s; 
    hsv.value[i]= v; 
    return h; 
} 

Мы хотели бы способ получить функцию RGBtoH, чтобы установить значение г-й структуры ВПГ к H, S и V значений. Это значение i является значением итерации из цикла, который вызывает эту функцию RGBtoH.

Однако эта ошибка возникает при попытке, как указано выше.

error: subscripted value is neither array nor pointer nor vector

+1

Функция должна быть int RGBtoH (int r, int g, int b, struct hsvoutput * p_hsv, int i); – venki

+0

и при вызове функции RGBtoH() предоставить структуру addr – venki

+0

'hsv' - это массив, поэтому эта строка: 'int RGBtoH (int r, int g, int b, struct hsvoutput hsv, int i)' должно быть: 'int RGBtoH (int r, int g, int b, struct hsvoutput * hsv, int i) ' – user3629249

ответ

4

В вашем определении структуры,

struct hsvoutput { 
    float hue; // angle in degrees 
    float saturation; 
    float value; 
}; 

hue, saturation и value не от типа массива. Вы не можете использовать индексирование на них.

Так, позже, написание

hsv.hue[i]= h; 
hsv.saturation[i] = s; 
hsv.value[i]= v; 

является (являются) неправильно. Все они являются одиночными переменными, и использование индексации на них неверно.

Решение: Если вы хотите иметь массивhsv, которые будут переданы вашей функции, и обновить значения для полей всех элементов, вы должны сделать что-то вроде (псевдо-код)

int RGBtoH(int r, int g, int b, struct hsvoutput *hsv, int i) 
{        //change hsv type to pointer 

    float h; 
    float s; 
    float v; 
    RGBtoHSV(r, g, b, &h, &s, &v); 
    hsv[i].hue= h;     //use indexing on hsv 
    hsv[i].saturation = s;   //use indexing on hsv 
    hsv[i].value= v;     //use indexing on hsv 
    return h; 
} 
+0

Да, и причина для downvote? Что я упустил? –

+0

Пробовал двигаться вверх. Я выбрал ваш ответ. Не позвольте мне подняться в тот момент, когда я боюсь. – studentuser

+0

@studentuser Вам понадобится 15 очков для увеличения. Nevermind, если решение (_any_) помогло вам, отметив, что как принято то, что вы должны делать (что вы сделали). :-) В любой более поздний момент, когда у вас будет 15+, если вы чувствуете себя, вы можете вернуться и щелкнуть вверх-тик, но это зависит от вас. Приветствия! –

1

Это должно быть:

hsv[i].hue = h; 
... 

и

int RGBtoH(int r, int g, int b, struct hsvoutput *hsv, int i) 

Массив в вашем случае - hsv, поэтому его следует индексировать так. Затем вы можете передать указатель на hsvoutput в своей функции.

0

Поскольку hsv - это массив, вы должны изменить параметр на тип указателя, а затем выполнить индексирование указателя, а не поплавки. Как это:

int RGBtoH(int r, int g, int b, struct hsvoutput *hsv /*pointer*/, int i) 
{ 
    float h, s, v; 
    RGBtoHSV(r, g, b, &h, &s, &v); 
    hsv[i].hue= h; // index on hasv 
    hsv[i].saturation = s; 
    hsv[i].value = v; 
    return h; 
} 
1

Вы пытаетесь индексировать структуру атрибутов как массив, однако в структуре они являются всего лишь единичные случаи, так что вы не можете индексировать их как массив. Вы должны выделить массив структур, а затем передать указатель на этот массив, таким образом вы можете получить доступ к i-му элементу массива. См. Код ниже.

int RGBtoH(int r, int g, int b, struct hsvoutput *hsv, int i) 
    { 

     float h; 
     float s; 
     float v; 
     RGBtoHSV(r, g, b, &h, &s, &v); 
     hsv[i].hue= h; 
     hsv[i].saturation = s; 
     hsv[i].value= v; 
     return h; 
    } 
Смежные вопросы