array(s) nach daten durchsuchen und zuordnen und damit dann ein neues array anlegen

  • 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):

    Der Inhalt kann nicht angezeigt werden, da du keine Berechtigung hast, diesen Inhalt zu sehen.

    nun zum AutoIT-Code:

    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:

    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

    ConsoleWrite("=====================>>> "&"About Me:"&" <<<=====================" & @CRLF)
    ConsoleWrite("Someday I will know how to do it but that day is not today!" & @CRLF)
    ConsoleWrite("===================>>> "&"bankesbusters"&" <<<===================" & @CRLF)

    Einmal editiert, zuletzt von SOLVE-SMART (17. April 2025 um 13:20)

  • Wenn ich deine Beschreibung richtig verstanden habe, ist das Ziel ein Programm, in dem du den Namen und Monat auswählst und dann den zugehörigen Raum angezeigt bekommst.
    Ich würde in dem Fall nicht mit Arrays, sondern mit Maps arbeiten. Die sind extra dafür da, Daten so abzulegen, dass man mit Schlüsselwörtern (Name/Monat) schnell darauf zugreifen kann:

    Ich habe hier eine Funktion erstellt, welche die Ini in eine Map einliest. Bei einer Map wird anders als bei einem Array, nicht mit einer Zahl als Index auf einen Wert zugegriffen, sondern stattdessen mit beliebigen Daten. Hier mit dem Namen oder dem Monat.
    Dabei ist das ganze hier in zwei Maps verschachtelt (wie ein 2D-Array).
    Eine Map, bei der man mit dem Namen eine weitere Map bekommt, in der für jeden Monat der Raum steht.

    Das ganze hat auch den Vorteil, dass ich alle Namen aus der $mData Map mit MapKeys($mData) auslesen kann und dann ein Array mit allen Namen aus der Ini-Datei habe, was ich in dem Code nutze um die ComboBox mit Namen zu befüllen.
    Da sich die Monate nicht ändern, musst du das Script also nie anpassen, wenn du eine weitere Person hinzufügst. Es reicht die Datei in der Ini hinzuzufügen.

    Du hast übrigens in der Ini bei einigen Nutzern "Mai" und bei anderen "May" als Monat angegeben, deshalb wird der Raum für manche Nutzer im Mai nicht gefunden.
    Deshalb hab ich mal beim einlesen der Ini das StringSplit mit einem RegExp ausgetauscht. Dadurch wird die Ini geprüft, ob die Eingabe richtig ist, oder ob irgendwo ein Fehler ist und der Fehler ggf. ausgegeben.

  • hi,

    so toll das auch ist (und es ist echt toll), glaube ich nicht das dies die loesung ist wonach ich suche, weil:

    ich muss das tatsächlich in array form zum laufen bringen, denn es geht tatsaechlich um die extakte reihenfolge der namen, monate und raeume.

    der shuffle ist nur dazu da um zu sehen ob das ergebnis immer unter allen bedingungen das gleiche richtige ergebnis ausgibt wie in der ini vorgegeben ist.

    der name der in &arr_namen[0] steht UND der monat der in &arr_monat[0] steht muss immer als erstes in der loesungsarray $result[0] stehen. das verhältnis zueinander ist bei deiner loesung zwar gewaerhleistet, aber die reihenfolge ist ganz entscheidend wichtig bei dem projekt. also es geht wirklich um die beziehung zwischen der exakten position und den darin enthaltenen daten und der suche nach der einzig richtigen loesungsantwort in der ini datei und die einzige richtige loesung von dort dann an diese stelle auszugeben.

    die zwoelf namen sind in einer bestimmten reihenfolge also zum beispiel:

    deswegen auch die suche nach einem genauen durchsuchen der 3 arrays und dann aus dem ini-array die einzige richtige loesung zu erfassen und exakt an der stelle wieder auszugeben wo sie urspruenglich abgefragt wurde. also position 1 muss unbedingt auf position 1 bleiben und nicht etwa auf position 5.

    das mit der falschen positon hatte ich bei meiner manuellen versuchen naemlich auch gehabt, aber ich wollte erst einmal das ich ueberhaupt daten habe um dann solange daran rumzuschrauben bis die daten auch wirklich an der stelle stehen von wo sie abgefragt worden. die beziehungen der daten und postionen sind also das aller wichtigste fuer mich.

    ---

    wie gesagt, es heisst nicht, dass die map loesung 'schlecht' ist, aber fuer _dieses_ projekt glaube ich nicht die richtige moeglichkeit?

    ich brauche als loesung quasi ein array welches in den in einen string umwandeln und ausgeben kann und der muss zu den eingegebenen positionen stimmen.

    bei der map loesung kann zwar die genaue beziehung abgefragt werden aber (glaube ich) ggf. nicht an exakt der gleichen stelle wieder ausgegeben werden. ich kann bei der map loesung wirklich einzelne daten gezielt abfragen und immer die richtige loesung erhalten, welches sogar total nuetzlich ist um das script auf die richtigkeit zu ueberpruefen, aber eine verbindung zu der genauen position sehe ich damit nicht wirklich umsetzbar. (ich mag mich irren, weil anfaenger, aber ich denke hier geht es 'nur' um die richtige loesung in bezug auf raum und nicht in bezug auf position und raum.

    etwas verstaendlicher?

    gruss


    PS: trotz allem bin ich auch dankbar fuer diesen loesungsansatz, da er mir wieder ganz neue moeglichkeiten offenbart, die ich an anderer stelle prima nutzen kann. deswegen trotzdem vielen dank. ich hatte vorher noch keinerlei tutorial zu maps gesehen oder gesucht, also ist das ein thema was mir jetzt nicht wirklich bekannt war. danke dafuer.

    ConsoleWrite("=====================>>> "&"About Me:"&" <<<=====================" & @CRLF)
    ConsoleWrite("Someday I will know how to do it but that day is not today!" & @CRLF)
    ConsoleWrite("===================>>> "&"bankesbusters"&" <<<===================" & @CRLF)

  • Doch, die Map ist immernoch die beste Möglichkeit, um den Raum von einer Namen/Monats kombination zu ermitteln.
    Wie du die Namen/Monate speicherst und in welcher Reihenfolge kannst du dir frei aussuchen.

    Wenn du diese Funktion in mein Script von vorher einfügst sollte es das sein, was du willst (wenn ich es jetzt richtig verstanden hab)

  • hi Kanashius

    sorry wegen der spaeten antwort, ich musste erst testen, testen, testen und noch mehr testen ob es auch wirklich geht: ja, es klappt und es ist absolut genial! (millionen fachen dank.)

    also ich habe das jetzt mal etwas 'modifiziert' um es so auszugeben wie ich es brauche, aber habe noch kleine fragen.

    ergebnis nach mehreren manuellen versuchen der kontrolle (hier nur ein einziges beispiel ... mindestens 20 mal durchgetestet):

    die (leichten) modifizierungen die ich gemacht habe. in erster linie habe ich nur zwei zeilen 'geloescht' (auskommentiert) und vom ergebnis 2 spalten geloescht:

    wahrscheinlich geht es noch ein wenig vereinfachter durch eine loeschung von den spalten in einem rutsch, aber das ergebnis stimmt und ist PERFEKT. ich werde jetzt daran noch testen, denn es gibt einige dinge die ich da noch ueberpruefen moechte um es auf herz und nieren zu testen, aber ich bin so unglaublich zufrieden, dass du dir das nicht vorstellen kannst, was das fuer mich bedeutet, danke danke danke!

    dinge die auf meiner AutoIT-Liste sind, die noch zu erledigen sind:

    Spoiler anzeigen

    1) ini mit bedingungen einlesen. bsp: in ini steht eine zahl z.b. "327" und wenn diese eingelesen wird, dann soll zu jeder zahl in einer reihe die zahl "17" hinzugefuegt oder abgezogen werden und eventuelle weitere moeglichkeiten hierzu (jede reihe unterschiedliche werte hinzufuegen oder abziehen) ... ich glaube das kriege ich aber selber hin. zumindest werde ich es erstmal versuchen.

    2) ein ini in eine map einlesen (gerade dabei das zu lernen bedingt durch das script von kanahius) und dann ein array in die selbe map einzulesen und dann das besagte array an vorgegebene stellen neu zusammensetzen (bsp. position[0][0] ist spaeter position [12][2] und position [1][0] ist spaeter position[3][5], etc.) und das ganze wieder rueckgaenig machen. das wird mit dieser map geschichte bestimmt gehen. mal sehen ich glaube ich muss mich wohl mehr mit map(s) beschaeftigen.


    ich habe allerdings noch einige fragen:

    du (und auch viele andere), ja teilweise sogar in den AutoIT hilfe-seiten und den darin enthaltenen beispielen arbeiten unglaublich oft und viel mit 'Func'. ich sehe den vorteil nicht wirklich davon, weil es macht alles nur (meiner meinung nach) unuebersichtlicher. ... du hast dann irgendwo im script "Func _example()" und musst dann erst suchen im script wo die func abgelegt ist (meist ganz unten) und wenn man auf func verzichtet, sieht man den kompletten notwendigen code an der stelle wo er abgearbeitet wird bzw. werden soll. ich sehe den vorteil nicht in der nutzung von funktionen. also wo ist der vorteil?

    jetzt schreibe bitte nicht so etwas wie: "du kannst funktionen mehrmals nutzen an verschiedenen stellen" ... jetzt mal ehrlich, wie oft brauchst du ein und die selbe funktion in einem einzigen script? ich habe eine funktion noch nie ein zweites mal verwendet, oder wenn ich sie ein zweites mal verwendet werden musste, dann musste in der funktion irgend eine kleinigkeit geaendert werden, welches die nutzung der selben funktion ebenfalls unmoeglich machte. gebe mir doch mal bitte ein beispiel wo exakt die gleiche funktion sinnvoll mehrmals genutzt wird in einem script unabhaengig vom user oder usereingaben. geht doch gar nicht, oder doch?

    jedenfalls meine (test)scripte arbeiten alle nach einem schema: wenn dies, dann das und dann jenes und danach etwas anderes. sprich nur wenn prozess 'a' ausgefuehrt wird kann prozess 'b' beginnen usw.

    aber zu diesem topic meiner frage nach dem vergleich von 2D-array und 1D-array(s) und der ausgabe eines 1D-array als loesung ist jedenfalls 'erledigt'

    wie gesagt, vielen dank an Kanashius

    ---

    abseits dessen wuensche ich allen lesern ein frohes osterfest. heute ist kar-freitag ... meine bessere haelfte und dutzende von anderen bekannten sagen immer: 'heute (kar-freitag) ist fisch-tag' na dann guten appetit.

    gruss

    bankesbusters

    ConsoleWrite("=====================>>> "&"About Me:"&" <<<=====================" & @CRLF)
    ConsoleWrite("Someday I will know how to do it but that day is not today!" & @CRLF)
    ConsoleWrite("===================>>> "&"bankesbusters"&" <<<===================" & @CRLF)

  • ich habe allerdings noch einige fragen:

    du (und auch viele andere), ja teilweise sogar in den AutoIT hilfe-seiten und den darin enthaltenen beispielen arbeiten unglaublich oft und viel mit 'Func'. ich sehe den vorteil nicht wirklich davon, weil es macht alles nur (meiner meinung nach) unuebersichtlicher. ... du hast dann irgendwo im script "Func _example()" und musst dann erst suchen im script wo die func abgelegt ist (meist ganz unten) und wenn man auf func verzichtet, sieht man den kompletten notwendigen code an der stelle wo er abgearbeitet wird bzw. werden soll. ich sehe den vorteil nicht in der nutzung von funktionen. also wo ist der vorteil?

    jetzt schreibe bitte nicht so etwas wie: "du kannst funktionen mehrmals nutzen an verschiedenen stellen" ... jetzt mal ehrlich, wie oft brauchst du ein und die selbe funktion in einem einzigen script? ich habe eine funktion noch nie ein zweites mal verwendet, oder wenn ich sie ein zweites mal verwendet werden musste, dann musste in der funktion irgend eine kleinigkeit geaendert werden, welches die nutzung der selben funktion ebenfalls unmoeglich machte. gebe mir doch mal bitte ein beispiel wo exakt die gleiche funktion sinnvoll mehrmals genutzt wird in einem script unabhaengig vom user oder usereingaben. geht doch gar nicht, oder doch?

    jedenfalls meine (test)scripte arbeiten alle nach einem schema: wenn dies, dann das und dann jenes und danach etwas anderes. sprich nur wenn prozess 'a' ausgefuehrt wird kann prozess 'b' beginnen usw.

    Naja... es reicht ein Blick in dein Script, warum Funktionen Sinn machen:
    Was ist denn _ArrayDisplay, _ArrayShuffle, ... Genau: Funktionen, die du mehrfach nutzt... wär jetzt doof, wenn du jedesmal den Code von _ArrayShuffle stattdessen dort hinschreiben würdest, oder?

    Spoiler anzeigen

    Der sieht nämlich so aus:

    Ein weiterer wichtiger Punkt ist nicht nur die Wiederverwendbarkeit (was in meinem Script auch schon mehrfach auftaucht: _readIniToMap wird 2x genutzt, _getRoom 3x,... ) sondern auch die Struktur.
    Je größer ein Programm wird, desto unübersichtlicher wird es. Deshalb gibt es auch so als Richtwert: Wenn ein Codeabschnitt (auch in einer Funktion) mehr als so ca. 30 Zeilen hat sollte er in eine eigene Funktion (gibt natürlich ausnahmen, aber in die Richtung geht es).
    Die Aufgabe wird dadurch in mehrere Abschnitte unterteilt, was das ganze übersichtlicher macht.
    Wenn jemand sich neuen Code von jemand anders anschaut um den zu Verstehen ist es halt übersichtlicher zu sehen:

    Code
    Func _processData()
    	Local $arData = _readData()
    	$arData = _removeDuplicates($arData)
    	$arData = _multiplyDataValues($arData)
    	_saveData($arData)
    EndFunc

    Wo ich abstrahiert erfahre, was gemacht wird. Einlesen->Duplikate entfernen->Daten multiplizieren (als Beispiel für z.B. Zahlen)->Ergebnis speichern.
    Insbesondere, wenn ich später mal was verändern will, weiß ich direkt, in welchen Abschnitt ich gehen muss um ihn mir anzuschauen.
    Ich habe nicht direkt 200 Zeilen Code und muss rausfinden, wo jetzt was passiert, sondern kann direkt zu dem Abschnitt/der Funktion gehen, die ich verändern muss.

    Dazu kommt, dass Funktionen normalerweise auch genutzt werden um bestimmte Aufgaben zu erledigen.
    Am besten ist es dabei, wenn die Funktion alles, was sie braucht als Parameter bekommt und auf keine Globalen Variablen oder ähnliches zugreifen muss.
    Ich kann dann eine Funktion schreiben, die z.B. zwei Matritzen multipliziert und übergebe dort die beiden Matrizen als Parameter.
    Ich habe dann ein geschlossenes System, das genau eine Aufgabe hat: Die beiden Matritzen-Parameter zu multiplizieren und kann genau schauen, wie das passiert und ggf. Fehler korrigieren, ohne das ich das gesamte Script kennen muss, weil ich keine Ahnung hab, wo die Variable denn jetzt herkommt, die 100 Zeilen zuvor erstellt wurde, 10x zwischendurch verändert wird und dann am Ende bei meiner Multiplikation landet.

    Und wenn man immer mit diesem Stil programmiert macht man das natürlich auch in kleinen 50 Zeilen programmen, auch wenn es da nicht unbedingt notwendig wäre.
    Man weiß ja auch nie, ob das Script vielleicht wächst und immer größer erweitert wird und dann steht man am Ende mit 1000 Zeilen durcheinander da ;)

    Ein weiterer Punkt: Es trennt die verschiedenen Variablen voneinandern.
    Variablen sind immer in einem Bereich gülitig. Schreibst du sie einfach in die Datei, gilt sie überall, du kannst also dort z.B. $arData definieren und überall darauf zugreifen.
    Wenn man aber nicht aufpasst kann in größeren Scripten schnell vergessen, dass man den Variable Namen schonmal genutzt hat.
    Dann überschreibt man ausversehen diese Variable und hat dort was komplett anderes drin stehen, als man denkt, was zu Fehlern führen kann, die versteckt sind und deshalb sehr lange brauchen, bis man das Problem findet.
    Nutzt man Funktionen und Lokale Variablen, sind die nur in der Funktion gültig und die Wahrscheinlichkeit für irgendwelche Namens-Konflikte ist erheblich geringer.

  • jetzt schreibe bitte nicht so etwas wie: "du kannst funktionen mehrmals nutzen an verschiedenen stellen"

    aber genau das wird seine Antwort sein. ;)

    Wenn du dir Funktionen ansiehst und dass diese auch Parameter übergeben bekommen können, dann kann man damit schon ganz schön viel anstellen.

    PS: fast alle komplexeren Befehle die User geschrieben haben, sind Funktionen
    Wenn du mal bei 1000+ Zeilen Code angekommen bist, wirst du diese sehr zu schätzen lernen...

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • ah, ok ... ergibt sinn. also muss ich mich auch damit wohl beschaeftigen. auf liste hinzugefuegt. danke fuer den tip.

    ConsoleWrite("=====================>>> "&"About Me:"&" <<<=====================" & @CRLF)
    ConsoleWrite("Someday I will know how to do it but that day is not today!" & @CRLF)
    ConsoleWrite("===================>>> "&"bankesbusters"&" <<<===================" & @CRLF)