你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何计算一个数组里的最大值,并且知道序号。

[复制链接]
any012 提问时间:2019-1-28 17:08 /
悬赏5ST金币已解决
请教个问题,现在我有4路报警信息,存放到了一个数组里,比如是alarm[4],其中每一路的报警等级分为4等吧。
而现在我需要一个总的报警等级,总的报警等级是各路报警等级里的最高值,并且还要判断出来是那一路,进而进行报警处理。
我现在是做了4个for循环,第一个for循环里判断各路报警等级是不是有1,如果有1的话,则置总报警等级为1,第二个for循环判断各路报警等级里是不是又2,如果有2的话,则置总报警等级为2...
这样做能实现想要的功能,但是觉得有些繁琐。
请教下,有什么好的方法来计算下?
冒泡法排序?感觉也挺麻烦的。

最佳答案

查看完整内容

用一个临时变量去赋值和比较咯
收藏 评论13 发布时间:2019-1-28 17:08

举报

13个回答
子曰好人 回答时间:2019-1-28 17:08:58
用一个临时变量去赋值和比较咯
  1. int i;
  2. int tmp;
  3. int ch;
  4. tmp =alarm[0];
  5. for(i=0;i<4;i++)
  6. {
  7. if(tmp <=alarm[i])
  8. {
  9. tmp = alarm[i];
  10. ch=i;
  11. }
  12. }
复制代码

点评

bug:如果alarm[0]就是最大值,ch理论上来说可能为任意值,返回值是有问题的。  发表于 2019-1-28 21:42

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

radio2radio 回答时间:2019-1-28 17:55:16
本帖最后由 radio2radio 于 2019-1-28 17:58 编辑

如果有alarm[4]的源头,好办。
设两个变量,比如叫alarmMax和alarmMXno,在存入alarm[]的任何一个值的时候,比较一下alarmMax,只要大于它就同时存入它和编号。适当的时候清零。

如果只能后期查询,也是一个for循环就够了,留取最大值和编号。而不是比较1,比较2,,,,

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

radio2radio 回答时间:2019-1-28 18:05:10
楼主小心,如果有两路或以上同时为最大(相等),你怎么分?
老牛洋车 回答时间:2019-1-28 18:08:31
一个循环足够了,用一个变量来保存最大等级的,如果还需要知道最大等级是哪路的,则再添加一个变量就行。等级变量开始置最低值,每次循环进行比较,若等级高则保留相关数据,循环结束后这个变量就是最高的等级。
STM1024 回答时间:2019-1-28 21:44:00
看样子题主偏向于搞硬件的?
any012 回答时间:2019-1-29 09:08:43
谢谢各位的回复。

我一开始是写了5个for循环,依次判断数组里的数是否是0、1、2、3、4;
现在改了下,弄成两层for循环了,外层for循环是0-4,里层for循环判断数组。
想了想,这样其实和以前一样,只是写法上简洁了些。
  1.    for (i = 0; i < 5; i++)
  2.     {
  3.         for (j = 0; j < CHANNEL_NUMBER; j++)
  4.         {
  5.             if (alarm[j] == i)
  6.             {
  7.                 alarmLevel = i;
  8.                 if (4 == alarmLevel)
  9.                 {
  10.                     OpenYout(j);
  11.                 }
  12.             }
  13.         }
复制代码

3楼的朋友给的代码感觉挺好的,一会试下。
子曰好人 回答时间:2019-1-29 09:18:05
本帖最后由 子曰好人 于 2019-1-29 09:19 编辑

回复5楼
@stm1024
老哥吓得我赶紧去验证了一下代码,应该没有你说的那个bug,不过有另外的bug,当数组的值是相同的时候ch是最后一个,还需另外处理
代码验证.png
代码验证2.png

any012 回答时间:2019-1-29 10:10:14
stm1024 发表于 2019-1-28 21:44
看样子题主偏向于搞硬件的?

相对来说,画板子多点,编程经验少些。
STM1024 回答时间:2019-1-29 10:14:59
any012 发表于 2019-1-29 10:10
相对来说,画板子多点,编程经验少些。

嗯,因为这个问题应该是一个非常简单的编程问题,其实你还要考虑的是,同时在两个通道出现故障等级相同的情况该如何处理。
STM1024 回答时间:2019-1-29 10:16:43
本帖最后由 stm1024 于 2019-1-29 10:25 编辑
子曰好人 发表于 2019-1-29 09:18
回复5楼
@stm1024
老哥吓得我赶紧去验证了一下代码,应该没有你说的那个bug,不过有另外的bug,当数组的值 ...
其实你可以在ch声明的时候直接初始化为0就可以解决出现的问题。
像这种局部变量,只申明不初始化的话,其实值可能是任意的。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. void Test()
  5. {
  6.     uint8_t x;
  7.     printf("%d\n",x);
  8. }
  9. int main()
  10. {
  11.     int i;
  12.     for(i=0;i<100;i++)
  13.         Test();
  14.     return 0;
  15. }
复制代码
2019-01-29_102402.png

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

子曰好人 回答时间:2019-1-29 10:35:35
stm1024 发表于 2019-1-29 10:16
其实你可以在ch声明的时候直接初始化为0就可以解决出现的问题。
像这种局部变量,只申明不初始化的话,其实 ...

我知道你的意思,确实是代码初始化是个好习惯,我写的那个至少会执行一次if,所以不会出现任意值
STM1024 回答时间:2019-1-29 10:53:51
子曰好人 发表于 2019-1-29 10:35
我知道你的意思,确实是代码初始化是个好习惯,我写的那个至少会执行一次if,所以不会出现任意值 ...

嗯,你说的非常对,就是有时候做算法滤波的时候,经常容易忘记初始化……

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版