hallo zusammen,
ich nerve ein letztes mal glaube ich, zumindest ist das mein derzeitger plan, denn das meiste was ich fuer mein geplantes vorhaben/projekt brauche habe ich jetzt 'zusammengehamstert'. es geht abseits dieses problems nur noch um den zusammenbau und damit bin ich dann einige wochen/monate beschaeftigt.
ich habe nun eine simulation angefertigt und jene so gut es ging mit comments versehen
aber zum verständnis vorab: später werden die user eine eingabemaske mit 3 feldern sehen. in feld 1 gibt er seinen namen ein. in feld 2 gibt er den monat ein und aus dieser kombination wird dann feld 3 'errechnet' und ausgegeben.
damit keiner mit unnoetigen daten arbeiten muss, habe ich die eingabe von 12 namen und 12 monaten bereits angelegt. damit dann jedes mal eine andere _richtige_ loesung herauskommt, sind die 12 namen und die 12 monate jeweils durch einen shuffle durcheinandergemischt worden.
ich poste jetzt den gesamten code inklusive der kompletten loesungs-ini-datei. ich habe lediglich fehlerhafte (und inzwischen auskommentierte stellen aka fehlversuche) aus dem code entfernt.
alles klappt bis auf die eigentliche sache, die das script machen soll und es liegt wie immer an einer For-To-Next-Schleife ... bzw. 2x 1D-Array und 1x 2D-Array die miteinander verglichen bzw. abgelichen werden um dann das richtige ergebnis in ein neues 1x 1D-Array in der selben Reihenfolge wie die 12 eingaben sind abzuspeichern.
sprich: ein name und ein monat sind zusammen unzertrennlich und mit einem raum verbunden den es zu ermitteln gilt.
lange rede kurzer sinn, seht mal selbst:
komplette ini-datei (als text datei hochgeladen und begefuegt):
nun zum AutoIT-Code:
#include <MsgBoxConstants.au3>
#include <Array.au3>
#comments-start
als erstes holen wir uns die einzig _richtige_ loesung aus einer ini datei zum spaeteren vergleich:
ich habe mich fuer die varinate von schnuffel aus dem forum entschieden, weil es fuer meine zwecke
glaube ich genau das ist was ich benoetige und nach ein wenig anpassung es toll geklappt hat. danke.
#comments-end
Global $ini = @ScriptDir & "\loesung.ini"
Global $iniOutput[1][1]
Global $sections = IniReadSectionNames($ini)
For $a = 1 To UBound($sections) - 1
$keys = IniReadSection($ini, $sections[$a])
Redim $iniOutput[UBound($keys)][3]
For $b = 1 To UBound($keys) - 1
$data = StringSplit($keys[$b][1], '|')
$iniOutput[$b][0] = $data[1]
$iniOutput[$b][1] = $data[2]
$iniOutput[$b][2] = $data[3]
Next
Next
_ArrayDisplay($iniOutput) ; dies ist nur ein test zur kontrolle der daten!
_ArrayDelete($iniOutput, 0) ; wir loeschen die leere zeile am anfang des arrays
_ArrayDisplay($iniOutput) ; dies ist nur ein test zur kontrolle der daten!
Global $monate, $namen
#comments-start
die folgenden daten waeren daten die von Usern eingegeben werden muessen: Monat und Name!
Die Monate Januar bis Dezember in Verbindung mit 12 unterschiedlichen Namen von Usern.
hier folgt nun eine komplette liste der monate und namen als liste als anschauliches beispiel:
#comments-end
$monate = 'Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember'
MsgBox(0, "MONATE", $monate) ; dies ist nur ein test zur kontrolle der daten!
$namen = 'Paul Ursula Robert Marion Peter Nadine Stefan Esther Oliver Evelyn Michael Doris'
MsgBox(0, "NAMEN", $namen) ; dies ist nur ein test zur kontrolle der daten!
#comments-start
jetzt wandeln wir die auflistung der Monate und die auflistung der Namen jeweils in ein array um
und nutzen hierzu die stringsplit moeglichkeit wobei die leerschritte als 'delimiter' genutzt werden:
ich weiss, ich haette einfach direkt ein array darus machen koennen, aber ich moechte ja die eingabe
vom user 'simulieren'. die user geben einen string ein und das wird dann vom script als array
gespeichert bzw. weiter verarbeitet.
#comments-end
$arr_monate = StringSplit($monate," ",$STR_NOCOUNT) ; no-count damit array sofort mit daten beginnt
_ArrayDisplay($arr_monate, "MONATE") ; dies ist nur ein test zur kontrolle der daten!
$arr_namen = StringSplit($namen," ",$STR_NOCOUNT) ; no-count damit array sofort mit daten beginnt
_ArrayDisplay($arr_namen, "NAMEN") ; dies ist nur ein test zur kontrolle der daten!
#comments-start
an dieser stelle sollen eingaben in einer eingabemaske 'simuliert' werden. spaeter in der GUI
gibt es zwei eingabefelder in der die entsprechenden daten eingegeben werden muessen um dann
das ergebnis zu bekommen ... zum thema ermittlung vom ergebnis: spaeter (weiter unten) mehr!
[ ... ]
zur eingabesimulation nutzen wir jetzt einen _ArrayShuffle() damit bei jedem neuen versuch
ein anderes ergebnis zu ermitteln ist. es gibt 144*144 = 20736 moeglichkeiten (glaube ich
zumindest, aber es koennte auch 144*144*144 sein) also sollte so die funktion vom script
eigentlich gut zu testen sein auf ihr koennen:
#comments-end
_ArrayShuffle($arr_monate, 0,11) ; daten durch die waschmaschiene jagen.
_ArrayDisplay($arr_monate, "M-SHUFF.") ; dies ist nur ein test zur kontrolle der daten!
_ArrayShuffle($arr_namen, 0,11) ; daten durch die waschmaschiene jagen.
_ArrayDisplay($arr_namen, "N-SHUFF.") ; dies ist nur ein test zur kontrolle der daten!
#comments-start
so nun kommen wir zu der magie ... ab hier beginnt die arbeit, die das script erledigen soll:
der plan sieht so aus: das script hat also jetzt 12 monatseingaben und 12 namenseingaben erhalten
und nun soll der dazugehörige Raum ermittelt werden. hierzu muessen die arrays verglichen werden
also wenn der name aus der eingegebenen namensliste ($arr_namen) und der monat aus der eingegebenen
monatsliste ($arr_monate) mit name und monat der ini-loesungs-datei-array ($iniOutput) uebereinstimmen,
so soll in einem neuen array ($result) die entsprechende raumnummer in der _richtigen_ reihenfolge
(sprich genau die gleiche reihenfolge der eingegebenen daten) wieder ausgegeben werden.
zunächst (zu testzwecken) fuer alle 12 eingaben direkt und spaeter (im eigentlichen geplanten script)
nur bei einer einzelnen eingabe von name und monat. sprich: wenn ein monat und ein namen eingegeben
wird, so wird zu diesem namen und zu diesem monat die entsprechende Raumnummer ausgegeben.
also versuchen wir mal unser glueck:
#comments-end
Global $result[1] ; wir stellen ein neues array her um dort die loesung zu speichern, die wir suchen ... 1D-Array
_ArrayDisplay($result) ; dies ist nur ein test zur kontrolle der daten!
Global $arows = UBound($iniOutput, $UBOUND_ROWS) ; erstellte daten für die For-To-Next-Schleife für $iniOutput (loesungsdaten) ... 2D-Array
Global $acols = UBound($iniOutput, $UBOUND_COlUMNS) ; erstellte daten für die For-To-Next-Schleife für $iniOutput (loesungsdaten) ... 2D-Array
Global $adims = UBound($iniOutput, $UBOUND_DIMENSIONS) ; erstellte daten für die For-To-Next-Schleife für $iniOutput (loesungsdaten) ... 2D-Array
Global $brows = UBound($arr_monate, $UBOUND_ROWS) ; erstellte daten für die For-To-Next-Schleife für $arr_monate (die eingegebenen monate) ... 1D-Array
Global $bcols = UBound($arr_monate, $UBOUND_COlUMNS) ; erstellte daten für die For-To-Next-Schleife für $arr_monate (die eingegebenen monate) ... 1D-Array
Global $bdims = UBound($arr_monate, $UBOUND_DIMENSIONS) ; erstellte daten für die For-To-Next-Schleife für $arr_monate (die eingegebenen monate) ... 1D-Array
Global $crows = UBound($arr_namen, $UBOUND_ROWS) ; erstellte daten für die For-To-Next-Schleife für $arr_namen (die eingegebenen namen) ... 1D-Array
Global $ccols = UBound($arr_namen, $UBOUND_COlUMNS) ; erstellte daten für die For-To-Next-Schleife für $arr_namen (die eingegebenen namen) ... 1D-Array
Global $cdims = UBound($arr_namen, $UBOUND_DIMENSIONS) ; erstellte daten für die For-To-Next-Schleife für $arr_namen (die eingegebenen namen) ... 1D-Array
Global $drows = UBound($result, $UBOUND_ROWS) ; erstellte daten für die For-To-Next-Schleife für $result (die auszugebene loesung) ... 1D-Array
Global $dcols = UBound($result, $UBOUND_COlUMNS) ; erstellte daten für die For-To-Next-Schleife für $result (die auszugebene loesung) ... 1D-Array
Global $ddims = UBound($result, $UBOUND_DIMENSIONS) ; erstellte daten für die For-To-Next-Schleife für $result (die auszugebene loesung) ... 1D-Array
#cs
;jetzt pruefen wir ob die daten der eingegebenen namen auch ausgegeben werden
ConsoleWrite("-----------"&"Array: $arr_namen"&"-----------"&@crlf)
For $1 = 0 To $crows -1
;ConsoleWrite($arr_namen[$1] & " _ ") ;funktioniert: ausgabe der namen _nach_ dem shuffle
ConsoleWrite("Access $arr_namen["&$1&"]: "&$arr_namen[$1]&@crlf)
Next
;pruefung (mit erfolg) beendet: die liste der namen wird korrekt ausgegeben
;ConsoleWrite(@CRLF & @CRLF) ; einfach nur wegen der uebersichtlichkeit
;jetzt pruefen wir ob die daten der eingegebenen monate auch ausgegeben werden
ConsoleWrite("-----------"&"Array: $arr_monate"&"-----------"&@crlf)
For $2 = 0 To $brows - 1
;ConsoleWrite($arr_monate[$2] & " _ ") ;funktioniert: ausgabe der monate _nach_ dem shuffle
ConsoleWrite("Access $arr_monate["&$2&"]: "&$arr_monate[$2]&@crlf)
Next
;pruefung (mit erfolg) beendet: die liste der monate wird korrekt ausgegeben
;ConsoleWrite(@CRLF & @CRLF) ; einfach nur wegen der uebersichtlichkeit
;jetzt pruefen wir ob die daten der loesung (ini datei array) auch ausgegeben werden
ConsoleWrite("-----------"&"Array: $iniOutput"&"-----------"&@crlf)
For $3a = 0 To $arows - 1
For $3b = 0 To $acols - 1
;ConsoleWrite($iniOutput[$3a][$3b] & " _ ") ; funktioniert: ausgabe der gesamten loesungsliste
ConsoleWrite("Access $iniOutput["&$3a&"]["&$3b&"]: "&$iniOutput[$3a][$3b]&@crlf)
Next
Next
;pruefung (mit erfolg) beendet: die liste der loesung wird korrekt ausgegeben
#ce
#comments-start
jetzt versuchen wir mal das ganze aufzuloesen in einer For-To-Next-Schleife:
#comments-end
For $4a = 0 To $arows - 1 ;$arows: loesungsarray (2D-Array)
For $4b = 0 To $acols - 1 ;$acols: loesungsarry (2D-Array)
ConsoleWrite("Access $iniOutput["&$4a&"]["&$4b&"]: "&$iniOutput[$4a][$4b]&@crlf)
For $5 = 0 To $crows - 1 ;$crows: namensarray (1D-Array)
ConsoleWrite("Access $arr_namen["&$5&"]: "&$arr_namen[$5]&@crlf)
For $6 = 0 To $brows - 1 ;$brows: monatsarray (1D-Array)
ConsoleWrite("Access $arr_monate["&$6&"]: "&$arr_monate[$6]&@crlf)
For $7 = 0 To $drows - 1 ;$drows: ausgabearray (1D-Array)
ConsoleWrite("Access $result["&$7&"]: "&$result[$7]&@crlf)
If $arr_namen[$5] = $iniOutput[$4a][$4b] And $arr_monate[$6] = $iniOutput[$4a][$4b] Then
$iniOutput[$4a][2] = _ArrayAdd($result, $result[$7])
EndIf
Next
Next
Next
Next
Next
_ArrayDisplay($result, "loesung") ; normalerweise haben wir jetzt die loesungsdaten, aber heute noch nicht ... denkfehler?
#comments-start
im prinzip soll das in etwa diese funktion haben (vereinfachtes beispiel ... aber snytax inkorrekt)!
If $arr_namen[0 - 11] = $iniOutput[gleich wie $arr_namen[0 - 11]][0] And $arr_monate[0 - 11] = $iniOutput[gleich wie $arr_monate[0 - 11]][1] Then
_ArrayAdd($result, $iniOutput[an korrter stelle die Raumnummer][2])
#comments-end
Alles anzeigen
ich weiss nicht ob das alles so nachvollziehbar ist? das ganze scheitert nur an der letzten Schleife, weil die wahrscheinlich total falsch ist.
in manuellen versuchen habe ich zumindest ansatzweise erfolg gehabt mit vielen vielen vielen solchen zeilen. bei 144 zeilen hatte ich manchmal zwischen 0 und 2 treffern, als weiss ich zumindest, das es so halbwegs funktioniert:
If $arr_namen[0] = $iniOutput[0][0] And $arr_monate[0] = $iniOutput[0][1] Then _ArrayAdd($result, $iniOutput[0][2])
If $arr_namen[1] = $iniOutput[1][0] And $arr_monate[1] = $iniOutput[1][1] Then _ArrayAdd($result, $iniOutput[1][2])
If $arr_namen[2] = $iniOutput[2][0] And $arr_monate[2] = $iniOutput[2][1] Then _ArrayAdd($result, $iniOutput[2][2])
If $arr_namen[3] = $iniOutput[3][0] And $arr_monate[3] = $iniOutput[3][1] Then _ArrayAdd($result, $iniOutput[3][2])
If $arr_namen[4] = $iniOutput[4][0] And $arr_monate[4] = $iniOutput[4][1] Then _ArrayAdd($result, $iniOutput[4][2])
If $arr_namen[5] = $iniOutput[5][0] And $arr_monate[5] = $iniOutput[5][1] Then _ArrayAdd($result, $iniOutput[5][2])
If $arr_namen[6] = $iniOutput[6][0] And $arr_monate[6] = $iniOutput[6][1] Then _ArrayAdd($result, $iniOutput[6][2])
If $arr_namen[7] = $iniOutput[7][0] And $arr_monate[7] = $iniOutput[7][1] Then _ArrayAdd($result, $iniOutput[7][2])
If $arr_namen[8] = $iniOutput[8][0] And $arr_monate[8] = $iniOutput[8][1] Then _ArrayAdd($result, $iniOutput[8][2])
If $arr_namen[9] = $iniOutput[9][0] And $arr_monate[9] = $iniOutput[9][1] Then _ArrayAdd($result, $iniOutput[9][2])
If $arr_namen[10] = $iniOutput[10][0] And $arr_monate[10] = $iniOutput[10][1] Then _ArrayAdd($result, $iniOutput[10][2])
If $arr_namen[11] = $iniOutput[11][0] And $arr_monate[11] = $iniOutput[11][1] Then _ArrayAdd($result, $iniOutput[11][2])
Alles anzeigen
wo sind die denkfehler? ich bin in der For-To-Next-Schleife jede instanz durchgegangen und normalerweise muesste das doch so funktionieren. meine ausgabe array ($result) bleibt aber leer und ein fehler bekomme ich nicht angezeigt, also weiss ich nicht genau wo der fehler liegt.
ich danke für jegliche hilfe.
gruss