C/C++一些隐藏的问题

今天写了一段代码,逻辑上一直没有找到错误,可以通过编译,但执行一段时间后就说提示错误: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

C/C++一些隐藏的问题的相关文章

移动端 input 获取焦点后弹出带enter(类似于搜索,确定,前往)键盘,以及隐藏系统键盘

一:调出系统带回车键的键盘 在项目中经常有输入框,当输入完成后点击确定执行相应的动作.但是有些设计没有确定或者搜索按钮,这就需要调用系统键盘,点击系统键盘的确定后执行相应动作. 但是单纯的input是无法实现的,要想调出带回车的键盘必须把input放在form表单里面才可以,并且得加上action(一定要加),下面是个简单的例子. <form action class="search" onsubmit="return false;"> <i cl

SQL Server Pivot 隐藏group

SQL Server行列转换隐藏group Pivot有一个隐藏的Group 分组, 除了Pivot column 和value列,其他列作为分组 Example: IF NOT EXISTS(SELECT * FROM sys.tables where name = 'Pivot_test') CREATE TABLE Pivot_test ( id1 int, id2 int, Pivot_column varchar(50), value char(50) ) insert into Pi

隐藏Title

Activity继承对象不同隐藏有所不同,分为ActionBarActivity和Activity两种. getSupportActionBar().hide(); 用于ActionBarActivity中 requestWindowFeature(Window.FEATURE_NO_TITLE); 用于Activity中 并且在配置清单文件中 android:theme="@android:style/Theme.NoTitleBar" 也不适用于ActionBarActivity

jsp页面做文件上传时遇到要根据登陆名按钮显示或隐藏的情况

项目遇到的情况要根据登陆的角色不同显示或隐藏按钮,因为之前没有遇到过 所以有些不知道怎么下手,百度解决了 方法如下: document.getElementById("#anniu").hide() <button id="anniu">隐藏按钮</button>

点击区域外隐藏该区域,event.stopPropagation()

event.stopPropagation() Description: Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event. 点击区域外隐藏该区域Example: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta content="chars

javascript页面详细信息的显示和隐藏

页面详细信息的显示和隐藏 <!DOCTYPE html> <html> <head> <title></title> </head> <body> <script type="text/javascript"> function show_detail(detail){ var p=document.getElementById('p'); if(detail.open){ p.style.

android ListView条目中TextView隐藏到显示时的测量

觉得ExpendableListView挺好用,但是就是代码复杂了点,我一时半会理解不了,于是就直接自己写个效果来实现.先来看一下expendableListView中展开的动画效果: 然后我模仿此效果,建立如下的item布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent" andr

巨丑巨简陋的一个Javascript显示隐藏菜单

<!DOCTYPE html> <html> <head> <title></title> <style type="text/css">       #div1{width:100px;             height:500px;             background: aqua;}     li{list-style-type: none;        margin-left: 0px;   

第一个app-进阶:1、让EditText屏蔽软键盘仍能光标闪动:2、EditText 的inputType参数类型(密码方式-隐藏显示、只允许输入数字等等)

EditText屏蔽软键盘后,光标消失问题 开始我有个需求:屏蔽系统软键盘 于是找到并使用这个方法: //edit_text1.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出//edit_text2.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出//edit_text3.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出 让三个EditText都成功地没有软键盘弹出. 后来我

Android使用init.rc触发脚本实现隐藏内置应用

[实现逻辑] 通过在property_service.c中设置标志位,在设置中实现接口改变标志位, 使用init.rc中声明的服务来侦听标志位的变化,显式启动声明的服务,执行对应的脚本,把应用后缀从apk重命名为bak,从而实现隐藏(显示逻辑相反). [实现步骤]以隐藏Google Play Store(system/priv-app/Phonesky.apk)为例: 1.首先在system/core/init/property_service.c中声明并初始化标志位,0为隐藏,1为显示,默认隐