Дейв Ригби превосходный диагноз верен, но передача position
в качестве параметра (а не увеличение его здесь) приведет к более легкому пониманию и более гибким процедурам:
char extract ( pixel* image, int position ) {
char curChar = '\0';
for(int i = 0; i<4; ++i) {
curChar = curChar << 2;
curChar = curChar | getbits(postion);
}
return curChar;
}
char *build_string(pixel *image) {
int i;
char *ret = malloc(SECRET_SIZE);
for (i=0; i<SECRET_SIZE; i++) {
ret[i]=extract(image, i);
}
ret[i] = '\0';
return ret;
}
Затем, когда вы поймете, что изменение всех пикселей в строке делает это довольно очевидным, и вы предпочитаете использовать пиксели, расположенные со значениями Фибоначчи, изменение легко сделать:
char *build_string_via_fib(pixel *image) {
int i;
char *ret = malloc(SECRET_SIZE);
for (i=0; i<SECRET_SIZE; i++) {
ret[i]=extract(image, fib(i));
}
ret[i]='\0';
return ret;
}
Вы могли бы вставить также вычисления Фибоначчи в свою подпрограмму extract()
, но разложение функций на мельчайшие, самые полезные части дает вам отличную разборчивость, отличную тестируемость и лучшие шансы для будущего кода. -использование.