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

  • [Beendet] µitLight März

    • Andy
    • 31. März 2010 um 23:06

    Hi,
    2 weitere "langsame" Funktionen...
    Beide nutzen komprimierte Siebe, leider kann man mit AutoIt damit keinen Blumenpott gewinnen...(Nicht die Schuld von AutoIt, wer mit einem Ferrari zum Einkaufen fährt und sich über den mangelnden Platz für die 4 Kisten Bier beschwert ist selbst schuld^^)
    Das "Sieb von Atkin" u.A. ist eine sehr schnelle Implementation zur Ermittlung großer Primen.

    Bei anderen Wettbewerben zur Primzahlbestimmung habe ich festgestellt, daß die "Geschwindigkeit" nicht für die gesamte Laufzeit, sondern für die verschiedenen Bereiche des Programms ausgewertet wird, für z.B. Initialisierung, Primzahlbestimmung (Filterung/Berechnung) und der Ausgabe der Zahlen....egal, es hat mir jedenfalls richtig Spass gemacht! :thumbup:
    Beispiel für komprimiertes Sieb:
    In Assembler gibt es eine wesentlich schnellere Alternative zu MOD und Division, wenn der Teiler (hier bei uns wird durch 30 geteilt) bekannt ist. Da auch relativ wenig Speicher erforderlich ist, können die Siebe im Cache liegen und extrem schnell abgearbeitet werden.

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <Array.au3>
    ;Sieb von Eratosthenes, komprimiert
    ;
    Global $z
    Global $limit = 1299709 ;alle Primzahlen bis zum Limit finden

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $arraysize = (Int($limit / 30) + 1) * 8 ;Array zur Aufnahme der möglichen Primzahlen, alle Vielfachen von 2,3 und 5 werden nicht berücksichtigt
    Dim $a[$arraysize]
    ;der Vorteil ist, man braucht nur 1/4 des Speicherplatzes für das Sieb

    [/autoit] [autoit][/autoit] [autoit]

    ;es werden in diesem komprimierten Sieb alle Vielfachen von 2,3 und 5 nicht berücksichtigt, daraus ergibt sich eine "Matrix" mit möglichen Primzahlen
    ;Zahlen Spalte
    ; 0 1 2 3 4 5 6 7
    ;Zeile
    ;0 1 7 11 13 17 19 23 29 in dieser Zeile stehen die Spaltenindizes
    ;1 31 37 41 43 47 49 53 59
    ;2 61 67 71 73 77 79 83 89
    ;3 91 97
    ; Formel zur Berechnung der möglichen Primzahlen:
    ; Prim = Zeilenanzahl * 30 + Spaltenindex Spaltenindex(0)=1 usw...
    Dim $spaltenindex[8] ;
    $spaltenindex[0] = 1
    $spaltenindex[1] = 7
    $spaltenindex[2] = 11
    $spaltenindex[3] = 13
    $spaltenindex[4] = 17
    $spaltenindex[5] = 19
    $spaltenindex[6] = 23
    $spaltenindex[7] = 29

    [/autoit] [autoit][/autoit] [autoit]

    ;dann folgt ein Array, in dem die Spaltenindizes(+1) den Primzahlen von 0-30 zugeordnet werden
    Dim $b[31] = [0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 4, 0, 0, 0, 5, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 8, 0]
    ;jede Vielfache der Primzahl soll aus der Matrix eliminiert werden, in der Matrix stehen aber nur Vielfache der Primen von 7 bis 29
    ;also wird nur die Zahl aus der Matrix eliminiert, bei der gilt:
    ;$b[Rest] <> 0 wobei Rest = mod ( Vielfaches der Prim , 30 )
    ;
    ;die Vielfachen der Primzahlen werden eliminiert, indem an ihre Position in der Matrix eine Zahl (zur Verdeutlichung das Vielfache) geschrieben wird
    ;Ist das Sieb fertiggestellt, sind die Arrayelemente mit 0 die Primzahlen, alle anderen sind eliminierte Vielfache

    [/autoit] [autoit][/autoit] [autoit]

    $tt = TimerInit()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $a[1]=1
    $flag = 0
    $primstring = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To $arraysize ;Anzahl aller möglichen Primzahlen in der Matrix
    For $y = 0 To 7 ;jedes Element in der Zeile
    If $a[$y + 1 + ($x * 8)]<>0 Then ContinueLoop ;nur Elemente mit 0 sind Primzahlen
    $prim = $x * 30 + $spaltenindex[$y] ;das ist die Primzahl
    $qprim = $prim ^ 2 ;alle Vielfachen ab dem Quadrat dieser Primzahl eliminieren...
    If $qprim > $limit Then ExitLoop 2 ;wenn Quadrat der Primzahl > Wurzel aus limit, dann besteht das sieb nur noch aus Primzahlen
    $r = Mod($qprim, 30) ;mod der Zahl liefert den Rest
    $d = Int($qprim / 30) ;int/30 liefert die Zeile der Zahl
    If $b[$r] <> 0 Then ;wenn Zahl ein Vielfaches eines der Spaltenindizes, dann alle weiteren Vielfachen eliminieren
    $a[$b[$r] + ($d * 8)] = $prim ;Im Arraydisplay sieht man sehr schön die eliminierten Vielfachen
    $t=timerinit()
    $w=0
    For $m = $qprim To $limit Step $prim ;alle Vielfachen aus der Matrix eliminieren
    $r = Mod($m, 30)
    $d = Int($m / 30)
    If $b[$r] <> 0 Then
    $a[$b[$r] + ($d * 8)] = $prim
    EndIf
    $w+=1 ;anzahl eliminierter Zahlen = Vielfache der Prim
    Next
    $m=timerdiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' &$prim&" "&$w&" "& $m & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    endif
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $m = TimerDiff($tt)
    Msgbox(0,"Komprimiertes Sieb von Eratosthenes"," Primzahlen in "&int($m)&" Millisekunden!" & @CRLF &"Bitte im Anschluss kurz auf das Arraydisplay warten....")
    _ArrayDisplay($a)
    $primstring = "2" & @CRLF & "3" & @CRLF & "5" & @CRLF
    $n = 3
    For $i = 1 To $arraysize - 2
    If $a[$i + 1] = 0 Then ;Primzahl im Sieb gefunden
    $r = Mod($i, 8)
    $d = Int($i / 8)
    $n += 1
    $primstring &= $d * 30 + $spaltenindex[$r] & " " & $n & @CR ;Ausgabe der Primzahlen
    EndIf
    Next
    ConsoleWrite($primstring)
    Exit

    [/autoit]

    Sieb von Atkin:

    Spoiler anzeigen
    [autoit]


    ;Sieb von Atkin

    [/autoit] [autoit][/autoit] [autoit]

    $limit=1299709;10^8
    global $struct=dllstructcreate("byte["&$limit&"]")
    $t=timerinit()

    [/autoit] [autoit][/autoit] [autoit]

    $q=int(sqrt($limit))
    for $x=1 to $q
    for $y=1 to $q
    $n=4*$x*$x+$y*$y
    if $n<$limit and (mod($n,12)=1 or mod($n,12)=5) Then _flip($n)
    $n=3*$x*$x+$y*$y
    if $n<$limit and (mod($n,12)=7) Then _flip($n)
    $n=3*$x*$x-$y*$y
    if $x>$y and $n<$limit and (mod($n,12)=11) Then _flip($n)
    Next
    Next
    $a=2
    For $i=5 to $limit step 2
    if dllstructgetdata($struct,1,$i)=1 Then
    $e=$i*$i
    $a+=1
    for $z=$e to $limit step $i
    dllstructsetdata($struct,1,0,$z)
    next
    EndIf
    next
    $m=timerdiff($t)
    Msgbox(0,"Sieb von Atkin","Zeit für die Primzahlen bis "&$limit & @CRLF & int($m) &" Millisekunden")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    for $i=1 to $limit
    if dllstructgetdata($struct,1,$i)=1 Then consolewrite ($i & @CRLF )
    next

    [/autoit] [autoit][/autoit] [autoit]

    func _flip($z)
    if dllstructgetdata($struct,1,$z)=1 Then
    dllstructsetdata($struct,1,0,$z)
    else
    dllstructsetdata($struct,1,1,$z)
    EndIf
    endfunc

    [/autoit]
  • µit für Mathematiker und Zocker

    • Andy
    • 31. März 2010 um 18:37
    Zitat von Oskar

    Die "Logik" dahinter habe ich in den Kommentaren untergebracht.

    :D
    Dann sei ein Mann und fülle nicht 2 Spielscheine aus, sondern plündere das Konto und lass es krachen! Die "Logik" is so verständlich, das wirst du auch (im unwahrscheinlichen Fall daß du alles verlierst) dem Scheidungsanwalt vermitteln können, da KANN garnichts schiefgehen... :rofl:

  • SAP Automatisierung im Hintergrund

    • Andy
    • 31. März 2010 um 09:51

    Hallo,
    teste auch mal, ob sich der Fensterinhalt der SAP-Anwendung händisch per CTRL-C (Copy) ermitteln lässt, bzw was man als Ergebnis dieser Copy erhält.

  • Lange nicht mehr aktiv transparenz mittlerweile möglich ?

    • Andy
    • 30. März 2010 um 23:22

    ggf hilft das hier auch weiter....http://www.autoitscript.com/forum/index.php?showtopic=102961&view=findpost&p=729998

  • Lange nicht mehr aktiv transparenz mittlerweile möglich ?

    • Andy
    • 30. März 2010 um 22:54
    [autoit]

    _WinAPI_CreateRoundRectRgn()

    [/autoit]

    schau mal in der Hilfe dazu nach...

  • memory enträge am Beispiel Teamspeak2

    • Andy
    • 30. März 2010 um 15:45
    Zitat von peethebee

    LOL, wie bitter ist es denn, im Botforum noch gesperrt zu werden?

    ....na schau dir mal die Frage(n) hier im Forum an^^
    Btt: Alles könner für Anti-googler ...kann ich zu diesem Thema nur empfehlen

  • Alles könner für Anti-googler

    • Andy
    • 30. März 2010 um 15:40
    Zitat

    http://www.lmgtfy.com, das reicht doch i.d.R. auch

    eben, aber nicht hart genug, sondern der Fragende bekommt genau was er will, jemand anderes macht sich die Arbeit....
    Daher ist mein Favorit https://autoit.de/www.gidf.de

  • Breakpoint 2010 in Bingen am Rhein vom 2.-5. April

    • Andy
    • 28. März 2010 um 18:38

    Hallo zusammen,

    vom 2.-5. April findet in diesem Jahr die Breakpoint in Bingen statt.
    Wer Interesse hat soll einfach mal einen Termin hier posten, ggf könnte man sich dort treffen!

    Unbedingt die Einladung anschauen.... :thumbup:

  • [Beendet] µitLight März

    • Andy
    • 28. März 2010 um 18:26

    Wenn wir schon dabei sind^^
    Dann zeige ich auch mal meine ASM-Version, incl. Umwandlung der Register in Zahlen.
    Ggf. nur als 32Bit in XP/Vista (ohne DEP) lauffähig, an einer Version die auf allen BS läuft wird zzt gerade gearbeitet.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <FASM.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $ASM = FasmInit()
    Local $maximum = 1299709

    [/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $primzahlen = _PrimeAsm($maximum) ;Assembler aufrufen, code assemblieren, in den Speicher schreiben und ausführen
    $m = TimerDiff($t)

    [/autoit] [autoit][/autoit] [autoit]

    StringReplace($primzahlen, @CR, @CR, 0, 1) ;alle CR im String zählen.....auch AutoIt hat SPEEEEED^^
    $anzahlprim = @extended ;hätte man auch vom Assembler zurückgeben lassen können^^
    MsgBox(262144, "Primzahlen bis " & $maximum, $anzahlprim & " Primzahlen in " & Int($m) & " Millisekunden, Ausgabe der Zahlen folgt in Console....")
    ConsoleWrite($primzahlen & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    FasmExit($ASM)
    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _PrimeAsm($limit) ;coded by Andy

    [/autoit] [autoit][/autoit] [autoit]

    FasmReset($ASM)

    [/autoit] [autoit][/autoit] [autoit]

    FasmAdd($ASM, "use32");32Bit-Version
    FasmAdd($ASM, " push ebp "); ebp des aufrufenden Programms retten
    FasmAdd($ASM, " mov ebp, dword[ESP+08h] "); "unseren" ebp setzen auf den Anfang unserer Struct
    ;dann ist...
    ; [EBP+0h] der erste Parameter (Limit) , da UINT ist er 4 Bytes lang, daher ist der nächste Parameter bei...
    ; [EBP+04h] der 2 Parameter (Limes), auch 4 Byte lang...daher findet man den 3. Parameter, unsere struct bei...
    ; [EBP+08h] der Anfang des Speicherbereichs Mem
    ;ich verwende die Hex-Zahlen, um bei verschiedenen Assemblern einen Standard zu haben, der Windowstaschenrechner ist Gold wert^^

    [/autoit] [autoit][/autoit] [autoit]

    FasmAdd($ASM, " mov ebx,dword[ebp+0h] "); Limit
    FasmAdd($ASM, " mov eax,3 "); 3 ist die nächste Primzahl
    FasmAdd($ASM, "Fill: "); Schleifenanfang
    FasmAdd($ASM, " mov dword[ebp+08h+eax],30313031h "); an die Speicherstelle in der Struct den String "1010"
    FasmAdd($ASM, " add eax,4 "); eax=eax+4 ;geht auch mit einem rep stosw^^ 10
    FasmAdd($ASM, " cmp eax,ebx "); vergleiche eax mit $limit
    FasmAdd($ASM, " jbe Fill "); Jump if below or equal (wenn <=) nach Fill, ansonsten weiter
    ;in der struct steht nun 001101010101010101010.....alle vielfachen von 2 sind 0, die erste 0 ist die 0, 2 ist die erste Primzahl!

    [/autoit] [autoit][/autoit] [autoit]

    ;startadresse Struct Prim holen
    FasmAdd($ASM, " mov edi, ebp "); an ebp steht der erste Parameter, wir brauchen aber die Adresse von ebp+8
    FasmAdd($ASM, " add edi, 8 "); ebp+8 ist die adresse des ersten bytes der struct Mem
    FasmAdd($ASM, " mov esi, edi "); ESI=anfang Mem
    FasmAdd($ASM, " mov ecx,dword[EBP+0h] "); do until limit
    FasmAdd($ASM, " mov ebx,3 "); ebx=aktuelle Zahl in der struct struct[1]=speicher[0] !!!!!!
    FasmAdd($ASM, "L0: ")
    FasmAdd($ASM, " mov eax,ebx "); eax=ebx=aktuelle primzahl
    FasmAdd($ASM, " mul eax ");nächstes vielfaches der prim = quadrat der primzahl
    ;****************************************
    ;ACHTUNG, das Erbebnis von mul ist EDX:EAX also wird auch das edx-register verändert!
    ;*****************************************
    FasmAdd($ASM, "L1: ")
    FasmAdd($ASM, " mov byte[esi+eax],30h ");jedes vielfache der Primzahl in der struct zu "0" machen
    FasmAdd($ASM, " add eax,ebx ");eax=eax+ebx vielfaches der Primzahl 20
    FasmAdd($ASM, " cmp eax,ecx "); Vielfaches mit limit vergleichen
    FasmAdd($ASM, " jl L1 "); solange eax < limit, die Vielfachen löschen
    FasmAdd($ASM, "L2: ");nächste Primzahl holen
    FasmAdd($ASM, " add ebx,2 ");2 zahlen weiter springen ,3,5,7,9,11,13,15....
    FasmAdd($ASM, " cmp ebx,dword[EBP+0h] "); vgl aktuelle position mit dem Ende von Mem
    FasmAdd($ASM, " ja exit ");wenn Ende erreicht, exit
    FasmAdd($ASM, " cmp byte[esi+ebx],31h ");ist an dieser stelle in der struct eine primzahl?
    FasmAdd($ASM, " jne L2 ");wenn nicht, nächste zahl wählen
    ;************************************************************
    ;aus einer Zahl(Registerinhalt) einen ZiffernString machen: http://dcla.rkhb.de/umwandlung/int2dez.html
    ;und in die Primstruct schreiben
    ;wird dieser Bereich auskommentiert, wird ein String aus nullen und einsen zurückgegeben 0=keine Prim 1=Prim
    ;dann können mit den AutoIt-Stringbefehlen die Primzahlen und deren Anzahl ausgelesen werden
    FasmAdd($ASM, " push ebx ");alle benötigten Register sichern
    FasmAdd($ASM, " push ecx ");alle benötigten Register sichern
    FasmAdd($ASM, " mov eax, ebx ");Zahl laden
    FasmAdd($ASM, " mov ebx, 10 "); Divisor
    FasmAdd($ASM, " xor ecx, ecx ");ECX=0 (Anzahl der Ziffern)
    FasmAdd($ASM, "Schleife_1: ")
    FasmAdd($ASM, " xor edx, edx ")
    FasmAdd($ASM, " div ebx "); EDX:EAX / EBX = EAX Rest EDX
    FasmAdd($ASM, " push dx "); LIFO
    FasmAdd($ASM, " add cl,1 "); ADD soll schneller sein als INC
    FasmAdd($ASM, " or eax, eax "); AX = 0?
    FasmAdd($ASM, " jnz Schleife_1 "); nein: nochmal
    FasmAdd($ASM, "Schleife_2: ")
    FasmAdd($ASM, " pop ax "); gepushte Ziffern zurückholen
    FasmAdd($ASM, " or al, 00110000b "); Umwandlung in ASCII
    FasmAdd($ASM, " stosb "); Nur AL nach [EDI] (EDI ist ein Zeiger auf den String)
    FasmAdd($ASM, " loop Schleife_2 "); bis keine Ziffern mehr da sind
    FasmAdd($ASM, " mov byte [edi],0Dh ");CR CarriageReturn, man könnte auch ein Komma (ascii=2C) einsetzen, dazu noch ein nullbyte als EndOfString
    FasmAdd($ASM, " add edi,1 ");ein Byte weiter
    FasmAdd($ASM, " pop ecx ");Register wiederherstellen
    FasmAdd($ASM, " pop ebx ");Register wiederherstellen
    ;************************************************************Ende Ziffer aus Register

    [/autoit] [autoit][/autoit] [autoit]

    FasmAdd($ASM, " cmp ebx,dword[EBP+04h] "); vgl aktuelle position mit der wurzel der listengrösse
    FasmAdd($ASM, " jl L0 "); solange ebx < wurzel listengrösse, gehe vielfache eliminieren

    [/autoit] [autoit][/autoit] [autoit]

    ;jetzt ist die Mem-Struct völlig gefüllt aber die Primzahlen sind nur bis Limes in der Prim-Struct!
    ;also muss der Rest auch noch eingetragen werden
    FasmAdd($ASM, " cmp ebx,dword[EBP+0h] "); vgl aktuelle position mit dem Ende von Mem
    FasmAdd($ASM, " jl L2 "); solange ebx < limit, gehe vielfache eliminieren bzw "1"en in zifferfolgen umwandeln

    [/autoit] [autoit][/autoit] [autoit]

    FasmAdd($ASM, "exit: ");
    FasmAdd($ASM, " mov byte [edi],00h ");nullbyte als EndOfString anfügen, damit hinter den Zahlen nicht die übrigen 0en und 1en stehen
    FasmAdd($ASM, " pop ebp "); ebp des aufrufenden Programms restaurieren
    FasmAdd($ASM, " ret "); und zurück, in eax steht das Ergebnis

    [/autoit] [autoit][/autoit] [autoit]

    $tStruct = DllStructCreate("uint Limit;uint Limes;char Mem[" & $limit + 10 & "]") ;char, dann kann man nachher schön mit den stringfunktionen suchen
    DllStructSetData($tStruct, "Mem", "001") ;die ersten 3 Zahlen setzen, 0=0 1=0 2=1 , 2 ist die erste Primzahl
    DllStructSetData($tStruct, "Limit", $limit);limit in die Struct schreiben
    DllStructSetData($tStruct, "Limes", Floor(Sqrt($limit)) + 1);wurzel aus limit in die struct schreiben

    [/autoit] [autoit][/autoit] [autoit]

    $Ret = MemoryFuncCall("int:cdecl", FasmGetFuncPtr($ASM), "ptr", DllStructGetPtr($tStruct)); Assembler aufrufen
    $pstring = "2" & @CR & "3" & @CR ;2 und 3 sind die ersten Primzahlen
    $pstring &= DllStructGetData($tStruct, "Mem") ;alle Primzahlen aus der struct in den string schreiben

    [/autoit] [autoit][/autoit] [autoit]

    Return $pstring ;und zurückgeben

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_PrimeAsm

    [/autoit]

    Und natürlich für den Wettbewerb der AutoItcode, leider sind unter AutoIt alle "schnellen" Algorithmen langsamer als ein simples Bruteforce... :thumbdown: ..oder überrascht mich^^
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Dateien

    Andy Primzahlen.zip 667 Byte – 323 Downloads
  • Java in Autoit verwenden

    • Andy
    • 28. März 2010 um 16:21
    Zitat

    Bringt das so einen Geschwindigkeitsvorteil, wenn erst eine DLL geöffnet und dann eine Java-funktion daraus aufgerufen wird?

    Kommt auf die Funktion an. Bei komplexen Berechnungen lässt sich sicherlich durch eine DLL einiges an Zeit gut machen, aber für die schon in AutoIt verfügbaren Funktionen lohnt ein Aufruf per DLL bestimmt nur in den allerseltensten Fällen.

  • [Beendet] µitLight März

    • Andy
    • 27. März 2010 um 21:19

    Um nochmal alle Klarheiten zu beseitigen:
    Die Bugfix´sche "Testumgebung" ist also verbindlich?!
    D.h. das Filewrite schreibt einen Textstring(mit den Primzahlen von 2-...) in die Datei und das "wie kommen die Primen in den Textstring?" erfolgt vor der Zeitmessung?
    Oder ist zwischen Zeitnahme und Filewrite eine "wie_auch_immer_Umformung" der Primzahlen in den String vorgesehen?

    [autoit]

    Local $timer = TimerInit()

    [/autoit][autoit][/autoit][autoit]

    Func _GetPrim(ByRef $timer)
    ; ...
    ; ...
    ConsoleWrite(TimerDiff($timer) & @CRLF)
    FileWrite($file, $100000_Primzahlen)
    EndFunc

    [/autoit]
  • Problem mit Array

    • Andy
    • 27. März 2010 um 09:32
    Zitat

    Sitz hier bestimmt schon 2 Stunden drann und bekomms alleine nicht hin.

    ....irgendwie werde ich da an etwas erinnert....ach ja, meine Sig....

  • Kombinatorik Problem

    • Andy
    • 26. März 2010 um 15:03
    [autoit]

    #include <Array.au3>
    $input= InputBox("Zahl","Gib eine Zahl ein")

    [/autoit][autoit][/autoit][autoit]

    $a=stringsplit($input,"",3)

    [/autoit][autoit][/autoit][autoit]

    _arraydisplay($a)

    [/autoit]
  • autonegotiation

    • Andy
    • 26. März 2010 um 14:39

    Habe mal bei mir auf der Maschine etwas gestöbert. Auto Negotiation bzw der Duplex Mode wird per Treiber eingestellt, die entsprechenden Verweise stehen in der Registry. Dort Schlüssel zu ändern halte ich für einfacher als eine "Fernsteuerung" von Fenstern.

  • Autoit und C++?

    • Andy
    • 26. März 2010 um 09:59
    Zitat

    C++ zu lernen lohnt sich meiner Meinung nach nur, wenn man vorhat größere, kompliziertere Projekte zu programmieren

    Genau das bringt es auf den Punkt. Erst hat man ein Problem, DANN erst macht man sich Gedanken über eine sinnvolle Lösung.
    Um C++ so zu lernen, daß man sinnvolle Applikationen in kürzerer Zeit als in einer anderen Programmiersprache (die man schon einigermassen beherrscht) erstellen kann, muß man viel Zeit investieren. Ob sich das im Endeffekt wirklich lohnt, muß jeder für sich entscheiden.
    Wer beruflich darauf angewiesen ist, bestimmten Code zu bearbeiten, für den stellt sich diese Frage nicht! Die "just for Fun" Programmierer kommen idR auch sehr gut mit einfacheren Sprachen zurecht...

    Niemand lernt Braumeister um 2x in der Woche ein Bier zu trinken....

  • PPI berechnung

    • Andy
    • 25. März 2010 um 20:52

    ich komme bei beiden Varianten auf 90 komma ebbes PPI.
    Inch=($pixels/3.93700787)
    Scheint also zu stimmen, die Größenangabe des Monitor-Herstellers^^

  • winlogon.exe & csrss.exe - Was ist das?

    • Andy
    • 25. März 2010 um 15:02

    ....don´t feed the troll.....

  • Star Wars Intro NEU

    • Andy
    • 25. März 2010 um 13:39

    Sehr schöne Idee!
    Auch bei 1680x1050 noch ansehbar!

    Vote for UDF!

  • Apfelmaennchen in FASM-Assembler Update incl. FLUG!

    • Andy
    • 25. März 2010 um 10:00

    Hier eine Version komplett ohne Assembler-Build also auch ohne die ggf störenden Befehle in der Memory.au3, um den Assembler komplett als Fehlerquelle auszuschalten.
    Funktioniert ggf nicht unter 64Bit.
    //EDIT noch mehr rausgeschmissen ^^....
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Dateien

    Apfelmaennchen_fasm_bytecode.zip 11,07 kB – 246 Downloads
  • Apfelmaennchen in FASM-Assembler Update incl. FLUG!

    • Andy
    • 25. März 2010 um 09:38

    Ok, vielen Dank fürs Testen,

    Zitat

    Flug funktioniert bei mir nicht, da wird der Rechner zu schwach sein (AMD XP 2400+).

    der Flug sollte aber immer funktionieren, anfangs hagbe ich sogar per sleep() die Framerate auf 25 begrenzt, damit es nicht zu schnell geht.
    Später wirde es, je nach Bildausschnitt, ruckelig, da in den "tiefen" (schwarzen) Bereichen pro Pixel bis zu 20.000 Iterationen (innere Schleifendurchläufe) berechnet werden. Beim Flug ist das aus Geschwindigkeitsgründen begrenzt. Beim "normalen" zoomen per Mausklick finden in großen Tiefen mehr als 100k Iterationen/Pixel statt. Dabei wird jedes Mal die Sequenz

    [autoit]

    while (($x * $x + $y * $y) < $tiefe and $iteration < $maxiteration)
    $xtemp = $x * $x - $y * $y + $x0
    $y = 2 * $x * $y + $y0
    $x = $xtemp
    $iteration += 1
    wend

    [/autoit]

    durchgerechnet...

    Btw. ich war sehr überrascht, daß der 8088-Code mit den "alten" Koprozessorbefehlen (damals schon intern 80Bit) ohne weiteres mit den parallel arbeitenden modernen SSE/SSE2/SSE3-Umsetzungen mithalten kann. Habe dazu eine DLL (auch in Assembler) geschrieben, die Laufzeit ist seltsamerweise fast Identisch. Allerdings wird zwangsläufig beim parallelen Rechnen per SSE nur mit 64 oder schlimmer noch 32 Bit Genauigkeit gerechnet, somit ist dann beim Zoomen wesentlich früher das Ende erreicht. Allerdings muss ich zugeben, daß ich noch nicht auf Zugriffe im Cache (Loop unrolling) optimiert habe, da sollten noch etwas rauszuholen sein. Wenn man bedenkt, daß ein Zugriff in den Hauptspeicher 100 Takte benötigt (die komplette oben gezeigte Schleife benötigt weniger!) und ein Zugriff im L1-Cache nur 1-2 Takte erkennt man das Potential. Moderne C-Compiler optimieren das übrigens automatisch, es gibt nicht viel Leute, die per Assembler schnelleren Code produzieren können....

    Zitat

    Dann klicke ich in die Gui und ein Teil des Apfelmännchen erscheint (zu groß). Nach insgesamt 5 Klicks wird die Gui dann dunkel.

    OK, auch für diesen Hinweis vielen Dank!

    Zitat

    Ohne _Asmcode_changecolor() läuft es.

    Aha! Werde das mal unter die Lupe nehmen. Ich vermute, daß in der Memory.au3 irgendwo der Wurm steckt. Wahrscheinlich gehen die Betriebssysteme >XP wesentlich restriktiver mit ausführbarem Code in nicht extra dafür freigegebenen Speicherbereichen um.
    Trancexx aus dem engl. Forum hat dafür eine tolle Methode entwickelt, die auch auf allen BS läuft. Dabei wird der Bytecode (auch von "normalen EXE´s oder DLL´s) vom BS genau wie bei einem normalen Programmstart in den Speicher geschrieben und dort ausgeführt, wen es interessiert, Stichwort "subrogation".

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™