找回密码
 加入
搜索
查看: 13291|回复: 23

[效率算法] 关于_ArrayAdd()与_ArrayAdd2()的讨论

 火.. [复制链接]
发表于 2012-11-24 23:46:27 | 显示全部楼层 |阅读模式
本帖最后由 blue_dvd 于 2012-11-24 23:52 编辑

在_ArrayAdd()中
变为
#include <Array.au3>
Local $avArray[1]
_ArrayAdd($avArray, "Brian")
_ArrayDelete($avArray, 0)
_ArrayDisplay($avArray, "$avArray 添加后的数据 _ArrayAdd()")
发现添加数据中第1个数组是空的
如果$avArray[1]改为$avArray[0]程序出错
所以加了一句_ArrayDelete($avArray, 0)删掉第一个空数据;

在_ArrayAdd2()中
出处:http://www.autoitx.com/forum.php?mod=viewthread&tid=17061&fromuid=7639113
#Include <Array.au3>
Dim $avArray[6]=[1,2,3,4,5,6]
Dim $anArray[8]=["Acd","BBB","DEFAS","dior","fdsa","e32390","32"]
Dim $Grid[1][6]  ;这里改为Dim $Grid[1][1]时,只添加了一个数字
_ArrayAdd2($Grid,$avArray);将一维数组添加到二维数组中
_ArrayAdd2($Grid,$anArray);将一维数组添加到二维数组中
_ArrayDisplay($Grid)
问题1:能否去掉第一行的空数据;
问题2:在没有定有多少列的情况下,即Dim $Grid[1][1]时,也可以照常添加$avArray的6个数据或是$anArray里的7个数据?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-11-25 09:56:07 | 显示全部楼层
回复 1# blue_dvd

1.第一行当然是空的,因为你定义时就没有赋值~~
#include <Array.au3>
Local $avArray[1]=['定义我时,麻烦您赋个初值,谢谢~~']
_ArrayAdd($avArray, "Brian")
_ArrayDisplay($avArray, "$avArray 添加后的数据 _ArrayAdd()")

   
第二个例子,空行也是同样的道理~~

2.用redim和UBound

#Include <Array.au3>
Dim $avArray[6]=[1,2,3,4,5,6]
Dim $anArray[8]=["Acd","BBB","DEFAS","dior","fdsa","e32390","32"]
Dim $Grid[1][1]=[['和第一个例子一样,不多说了~~']]  ;这里改为Dim $Grid[1][1]时,只添加了一个数字
ReDim $Grid[1][(UBound($anArray)-1)]
_ArrayAdd2($Grid,$avArray);将一维数组添加到二维数组中
_ArrayAdd2($Grid,$anArray);将一维数组添加到二维数组中
_ArrayDisplay($Grid)

Func _ArrayAdd2(ByRef $array1,$array2);_ReArrayAdd(目标数组,增加内容)
        If IsArray($array2) Then 
                If UBound($Array2, 0) <> 1 Then Return SetError(2, 0, -1);增加内容不是一个一维数组
        Else
                Return SetError(1, 0, -1);返回错误代码1,增加的内容非数组
        EndIf
        If Not IsArray($array1) Then Return SetError(3, 0, -1);返回错误代码3,目标数组非数组
        $One_Dimen=UBound($array2);取一维数组数量
        $Many_Dimen=UBound($array1,0);取二维数组维数
        Local $Many_Dimen_Line=UBound($array1,1);取二维数组行数
        $Many_Dimen_Col=UBound($array1,2);取二维数组列数
        If $Many_Dimen<>2 Then Return SetError(4,0,-1);返回错误代码4,目标数组非二维数组
        If $One_Dimen<$Many_Dimen_Col Or $One_Dimen>$Many_Dimen_Col Then
                ReDim $array2[$Many_Dimen_Col]
        EndIf
        ReDim $array1[$Many_Dimen_Line+1][$Many_Dimen_Col]
        For $add_i=0 To $Many_Dimen_Col-1
        $array1[$Many_Dimen_Line][$add_i]=$array2[$add_i]                
        Next
        Return $Many_Dimen_Line
        
EndFunc
 楼主| 发表于 2012-11-25 13:23:18 | 显示全部楼层
回复 2# annybaby
感谢回复!
我的思维是:我只是定义数组不给它初始值,直接由合并的数据来赋值!
你给的代码中还是没能去掉第一行的空行!
发表于 2012-11-25 14:33:57 | 显示全部楼层
发表于 2012-11-25 14:34:02 | 显示全部楼层
发表于 2012-11-25 14:44:31 | 显示全部楼层
回复 3# blue_dvd

