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

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

[复制链接]
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版