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)

  • hallo nochmals,

    also das thema ist doch noch nicht abgeschlossen, denn mir kamen bei meinen ganzen tests noch weitere problematiken auf. die map funktionert bei mir zumindest nur in eine richtung und nicht in jede richtung. sprich ich kann die korrekte zuweisung erreichen, wenn ich mich an die reihenfolge der daten halte. aendere ich die datenreihenfolge (der eingabe), so kann es gar dazu kommen, dass kein output erzeugt wird. (aber das ist bestimmt loesbar und ist nur eine frage der ergbniszuweisung)

    ---

    viel schlimmer ist das zweite problem: manche datensaetze sind 'fast' identisch. ich fuege die entsprechende ini-datei hier (weiter unten) als code bei. es gibt 81 eintraege und bei der erzeugung der datensatzkombinationen (hier jetzt mal farben) klappt alles genau wie es soll. aber: habe ich nur farben und EINEN datensatz bekomme ich den zweiten datensatz nicht mehr heraus, welches denke ich an doppelten (auch so gewollten) eintraegen liegt. sprich:

    Code
    rot + C = G (key81) ; rot  + C = F (key54) ;  rot + C = C (key09)

    das ist eigentlich ein problem, welches ich mittels einer idee beseitigen moechte:

    da es ja zu allen moeglichkeiten immer drei (oder im seltensten fall auch mehr) moegliche loesungen gibt, moechte ich alle drei ausgeben (alle exakt in der eingegebenen reihenfolge, aber quasi als drei verschiedene arrays die jeweils eine der drei loesungen darstellen)

    legt man diese nun untereinander ergibt sich nach sichtkontrolle die richtige loesung auf anhieb. mal ist ein richtiges element in loesungsarray1 dann in loesungsarray2 oder in loesungsarray3 aber da die einzelnen loesungen alle exakt an der selben position liegen, kann man sehen was offensichtlich richtig oder falsch ist, bsp.:

    Code
    [ loesungsarray1 ]
    [ Pos 1 ] [ Pos 2 ] [ Pos 3 ] [ Pos 4 ] [ Pos 5 ]
      H (r)     B (f)     C (f)     L (r)     E (f)
    [ loesungsarray2 ]
    [ Pos 1 ] [ Pos 2 ] [ Pos 3 ] [ Pos 4 ] [ Pos 5 ]
      A (f)     A (r)     C (f)     D (f)     O (r)
    [ loesungsarray3 ]
    [ Pos 1 ] [ Pos 2 ] [ Pos 3 ] [ Pos 4 ] [ Pos 5 ]
      A (f)     B (f)     L (t)     C (f)     D (f)
    (r) = richtig // (f) = falsch

    es ist zwar sogesehen aufwendig jetzt zu erkennen was aus welchem array richtig oder falsch ist, da die in klammern stehenden richtig oder falsch angaben ja nicht wirklich vorhanden sind und dargestellt werden, aber schaue ich mir das lange genug an, komme ich wohl drauf, dass da das wort "HALLO" in der richtigen reihenfolge steht und zu finden ist. alle anderen variationen ergeben absolut keinen sinn. (spinnt man das nun erheblich viel weiter, dann koennte man mittels einer "K.I." ermitteln lassen ob irgendwelche kombinationen einen sinn ergeben zum beispiel worte ergeben, und nur diese ausgeben)


    na ja, wer zeit und lust hat kann sich das problem ja mal angucken, ich habe es mal entsprechend kommentiert:


    zuerst die ini datei (81cube.ini):

    jetzt der nur ganz leicht modifizierte code von Kanashius :

    ---

    es ergeben sich noch folgende fragen bezueglich der ini-datei fuer mein projekt:

    1. hier bei dem beispiel macht es zum beispiel einen unterschied was bei a+b rauskommt, und was bei b+a rauskommt, aber wie viele datensaetze kann ich in die ini einbauen? gibt es da physische danten-mengen-grenzen? - nach meiner berechnung muessten das dann hinterher 810000 eintraege in der ini-datei sein. (30x30x30x30)

    mein erster gedanke war damals anstelle von einer ini, alles in eine tabelle (array) zu legen in der alle zusammenhaenge zu sehen sind um daten nachzuschlagen, aber irgendwer sagte mal, dass es linear einfacher waere. jetzt stehe ich an der stelle wo ich wirklich ueberlegen muss ob es sinnvoll ist unter umstaenden 810000 zeilen in eine ini zu packen oder ob eine map mit der kompletten 'loesung' zu erzeugen von einer ini-datei die ggf. nicht mehr als 30 zeilen hat oder gar auf die ini zu verzichten und die 30 zeilen direkt als array bzw. map zu erstellen?

    für meine 81 eintrage habe ich eine kleine excel tabelle erstellt welche als array schneller erstellt waere als die ini zu schreiben:

    Code
    Local $testarray[5][5] = [ ["","A","B","C",""], _
    ["A","rot","gruen","gelb","D"], _
    ["B","gelb","rot","gruen","E"], _
    ["C","gruen","gelb","rot","F"], _
    ["","I","H","G",""] ]
    _ArrayDisplay($testarray)
    
    ; dauer zum schreiben des arrays GLEICH: unter 5 minuten ... ini-datei mit 81 keys GLEICH: eine gute stunde

    wenn ich das in eine map schreibe dann koennte ich mir wirklich die 81 zeilen sparen, denn dann muss ich nur noch rahmenbedinguen erstellen wo und wie nachgeschlagen werden muss? mir ist gesagt worden, dass es linear einfacher waere, denn die nachschlagebedingungen muessen ja irgendwie festgelegt werden und daran wuerde das scheitern?

    ich vermute, dass eine map meine gewunschte loesung ist, aber dann mussen exakte rahmenbedinungen der nachschlagung der daten festgelegt werden, welches wahrscheinlich sehr komplex waere? - aber letztlich wuerde ich den code von 810000 zeilen auf 30 zeilen reduzieren, denn ich muesste nur die zwei eingabefelder von den usern mit der map abgleichen und dann die entsprechende loesung nachschlagen. wobei es auch hier mindestens 3 gleiche loesungen gibt, die alle irgendwie aus ausgabe aufzulisten sind.

    ich hoffe das ergibt alles ein wenig sinn?

    hier geht es um zwei dinge: beratung (was ist sinnvoll) und hilfe bei der festlegung der nachschlagebedingungen sowie dem bau der map

    gruss

    bankesbusters

    ps: es ist verdammt schwer das alles in verneunftige verstaendliche worte zu packen, denn ich habe hier excel tabellen wo ich sehe was ich machen moechte, aber die seht der leser nicht und folglich kann man sich das nicht wirklich vorstellen was ich machen moechte. wobei der map ansatz bislang das vielversprechenste ist, glaube ich.

    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 bankesbusters (3. Mai 2025 um 12:48) aus folgendem Grund: leichte korrekturen im beschreibungstext: vorher (30x30x3030) ... jetzt (30x30x30x30)

  • mal am Rande die Frage, was möchtest du eigentlich erreichen?
    Ich habe bisher verstanden, dass es Usereingaben und Vorgaben gibt, dass ganze mit Farben und Buchstaben zu tun hat.

    Mehr verstehe ich bisher nicht.
    Vielleicht magst du mir in max. 3 Sätzen ( ;) ) erklären, was du eigentlich programmieren möchtest.

    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.

  • hi,

    vorab:

    ich habe mit dieser frage von dir Schnuffel leider keine guten erfahrungen gemacht, denn danach hatte man leider kein interesse mehr mir zu helfen. ... deswegen versuche ich auch kleine probleme als fragen zu stellen um mir dann selbst mit teilstuecken weiterhelfen zu koennen. leider zeigt meine erfahrung, dass wenn man erst einmal weiss wie aufwendig etwas sein wird, dann hat man keine lust sich damit auseinanderzusetzen. (wobei dein hackathon war schon eine tolle sache und die beteiligung war auch beeindruckend!)

    eigentliche antwort:

    ich weiss jetzt nicht genau das relevant ist, aber es gibt mehrere dinge an den ich 'arbeite' die ALLE auf diesem schema bzw. diesem 'nachschlagewerk/system' beruhen:

    1. z.B.: ein weichenstellungs-nachschlage-script fuer xxl-modellzugbahn. also mir ist bekannt wo weiche ist und mir ist bekannt wo das signal dafuer ist, nun muss ich aber wissen welche spur betroffen ist, wenn ich die weiche oder das signal umstelle. (mir ist bekannt, dass es extra software fuer so etwas gibt, aber lass mal jemand an so etwas ran, der keine ahnung hat, dann ist nicht gut. ... also ein script um basics zu lernen ohne etwas kaputt zu machen)

    2. z.B.: ein spiel welches ein wenig zwischen dame, schach, ludo, halma und stratego liegt bei dem zwei oder vier spieler den zug von einem spieler teilbestimmen. also spieler 1 zieht die x-achse und spieler 2 zieht die y-achse und dort muss die spielfigur von spieler 1 hinbewegt/abgestellt werden. (das spiel gibt es nicht zu kaufen noch gibt es das generell irgendwo, es ist von mir und ich moechte das konzept von papier zum testen als script umsetzen)

    3. z.B.: ein ampelstellungs-nachschlage-script. was fuer einen einfluss hat es wenn ampel a-auf rot geht und ampel-b auf grün, wo wird dann eine andere ampel auf gelb

    4. z.B.: ein 'word-jumble' automatisions script. siehe meine fragen zu dem thema 12x12-magic-square-grid-system ... also zwecks erstellung von raetseln von einfacher bis komplexer natur mithilfe von auto-it und einem entsprechendes script.

    5. z.B.: ggf. kleine rätsel die man für einen 'escape-room' verwenden koennte also wie einen 'ceasar-cypher'. siehe umwandlung von einzelnen buchstaben in einem string.

    6. z.B.: ein kleines register zum nachschlagen von telefonnummern, adressen/e-mails und personen auf meinem rechner. besser und schneller als excel tabellen immer neu nach kreterien zu sortieren.

    7. z.B.: einfach nur der schlichte spass an der freude auto-it besser zu lernen durch praktische beispiele. hier denkt man sich dann ein problem aus und versucht es mit auto-it zu meistern. klingt bloed, aber am ende kann es ggf. irgendwann mal zu etwas nutze sein.

    ich glaube ich koennte noch viele dinge aufzaehlen, die ich auf papier (mit excel) super toll machen kann, aber der zeitaufwand emens ist und jedes individuell erstellt werden muss, waehrend ich zum beispiel mit auto-it eine möglichkeit haette einfach nur parameter zu aendern um bereits ein ganz neues ergebnis zu haben.

    ---

    fest steht, dass zu 99% meiner vorhaben es zwei bedingungen gibt um eine dritte bedingung zu ermitteln, anhand von vordefinierten suchkreterien. wichtig ist mir nur, dass es bidirektional ist. das heisst, ich muss immer davon ausgehen, dass ich nur zwei bedingungen habe um die dritte zu ermitteln dabei ist es ganz gleich welche der zwei bedingungen ich habe. deswegen habe ich immer eine komplettloesung erstellt als 'nachschlagewerk' oder 'nachschlageregister'. ich möchte also quasi immer zwei einzelne userdatensaetze haben um diese mit dem register zu vergleichen um eine entsprechende loesung zu 'ermitteln' oder 'auszugeben'

    ---

    eigentlich ganz simple.

    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)

  • hmm, ich würde dir vorschlagen dich zumindest hier eines konkreten Themas anzunehmen und ausschließlich das hier zu besprechen und Lösungen für dabei auftretende Probleme zu finden.

    Wenn du daraus einen Synergie-Effekt erzielst und deine Lernkurve dir in weiteren Themen Hilfestellung leistet, dann gut. Ansonsten wenn das erste Thema fertig ist, dann das nächste. Deine Fragen werden von alleine weniger wenn das Verständnis wächst.

    Du brauchst vermutlich erstmal einen Ansatz, wie man deine Problemstellungen überhaupt digitalisiert um diese auswerten und verarbeiten zu können.

    Welches Frontend schlussendlich davor steht, ob du Farben, Wörter und sonstwas arrangieren und damit "spielen" willst ist nur Nebensache.

    Daher:

    Stelle 1 Projekt von dir ein, stelle deine bisherigen Bemühungen anhand deines Scriptes hier ein und stelle deine Frage.

    Die meisten aktiven Mitglieder sind Lösungsfinder und haben Spaß daran solche Aufgaben zu meistern.

    PS: in der Kürze liegt die Würze. Worauf ich keinen Bock habe ist, mir erstmal ein 2-seitiges Gedankenkonstrukt durchzulesen, um dann festzustellen dass die eigentliche Frage gar nicht behandelt wird. Deshalb mach es kurz und knapp. Das hilft auch, Dinge zu optimieren und komprimieren in Ihrer Betrachtung.

    PS PS: Wir fragen deshalb nach dem Sinn deines Scriptes, da wir White-hats sind und niemandem helfen wollen Scripte zu schreiben, die andere Ärgern oder um sich selbst zu bereichern mit z.B. Bots.

    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.


  • Hier mal, wie ich die Fragestellungen angehen würde:
    Zu 1.:
    - Liste mit allen Strecken anlegen (mit IDs e.g. StreckenID (nummer zur identifizierung für PC) und Namen (identifizierung für Menschen; muss nicht eindeutig sein))
    - Liste mit Weichen/"Kreuzungen" erstellen (mit eigener WeichenID) und einer Liste mit StreckenIDs, wo man von dort hin kann, keine Ahnung, ob Weichen auch namen brauchen
    - ggf. die Liste mit StreckenIDs in eingehende/ausgehende Strecken unterteilen. Weiche X (WeichenID 1) geht z.b. von Strecke A (StreckenID 1) nach Strecke B (StreckenID 2) oder C (StreckenID 3)
    - Man könnte das ganze dann sogar erweitern mit einer Liste an koordinaten für jede Strecke (Als Pfad, der die Strecke definiert) und das ganze visuell als Grafik abbilden
    - _GDIPlus_GraphicsDrawClosedCurve

    - Die Daten würde ich nicht als INI, sondern als JSON anlegen:
    - https://github.com/Sylvan86/autoit-json-udf dort die JSON.au3 herunterladen
    Das würde dann so aussehen:


    Wenn du das mit _JSON_Parse einliest, bekommst du direkt eine Map mit allen Daten.
    Ich würde auch darüber nachdenken, das mit SQL (SQLite) zu lösen und in einer Datenbank abzulegen, das würde aber eine Menge der Logik nach SQL verlegen, was vllt. schwerer für dich wäre.

    Zu 2.:
    - da müsste ich mehr wissen um aktiv zu helfen, bzw. Beispiele zu geben

    Zu 3.:
    - Schau dir mal Endliche Automaten (Finite-state machines) an. Da werden States definiert, und von einem State geht man unter bestimmten bedingungen in einen anderen State über.
    Bei jedem State würde man dann für alle Ampeln den aktuellen status (Ampel Farbe) festlegen

    Zu 4/5.:
    - Ok, da hast du ja schon was :)

    Zu 6.:
    - Da würde ich wirklich in Richtung Datenbank mit SQLite schauen, die sind genau für sowas ausgelegt und ein paar einfache Abfragen sollten zu machen sein.

    Zu 7.: Spaß ist die Hauptsache :)

  • Hallo!

    Zu 6: Kommt auf den Umfang an: möchtest Du ein paar 100 Einträge machen, z.B.: für dich persönlich, das Du bei Bedarf abfragst (GUI oder Konsole) reicht ein INI-File oder ein einfaches Array das mit einen String befüllt wird.
    Möchtest Du das doch größer haben (Büro) dann wird eine Datenbank wahrscheinlicher besser sein.

    Idee für die Array/String-Variante:

    Jedes Element vom Array behinhaltet alle Daten nur mit einem Trennzeichen unterteilt:
    "Vorname|Nachname|Telefonnummer|Postleitzahl|Strasse|Hausnummer|....."

    Um den einzelnen Token (Teil des Strings) anzusprechen verwendet man Stringsplit das aber selbst wiederum ein Array zurückgibt das ich persönlich nicht immer so toll finde, daher habe ich mir einen kleine Funktion geschrieben die nur einen String zurückliefert:

    ;**********************************************
    ; Tokentrenner ohne Array !!
    ; Übergabe: Der String der untesucht wird
    ; Übergabe: Der String der den ersten String teilt
    ; Übergabe: Das wievielte Teil
    ; Ausgabe: Den gesuchten Token oder eine Leerstring (=Fehler)
    ;**********************************************
    func _gettok ($string, $teiler, $teilnummer)

    local $neu , $tmp

    $tmp = stringsplit ($string, $teiler, 1)
    if $tmp[0] >= $teilnummer then
    $neu = $tmp[$teilnummer]
    else
    $neu = ""
    endif
    return $neu
    endfunc
    ;**********************************************

    Du musst Dir verschiedene Funktionen überlegen für Dateneinlesen, Datenschreiben, Suche usw. Wenn Du das immer in kleine Funktionen unterteilst und immer brav lokale Variablen benutzt wirst Du sehr schnell einen Erfolg haben und bei der Entwicklung auch Fehler sehr schnell finden, denn Du musst Dich nur mir einen kleinen Teil des Codes beschäftigen - glaub mir, wenn Du einen 5000 Zeile lange Wurst hast und dann einen kleinen logischen Fehler suchen musst ist das einfach nur Furchtbar (meine Erfahrung).

    lg

    Racer