Правильные варианты:
short int *smoothedim;
unsigned char **edge;
int rows, int cols;
int i;
for(i = 0;i< rows*cols;i++){
(*edge)[i] = (255*smoothedim[i]/255);
}
for(i = 0;i< rows*cols;i++){
(*edge)[i] = (smoothedim[i]/1);
}
Не правильный варианты (с точки зрения компилятора)
for(i = 0;i< rows*cols;i++){
(*edge)[i] = (smoothedim[i]/255*255);
}
for(i = 0;i< rows*cols;i++){
(*edge)[i] = (smoothedim[i]/255*255);
}
Причем, второй вариант не трактуется как (*edge)[i] = (smoothedim[i]/(255*255));
Разница между "правильным" и "неправильным" заключается в массиве edge. В случае неправильного варианта, данные дублируются со смещением, и, вообще, чего-то страшное.
Испытано на VC6, VC6+SP5, VC7.
Я просто в шоке...
Здравствуйте, NewKent, Вы писали:
NK>Не правильный варианты (с точки зрения компилятора)
NK>NK>for(i = 0;i< rows*cols;i++){
NK> (*edge)[i] = (smoothedim[i]/255*255);
NK>}
NK>
NK>NK>for(i = 0;i< rows*cols;i++){
NK> (*edge)[i] = (smoothedim[i]/255*255);
NK>}
NK>
Не совсем понимаю. В чем же заключается разница между этими двумя "неправильными вариантами"? Почему уж тогда не три или четыре?
NK>Причем, второй вариант не трактуется как (*edge)[i] = (smoothedim[i]/(255*255));
Разумеется, не трактуется. С чего бы это вдруг ему так трактоваться?
NK>Разница между "правильным" и "неправильным" заключается в массиве edge. В случае неправильного варианта, данные дублируются со смещением, и, вообще, чего-то страшное.
По прежнему не понимаю, что ты увидел здесь "неправильного". Надеюсь, ты понимаешь, что в С/С++, например, '10 * 255 / 255' дает '10', в то время как '10 / 255 * 255' дает '0' (как и должно быть)?
NK>Испытано на VC6, VC6+SP5, VC7.
NK>Я просто в шоке...
К>Ошибки целочисленного округления в кольце по модулю 2^16.
То есть ошибками это назвать сложно — это dura lex sed lex (закон дурак, но это закон

).
Два феномена: деление нацело (с отбрасыванием остатка) и умножение по модулю.