Hallo,
ich möchte einen Eintrag zu einem 2D-Array hinzugügen. Die Hilfe sagt ja, dass bei _ArrayAdd nur mit 1D-Arrays gearbeitet werden kann. Welche 2D-Alternative gibt es hierzu?
Alternative zu _ArrayAdd
-
- [ gelöst ]
-
Scritch -
5. Mai 2011 um 09:48 -
Geschlossen -
Erledigt
-
-
- Offizieller Beitrag
Schreib doch selbst, oder such mal bei Bugfix(user im Forum)

-
Wie Xeno sagte - schreib es dir doch selbst.
Da reicht prinzipiell schon ein Zweizeiler:
Ein ReDim und eine Wertzuweisung. -
Ja, einfach selbst schreiben, ganz einfach
Ich habe hier eine Teillösung gefunden, ist aber kein 2 Zeiler
und ich weiß auch noch nicht, wie ich in die 2 Spalte Werte reinbekomme.Spoiler anzeigen
[autoit]$sMsg = "Add a single element to a 2D array:" & @CRLF
[/autoit] [autoit][/autoit] [autoit]
Global $avTesting[3][2] = [[1, 2],[3, 4],[5, 6]]
$RET = __ArrayAdd($avTesting, "Test")
$iErrSav = @error
$iExtSav = @extended
_ArrayDisplay($avTesting, "$avTesting")Func __ArrayAdd(ByRef $avArray, $vValue, $NestArray = True)
[/autoit]
Local $iBoundArray0, $iBoundArray1, $iBoundArray2, $iBoundValue1
If IsArray($avArray) = 0 Then Return SetError(1, 0, -1); $avArray is not an array
$iBoundArray0 = UBound($avArray, 0); No. of dimesions in array
If $iBoundArray0 > 2 Then Return SetError(1, 1, -1); $avArray is more than 2D
$iBoundArray1 = UBound($avArray, 1); Size of array in first dimension
If $iBoundArray0 = 2 Then $iBoundArray2 = UBound($avArray, 2); Size of array in second dimension
If ($iBoundArray0 = 1) Or (IsArray($vValue) = 0) Or $NestArray Then
; If input array is 1D, or $vValue is not an array, or $NestArray = True (default) then save $vValue literally
If $iBoundArray0 = 1 Then
; Add to 1D array
ReDim $avArray[$iBoundArray1 + 1]
$avArray[$iBoundArray1] = $vValue
Else
; Add to 2D array at [n][0]
ReDim $avArray[$iBoundArray1 + 1][$iBoundArray2]
$avArray[$iBoundArray1][0] = $vValue
EndIf
Else
; If input array is 2D, and $vValue is an array, and $NestArray = False,
; then $vValue is a 1D array of values to add as a new row.
If UBound($vValue, 0) <> 1 Then Return SetError(1, 2, -1); $vValue array is not 1D
$iBoundValue1 = UBound($vValue, 1)
If $iBoundArray2 < $iBoundValue1 Then Return SetError(1, 3, -1); $vValue array has too many elements
ReDim $avArray[$iBoundArray1 + 1][$iBoundArray2]
For $n = 0 To $iBoundValue1 - 1
$avArray[$iBoundArray1][$n] = $vValue[$n]
Next
EndIf
; Return index of new last row in $avArray
Return $iBoundArray1
EndFunc ;==>__ArrayAdd
Ich probiers mal mit dem alleine schreiben
-
Soo:
Spoiler anzeigen
[autoit]#include <array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <file.au3>dim $pcname[1] = ["pcname"]
[/autoit] [autoit][/autoit] [autoit]
Local $csvpfad = @ScriptDir & "\test.csv"
Local $open = FileOpen($csvpfad, 0)
;~ global $csv2array = _CSV2Array($open, Default, True, 1)
FileClose($csvpfad)
;_ArrayDisplay($csv2array)For $a = 1 To UBound($pcname) - 1
[/autoit]
$onlinestatus = Ping($pcname[$a],500) ; onlinestatus abfragen für schnellere verarbeitung
If $onlinestatus Then
Local $software = "\\" &$pcname[$a] & "\d$\HaSo\software.ini"
Global $asoftware
_FileReadtoarray($software, $asoftware) ;Erste Softwareliste wird eingelesen und gleich in die .csv geschrieben
for $b = 1 to ubound($asoftware) - 1
dim $csv[$b - 1][0] = $asoftware[$b]
_ArrayDisplay($csv)
Next
EndIf
NextIch lese hier eine Liste mit installierter Software von einem anderen Computer in ein array ein. Dann möchte ich diese Liste an
[autoit]
Software gerne in ein anderes Array, in die erste Spalte haben. Das habe ich mitfor $b = 1 to ubound($asoftware) - 1
[/autoit]
dim $csv[$b - 1][0] = $asoftware[$b]
_ArrayDisplay($csv)
Next
versucht. Das sagt mir Autoit aber immer "badly formated". Ich komme einfach nicht drauf, was ich verkehrt mache
-
Dein Skript kann ich ja nicht testen da ich die "test.csv" ja nicht habe.
Dennoch mal ein kleiner Denkanstoß:
Hab dein Skript mal auf einen wesentlichen Aspekt hin verkürzt - was fällt dir dabei auf?:Spoiler anzeigen
[autoit]dim $pcname[1] = ["pcname"]
[/autoit] [autoit][/autoit] [autoit]For $a = 1 To UBound($pcname) - 1
[/autoit]
MsgBox(0,"", "Wird ausgeführt")
Next
Nun mal zu deinem neuen Codeteil.
Ich verstehe es so das du ein 2D-Array erstellen willst und gleich direkt eine Spalte mit dem Inhalt eines 1D-Arrays befüllen willst.
Das geht nicht in einer Zeile (maximal nur über eine UDF).
Du musst schon Element für Element in einer Schleife durchgehen und die Elemente einzeln einzutragen.
Warum du in der Schleife immer ein neues Array erstellst (dim) ist mir zwar nicht klar aber in der 2. Dimension sollte schon eine Zahl größer 0 stehen weil ein 2D-Array mit der Spaltenanzahl 0 einfach mal "Nichts" ist.Vielleicht zur Verständnis nochmal der angesprochene 2-Zeiler (hier sind es 3 da ich die Elemente einzeln eintrage):
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]; Array mit 3 "Zeilen" und 2 "Spalten":
[/autoit] [autoit][/autoit] [autoit]
Global $aTest[3][2] = [[1, 2],[3, 4],[5, 6]]
_ArrayDisplay($aTest, "Vorher"); Vergrößere das Array um eine Zeile (UBound($aTest,2) = Anzahl Spalten):
[/autoit] [autoit][/autoit] [autoit]
ReDim $aTest[UBound($aTest)+1][UBound($aTest, 2)]; Trage die beiden neuen Werte mit in das Array:
[/autoit] [autoit][/autoit] [autoit]
$aTest[UBound($aTest) - 1] [0] = 7
$aTest[UBound($aTest) - 1] [1] = 8_ArrayDisplay($aTest, "Nachher")
[/autoit] -
Hab dein Skript mal auf einen wesentlichen Aspekt hin verkürzt - was fällt dir dabei auf?:
Ausser dass mein Array nur einen Eintrag hat und dass das in einer Schleife abzuarbeiten ziemlich blödsinnig ist, nichts... (Zur Verteidigung: Das Array ist normal größer)
Ich verstehe es so das du ein 2D-Array erstellen willst und gleich direkt eine Spalte mit dem Inhalt eines 1D-Arrays befüllen willst.
Genau das möchte ich!
Warum du in der Schleife immer ein neues Array erstellst (dim) ist mir zwar nicht klar
Jetzt wo dus sagst: Bischen schwachsinnig, ja :pinch:
in der 2. Dimension sollte schon eine Zahl größer 0 stehen
Hatte irgendwie im Kopf, dass da die Zählweise von links auch bei 0 anfängt, wie bei den Spalten.
Vielleicht zur Verständnis nochmal der angesprochene 2-Zeiler
Ok, danke dafür. Habs jetzt glaube ich... wenigstens zum Teil...
[autoit]Dim $csv[30][4]
[/autoit]
for $b = 1 to ubound($asoftware) - 1
$csv[$b][1] = $asoftware[$b]
_ArrayDisplay($csv)
NextEdit: Ich möchte es jetzt nur noch so haben, dass ich die Arraygröße vorher nicht bestimmen brauche... Ich bastel mal weiter.
Edit2: Habs jetzt so wie ich es haben wollte, danke für die Hilfe:
[autoit]Dim $csv[2][4];Größe des Arrays (Sollte dynamisch angepasst werden)
[/autoit]
for $b = 1 to ubound($asoftware) - 1
$csv[$b][1] = $asoftware[$b]
ReDim $csv[ubound($asoftware) + 1][4]
_ArrayDisplay($csv)
Next -
Zitat von »AspirinJunkie«
Hab dein Skript mal auf einen wesentlichen Aspekt hin verkürzt - was fällt dir dabei auf?:
Ausser dass mein Array nur einen Eintrag hat und dass das in einer Schleife abzuarbeiten ziemlich blödsinnig ist, nichts...Führe es doch mal aus...
Der erste ArrayIndex ist die 0 - nicht die 1.
Bei allen For-Schleifen die ich bei dir gesehen habe ignorierst du immer das 1. Element.Hatte irgendwie im Kopf, dass da die Zählweise von links auch bei 0 anfängt, wie bei den Spalten.
Wenn du auf die Werte zugreifst ist das ja richtig. Aber wenn man ein Array deklariert wird kein Index sondern die Größe angegeben.
-
Bei allen For-Schleifen die ich bei dir gesehen habe ignorierst du immer das 1. Element.
Hat den Grund, weil in der ersten Zeile die Größe des Arrays stand. Und das ist ein Eintrag, den ich nicht brauche.
-
Hallo Scritch,
wenn Du grundsätzlich Probleme mit Arrays hast, hilft Dir vielleicht das Array-Tutorial von BugFix (http://www.bug-fix.info/array_tut.htm) weiter. -
Generell Probleme habe ich nicht. Das sind jetzt bloß Dinge, die mit Arrays vorher nicht angestellt habe und ich mich daher bischen mit schwer tue. Das Tut kenne ich schon, schaue auch ab und zu mal wieder rein, trotzdem danke für den Hinweis
