C: Сравнение двух байтов, чтобы увидеть, находится ли один в определенном диапазоне другого - PullRequest
0 голосов
/ 17 декабря 2009

Я пишу код, который сравнивает 2 байта, которые представляют целые числа. Я хочу посмотреть, если байт R с + -10 от G. Проблема, с которой я столкнулся с кодом, заключается в сравнении в if-statment в конце. Байты никогда не выходят за пределы диапазона, даже когда они должны. Я уверен, что проблема заключается в том, как я добавляю / вычитаю error_range, но я не знаю другого способа сделать это.

Сначала я подумал о преобразовании байтов в целые числа, но я не могу найти никакой помощи с этим в Интернете. Если это сработает лучше, чем то, что я делаю здесь, пожалуйста, скажите мне, как это сделать.

Любая помощь приветствуется!

const char ERROR_RANGE = 0x1010; //warning: overflow in implicit constant conversion
char R, G; /2 separate bytes
char buffer; //enough space for 1 byte

image = fopen(fileName,"r"); //open file

fread(&buffer, 1, 1, image); //read 1 byte  
memcpy (&R,&buffer,1); //store it as R

fread(&buffer, 1, 1, image); //read 1 byte   
memcpy (&G,&buffer,1); //store it as G

fclose(image);

if((R >= (G + ERROR_RANGE)) && (R <= (G - ERROR_RANGE)))
{
    printf("Outside of range!\n");
}

Спасибо.

Ответы [ 5 ]

11 голосов
/ 17 декабря 2009

Ваша проблема в том, что ваш тест говорит:

если (R больше или равно G + ERROR) И (R меньше или равно G - ERROR)

это не может быть и то и другое.

Заменить && на || в первом случае.

Лучшим тестом будет:

if (разница R и G больше, чем ERROR)

, что переводится как:

if (abs(R - G) > ERROR_RANGE)
{
    printf("Error");
}
6 голосов
/ 17 декабря 2009

Первая проблема в том, что вы используете &&, а не ||. R не будет и слишком высоким, и слишком низким.

Во-вторых, вы уверены, что R и G будут в разумных пределах? Если char в вашей системе не подписано, то G - ERROR_RANGE может быть большим числом, если G маленькая, а не маленькая. Вы, вероятно, лучше всего с чем-то вроде if (abs(R - G) <= ERROR_RANGE).

3 голосов
/ 17 декабря 2009

Помимо того, что уже было указано ...

Значение 0x1010 слишком велико, чтобы поместиться в байте, и два байта никогда не могут отличаться более чем на 255 (0xff). Вы имели в виду 1010 двоичное (== 10 десятичное == 0xA шестнадцатеричное)?

Кроме того, нет необходимости читать и копировать, вы можете просто прочитать ваши переменные напрямую:

fread(&R, 1, 1, image); //read 1 byte  
fread(&G, 1, 1, image); //read 1 byte   
2 голосов
/ 17 декабря 2009

Есть ли причина, по которой вы не можете использовать что-то вроде:

if (abs(R-G) > ERROR_RANGE)
    // ...
1 голос
/ 17 декабря 2009

Вот мой удар, НЕПРОВЕРЕНО:

unsigned char buffer[2];
int r, g, diff;

image = fopen(fileName, "r");
fread(&buffer, 2, 1, image);

r = buffer[0];
g = buffer[1];
dif = r - g;

if (abs(dif) > 10) { printf... }

Он использует функцию abs, чтобы сделать разницу всегда положительной ... проще сравнивать таким образом. Небольшое улучшение производительности при чтении обоих первых двух байтов за один раз. Назначение (без знака) символов для вставок сделает их легко сопоставимыми.

...