|
You last visited: Today at 13:04
Advertisement
2D Array Fehler
Discussion on 2D Array Fehler within the AutoIt forum part of the Coders Den category.
10/20/2013, 14:56
|
#1
|
elite*gold: 400
Join Date: Jun 2011
Posts: 513
Received Thanks: 101
|
2D Array Fehler
Hallihallo epvp,
ich habe ein kleines Problem mit meiner 2D Array. Ich finde den Fehler nicht. Vermutlich steh ich komplett auf dem Schlauch. Entschuldigung dafür, >.< aber bevor ich viel erzähle hier der Script:
PHP Code:
Dim $Line[1], $Split[1]
$File = FileOpen("M:\ein\Pfad\von\der\Datei.txt")
$Line[0] = FileReadLine($File,1)
$Split[0] = StringSplit($Line[0],"|")
MsgBox(0, "", $Split[0][0])
Das Textdokument:
MfG
|
|
|
10/20/2013, 15:06
|
#2
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Du kannst einem 1D-Eintrag keinen 1D-Array zuweisen:
Code:
$Split[0] = StringSplit()
ist falsch, StringSplit returned einen Array, was gehen würde wäre StringSplit in einen neuen Array zu speichern und die Einträge in einer For-Schleife zu übernehmen.
Hier mal ausm Kopf geschmissener Code der funktionieren könnte:
Code:
Local $aSplit = StringSplit("","",2), $a2DArray[1][UBound($aSplit)]
For $i = 0 To UBound($aSplit) - 1
$a2DArray[0][$i] = $aSplit[$i]
Next
|
|
|
10/20/2013, 15:14
|
#3
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
Du hast ein Array in einem Array, das macht es nicht zu einem 2D Array. Mir ist in AutoIt keine direkte Zugriffsmethode bekannt.
Aber warum möchtest du es überhaupt ein Array in einem Array speichern?
Ich weiß zwar nicht genau, was du machen möchtest, aber hier mal ein Beispiel:
Code:
$file = FileOpen("datei.txt")
While $file <> -1
$line = FileReadLine($file)
If @error Then Exit
$split = StringSplit($line, "|")
For $i = 1 To $split[0]
MsgBox(0, "", $Split[$i])
Next
WEnd
Du könntest es aber auch tatsächlich in ein 2D Array packen. Die Größe der Dimensionen müsstest du aber immer wieder mit UBound() überprüfen und mit ReDim anpassen. Das ist aber keine Lösung die du verwenden solltest.
Quote:
Originally Posted by alpines
Du kannst einem 1D-Eintrag keinen 1D-Array zuweisen
|
Doch, das kann man:
Code:
Dim $array1[1]
$array1[0] = StringSplit("1|2|3", "|")
$var = $array1[0]
MsgBox(0, "", "Elemente: " & $var[0])
Dein Beispiel funktioniert übrigens nur Gesetz dem Falle, dass alle Zeilen gleich viele "Spalten" haben. Nicht die beste Lösung.
|
|
|
10/20/2013, 15:18
|
#4
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Achso, ich hatte das anders probiert:
Code:
Local $myArray1[1][UBound(StringSplit("","",2)-1], $aSplit = StringSplit("","",2)
$myArray[0] = $aSplit
Würde man hier nicht einem Feld die Array-Einträge zuweisen?
|
|
|
10/20/2013, 16:43
|
#5
|
elite*gold: 400
Join Date: Jun 2011
Posts: 513
Received Thanks: 101
|
Quote:
Originally Posted by KDeluxe
Ich weiß zwar nicht genau, was du machen möchtest
|
Die Datei hat mehrere Reihen. 1. Zahl für die Reihe und 2. Zehl für die Spalte.
|
|
|
10/20/2013, 17:42
|
#6
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
Wie und wann soll das ganze den "verarbeitet" werden? Wenn jede Zeile gleich viele "Spalten" verwendet kannst du ganz einfach ein 2D Array verwenden:
Code:
#include <Array.au3>
Dim $index = 0, $lines[1][5]
$file = FileOpen("datei.txt", 1)
While $file <> -1
$line = FileReadLine($file)
If @error Then ExitLoop
$split = StringSplit($line, "|")
ReDim $lines[$index + 1][5]
For $i = 1 To $split[0]
If $i > 5 Then ExitLoop
$lines[$index][$i - 1] = $split[$i]
Next
$index += 1
WEnd
_ArrayDisplay($lines)
In diesem Beispiel hat eine Zeile fünf Spalten. Sind es weniger wird der Standardwert (0) verwendet, sind es mehr werden diese ignoriert.
Eine andere Methode wäre die von dir bereits verwendete (Array in Array), nur eben richtig:
Code:
Dim $index = 0, $lines[1]
$file = FileOpen("datei.txt", 0)
While $file <> -1
$line = FileReadLine($file)
If @error Then ExitLoop
ReDim $lines[$index + 1]
$lines[$index] = StringSplit($line, "|")
$index += 1
WEnd
; Folgendes dient nur der Ausgabe und verdeutlicht die Verwendung
If $file <> -1 Then
FileClose($file)
ConsoleWrite("Zeilen: " & UBound($lines) & @CRLF)
For $i1 = 0 To UBound($lines) - 1
$var = $lines[$i1]
ConsoleWrite("Spalten: " & $var[0] & ", ")
For $i2 = 1 To $var[0]
ConsoleWrite($i2 & " = " & $var[$i2])
If $i2 == $var[0] Then
ConsoleWrite(@CRLF)
Else
ConsoleWrite(", ")
EndIf
Next
Next
EndIf
Hierbei musst du beachten, dass FileReadLine() nur funktioniert, wenn der 2. Parameter (mode) bei FileOpen() auf 0 (read mode) ist.
Beide Beispiele sind aber nicht das Gelbe vom Ei. Nenne uns doch deinen Anwendungsfall.
|
|
|
10/20/2013, 18:23
|
#7
|
elite*gold: 400
Join Date: Jun 2011
Posts: 513
Received Thanks: 101
|
Ich spiele Lotto und will die getippten Zahlen die ich in der Textdatei gespeichert habe auslesen und mit den gezogenen Zahlen vergleichen.
Es gibt mit sicherheit schon so ein Programm und ich könnte es auch totan einfach machen. Möchte ich aber nicht. ^^
€: So würde das dann aussehen.
PHP Code:
01|02|03|04|05|06 11|12|13|14|15|16 21|22|23|24|25|26 31|32|33|34|35|36 41|42|43|44|45|46 51|52|53|54|55|56 61|62|63|64|65|66 71|72|73|74|75|76 81|82|83|84|85|86 91|92|93|94|95|96
|
|
|
10/20/2013, 20:47
|
#8
|
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
|
Machs so:
Code:
#include <Array.au3>
Local $sRead, $aSplitFile, $iZeilen, $aSplit
$sRead = FileRead("zahlen.txt"); Datei auslesen
$aSplitFile = StringSplit($sRead, @CR, 2); Zeilen Splitten
$iZeilen = UBound($aSplitFile); Zeilen Länge rausfinden
Dim $aZahlen[$iZeilen][6]; 2D Array Deklarieren
For $i = 0 To $iZeilen -1; Alle Zeilen durchgehen
$aSplit = StringSplit($aSplitFile[$i], "|", 2); In den Zeilen jedes | Splitten
For $i2 = 0 To 5; Alle 6 Zahlen durchgehen
$aZahlen[$i][$i2] = $aSplit[$i2]; In die 2D Array die Zahlen eintragen
Next; For-Schleife Ende
Next; For-Schleife Ende
_ArrayDisplay($aZahlen); Array Anzeigen
Und mach dir eine txt Datei namens zahlen.txt, mit den inhalt:
Code:
01|02|03|04|05|06
11|12|13|14|15|16
21|22|23|24|25|26
31|32|33|34|35|36
41|42|43|44|45|46
51|52|53|54|55|56
61|62|63|64|65|66
71|72|73|74|75|76
81|82|83|84|85|86
91|92|93|94|95|96
|
|
|
10/20/2013, 22:16
|
#9
|
elite*gold: 400
Join Date: Jun 2011
Posts: 513
Received Thanks: 101
|
Thx BladeTiger12
Ist zwar nicht fertig aber ich habs so gemacht:
PHP Code:
#include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3>
Dim $sRead, $aSplitFile, $iZeilen, $aSplit
GUICreate("", 187, 274, 319, 134, BitOR($WS_SYSMENU,$WS_CAPTION,$WS_POPUP,$WS_POPUPWINDOW,$WS_BORDER,$WS_CLIPSIBLINGS)) GUICtrlCreateGroup("Getippte Zahlen", 8, 72, 169, 193)
$sRead = FileRead("zahlen.txt") $aSplitFile = StringSplit($sRead, @CR, 2) $iZeilen = UBound($aSplitFile)
Dim $aZahlen[$iZeilen][6]
For $i = 0 To $iZeilen -1; Alle Zeilen durchgehen $aSplit = StringSplit($aSplitFile[$i], "|", 2) For $i2 = 0 To 5; Alle 6 Zahlen durchgehen $aZahlen[$i][$i2] = $aSplit[$i2] Next Next
Dim $aLabel[$iZeilen][6]
For $i1 = 0 To 9 Step 1 For $i2 = 0 To 5 Step 1 $aLabel[$i1][$i2] = GUICtrlCreateLabel($aZahlen[$i1][$i2],($i2 + 1) * 24, (($i1 + 1) * 16) + 80, 16, 17) Next Next GUISetState(@SW_SHOW)
While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit
EndSwitch WEnd
Warum da bei den 1. Zahlen jetzt ein Absatz ist weiß ich grade nicht. Werde ich aber gleich schauen/editieren.
|
|
|
10/20/2013, 22:49
|
#10
|
elite*gold: 64
Join Date: May 2011
Posts: 1,229
Received Thanks: 854
|
Probiers so:
Code:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Dim $sRead, $aSplitFile, $iZeilen, $aSplit
GUICreate("", 187, 274, 319, 134, BitOR($WS_SYSMENU,$WS_CAPTION,$WS_POPUP,$WS_POPUPWINDOW,$WS_BORDER,$WS_CLIPSIBLINGS))
GUICtrlCreateGroup("Getippte Zahlen", 8, 72, 169, 193)
$sRead = FileRead("zahlen.txt")
$aSplitFile = StringSplit($sRead, @CRLF, 2)
$iZeilen = UBound($aSplitFile)
Dim $aZahlen[$iZeilen][6], $aLabel[$iZeilen][6]
For $i = 0 To $iZeilen -1 Step 2; Alle Zeilen durchgehen
$aSplit = StringSplit($aSplitFile[$i], "|", 2)
For $i2 = 0 To 5; Alle 6 Zahlen durchgehen
$aZahlen[$i][$i2] = $aSplit[$i2]
$aLabel[$i][$i2] = GUICtrlCreateLabel($aZahlen[$i][$i2],($i2 + 1) * 24, (($i +2) * 8) + 80, 16, 17)
Next
Next
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
|
|
|
 |
Similar Threads
|
Facebook App - Array Error [Es ist ein Fehler aufgetreten. Bitte Lade die Seite neu!]
02/28/2013 - Web Development - 9 Replies
Werte Community,
Ich habe eine App, die automatisch bein Verwenden dieser App ein Bild erstellt und automatisch auf die Pinnwand teilen soll.
Dies Funktioniert eig. alles soweit.
Doch nun habe ich die App auf mein Webspace hochgeladen.
Beim Verwenden dieser App auf meiner Seite kommt folgendes Problem:
Es ist ein Fehler aufgetreten. Bitte Lade die Seite neu!
Array
|
$SID[0] array Fehler
10/18/2011 - AutoIt - 3 Replies
Hi,
ich lese die SID aus einem Spiel aus. Mit _stringbetween klappt das auch bei dem ersten Account. Beim zweiten nicht mehr. Warum? Ich lese sie ja immer neu aus..$oWEBTCP.Navigate("http://www.howrse.de/ jeu/?identification=1")
$SID = _StringBetween($oWebTcp.body, "sid=", "'")
$OWEBTCP.Navigate("http://www.howrse.de/site /doLogOut", "sid="&$SID)Wenn ich jz hinter dem $SID = _StringBetween($oWebTcp.body, "sid=", "'") eine MSGBOX mache dann zeigt er mir die richtige SID an aber halt beim 2....
|
Array
06/18/2011 - AutoIt - 0 Replies
Array Fehler
Ich habe hier mal wieder einen Fehler den ich nicht beheben kann
#include "WebTcp.au3"
#include <Array.au3>
#Include <File.au3>
TCPStartup()
_AutoITObject_Startup()
|
All times are GMT +1. The time now is 13:05.
|
|