if--else 和 switch case

[复制链接]
6006|23
 楼主| victor3l 发表于 2012-7-9 21:22 | 显示全部楼层 |阅读模式
if ... else if...和switch 。。。case 这种结构一次只能选择一个,有没有好的结构可以一次选择多个啊?
shell.albert 发表于 2012-7-9 21:25 | 显示全部楼层
一次选择多个?什么意思?
发明C语言的人是根据使用条件创造出如此神奇的语句-------------条件语句。
根据条件,一个萝卜一个坑!
ayb_ice 发表于 2012-7-9 21:39 | 显示全部楼层
有些语言的SWITCH语句就可以,我同事说QT的SWITCH就可以
ningling_21 发表于 2012-7-9 22:17 | 显示全部楼层
if ... else if...和switch 。。。case 这种结构一次只能选择一个,有没有好的结构可以一次选择多个啊?
victor3l 发表于 2012-7-9 21:22

为什么要选择多个?
NE5532 发表于 2012-7-9 22:28 | 显示全部楼层
程序本来就不支持并发执行,如果是两种case有公用程序段,通过标志传递或者巧妙安排语句位置,是可以实现的。
 楼主| victor3l 发表于 2012-7-10 08:20 | 显示全部楼层
5# NE5532

我要达到这样的效果,有6路数据要处理,乘以系数求和。有些时候我需要第一路,第二路,第六路,有时候仅需要第一路等等。就是要达到,任意选择我想要的哪几路数据。如果用if   else if    这样来选择的话,那么有6!这么多个项,不是使用啊。该怎样达到我的效果啊?在其他地方我已经把6路是否选择做好了不知,在选的时候直接查询标志 看要不要选择。
 楼主| victor3l 发表于 2012-7-10 08:20 | 显示全部楼层
4# ningling_21
我要达到这样的效果,有6路数据要处理,乘以系数求和。有些时候我需要第一路,第二路,第六路,有时候仅需要第一路等等。就是要达到,任意选择我想要的哪几路数据。如果用if   else if    这样来选择的话,那么有6!这么多个项,不是使用啊。该怎样达到我的效果啊?在其他地方我已经把6路是否选择做好了不知,在选的时候直接查询标志 看要不要选择。
原野之狼 发表于 2012-7-10 09:58 | 显示全部楼层
看我的,或许可以参考使用:
  1. /*
  2. *  Update the changed direction of y.
  3. *  There are 4 blocks in one byte,each block own 2 bits.
  4. *
  5. *  @block_index: which jepg block?
  6. *  @delta_y:     y changed.
  7. */
  8. void update_y_direction(int block_index, int delta_y)
  9. {
  10.     int i;
  11.         unsigned char level;

  12.     level = whichlevel(delta_y);

  13.     switch (level) {
  14.         case 0:
  15.             /* NO changing. Update all of the table */
  16.             for (i = 0; i < ALARM_SENSITY_LEVEL_MAX; i++) {
  17.                 SET_BYTE_BITS(last_y_direction[i][block_index / 4],
  18.                     (block_index % 4) << 1, 2, BLK_Y_NO_CHANGE);
  19.             }
  20.             break;

  21. #ifdef USING_ALARM_LV5
  22.         case ALARM_SENSITY_LV5:
  23.             SET_BYTE_BITS(last_y_direction[ALARM_SENSITY_LV5 - 1][block_index / 4],
  24.                 (block_index % 4) << 1, 2, delta_y > 0 ? BLK_Y_INCREASED : BLK_Y_DECREASED);
  25. #endif

  26. #ifdef USING_ALARM_LV4
  27.         case ALARM_SENSITY_LV4:
  28.             SET_BYTE_BITS(last_y_direction[ALARM_SENSITY_LV4 - 1][block_index / 4],
  29.                 (block_index % 4) << 1, 2, delta_y > 0 ? BLK_Y_INCREASED : BLK_Y_DECREASED);
  30. #endif

  31. #ifdef USING_ALARM_LV3
  32.         case ALARM_SENSITY_LV3:
  33.             SET_BYTE_BITS(last_y_direction[ALARM_SENSITY_LV3 - 1][block_index / 4],
  34.                 (block_index % 4) << 1, 2, delta_y > 0 ? BLK_Y_INCREASED : BLK_Y_DECREASED);
  35. #endif

  36. #ifdef USING_ALARM_LV2
  37.         case ALARM_SENSITY_LV2:
  38.             SET_BYTE_BITS(last_y_direction[ALARM_SENSITY_LV2 - 1][block_index / 4],
  39.                 (block_index % 4) << 1, 2, delta_y > 0 ? BLK_Y_INCREASED : BLK_Y_DECREASED);
  40. #endif

  41. #ifdef USING_ALARM_LV1
  42.         case ALARM_SENSITY_LV1:
  43.             SET_BYTE_BITS(last_y_direction[ALARM_SENSITY_LV1 - 1][block_index / 4],
  44.                 (block_index % 4) << 1, 2, delta_y > 0 ? BLK_Y_INCREASED : BLK_Y_DECREASED);
  45. #endif
  46.             break;
  47.         default:
  48.             ; /* WARNING! */
  49.     }
  50. }
