1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • IOCTL - Prozessortemperatur Raspberry PI 4 - Windows 11 ARM

    • Andy
    • 12. Februar 2022 um 09:23
    Zitat von Homer J. S.

    Hier mein "quick and dirty"-Code für die Temperatur auszulesen

    Naja...dann ist es doch ab hier nur eine Fleißaufgabe, die anderen Parameter auszulesen und in eine schicke GUI zu überführen :P

    Sehr nice gemacht....ich habe auch viel gelernt! Der Dank geht zurück^^

  • IOCTL - Prozessortemperatur Raspberry PI 4 - Windows 11 ARM

    • Andy
    • 11. Februar 2022 um 17:13

    Cool!

    Hast du Win10 auf einer SSD installiert? Ich wollte einen meiner Rechner mit einer SSD upgraden und hätte dann eine übrig.

    Das wäre für Win10 jedenfalls nötig denke ich.

    Hast du da ein spezielles Image verwendet?

    Wobei ich schon kurz nach dem Kauf des 400 DARAN gedacht hatte :klatschen:

  • Mehrfachbedingung vernünftig gestalten

    • Andy
    • 11. Februar 2022 um 10:15
    Zitat von Lambdax

    wird autoit sowas wie ein Bool False in String "False" umwandeln was buggs hervorrufen könnte.

    "Bugs" sind das nicht! Jedenfalls nicht, solange der "Programmierer" weiß, was er da tut. Ein Bug ist ein Fehler in einem Programm wo der Programmierer eben genau an dieser Stelle NICHT gewußt hat, was er da tut oder "davon ausgegangen ist" das das richtig war was er getan hat.

    Wenn der Inhalt der Variablen und deren Typ klar sind, und auch nachvollzogen werden können, dann ist es schwer, "Bugs" zu erzeugen.

    Daher gibt es in AutoIt/Scite in den Tools ja auch die Menge an Debugging-Funktionen, die imho viel zu wenig genutzt werden...

  • IOCTL - Prozessortemperatur Raspberry PI 4 - Windows 11 ARM

    • Andy
    • 11. Februar 2022 um 09:46
    Zitat von Homer J. S.

    Jetzt kommt die "mailbox"-Geschichte, woran ich bisher scheitere.

    Code
    //
    // Tag Request
    //
    #define TAG_REQUEST         0x00000000
    
    
    
    //
    // Mailbox Property Interface
    //
    
    // Standard mailbox header for all property interface
    typedef struct _MAILBOX_HEADER {
        ULONG TotalBuffer;
        ULONG RequestResponse;
        ULONG TagID;
        ULONG ResponseLength;
        ULONG Request;
    } MAILBOX_HEADER, *PMAILBOX_HEADER;
    
    
    
    
    #define TAG_ID_GET_TEMPERATURE 0x00030006
    typedef struct _MAILBOX_GET_TEMPERATURE
    {
        MAILBOX_HEADER Header;
        ULONG TemperatureId;
        ULONG Value;
        ULONG EndTag;
    } MAILBOX_GET_TEMPERATURE;
    
    __inline VOID INIT_MAILBOX_GET_TEMPERATURE(
        _Out_ MAILBOX_GET_TEMPERATURE* PropertyMsgPtr)
    {
        PropertyMsgPtr->Header.TotalBuffer = sizeof(MAILBOX_GET_TEMPERATURE);
        PropertyMsgPtr->Header.RequestResponse = TAG_REQUEST;
        PropertyMsgPtr->Header.TagID = TAG_ID_GET_TEMPERATURE;
        PropertyMsgPtr->Header.ResponseLength = 8;
        PropertyMsgPtr->Header.Request = TAG_REQUEST;
        PropertyMsgPtr->TemperatureId = 0;
        PropertyMsgPtr->Value = 0;
        PropertyMsgPtr->EndTag = 0;
    }
    Alles anzeigen

    Die Struct muss erstellt werden, in deren Inhalt sich nach dem Aufruf imho die Werte befinden. Also die typedef struct _MAILBOX_HEADER in der Struct _MAILBOX_GET_TEMPERATURE

    MAILBOX_GET_TEMPERATURE mailbox;

    INIT_MAILBOX_GET_TEMPERATURE(&mailbox);

    definiert die Struct in der Struct s.o.

    Ich gehe davon aus, dass wenn die Struct MAILBOX_GET_TEMPERATURE "ordentlich gefüllt ist, der Aufruf

    ;DeviceIoControl(hDevice, IOCTL_MAILBOX_PROPERTY, (LPVOID)(&mailbox), sizeof(mailbox), (LPVOID)(&mailbox), sizeof(mailbox), &bytesReturned, 0);

    nur noch mit den Pointern auf diese Struct ausgeführt werden muss

  • Mehrfachbedingung vernünftig gestalten

    • Andy
    • 11. Februar 2022 um 09:14
    Zitat von AspirinJunkie

    Es hängt also enorm vom konkreten Anwendungsfall ab

    Eben! Und damit plädiere ich wieder mal für die verschachtelte IF-Konstruktion. DIE ist nämlich in jedem Schritt debuggbar, was man von if Not ($sA & $sB & $sC & $sD) Then mal nicht behaupten kann.

    Ich postuliere auch mal, dass geschätzt 50% aller Forenfragen, die sich auf die Logik im Code beziehen, die "funktioniert nicht"-Anfrage aufgrund fehlendem Debugging bzw. Ahnungslosigkeit des Users was sich in seinen Variablen befindet, beziehen. Unabhängig von der Programmiersprache....

    AutoIt´s Segen bezüglich der Datentypen ist gleichzeitig sein Fluch.

    Zitat von Mars

    Wo das funktioniert: Wenn du ganz genau weißt welche Typen verwendet werden, und du tatsächlich "leere Strings" als "False" oder als "0" verwenden willst.
    Wo das nicht funktioniert: Überall sonst. Angenommen $sA = 0, dann ist der Ausdruck: If Not ("0") Then. "0" ist aber kein "leerer String" und wird daher nicht als "False" interpretiert.

    wzbw... :thumbup: Wenn man genau weiß was man tut, ist es auch total einfach ^^

  • IOCTL - Prozessortemperatur Raspberry PI 4 - Windows 11 ARM

    • Andy
    • 10. Februar 2022 um 13:15

    Danke für die Infos!

    Wenn man mal bissl sucht, findet man https://www.autoitscript.com/forum/topic/10…lslot/#comments

    Somit sollte das Mailslotgedöns zu schaffen sein^^

  • IOCTL - Prozessortemperatur Raspberry PI 4 - Windows 11 ARM

    • Andy
    • 9. Februar 2022 um 20:26

    Ja, an dem Punkt war ich schon nach deinem Startpost^^

    Ich dachte auch erst daran, die Treiber runterzuladen und aus AutoIt anzusprechen.

    Bis ich dann merkte, dass das Interface auf dem Raspberry nicht von "außerhalb" anzusprechen ist.

    So wie ich das verstehe, wird das Interface zweimal aufgerufen/gecalled.

    Einmal zum Initialisieren der Funktion, bei der zweiten Abfrage werden dann die Rückgabewerte ausgegeben.

    HANDLE hDevice = CreateFileW( RPIQ_USERMODE_PATH, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0 );

    das solltest du hinbekommen, das ist ein ganz simpler API-Aufruf mit entsprechenden Parametern. Die Parameter sind imho. alle im Programm als Konstanten definiert.

    Versuch das mal, ich lese mich derweil mal in das Interface-Gedöns ein. Da ist allerlei wg. Endianess und Alignment gefordert...

  • Mehrfachbedingung vernünftig gestalten

    • Andy
    • 9. Februar 2022 um 20:10
    Zitat von JBO

    Zumal ich später noch mehr Bedingungen dieser Art habe.

    Aus eigener Erfahrung würde ich dir raten, zunächst sämtliche dieser Abfragen in verschachtelten IF-Konstrukten unterzubringen.

    Das ist für das Debugging essenziell! Ich persönlich liebe Flags (entweder 1 oder 0). Deren Kombinationen kann man, wie bereits von AspirinJunkie beschrieben, schön kurz per BitAND bzw BitOr abfragen.

    Btw. wer mit einer Compilersprache arbeitet und zeitkritische Schleifendurchläufe bearbeitet, sollte diese Abfragen so sortieren, dass der wahrscheinlichste Fall zuerst abgefragt wird.

    Branch prediction https://de.wikipedia.org/wiki/Sprungvorhersage

    Speculative execution https://de.wikipedia.org/wiki/Speculative_execution

    In AutoIt würde ich in zeitkritischen Schleifen IMMER die wahrscheinlichste Bedingung zuerst abfragen.

  • IOCTL - Prozessortemperatur Raspberry PI 4 - Windows 11 ARM

    • Andy
    • 9. Februar 2022 um 19:33

    Ah, ok, ich dachte du wolltest von einem Windows10-x86 auf einen Raspi zugreifen...

    Hast du denn mal das vorliegende Programm compiliert und laufen lassen? Funktioniert es denn?

    //EDIT

    Halte mich/uns mit diesem Projekt bitte auf dem Laufenden, ich habe einen Raspi 400 zum rumspielen und experimentieren.

  • IOCTL - Prozessortemperatur Raspberry PI 4 - Windows 11 ARM

    • Andy
    • 9. Februar 2022 um 17:45

    Hi,

    du kannst natürlich versuchen, die gesamte Software zu portieren, für dein Problem

    Zitat von Homer J. S.

    Auslesen der Prozessortemperatur eines Rasberry PI4 mit Windows 11 ARM

    würde ich auf dem Raspi eine alle paar Sekunden eine Datei "Prozessortemperatur.txt" von deinem Temperaturmonitorprogramm erstellen lassen und diese per SSH/SCP von Windows aus abholen.

    Diese Datei kannst du dann per AutoIt öffnen und auslesen.

    ich hatte zwar damit noch nie zu tun, habe das eben aber ausprobiert, geht einwandfrei!

    Beim Raspberry musst du nur SSH per

    sudo raspi-config in den Interface Options einschalten.

    Ich habe in Windows WinSCP installiert, um "einfach" (bspw. per Script) Dateien zwischen Raspi und Windows hin- und herschieben zu können. ggf. ist da sin den neueren Versionen von Windows nicht mehr nötig, Gib einfach mal in einer CMD/Powershell den Befehl SCP ein und schau was dabei rauskommt...

    Im Windows musst du in der Powershell oder CMD (als Administrator geöffnet wg. Zugriffsrechten) per

    scp pi@192.168.2.106:/home/pi/TemperatureTests/mytest.out C:\mytest.out die Datei aus dem Raspiverzeichnis in das entsprechende Windowsverzeichnis kopieren.

    Auf dem Raspi musst du also außer SSH zu aktivieren garnichts machen....außer in einer Endlosschleife die Temperatur und/oder andere Daten aus deinem Sensorprogramm in eine Datei zu schreiben.

  • Code Kata - Happy Numbers

    • Andy
    • 7. Februar 2022 um 11:47

    Hi zusammen....

    so ist das mit den Beweihräucherungen....taugt alles nix^^

    Ich hatte im vorgestellten Script beim "Verschönern" irrtümlich 3 Zeilen gelöscht....was das Script in seiner Lauffähigkeit zwar nicht beeinflusste, aber die Idee dahinter völlig gegen die Wand fuhr!

    Die fehlenden Zeilen waren genau die Schleife, welche die in der Rekursion gefundenen NICHT HAPPY - Zahlen in das Array eintragen.....

    AutoIt
            Else                             ;keine happynumber gefunden
                If $i < $maxarray Then
                    $sieb[$i] = $i           ;dann Zahl als zahl im index ins sieb eintragen
                    For $z = 1 To $maxrecurs ;alle in den rekursionen gefundene zahlen merken
                        $sieb[$temp[$z]] = $temp[$z] ;diese Zahl ist nicht auch nicht happy weil führt in der Folge nicht zu 1
                    Next
                EndIf
            EndIf

    Ich hab das jetzt im Post ergänzt, wenn man das _Arraydisplay() einkommentiert , sieht man den Unterschied zu vorher...shame on me...aber an euch noch mehr weil es keiner gemerkt hat :rofl:

    //EDIT

    Da es sinnvoll ist, erst das Sieb zu füllen und danach erst die Grafik zu erstellen habe ich mich entschlossen, das Script im Post #14 upzugraden.

    Was zur annähernden Verdopplung der Geschwindigkeit geführt hat....

  • Code Kata - Happy Numbers

    • Andy
    • 7. Februar 2022 um 00:57

    Hehe....die "Aufgabe" hat mich an die µ-It hier im Forum erinnert....das ist bestimmt schon 10 Jahre her, oder?!

    So etwas sollte/könnte man wieder mal aufleben lassen.

    BTT:

    Zitat von UEZ

    Die Tatsache der Spiegelung ist definitiv ein Booster bezgl. Performance

    Ja, mich hat gewundert, dass das noch keiner gemacht hatte, ich habe jedenfalls keine Info darüber gefunden. Daten "grafisch" zu analysieren ist ein uralter Hut, "früher" hatte ich bei Analysen von fremden Programmen einfach die gesamte (*-EXE-) Datei in eine Bitmap gemapped (omg, was ein Wortspiel^^) und diese Bitmap per Programm in diversen Pixelbreiten anzeigen lassen. Da hat man dann feine Sachen gefunden, Zeichensätze, eingebundene Bilder uvm.

    Im vorliegenden Fall war ich aber echt überrascht, diese Muster zu finden...naja, wenn man mal bissl nachdenkt, dann ist ja auch klar wo die herkommen. 8)

    Die Idee mit dem "kleinen" Array habe ich mir bei einem eigenen Script, dem erweiterten Primzahlensieb (auch ein µ-It gewesen) abgeschaut, mit LUT geht vieles viel schneller und trotz meines biblischen Alters und fortschreitendem Gehirnschwund fallen mir doch noch so manche Tricks ein :rock:

    Jedenfalls hats Spass gemacht! Danke auch dafür an @SOLVE-SMART!

    Ich habe das zum Anlass genommen, wieder mehr mit AutoIt zu machen, hab noch soooo viele Sachen offen, OpenCL und OpenCV, und nicht zuletzt Assembler, habe letzte Woche Kontakt mit Jungs und Mädels aus Jülich gehabt, das ist da wo die RICHTIG DICKEN KISTEN stehen=O und die werden auch mit auf der letzten Rille optimierten Programmen gefüttert, ggf. werde ich mir da mal den letzten Schliff holen. Die frei verfügbaren Unterlagen dort sichern mir schon die Wochenendlektüre fürs ganze Jahr^^

    Wen es interessiert https://www.fz-juelich.de/SharedDocs/Mel…jurecapt16.html


    Forschungszentrum Jülich - JSC - Presentations in courses and talks - Slides of the Seminar on Modular Supercomputing Architectures (MSA)

    uvm....

  • Code Kata - Happy Numbers

    • Andy
    • 6. Februar 2022 um 15:42

    Hi zusammen,

    zunächst muss ich sagen, dass ich noch nie von diesen "Happy Numbers" gehört hatte^^

    Daher bin ich mal völlig unvoreingenommen an diese ganze Sache herangegangen.

    Wie einige von euch sicherlich wissen, schwärme ich für die "brotlose Kunst" aka Grafikspielereien und oldschool Assemblerprogrammierung, und so war mein Ziel, die Daten der "Happy Numbers" als Bitmap darzustellen.

    OT Das habe ich mir übrigens bei diversen "Hackings" von unbekannten Daten angewöhnt, da findet man die interessantesten Sachen. Wer darüber mehr erfahren will, bitte per PN.

    Diese Bitmap wäre dann nichts weiter als eine LUT (LookUpTabelle), die Frage ob eine Zahl im Wertebereich Happy oder Unhappy ist beschränkt sich dann nur noch auf eine Abfrage des Pixels an dieser Adresse.....

    Also sollte eine Bitmap erstellt werden, in der jede Happy Number ein gesetztes Pixel ist. Fehlte nur noch der Algorithmus^^

    Der "offensichtliche" Weg für mich war, die Zahlen von 1 bis 9 hinzuschreiben und dann die "Folge" nach Vorschrift zu erstellen, die dann hoffentlich zur 1 (Zahl ist Happy) führt.....oder eben nicht (Zahl ist Unhappy).

    Dabei hatte ich festgestellt, dass die "Zwischensummen" (der Quadrate der Ziffern) unweigerlich ebenfalls Happy bzw. Unhappy sind, da sie ja in direkter Folge auf Happy bzw. Unhappy hinauslaufen.

    Man muss also während der Ermittlung der Folge nur die aktuell ermittelte Quadratsumme auf Happy bzw. Unhappy überprüfen, um diese "Folge" frühzeitig abbrechen zu können.

    Bei Beispielsweise der 6 ergeben sich die Quadratsummen 36, 45, 41, 17, 50 ..... !!!BÄM!!!

    50 wird in der Folge zu nichts anderem als 5²+0² aufgelöst. 5 ist aber bereits Unhappy, daraus folgt, dass 6 auch Unhappy sein muss. Desweitern sind 36, 45, 41, 17 auch Unhappy.

    Ist eine Zahl Happy, dann sind definitiv sämtliche Quadratsummen auf dem Weg zur 1 auch Happy!

    Dann kam ich auf die Idee, diese Quadratsummen in ein Array einzutragen (aka Bitmap^^) und entsprechend zu markieren.

    Jede Zahl, die als Happy ermittelt wurde, wird im Array als 1 markiert ($array[happyzahl]=1), jede Unhappy Zahl als ihren Wert ($array[unhappyzahl]=unhappyzahl)

    Ich stellte fest, dass die maximale Größe einer einzelnen Quadratsumme höchstens die Summe aus der Anzahl der Ziffern multipliziert mit dem Quadrat der größten Ziffer, also 9, sein kann.

    Bsp. Eine Zahl hat 14 Ziffern, die größte Ziffer ist 9, das zum Quadrat ist 81, das mal 14 ergibt 1134.

    Man braucht also "nur" beim Test einer 14-stelligen Ziffer ein Array mit 1134 Feldern....

    Innerhalb dieses Arrays müssen nur noch die Indizes mit 1 für Happy und mit Zahl für Unhappy gesetzt werden (s.o) und tadaaa, im Algorithmus wird bei Zahlen von 1135 bis 99999999999999 nur noch EINE EINZIGE QUADRATSUMME (die immer kleiner ist als 1134) gebildet, aus der man dann ermittelt, ob diese Zahl dann Happy oder Unhappy ist!

    Ich hatte dafür eine rekursive Funktion _IsHappy() geschrieben, im Endeffekt bedeutet das, dass spätestens ab der Zahl 1135 die Rekursion im ersten Schritt verlassen wird! Und das IMMER, egal wie groß die Zahl wird, es wird immer nur die Berechnung der ersten Quadratsummenzahl benötigt um per Lookup im Array sofort auf Happy bzw. Unhappy zu kommen....


    Und dann wurde es spannend!!!

    Ich erstellte eine Bitmap von 1000x1000 Pixeln (jaja, ermittelt wurden die Happy Numbers von 1 bis eine Million) und markierte nur die ermittelten Happy Numbers mit einem farbigen "rosa" Pixel.

    AutoIt-typisch erfolgte die "Berechnung" recht langsam, aber immerhin etliche Faktoren schneller als mit der von (bisher schnellsten _IsHappyNumber()-Funktion vom geschätzten Kollegen Yjuq!

    Mir fielen sofort "Muster" im Bild auf! OHA! Seht ihr auch diese "Fensterkreuze"?

    Happy Numbers.PNG

    Als ich dann die obere linke Ecke stark vergrößerte, wunderte ich mich noch mehr!

    Happy Numbers Ausschnitt vergrößert.PNG

    Fällt euch auch auf, dass die Happy Pixel an der Diagonale von oben links nach unten rechts gespiegelt sind!?

    Was nichts anderes bedeutet, als dass NUR BEI DER HÄLFTE der Zahlen überhaupt der Status "Happy" ermittelt werden muss....

    Beispiel: In der obersten Pixelzeile sieht man von links die "Happy Pixel" 1, 7,10,13 usw. (in der Bitmap ist das erste Pixel an Adresse 0!)

    Das bedeutet, in der linken Pixelspalte von oben ist ebenfalls das 1te, 7te,10te,13te usw. Pixel gesetzt.

    Wenn also an den Koordinaten (x,y) ein Happy Pixel ist, dann auch das an der Koordinate (y,x).

    Anbei mein unoptimiertes und auf die schnelle hingehacktes Script zur Ermittlung der "Happy Numbers" incl. Erstellung der 1000x1000 Bitmap...ich werde mich morgen mal an die Beschleunigung machen...

    Im abschließenden Arraydisplay wird das Array angezeigt, welches zur Ermittlung der Happy Numbers erstellt wurde.

    Ist der Feldinhalt 1, dann ist die Indexzahl Happy, ansonsten der Feldinhalt (Indexzahl ist Unhappy)

    Nach schließen des Arraydisplay kann man mit der Maus in der Grafik die Positionen der Pixel anfahren und im Tooltip die dort "gespeicherte" Zahl ermittelt aus den Koordinaten erfahren, der Farbwert des Pixels bestimmt dann, ob die Zahl Happy (Pixelfarbe hat nicht Hintergrundfarbe) oder Unhappy ist (Pixelfarbe hat Hintergrundfarbe)

    AutoIt
    ;AlignComment=40
    #include <Array.au3>
    #include <WinAPIGdi.au3>
    #include <WinAPIGdiDC.au3>
    
    
    $w = 1000                                ;Breite und Höhe der Bitmap
    $h = $w                                  ;für das Beispiel quadratisch
    
    $ret = DllCall("kernel32.dll", "uint", "SetPriorityClass", "hwnd", _WinAPI_GetCurrentProcess(), "dword", 0x00000080) ;zum Benchmarken die Threadpriorität auf "hoch" setzen
    
    $len = StringLen(String($w * $h))        ;Anzahl Ziffern
    $happyflag = 0
    $happynumbers = 0
    
    Global $maxarray = 81 * $len + 1         ;maximale Groesse der Summe der Quadrate bei dieser Anzahl Ziffern
    Global $sieb[$maxarray]                  ;wenn position im Sieb=1 dann ist dieser index "happy", ansonsten wird die rekursion beim Treffer einer unhappy zahl abgebrochen
    Global $temp[16], $maxrecurs = 0         ;innerhalb der Rekursion gespeicherte summen
    
    
    $sieb[1] = 1                             ;Vorbelegung Happy
    $sieb[4] = 4                             ;Vorbelegung Unhappy. bei 4 ist die erste Folge mit Endlosschleife, eine Berechnung hätte nur für diese eine Zahl massiven Geschwindigkeitsverlust in der Rekursion bedeutet
    
    AutoItSetOption("MouseCoordMode", 2)
    AutoItSetOption("PixelCoordMode", 2)
    ;~ AutoItSetOption("GUICoordMode",2)
    
    $hgui = GUICreate("", $w, $h)
    $hdc = _WinAPI_GetDC($hgui)
    $hwnd = WinGetHandle($hgui)
    WinSetTitle($hgui, "", "Happy Numbers  0 - " & $w * $h - 1)
    $guibkcolor = 0xFFFFFF                   ;hintergrund weiß
    $Happycolor = 0xFF00FF                   ;farbe "rosa"^^
    GUISetBkColor($guibkcolor, $hwnd)
    GUISetState()
    
    $time = TimerInit()
    
    ;zuerst das sieb füllen
    For $i = 1 To $maxarray - 1              ;erst das maxarray füllen
        If _ishappy($i) Then                 ;happynumber gefunden....
            $sieb[$i] = 1                    ;happynumber ins Sieb eintragen
            For $z = 1 To $maxrecurs         ;alle in den rekursionen gefundene zahlen merken
                $sieb[$temp[$z]] = 1         ;diese Zahl ist auch happy weil führt in der Folge zu 1
            Next
        Else                                 ;keine happynumber gefunden
            $sieb[$i] = $i                   ;dann Zahl als zahl im index ins sieb eintragen
            For $z = 1 To $maxrecurs         ;alle in den rekursionen gefundene zahlen merken
                $sieb[$temp[$z]] = $temp[$z] ;diese Zahl ist auch happy weil führt in der Folge zu 1
            Next
        EndIf
        $maxrecurs = 0                       ;für den nächsten durchlauf löschen
        ;_ArrayDisplay($sieb)
    Next
    
    
    ;dann die Grafik erstellen
    For $y = 0 To $h - 1                     ;y-koordinate, Bitmaps sind nullbasiert!!
        For $x = $y To $w - 1                ;x-kooedinate ab y heisst nur Bereich über der diagonale
            $i = $y * $w + $x                ;Zahlen von 0 bis $w*$h-1
    
            ;Quadratsumme der Zahl bilden
            $a = StringSplit($i, "", 2)      ;einzelne ziffern in array
            $quadsum = 0                     ;summe der quadrate der einzelnen ziffern
            For $t = 0 To UBound($a) - 1     ;array nullbasiert
                $m = Number($a[$t])          ;schneller, als von AutoIt casten lassen!
                $quadsum += $m * $m
            Next
    
            If $sieb[$quadsum] = 1 Then      ;happy gefunden
                $happynumbers += 1           ;...und eins erhöhen
                _WinAPI_SetPixel($hdc, $x, $y, $Happycolor) ;pixel setzen
                If $x <> $y Then             ;der Bereich unter der diagonale
                    $happynumbers += 1
                    ;$i2 = $x * $w + $y       ;ishappy!!!!
                    _WinAPI_SetPixel($hdc, $y, $x, $Happycolor) ;0x00FF00)  ;Farbe ändern um die beiden Bereiche zu trennen
                Else                         ;x=y => Diagonale
                    _WinAPI_SetPixel($hdc, $y, $x, 0x0000FF) ;spiegelachse diagonal einfärben
                EndIf
            EndIf
        Next
    Next
    $m = TimerDiff($time)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $happynumbers = ' & $happynumbers & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    _ArrayDisplay($sieb)
    AutoItSetOption("MouseCoordMode", 2)
    AutoItSetOption("PixelCoordMode", 2)
    
    While GUIGetMsg() <> -3
        $posx = MouseGetPos(0)
        $posy = MouseGetPos(1)
        If $posx > 0 And $posy > 0 And $posx <= $w And $posy <= $h Then
            $col = PixelGetColor($posx, $posy, $hwnd)
            $zahl = ($posy - 1) * $w + ($posx - 1)
            ToolTip("x = " & $posx - 1 & @CRLF & _
                    "y = " & $posy - 1 & @CRLF & _
                    "Zahl  " & $zahl & " ist " & ($col <> $guibkcolor ? "Happy" : "Unhappy"))
        Else
            ToolTip("")
        EndIf
    WEnd
    
    
    
    Func _ishappy($zahl)                     ;nur um das sieb zu füllen
        $maxrecurs += 1                      ;rekursionstiefe
        $a = StringSplit($zahl, "", 2)       ;einzelne ziffern in array
        $quadsum = 0                         ;summe der quadrate der einzelnen ziffern
        For $t = 0 To UBound($a) - 1         ;array nullbasiert
            $m = Number($a[$t])              ;schneller, als von AutoIt casten lassen!
            $quadsum += $m * $m
        Next
        $temp[$maxrecurs] = $quadsum
        If $sieb[$quadsum] = 1 Then Return True ;happy gefunden
        If $sieb[$quadsum] = $quadsum Then Return False ;bereits als unhappy markiert
        Return _ishappy($quadsum)
    EndFunc                                  ;==>_ishappy
    Alles anzeigen

    //EDIT

    Script aktualisiert, es wird nun zuerst das Sieb mit den Happy/Unhappy Zahlen gefüllt, danach muss für jede Zahl nur noch die Quadratsumme ermittelt werden, die der Index für das Sieb ist.

  • RUN startet Datei mit Teilnamen des gewünschten Dateinamens

    • Andy
    • 19. Januar 2022 um 13:15
    Zitat von Racer

    Bin nicht der Einzige der das Computerzeitalter der 80er durchgemacht hat

    Willkommen im Club! :klatschen:

    Da ich als DOS-Jünger der ersten Generation auch keine Probleme mit der Konsole/Konsolenanwendungen habe/hatte, stößt mir die o.g. "Lösung" besonders auf.... :rolleyes:

    "Früher" hätte ich das sicher sofort bemerkt. Aber auch bei mir macht sich das fortgeschrittene Alter und die Mausschubserei bemerkbar....

  • RUN startet Datei mit Teilnamen des gewünschten Dateinamens

    • Andy
    • 17. Januar 2022 um 09:09
    Zitat von AspirinJunkie

    oder ShellExecute()

    Das hatte ich (genauso erfolglos) bereits probiert....

    Zitat von AspirinJunkie

    Das Kommando test findet er als exe-Datei im aktuellen Working-Directory liegen und ruft es entsprechend auf.

    Shellexecute macht ja nichts anderes, außer dass es vorher in der Registry nach "mit der Anweisung verknüpften Programmen" sucht. In diesem Fall nach ausführbaren Dateien, aka Kommandozeile.

  • RUN startet Datei mit Teilnamen des gewünschten Dateinamens

    • Andy
    • 17. Januar 2022 um 00:45
    Zitat von Musashi

    Ich habe es mal so gemacht, mit $PID = Run('"' & $neu & '"') ; neue Datei starten :

    So klappt es! Klasse!

    Wenn ich aber $PID = Run("test neu.exe")

    eingebe, dann startet wieder die test.exe....

    Aber so kann ich wenigstens weitermachen.

    Danke an alle!

    EDIT:

    Sollte man dafür ein Ticket erstellen?

  • RUN startet Datei mit Teilnamen des gewünschten Dateinamens

    • Andy
    • 16. Januar 2022 um 14:19

    Hi zusammen,

    habe heute folgendes festgestellt, AutoIt 3.3.14.5, Win10

    Wenn in einem Verzeichnis zwei Dateien existieren, deren Dateinamen sich nur am Ende unterscheiden, bspw. "test.exe" und "test neu.exe", dann startet RUN("test neu.exe") die "test.exe" ?!

    Ist das ein bekannter Fehler oder mache ich etwas falsch?

    Testscript "test.au3" compilieren und starten, es wird bei mir nie die Datei "test neu.exe" ausgeführt, sondern nur die Datei "test.exe"


    AutoIt: test.au3
    MsgBox(0, @AutoItPID, @ScriptName )                                           ;Dateinamen anzeigen
    
    $neu = StringReplace(@ScriptName, ".exe", " neu.exe")                                                                         ;Dateinamen umbenennen
    MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @CRLF & '$neu' & @CRLF & @CRLF & 'Return:' & @CRLF & $neu)  ;### Debug MSGBOX
    
    $ret = FileCopy(@ScriptName, $neu)                                                                                            ;neue Datei erstellen
    MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @CRLF & '$ret' & @CRLF & @CRLF & 'Return:' & @CRLF & $ret)  ;### Debug MSGBOX
    
    $PID = Run($neu)                                                                                                              ;neue Datei starten
    MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @CRLF & '$PID' & @CRLF & @CRLF & 'Return:' & @CRLF & $PID)  ;### Debug MSGBOX
  • Frage

    • Andy
    • 7. Januar 2022 um 10:52

    Hi,

    wir (4 PC´s plus diverse Laptops, Monitore) benutzen privat schon seit vielen Jahren DELL-Produkte.

    Mehrere Monitore 27´´ WQHD seit Jahren ohne Probleme, Inspiron-Laptops auch problemlos.

    Mein Sohn hat hat so ein Alienware-Monster, bei dem trat im letzten Jahr ein Problem mit der Bildschirmdarstellung auf, ab und zu flimmern, eingeschickt, eine Woche später repariert (Kabelübergang im Scharnierbereich getauscht) wieder zurückbekommen.

    Den Support habe ich noch nicht in Anspruch nehmen müssen!

    Zitat von BugFix

    Bei der letzten Hardwareaktualisierung sind wir jetzt auf Mikro-PC (ZOTAC) umgestiegen. Größe einer Zigarrenschachtel und lüfterloser Betrieb sind echt angenehm.

    Ja, bei uns in der Firma ähnlich. Macht eine von den Kisten Probleme (meist erst nach Jahren!), fliegt sie nach durchbohren der Festplatte in den Elektroschrott.

    Da diese Rechner ausschliesslich in eine RDP-Sitzung booten, ist der Austausch in Minuten erledigt.

    Zitat von BugFix

    Verwendung von eigenen Komponenten, d.h. dass man nicht selbst Motherboard, Netzteil oder Lüfter tauschen kann, da Dell diese Komponenten nicht vertreibt

    Daher die "billigen" Mikro-PC. Was soll denn heutzutage noch "repariert" werden? Bei Preisen von 300-400€ für den fertigen Rechner ist es teurer, den Fehleranalyse- und Reparatur-"Service" in Anspruch zu nehmen, als sofort ein neues Gerät (nach) zu bestellen.

    Bei Ausfallkosten von Industriemaschinen von mehreren zehntausend Euro pro Tag diskutiere ich auch nicht mehr, den Zuschlag für das Ersatzteil bekommt der, der als schnellstes liefert.

  • Formel noch nicht gefunden : Ich liebe Menschen die nicht einmal für eine Krone mit denken (mitdenken ?) !

    • Andy
    • 5. Januar 2022 um 00:35

    Hey Alina!

    Zitat von Alina

    Wo in Dänemark möchtest Du denn Urlaub machen?

    ...da wo es schön ist :o)

    Ich liebe es, Land und Leute kennenzulernen. Ich bin nicht der typische "Touri". Lieber bei Einheimischen wohnen, mit ihnen Essen und Trinken und gemütlich entspannen.

    Daher verlasse ich mich auch nicht auf einen Reiseführer, in dem drin steht, wo es "schön" ist, sondern ich frage die Leute die dort wohnen/leben. In diesem Fall DICH ^^

  • Formel noch nicht gefunden : Ich liebe Menschen die nicht einmal für eine Krone mit denken (mitdenken ?) !

    • Andy
    • 4. Januar 2022 um 14:26

    Hey Alina!

    Da ich auch immer gerne bei meinen (oft sehr eingeschränkten) Fremdsprachen verbessert werde, nur der Hinweis:

    Mitdenken wird zusammengeschrieben.

    Ist das in Dänemark anders? Google übersetzt mir in dänisch "tænke med", also 2 Wörter.

    Vielleicht schaffe ich es in diesem Jahr mal im Sommer nach DK....dann melde ich mich auch bei dir, ich brauche dann sicher eine Ferienwohnung! :)

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™