你定义了空的,又不给它赋值,又使用_arrayadd添加,当然有空!!!!!!
发表于 2012-11-25 16:20:15 | 显示全部楼层
本帖最后由 netegg 于 2012-11-25 16:24 编辑

回复 6# annybaby
不是这个缘故,第一个元素[0]不能普通意义上的赋值
这么理解吧,如果定义一个数组,$a[0]不能等于0,必须从1开始,第0个元素首先是数组元素
发表于 2012-11-25 18:24:01 | 显示全部楼层
回复 7# netegg


    试举例说明??
发表于 2012-11-25 20:31:36 | 显示全部楼层
本帖最后由 netegg 于 2012-11-25 20:46 编辑

回复 8# annybaby [au3]
;Dim $a[0] = 0
;ConsoleWrite($a[0])
Dim $aA[1]
$aA[0] = 1
ConsoleWrite($aA[0])[/au3]
其实这个问题可以换个角度理解,ubound()可以返回元素个数,如果是数组的话,最少为1
未注释的部分之所以可以成功,就是要先定义数组,才能有[0],没数组的话肯定报错
还有,楼主那个问题,和这些关系似乎不大,_arrayadd2d那个函数本来就不是向空的二维数组里加行的
 楼主| 发表于 2012-11-25 20:45:32 | 显示全部楼层
回复 6# annybaby
我的意思是添加完后,有什么办法删掉第一行空行?
发表于 2012-11-25 20:49:25 | 显示全部楼层
本帖最后由 netegg 于 2012-11-25 20:50 编辑

回复 10# blue_dvd
上面不是给你链接了吗
Func _Array2DDeleteRow(ByRef $avArray, $line)
        Local $avArray2[UBound($avArray, 1) - 1][UBound($avArray, 2)]
        For $i = 0 To UBound($avArray, 1) - 1
                If $i < $line Then
                        For $j = 0 To UBound($avArray, 2) - 1
                                $avArray2[$i][$j] = $avArray[$i][$j]
                        Next
                Else
                        If $i > $line Then
                                For $j = 0 To UBound($avArray, 2) - 1
                                        $avArray2[$i - 1][$j] = $avArray[$i][$j]
                                Next
                        EndIf
                EndIf
       Next
        Return $avArray2
EndFunc   ;==>_Array2DDeleteRow

 
发表于 2012-11-25 20:57:21 | 显示全部楼层
回复 9# netegg

呵呵,你说的当然很明显是事实,我也知道,不过我看不到这个例子和我前面(2L和6L)所描述的有任何冲突的地方~~

我这两楼都是解释为什么会出现一个空的行~~
并没有说可以不定义数组就直接给一个空想的数组元素赋值哦~~
 楼主| 发表于 2012-11-25 20:59:57 | 显示全部楼层
本帖最后由 blue_dvd 于 2012-11-25 21:01 编辑

回复 4# netegg
用了老大蛋你的删除行函数
_Array2DDeleteRow(ByRef $avArray, $line)
,无效果!一行也删不掉!
#Include <Array.au3>
Dim $avArray[6]=[1,2,3,4,5,6]
Dim $anArray[8]=["Acd","BBB","DEFAS","dior","fdsa","e32390","32"]
Dim $Grid[1][1]=[['和第一个例子一样,不多说了~~']]  ;这里改为Dim $Grid[1][1]时,只添加了一个数字
ReDim $Grid[1][(UBound($anArray)-1)]

_ArrayAdd2($Grid,$avArray);将一维数组添加到二维数组中
_ArrayAdd2($Grid,$anArray);将一维数组添加到二维数组中
_Array2DDeleteRow($Grid,0);删除第一行
_ArrayDisplay($Grid)
 
Func _ArrayAdd2(ByRef $array1,$array2);_ReArrayAdd(目标数组,增加内容)
        If IsArray($array2) Then 
                If UBound($Array2, 0) <> 1 Then Return SetError(2, 0, -1);增加内容不是一个一维数组
        Else
                Return SetError(1, 0, -1);返回错误代码1,增加的内容非数组
        EndIf
        If Not IsArray($array1) Then Return SetError(3, 0, -1);返回错误代码3,目标数组非数组
        $One_Dimen=UBound($array2);取一维数组数量
        $Many_Dimen=UBound($array1,0);取二维数组维数
        Local $Many_Dimen_Line=UBound($array1,1);取二维数组行数
        $Many_Dimen_Col=UBound($array1,2);取二维数组列数
        If $Many_Dimen<>2 Then Return SetError(4,0,-1);返回错误代码4,目标数组非二维数组
        If $One_Dimen<$Many_Dimen_Col Or $One_Dimen>$Many_Dimen_Col Then
                ReDim $array2[$Many_Dimen_Col]
        EndIf
        ReDim $array1[$Many_Dimen_Line+1][$Many_Dimen_Col]
        For $add_i=0 To $Many_Dimen_Col-1
        $array1[$Many_Dimen_Line][$add_i]=$array2[$add_i]               
        Next
        Return $Many_Dimen_Line
        
