大头
Table_bottom

标签云
Table_bottom

分类
Table_bottom

日历
五月
2829301234
567891011
12131415161718
19202122232425
2627282930311
Table_bottom

评论
Table_bottom

留言
Table_bottom

微博
Table_bottom

热门文章
Table_bottom

随机文章
Table_bottom

豆瓣上谁关注这里
Table_bottom

链接
Table_bottom

搜索栏
Table_bottom

RSS
RSS Link
Table_bottom

功能
Table_bottom

页面
Table_bottom

计数器
465013
Table_bottom

访客统计
Table_bottom

存档
Table_bottom

维护从客户那儿返回的代码

代码的结构。

从底向上有A,B,C三层,每层有一些模块,上层调用下层模块。不同的客户,C的差异很大,C层有很多并列的分支,A和B

与客户的合作有不同的方式,有的是不给客户源代码,任何变动的需求都由公司完成;有的是给C层的代码,部分变动的需求客户自己解决;有的是给B层和C层的源代码,几乎全由客户自己完成变更。

有一个客户,合作方式是第三种。客户拿到代码后在B层和C层做了一些改动,改动部分模块以增加功能,或者是改变部分行为方式。

一年以后,主干树上的A层和B层经过多次升级,整个工程升级到新的版本,该客户希望能同步,但是要求保持其自主改动。

矛盾是:该客户在B层做的改动不可能合并到主干树上。而另建分支增加了与主干树B层的更新保持同步的合并动作,增加测试工作量,增加错误可能性。

怎么办?

我们只能是为其另建分支,而同步代码的维护工作长期占用了一个工程师的几乎全部工作时间。

事实证明,替客户维护已经发布给他的源代码是一件非常不可取的事情。

应该告诉他们,如果希望得到源代码发布,那我们将不再对这份代码做维护。

rgb to yuv

 

  1. void RGB2YUV(BYTE *in, BYTE *out, DWORD len)
  2. {
  3.         int r,g,b;
  4.         int y, cb,cr;
  5.         int i;
  6.         int data;
  7.  
  8.         for(i=0; i<len; i=i+4)
  9.         {
  10.                 r = *(in+2);
  11.                 g = *(in+1);
  12.                 b = *(in);
  13.  
  14.                 y= (0.257*r + 0.504*g + 0.098*b + 16);
  15.                 cb = -0.148*r - 0.291*g + 0.439*b + 128;
  16.                 cr = 0.439*r - 0.368*g - 0.071*b + 128;
  17.                 if(y <16)
  18.                 {
  19.                         y = 16;
  20.                 }
  21.                 else if(y>235)
  22.                 {
  23.                         y = 235;
  24.                 }
  25.  
  26.                 if(cb <16)
  27.                 {
  28.                         cb = 16;
  29.                 }
  30.                 else if(cb>240)
  31.                 {
  32.                         cb = 240;
  33.                 }
  34.  
  35.                 if(cr <16)
  36.                 {
  37.                         cr = 16;
  38.                 }
  39.                 else if(cr>240)
  40.                 {
  41.                         cr = 240;
  42.                 }
  43.                 *(DWORD *)out = 0x7f000000 + ((DWORD)cr<<16) + ((DWORD)cb<<8) + (DWORD)y;
  44.  
  45.                 in += 4;
  46.                 out += 4;
  47.         }
  48. }

 

补充编译警告

在实际的工程中,往往会出现callback函数的参数类型,定义和实际使用的并不一致。要注意强制类型转换。

在某个 struct 定义中使用了 union,而此 union 中定义了两个结构,第一个结构包含5个 UINT8 类型的成员,第二个结构包含1个指针类型成员,1个 UINT16 类型成员,1个 UINT8 类型成员。工程中两个结构都会使用到,而编译器无法知道程序使用的是 union 中的哪一个成员,默认为第一个。由此产生类型不匹配的编译警告,这里有产生错误的隐患。

编译警告

一个项目,编译出近千条warning。

大部分大部分大部分是下面这四条导致的。

      1)局部变量定义后使用前没有初始化。
      2)函数体在调用处后,调用前没有声明。
      3)类型转换。
      4)比较运算符两边变量的类型不同。

 

安装卫星天线时计算方位角和仰角

输入:本地经度,本地纬度,卫星经度。

输出:卫星天线的方位角,仰角。 

需要数学库的支持,可调整M_PI的精度。 

 

 

 

  1. void do_calculate(float local_longititude, float local_latitude, float satellite_longititude, float * orientation, float * evaluation)
  2. {
  3.         float   temp1, temp2, ori, eva;
  4.  
  5.         local_longititude        = local_longititude/100.0/180.0*M_PI;
  6.         local_latitude              = local_latitude/100.0/180.0*M_PI;
  7.         satellite_longititude   = satellite_longititude/100.0/180.0*M_PI;
  8.  
  9.         ori = atan(tan(local_longititude - satellite_longititude)/sin(local_latitude))/M_PI*180 + 180.0;
  10.  
  11.         if (ori < 0)
  12.                 *orientation = (INT32)(ori * 100.0 + 360);
  13.         else
  14.                 *orientation = (INT32)(ori * 100.0);
  15.  
  16.         temp1 = cos(local_latitude);
  17.         temp2 = cos(local_longititude - satellite_longititude);
  18.  
  19.         eva = atan((temp1*temp2 - 0.15)/sqrt(1 - (temp1*temp1*temp2*temp2))); // 0.15127
  20.  
  21.         if (eva < 0)
  22.                 *evaluation = (INT32)((eva/M_PI*180 + 360) * 100.0);
  23.         else
  24.                 *evaluation = (INT32)(eva/M_PI*180 * 100.0);
  25. }
  26.