使用CF块写的冒泡排序例程
适用于字节、字、双字、浮点,基于冒泡法+数据读写编写。用于将任意长度的某段存储区内数据从大到小排序后存储到另一存储区C函数整体和程序块调用:
几种运算结果:
↓↓↓↓↓↓↓↓源代码↓↓↓↓↓↓↓↓
// switch用于输入输出判断属于哪种类型的数据。
// 中间使用for嵌套调整数组data_t 内数据排序。
// 14-23行:输入, 29-40行:调整, 42-51行:输出。
#include "math.h"
#include "stdio.h"
#include "plc300.h"
S32 l;
U16 j, k;
void CF_0( void* data_in, U16 len, U8 type, void* data_out)
{
S32 data_t; // len长度的数组,用于存储数据
for(j=0; j<len; j++) // 将data_in指定V区中len数量的数据获取到数组data_t 中
{
switch(type) // 判断数据长度(type==?)1:字节/ 2:字/ 4:双字/ 其他:非法,不获取数据
{
case 1: data_t =getS8(data_in+j); break;
case 2: data_t =getS16(data_in+2*j); break;
case 4: data_t =getS32(data_in+4*j); break;
default: break;
}
}
// 数据调整原理:
// 一级for:限制数据调整范围,不对已经存储好的数据进行二次判断,所以要越来越小
// 二级for:使用if条件判断从第一个数据开始,到范围内最后一个数据依次对相邻数据进行判断,将范围内最小值放到最后面,范围内所有值判断完成后回到一级for缩小范围锁定当前最小值
// if判断:如果当前值小于下一个值,就把当前值跟下一个值互换位置,否则不执行调整;然后回到二级for开始判断下一值
for(j=len; j>1; j--)
{
for(k=0; k<j-1; k++)
{
if(data_t <data_t)
{
l =data_t;
data_t =data_t;
data_t =l;
}
}
}
for(j=0; j<len; j++) // 将数组data_t 中的数据恢复到data_out指定V区中
{
switch(type) // 判断数据长度(type==?)1:字节/2:字/4:双字/其他:非法,不输出数据
{
case 1: setS8(data_out+j ,data_t); break;
case 2: setS16(data_out+2*j ,data_t); break;
case 4: setS32(data_out+4*j ,data_t); break;
default: break;
}
}
}
页:
[1]