技术论坛

 SCL实现数组全复制的三种方法

返回主题列表
作者 主题
'Razor
至圣

经验值:24441
发帖数:3205
精华帖:41
楼主    2017-11-09 17:54:04
主题:SCL实现数组全复制的三种方法 精华帖  精编帖 

当一回孔乙己,如题。

//copy a array totally to another array

//first way: use SFC20

#Error := BLKMOV(SRCBLK := #SourceArray, DSTBLK =>#DestinationArray_1);


//second way: copy the elements one by one

FOR #index := 0 TO 9 DO  

  #DestinationArray_2[#index] := #SourceArray[#index];

END_FOR;

#index := #index + 1;


//third way: use the name of array

#DestinationArray_3 := #SourceArray;


//Error check

FOR #index := 0 TO 9 DO    

IF (#DestinationArray_1[#index] <> #SourceArray[#index]) THEN  

      #Error_1 := TRUE; 

ELSE       

      IF (#DestinationArray_2[#index] <> #SourceArray[#index]) THEN         

            #Error_2 := TRUE; 

      ELSE         

            IF (#DestinationArray_3[#index] <> #SourceArray[#index]) THEN               

                  #Error_3 := TRUE;

            ELSE

                  ;

            END_IF;       

       END_IF;    

 END_IF;

END_FOR;


若要倒序复制,则变更索引下标即可:

//second way: copy the elements one by one

FOR #index := 0 TO 9 DO

    #DestinationArray_2[9-#index] := #SourceArray[#index];

END_FOR;

#index := #index + 1;

或者

//second way: copy the elements one by one

FOR #index := 0 TO 9 DO

    #DestinationArray_2[#index] := #SourceArray[9-#index];

END_FOR;

#index := #index + 1;


少即是多
Zane
版主

经验值:85161
发帖数:21047
精华帖:399
4楼    2017-11-10 08:56:25
精编帖  主题:回复:SCL实现数组全复制的三种方法

孔乙己有啥典故?窃书不为偷?


对楼主程序的建议:


300/400的做法,建议按字节直接用SFC20拷贝,只要确保目标存储区大于源存储区即可


而在博图S7-1200/1500下,对等结构是可以直接MOVE的,而不同长度数组的拷贝则可以考虑楼主的做法,但保险起见需要核对目标数组的大小及数组单元的类型

Zane 注册自动化系统工程师 Always save before download
Setrarin
侠士

经验值:1749
发帖数:139
精华帖:4
5楼    2017-11-10 09:07:24
精编帖  主题:回复:SCL实现数组全复制的三种方法

不错,唯一就是#index := #index + 1; 有些累赘了。

但行好事,莫问前程
Qin.
侠圣

经验值:3902
发帖数:234
精华帖:1
7楼    2017-11-10 13:43:29
精编帖  主题:回复:SCL实现数组全复制的三种方法

不错,见识了几种移植方法,有心了解过。但这样发散的思维不应该是孔乙己呀,唐诗宋瓷?印象中鲁大师笔下的孔乙己是位思想腐朽、四体不勤的形象,完全跟唐兄这举一反三、追求科技的思想大相径庭啊~

Stay Hungry ,Stay Foolish .
'Razor
至圣

经验值:24441
发帖数:3205
精华帖:41
8楼    2017-11-10 17:09:53
精编帖  主题:回复:SCL实现数组全复制的三种方法

孔乙己不是说“茴”字有三种写法嘛,所以借用了一下。

多谢 Z 版不计前嫌,提携后进。

无论是应用场景,还是应用中的注意事项,都被说到了。

关于不同长度数组的拷贝,核对目标数组的大小及数组单元的类型,考虑采用ARRAY+ANY,ANY指向ARRAY的起始地址,对ANY进行解析,取出重复因子及数据类型等参数,进行数组长度的计算,以及索引下标是否边界溢出,数据类型是否匹配等问题的核验,待算法经过验证后,再另开一帖说明 。

上面的代码缺点不少,最基本的,易读性不是太好,一些类似“0“和”9“这样的常数没有明确的标示出其代表的意义,改成"minIndex"、"maxIndex"、"totalElements",阅读效果要好得多。

博途平台SCL编程环境下,不支持绝对地址的编程,而是采用支持符号寻址的编程方式,更多的恐怕也是基于易读性方面的考虑。

数组的操作属于数据结构的基础知识,自己也只是写出来发在论坛以防自己忘记而已,没想到得到前辈推荐,还成了“精华贴”,实在是惭愧,多谢大伽推荐,更多谢版主封精。

少即是多
lurphy
侠士

经验值:1777
发帖数:7
精华帖:0
9楼    2017-11-11 09:23:45
精编帖  主题:回复:SCL实现数组全复制的三种方法

不理解Error check  为什么要嵌套。

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。