EndFunc

Func _Array2DDeleteRow(ByRef $avArray, $line)
        Local $avArray2[UBound($avArray, 1) - 1][UBound($avArray, 2)]
        For $i = 0 To UBound($avArray, 1) - 1
                If $i < $line Then
                        For $j = 0 To UBound($avArray, 2) - 1
                                $avArray2[$i][$j] = $avArray[$i][$j]
                        Next
                Else
                        If $i > $line Then
                                For $j = 0 To UBound($avArray, 2) - 1
                                        $avArray2[$i - 1][$j] = $avArray[$i][$j]
                                Next
                        EndIf
                EndIf
        Next
        Return $avArray2
EndFunc   ;==>_Array2DDeleteRow
 楼主| 发表于 2012-11-25 21:03:00 | 显示全部楼层
会不会是我自己的问题,你们试试!我上面的代码
发表于 2012-11-25 21:08:44 | 显示全部楼层
本帖最后由 netegg 于 2012-11-25 21:10 编辑
#include <Array.au3>
Dim $avArray[6] = [1, 2, 3, 4, 5, 6]
Dim $anArray[8] = ["Acd", "BBB", "DEFAS", "dior", "fdsa", "e32390", "32"]
Dim $Grid[1][6] ;这里改为Dim $Grid[1][1]时,只添加了一个数字
_ArrayAdd2($Grid, $avArray);将一维数组添加到二维数组中
_ArrayAdd2($Grid, $anArray);将一维数组添加到二维数组中
_ArrayDisplay($Grid)
$Grid = _Array2DDeleteRow($Grid, 0)
_ArrayDisplay($Grid, '_Array2DDeleteRow')
Func _ArrayAdd2(ByRef $array1, $array2);_ReArrayAdd(目标数组,增加内容)
        If IsArray($array2) Then
                If UBound($array2, 0) <> 1 Then Return SetError(2, 0, -1);增加内容不是一个一维数组
        Else
                Return SetError(1, 0, -1);返回错误代码1,增加的内容非数组
        EndIf
        If Not IsArray($array1) Then Return SetError(3, 0, -1);返回错误代码3,目标数组非数组
        $One_Dimen = UBound($array2);取一维数组数量
        $Many_Dimen = UBound($array1, 0);取二维数组维数
        Local $Many_Dimen_Line = UBound($array1, 1);取二维数组行数
        $Many_Dimen_Col = UBound($array1, 2);取二维数组列数
        If $Many_Dimen <> 2 Then Return SetError(4, 0, -1);返回错误代码4,目标数组非二维数组
        If $One_Dimen < $Many_Dimen_Col Or $One_Dimen > $Many_Dimen_Col Then
                ReDim $array2[$Many_Dimen_Col]
        EndIf
        ReDim $array1[$Many_Dimen_Line + 1][$Many_Dimen_Col]
        For $add_i = 0 To $Many_Dimen_Col - 1
                $array1[$Many_Dimen_Line][$add_i] = $array2[$add_i]
        Next
        Return $Many_Dimen_Line
        
EndFunc   ;==>_ArrayAdd2
Func _Array2DDeleteRow(ByRef $avArray, $line)
        Local $avArray2[UBound($avArray, 1) - 1][UBound($avArray, 2)]
        For $i = 0 To UBound($avArray, 1) - 1
                If $i < $line Then
                        For $j = 0 To UBound($avArray, 2) - 1
                                $avArray2[$i][$j] = $avArray[$i][$j]
                        Next
                Else
                        If $i > $line Then
                                For $j = 0 To UBound($avArray, 2) - 1
                                        $avArray2[$i - 1][$j] = $avArray[$i][$j]
                                Next
                        EndIf
                EndIf
        Next
        Return $avArray2
EndFunc   ;==>_Array2DDeleteRow
我去,睁眼说瞎话
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-5 08:08 , Processed in 0.085176 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表