打印

if--else 和 switch case

[复制链接]
4971|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victor3l|  楼主 | 2012-7-9 21:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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

为什么要选择多个?

使用特权

评论回复
5
NE5532| | 2012-7-9 22:28 | 只看该作者
程序本来就不支持并发执行,如果是两种case有公用程序段,通过标志传递或者巧妙安排语句位置,是可以实现的。

使用特权

评论回复
6
victor3l|  楼主 | 2012-7-10 08:20 | 只看该作者
5# NE5532

我要达到这样的效果,有6路数据要处理,乘以系数求和。有些时候我需要第一路,第二路,第六路,有时候仅需要第一路等等。就是要达到,任意选择我想要的哪几路数据。如果用if   else if    这样来选择的话,那么有6!这么多个项,不是使用啊。该怎样达到我的效果啊?在其他地方我已经把6路是否选择做好了不知,在选的时候直接查询标志 看要不要选择。

使用特权

评论回复
7
victor3l|  楼主 | 2012-7-10 08:20 | 只看该作者
4# ningling_21
我要达到这样的效果,有6路数据要处理,乘以系数求和。有些时候我需要第一路,第二路,第六路,有时候仅需要第一路等等。就是要达到,任意选择我想要的哪几路数据。如果用if   else if    这样来选择的话,那么有6!这么多个项,不是使用啊。该怎样达到我的效果啊?在其他地方我已经把6路是否选择做好了不知,在选的时候直接查询标志 看要不要选择。

使用特权

评论回复
8
原野之狼| | 2012-7-10 09:58 | 只看该作者
看我的,或许可以参考使用:
/*
*  Update the changed direction of y.
*  There are 4 blocks in one byte,each block own 2 bits.
*
*  @block_index: which jepg block?
*  @delta_y:     y changed.
*/
void update_y_direction(int block_index, int delta_y)
{
    int i;
        unsigned char level;

    level = whichlevel(delta_y);

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

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

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

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

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

#ifdef USING_ALARM_LV1
        case ALARM_SENSITY_LV1:
            SET_BYTE_BITS(last_y_direction[ALARM_SENSITY_LV1 - 1][block_index / 4],
                (block_index % 4) << 1, 2, delta_y > 0 ? BLK_Y_INCREASED : BLK_Y_DECREASED);
#endif
            break;
        default:
            ; /* WARNING! */
    }
}

使用特权

评论回复
9
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++;
}

使用特权

评论回复
10
sedatefire| | 2012-7-10 10:50 | 只看该作者
表示看不懂

switch (var)
{
        case  一路:
        case  三路:
        case  五路:
          break;
}
这样不就可以了












使用特权

评论回复
11
victor3l|  楼主 | 2012-7-10 14:33 | 只看该作者
10# sedatefire
switch  case 每次只能有一个成立,我要在某些情况下同时选择好几路,或任意一路。

使用特权

评论回复
12
xmar| | 2012-7-10 15:34 | 只看该作者
switch (var)
{
        case  1路:
        case  2路:
          ......
        case  N路:
          break;
}
这样就可以了.

使用特权

评论回复
13
xmar| | 2012-7-10 16:02 | 只看该作者
当然,如果不是多核或多线程cpu,仅仅单核cpu是不能真正同时多任务的。其实单线程cpu只能依次来完成任务。无法真正并行。即使是多核cpu也要编程语言的编译系统支持多任务再加上多任务编程技巧,才能完成真正多任务。你的多任务编程技巧非常影响程序运行效率。并且,即使在理论上,N核cpu程序运行时间也不能简单缩短 1/N倍。

相反,对于硬件描述语言(VHDL)而言,如果把FPGA芯片的IO信号处理类比cpu的任务,FPGA几乎所有‘任务’都是并行,要依次分别完成‘任务’——即‘单任务’反而是困难的!

使用特权

评论回复
14
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;   
}

使用特权

评论回复
15
weibestww| | 2012-7-10 19:37 | 只看该作者
使用函数指针其不受更方便

使用特权

评论回复
16
wukunshan| | 2012-7-10 20:40 | 只看该作者
C语言的基本语句里没有楼主所说的条件语句。这样的功能只能通过楼主自己的算法来实现。

使用特权

评论回复
17
intermec| | 2012-7-10 23:48 | 只看该作者
if()
{xxx}
if()
{xxx}
if()
{xxx}
这样不知算不算多路呢,,,哈哈

使用特权

评论回复
18
sedatefire| | 2012-7-11 00:03 | 只看该作者
10# sedatefire  
switch  case 每次只能有一个成立,我要在某些情况下同时选择好几路,或任意一路。
victor3l 发表于 2012-7-10 14:33

我大概了解你的意思了
这个貌似可以透过标志位、查表法、等方式解决
有几路,就在对应位上或上1,然后有一个函数指针数组,进行跳转,这样应该可以
mcu要求是压栈传参的工作方式,51的不行

使用特权

评论回复
19
sedatefire| | 2012-7-11 00:04 | 只看该作者
你这个还涉及到优先权的问题...

使用特权

评论回复
20
kind__heart| | 2012-7-11 14:31 | 只看该作者
进来学习下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

308

帖子

5

粉丝