今天写了一段代码,逻辑上一直没有找到错误,可以通过编译,但执行一段时间后就说提示错误:Access violation reading location ****
代码如下(主要将错误的地方贴出):
1 /*************************HSVtoColor*******************************/ 2 enum { Red,Orange, Yellow, Green, Cyan, Blue,Violet , White, Dark } Color; 3 int HSVtoColor(float H, float S, float V) 4 { 5 if (!(H >= 0 && H <= 360 && S <= 1 && S >= 0 && V >= 0 && V <= 1)) 6 { 7 printf("HSV is invalid !\n"); 8 getchar(); 9 exit(0); 10 } 11 12 if (V <= 0.2)return Dark; 13 else{ 14 if (S <= 0.1)return White; 15 /*(330,20).(20。45),(45.75),(75,165),(165,200),(200,270), 16 (270,330),H分别取值为0,I,2,3,4,5,6代表红、橙、黄、绿、 17 青、蓝、紫。*/ 18 /*****************************************************************/ 19 if (H >= 330 && H <=359 || H >= 0 && H < 20) return Red; 20 if (H >= 20 && H < 45)return Orange; 21 if (H >= 45 && H < 75)return Yellow; 22 if (H >= 75 && H < 165)return Green; 23 if (H >= 165 && H < 200)return Cyan; 24 if (H >= 200 && H < 270)return Blue; 25 if (H >= 270 && H < 330)return Violet; 26 //return Red; 27 } 28 } 29 30 31 /****************************GetInfoOfJpeg***********************************/ 32 int GetInfoOfJpeg(char *file_path, float info[9], int gap , int mode /* = 1*/ ) 33 { 34 for (int i = 0; i < 9; i++)info[i] = 0; 35 FIBITMAP *bitmap = FreeImage_Load(FIF_JPEG, file_path); 36 if (bitmap) 37 { 38 int BPP = FreeImage_GetBPP(bitmap); 39 if (BPP < 16){ cout << "invalid JPEG -----GetInfoOfJpeg()\n"; return 0; } 40 41 int height = FreeImage_GetHeight(bitmap); 42 int weight = FreeImage_GetWidth(bitmap); 43 int x, y; 44 RGBQUAD color; 45 uchar *pcolor = (uchar *)&color; 46 float hsv[3]; 47 for (y = 0; y < height; y += gap) 48 for (x = 0; x < weight; x += gap) 49 { 50 FreeImage_GetPixelColor(bitmap, x, y, &color); 51 RGBtoHSV (pcolor[FI_RGBA_RED], pcolor[FI_RGBA_GREEN], pcolor[FI_RGBA_BLUE], hsv); 52 cout<<"HSV :"<<HSVtoColor(hsv[0], hsv[1], hsv[2])<<endl; 53 info[HSVtoColor(hsv[0], hsv[1], hsv[2])]++; 54 } 55 int sample_pixels = (weight*height) / (gap*gap);//the number of sample pixels 56 if (mode == 1)for (int i = 0; i < 9; i++)info[i] = info[i] / sample_pixels; 57 58 return 1; 59 //cout << "color:" << HSVtoColor(hsv[0], hsv[1], hsv[2]); 60 } 61 62 63 }//GetInfoOfJpeg
这里不介绍HSV颜色空间,只说明其取值范围:H∈N,且H∈[0 , 359] , S,V∈R 且∈[0,1],注意到上面第三行参数都是float型。传入的数据H = 359.01(可能舍入运算时出现这种情况)那么19到25行的区间就无法包括这一H值,程序在执行的时候可能没有返回值。当把这个函数的返回值作为其他操作的参数时(例如53行)就会出现问题。下面的图片的最后一行数据显示了当H不在19到25行的数据区间时内存中的数据。很显然将这个数据作为info[]的下标就溢出了,所有才会出现上面的错误。
总结一下,比较大小是还是将关系运算符两边的数据的类型转化为一致,当数据进行类型转化时,最好做个标记,防止自己忘了。
当出现多个并列的条件语句时一定要注意是否我考虑了所有的可能性(考虑一下switch语句中default的作用)。
时间: 2024-10-15 23:45:35