joyme 发表于 2012-7-10 10:27 | 显示全部楼层
uchar multi_num[6] ={初始化系数};       //系数数组
uint    total;
#define  calc_sum(adresult,ch_num)     total += adresult*multi_num(n)

想一次完成的话,用链表是可以的,用一个数组来保存要处理的路数也可以
把要处理的索引一次放到这个数组的前几个位置,后面的置零
比如处理1,2,6三路,index[6] = {1,2,6,0,0,0}; ADResult[6]分别放了6路采样的数据
while(index[i] != 0)
{
      total += ADResult[index[i]] * multi_num[index[i]]
   i++;
}
sedatefire 发表于 2012-7-10 10:50 | 显示全部楼层
表示看不懂

  1. switch (var)
  2. {
  3.         case  一路:
  4.         case  三路:
  5.         case  五路:
  6.           break;
  7. }
  8. 这样不就可以了












 楼主| victor3l 发表于 2012-7-10 14:33 | 显示全部楼层
10# sedatefire
switch  case 每次只能有一个成立,我要在某些情况下同时选择好几路,或任意一路。
xmar 发表于 2012-7-10 15:34 | 显示全部楼层
switch (var)
{
        case  1路:
        case  2路:
          ......
        case  N路:
          break;
}
这样就可以了.
xmar 发表于 2012-7-10 16:02 | 显示全部楼层
当然,如果不是多核或多线程cpu,仅仅单核cpu是不能真正同时多任务的。其实单线程cpu只能依次来完成任务。无法真正并行。即使是多核cpu也要编程语言的编译系统支持多任务再加上多任务编程技巧,才能完成真正多任务。你的多任务编程技巧非常影响程序运行效率。并且,即使在理论上,N核cpu程序运行时间也不能简单缩短 1/N倍。

相反,对于硬件描述语言(VHDL)而言,如果把FPGA芯片的IO信号处理类比cpu的任务,FPGA几乎所有‘任务’都是并行,要依次分别完成‘任务’——即‘单任务’反而是困难的!
sfesdm 发表于 2012-7-10 18:40 | 显示全部楼层
switch(value)
{
    case 1:
    case 2:
    case 6:
       if(condition1)
       {
             excute 1;
       }
        if(condition2)
       {
             excute 2;
       }
       if(condition3)
       {
             excute 6;
       }
      break;   
}
weibestww 发表于 2012-7-10 19:37 | 显示全部楼层
使用函数指针其不受更方便
wukunshan 发表于 2012-7-10 20:40 | 显示全部楼层
C语言的基本语句里没有楼主所说的条件语句。这样的功能只能通过楼主自己的算法来实现。
intermec 发表于 2012-7-10 23:48 | 显示全部楼层
if()
{xxx}
if()
{xxx}
if()
{xxx}
这样不知算不算多路呢,,,哈哈
sedatefire 发表于 2012-7-11 00:03 | 显示全部楼层
10# sedatefire  
switch  case 每次只能有一个成立,我要在某些情况下同时选择好几路,或任意一路。
victor3l 发表于 2012-7-10 14:33

我大概了解你的意思了
这个貌似可以透过标志位、查表法、等方式解决
有几路,就在对应位上或上1,然后有一个函数指针数组,进行跳转,这样应该可以
mcu要求是压栈传参的工作方式,51的不行
sedatefire 发表于 2012-7-11 00:04 | 显示全部楼层
你这个还涉及到优先权的问题...
kind__heart 发表于 2012-7-11 14:31 | 显示全部楼层
进来学习下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

308

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部