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

  • Digital Uhr

    • Andy
    • 2. Februar 2013 um 21:44
    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Timers.au3>

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

    Dim $ws[12] = [0, 0, 10, -7, 50, -7, 60, 0, 50, 7, 10, 7] ;Koordinaten Polygonzug: von links nach rechts WAAGRECHTER Balken, von rechts nach links SENKRECHTER Balken
    Dim $ziffer[10] = [239, 10, 118, 94, 154, 220, 253, 14, 254, 222] ;alle gesetzten bits des Indexes in der 7-segmentanzeige ergeben die Ziffer
    Dim $balkenpos[8] = [0, "60.0", "0.0", "60.60", "0.60", "0.60", "0.120", "0.0"] ;position der Leuchtbalken der 7-Segmentanzeige innerhalb der Ziffer
    Dim $p[7][2] ;nimmt die polygonzug-koordinaten zum Zeichnen auf
    $p[0][0] = 6 ;6 Punkte im Polygonzug

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

    Global $hgui = GUICreate('Uhr', 620, 175, -1, -1, $WS_POPUP, $WS_EX_CONTROLPARENT) ;GUI erstellen ohne Rahmen
    GUISetBkColor(0x000000) ;Hintergrund der GUI schwarz
    WinSetTrans($hgui, "", 205) ;transparenz
    GUISetState() ;GUI anzeigen

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

    _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui) ;"Leinwand" erstellen, auf der gezeichnet werden kann
    ;_time()
    _Timer_SetTimer($hgui, 1000, "_TIMER_CALLBACK")

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

    Do ;Endlosschleife, solange bis..
    Until GUIGetMsg() = -3 ;..ESC gedrückt wird

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

    _Timer_KillAllTimers($hgui)
    _GDIPlus_GraphicsDispose($hGraphic) ;freigeben
    _GDIPlus_Shutdown()

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

    Func _TIMER_CALLBACK($hWnd, $Msg, $iIDTimer, $dwTime)
    ;Uhrzeit anzeigen :o)
    For $k = 1 To 6 ;die 6 Ziffern der Uhrzeit
    $setbits = $ziffer[StringMid(String(@HOUR & @MIN & @SEC), $k, 1)] ;gesetzte Bits in der siebensegmentanzeige anhand der Ziffer in der Uhrzeit holen
    For $bitnr = 7 To 1 Step -1 ;alle Bits durchlaufen
    _drawpolygon(BitAND($setbits, 128), $k * 100 - 80 + ($k = 1 Or $k = 3 Or $k = 5) * 20, $bitnr) ;parameter: bit gesetzt ja/nein, position der gesamten ziffer,nummer des bits(gerade=waagrechter balken, ungerade=senkrechter balken)
    $setbits = BitShift($setbits, -1) ;nächstes Bit holen
    Next
    Next
    $brush = _GDIPlus_BrushCreateSolid(0xFF440000 + (@SEC / 2 = Int(@SEC / 2)) * 0xBB0000) ;Pinsel erstellen, wenn Ziffer gerade, dann farbig, ansonsten schwarz
    _GDIPlus_GraphicsFillEllipse($hGraphic, 202, 55, 15, 15, $brush) ;Punkte zeichnen
    _GDIPlus_GraphicsFillEllipse($hGraphic, 402, 55, 15, 15, $brush)
    _GDIPlus_GraphicsFillEllipse($hGraphic, 202, 105, 15, 15, $brush)
    _GDIPlus_GraphicsFillEllipse($hGraphic, 402, 105, 15, 15, $brush)
    _GDIPlus_BrushDispose($brush) ;Pinsel auflösen
    EndFunc ;==>_TIMER_CALLBACK

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

    Func _drawpolygon($bit, $xpos, $bitnr) ;zeichnet einen polygonzug ("Balken") an die entsprechende Position
    $split = StringSplit($balkenpos[$bitnr], ".", 3) ;x- und y-koordinaten des Balkens innerhalb der Ziffer holen
    $b = (($bitnr / 2) = Int($bitnr / 2)) ;$bit gerade => $b = true => Balken waagrecht, ansonsten Balken senkrecht
    $step = -1 + 2 * $b ;schrittweite durch das $WS-Array
    For $i = 11 - 11 * $b To 11 * $b Step 2 * $step ;array mit waagrechten (bit=gerade) oder (Bit=ungerade) senkrechten Balken füllen
    $r = Int(Abs((11 * (Not ($b))) - $i) / 2) + 1 ;abhängig von der Reihenfolge, egal ob $i von 0 bis 11 oder von 11 bis 0, $r muss immer 1,2,3,4,5,6
    $p[$r][0] = $ws[$i] + $split[0] + $xpos ;x- und
    $p[$r][1] = $ws[$i + $step] + $split[1] + 30 ;y-position in das polygonarray schreiben
    Next
    $brush = _GDIPlus_BrushCreateSolid(0xFF440000 + ($bit <> 0) * 0xBB0000) ;wenn bit gesetzt, dann farbig, ansonsten schwarz
    _GDIPlus_GraphicsFillPolygon($hGraphic, $p, $brush) ;Balken zeichnen
    _GDIPlus_BrushDispose($brush)
    EndFunc ;==>_drawpolygon

    [/autoit]

    Macht im Grossen und Ganzen dasselbe wie dein Script....

    Schau dir mal deine Funktion für das Zeichnen von zwei Segmenten an:

    Spoiler anzeigen
    [autoit]

    Func _Segment_H0_()
    Local $Segment_Hour_Null[$SegmentName[0]] = [$Segment_Hour_Null[0]] ;_Segment_HLinks / 00
    $Segment_Hour_Null[1] = $SegmentHour[1]
    $Segment_Hour_Null[2] = $SegmentHour[2]
    $Segment_Hour_Null[3] = $SegmentHour[3]
    $Segment_Hour_Null[4] = $SegmentHour[5]
    $Segment_Hour_Null[5] = $SegmentHour[6]
    $Segment_Hour_Null[6] = $SegmentHour[7]
    Local $Segment_Hour_Null_Greyed[$SegmentName[0] - 5] = [$Segment_Hour_Null_Greyed[0]]
    $Segment_Hour_Null_Greyed[1] = $SegmentHour[4]
    ;~
    For $i = 1 To UBound($Segment_Hour_Null) - 1
    _GDIPlus_GraphicsFillPolygon($Graphic, $Segment_Hour_Null[$i], $Brush)
    Next
    For $ia = 1 To UBound($Segment_Hour_Null_Greyed) - 1
    _GDIPlus_GraphicsFillPolygon($Graphic, $Segment_Hour_Null_Greyed[$ia], $Brush_Greyed)
    Next
    EndFunc ;==>_Segment_H0_
    #endregion ### _Segment_H0_ ###
    ;==========
    #region ### _Segment_H01 ###
    Func _Segment_H01()
    Local $Segment_Hour_NullEins[$SegmentName[0] - 4] = [$Segment_Hour_NullEins[0]] ;_Segment_HLinks / 01
    $Segment_Hour_NullEins[1] = $SegmentHour_10[3]
    $Segment_Hour_NullEins[2] = $SegmentHour_10[6]
    Local $Segment_Hour_NullEins_Greyed[$SegmentName[0] - 1] = [$Segment_Hour_NullEins_Greyed[0]]
    $Segment_Hour_NullEins_Greyed[1] = $SegmentHour_10[1]
    $Segment_Hour_NullEins_Greyed[2] = $SegmentHour_10[2]
    $Segment_Hour_NullEins_Greyed[3] = $SegmentHour_10[4]
    $Segment_Hour_NullEins_Greyed[4] = $SegmentHour_10[5]
    $Segment_Hour_NullEins_Greyed[5] = $SegmentHour_10[7]
    ;~
    For $i = 1 To UBound($Segment_Hour_NullEins) - 1
    _GDIPlus_GraphicsFillPolygon($Graphic, $Segment_Hour_NullEins[$i], $Brush)
    Next
    For $ia = 1 To UBound($Segment_Hour_NullEins_Greyed) - 1
    _GDIPlus_GraphicsFillPolygon($Graphic, $Segment_Hour_NullEins_Greyed[$ia], $Brush_Greyed)
    Next
    EndFunc ;==>_Segment_H01

    [/autoit]


    Der obere Teil ist lediglich eine Zuweisung, die man bequem in eine For/To schleife legen könnte, genau wie die in jeder Funktion vorkommenden 2 Schleifen um _GDIPlus_GraphicsFillPolygon().
    x-dimensionale Arrays, die wiederum andere y-dimensionale Arrays indizieren...


    Die Frage ist, ob das herangehen an das Problem verbessert werden sollte. ^^

    Die Ziffern der Uhr sind aus Segmenten zusammengesetzt.
    Das Aussehen der einzelnen Segmente allgemein kann man berechnen, alle waagrechten und alle senkrechten Segmente sehen gleich aus! (wenn man mag, kann man auch je zwei berechnen fürs schönere Aussehen)
    Es gibt also insgesamt nur 2 (oder 4) Segmente alle an definierten Positionen, die je nach Uhrzeit "an" oder "aus" geschaltet werden müssen.

    Für die Uhr sieht das vorgehen so aus:
    1) Berechne je EIN waagrechtes und senkrechtes Segment um es später an einer bestimmten Position darzustellen. (polygonzug)

    2) Weise jeder Ziffer der Uhrzeit die an-, bzw. abgeschalteten Segmente zu. (Ein- bzw. Ausgeschaltet...klingelt es....an/aus...1/0....binär 8o )
    Jede Ziffer hat 7 Segmente, die "angeschalteten" kann man einer 1 zuordnen
    Jetzt muss man die Segmente nur noch durchnummerieren.

    Code
    111
    2      3
    2      3 
      444
    5      6
    5      6
      777


    soweit sogut,
    Bei einer darzustellenden "2" wären welche Segmente angeschaltet also "1"? Na, Segmentnummer 1,3,4,5 und 7. Die anderen Segmente 2 und 6 sind "0" (aus).
    In einer Reihe von Null bis Sieben sieht die 2 also so aus:
    Segment 1="1"
    Segment 2="0"
    Segment 3="1"
    Segment 4="1"
    Segment 5="1"
    Segment 6="0"
    Segment 7="1"
    Hintereinandergeschrieben "1011101"
    Somit hätten wir die "2", die "Binärdarstellung" der anderen Ziffern überlasse ich dir^^
    Was bringt das?
    Die Ziffern 0 bis 9 (wenn man mag auch noch die Buchstaben A-F) sind in einem einzigen Array von 10 Feldern darzustellen.

    [autoit]

    dim Ziffer[10]=["xxxxxx","xxxxxxx","1011101","xxx..."]; Binär(An/Aus)darstellung der Ziffern 0 bis 9

    [/autoit]


    Der Index des Arrays ist die "Ziffer" die dargestellt werden soll. 2 => "1011101"
    Jetzt reicht EINE Schleife von 0 bis 7, um den String "1011101" abzuklappern und bei einer "1" das entsprechende "Segment" anzuschalten!

    3) Aber wo ist die Position der einzelnen Segmente?
    Zeichne dir die 7 gleichgroßen Segmente einer Ziffer flächenfüllend auf ein kariertes DIN A4 Blatt.
    Die Mittelpunkte der Segmente werden markiert.
    Dann brauchst du nur noch "Kästchen zählen", um die Koordinaten dieser Mittelpunkte festzulegen.
    Beim Aufschreiben dieser Koordimaten sollte einem etwas auffallen^^(das wäre dann für die Fortgeschrittenen^^)
    Man erstellt also ein Array mit Koordinaten (Index ist die Segmentnummer s.o. )
    Bei meiner Zeichnung kommen folgende koordinaten raus (x- und y-Richtung, 0;0 ist oben links)

    [autoit]

    dim Koordinaten[8]=["indexnull;gibtsnicht","16;0","0;12","32;12","16,24", usw ]; koordinaten der segmente 1 bis 7,

    [/autoit]


    Wer unbedingt will, kann ein 2-dimensionales Array erstellen.

    4) lese die Uhrzeit aus, splitte in die einzelnen Ziffern, bspw. die 2
    Nimm die Ziffer als Index für das Segmentarray $Ziffer[], du erhälst "1011101"
    Laufe durch diesen String, wenn du eine "1" findest nimm die Position der "1" innerhalb des Strings und verwende diese Position als Index für das Koordinaten-Array.
    Du erhälst die Koordinaten zum Zeichnen der Segmente für die 2

    5)lese die nächsten Ziffern aus der Uhrzeit aus, verfahre wie bei 4.
    Erhöhe nur die y-Koordinaten um einen fixen Wert => die weiteren Ziffern werden nach rechts verschoben

    Das wars schon.

    Wenn du die "Segmente" als Kreise darstellst, sollte die Erstellung nach obigem Rezept schnell erledigt sein.
    Aber woher weiss man, ob man ein waagrechtes oder ein senkrechtes Segment zeichnen soll?
    Naja, man könnte es ja einfach machen und statt "1011101" einfach "W0SWSSW" schreiben W=waagrecht S=senkrecht :rolleyes:

    Auch für einen absoluten Anfänger denke ich, ist das mit weit weniger als 100 Zeilen zu schaffen :D

  • Digital Uhr

    • Andy
    • 2. Februar 2013 um 11:07
    Zitat

    aber mir ging es nicht darum, den Code so einfach wie möglich zu halten

    ja, auch ich neige idR. zu "form follows function"
    Allerdings sollte imho das Ziel einer Programmierung nicht sein, möglichst viel Code zu erzeugen, durch den dann kein Mensch mehr durchblickt.

    Wenn man für ein "kleines" Problem so eben mal 600-800 Zeilen Code in einer zugegebenen Fleissarbeit erstellt, dazu dann Ressourcen in Form von Rechner- und Rechenkapazität verballert und mitten in dieser Aktion dann nicht feststellt, dass da etwas "schief läuft", dann weiss ich auch nicht weiter...
    Ein Forum wie dieses ist ja genau für diesen Fall da.
    Lernen und aus den Scripten bzw. Antworten der anderen das Know-How ziehen und auf das eigene Problem anwenden!

    Für jeden Anfänger, der über diesen Thread stolpert wäre es sinnvoller gewesen, du hättest gefragt, wie man diese Monsterarrays und die vielen Funktionen mit fast identischem Inhalt vermeidet bzw. programmiertechnisch einfacher realisiert!
    Erstens hättest du dich in der von dir benötigten Zeit wesentlich schneller weiterentwickelt und zweitens auch für alle anderen (auch Fortgeschrittenen) einen interessanten Thread erstellt.
    Jetzt schaut sich ein Anfänger dein Script an und kapiert nichts ;( , ein Fortgeschrittener schaut sich dein Script an und kapiert auch nicht viel mehr, bzw. erkennt sofort die programmtechnischen Defizite und würdigt deine "Arbeit" kein bisschen... ;(

    Naja, jedenfalls hast du dich durch ein Problem gekämpft und ein funktionierendes Script gebastelt, weiter so! :thumbup:

  • Digital Uhr

    • Andy
    • 2. Februar 2013 um 10:15

    Hi,

    Zitat

    Scheinbar gibt es Probleme bei Codes mit mehr als 900 Zeilen...

    yepp, die Forensoftware erkennt nämlich, wenn 90% des codes überflüssig ist :D

    Digitaluhr in 50 Zeilen (unopimiert für bessere Lesbarkeit)

  • GDI+ Show Histogram v0.97 beta build 2013-02-05

    • Andy
    • 2. Februar 2013 um 06:57

    Hi,

    Zitat

    Keine Ahnung für was man sowas gebrauchen kann...

    :rofl:
    Das erinnert mich an unsere Diskussion abends im Irish Pub zum Thema Grafik und "brotlose Kunst" :thumbup:

    Klasse Script!

    Übrigens ist ein Histogramm nur eine Darstellung der Häufigkeitsverteilung bestimmter Werte in einem Bereich, bei Bildern bietet es sich an, die Häufigkeit der Farben (in den einzelnen Farbkanälen) darzustellen.
    Anhand des Histogramms kann man dann Rückschlüsse ziehen auf die Farb/Helligkeitsverteilung im Bild, und diese dann gezielt über die einzelnen Farbkanäle beeinflussen.

    Bau auch die Schieberegler von 0-255 für die einzelnen Kanäle ein, und du hast die von 90% aller Bildbearbeiter zuerst verwendete Methode zum Bearbeiten der Farbwerte ;)

  • SMP - Simple Maleware Scanner [Im Aufbau]

    • Andy
    • 2. Februar 2013 um 06:37
    Zitat

    Ein Bit verändert, schon hat man einen anderen Hash...

    ...was auch den ureigensten Sinn des Ganzen darstellt...

  • Datentypen

    • Andy
    • 1. Februar 2013 um 20:19

    ...und zu allem Überfluss schlägt auch noch die Endianess zu!
    Es gibt wohl kaum jemanden, der nicht daran schon verzweifelt ist^^

    [autoit]

    $byte_struct = DllStructCreate("byte[4]") ;byte struktur erstellen
    $word_struct = DllStructCreate("word[2]", DllStructGetPtr($byte_struct)) ;word struktur an der adresse der byte-struktur erstellen
    $dword_struct = DllStructCreate("dword", DllStructGetPtr($byte_struct)) ;dword struktur an der adresse der byte-struktur erstellen

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

    DllStructSetData($dword_struct, 1, 0xAABBCCDD) ;dword schreiben

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

    ConsoleWrite("DWORD 0xAABBCCDD => dword " & Hex(DllStructGetData($dword_struct, 1), 8) & @CRLF)

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

    ConsoleWrite("DWORD 0xAABBCCDD => word " & Hex(DllStructGetData($word_struct, 1, 1), 4) & Hex(DllStructGetData($word_struct, 1, 2), 4) & @CRLF)

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

    ConsoleWrite("DWORD 0xAABBCCDD => byte " & Hex(DllStructGetData($byte_struct, 1, 1), 2) & Hex(DllStructGetData($byte_struct, 1, 2), 2) & Hex(DllStructGetData($byte_struct, 1, 3), 2) & Hex(DllStructGetData($byte_struct, 1, 4), 2) & @CRLF)

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Kleinster HD-Kurzfilm

    • Andy
    • 31. Januar 2013 um 20:29

    yupp, den habe ich mittlerweile auch gefunden....
    "Große" Mathematik scheint nicht dahinter zu sein, eher viel Fleißarbeit.
    Primitive 3D-Texturen und Objekte erstellen und beliebig in alle Dimensionen vervielfältigen , einige Filter (z.b. Blur) drüberlaufenlassen und ne schöne Funktion für die Kamerafahrt ausdenken, fertig :D
    Interessant ist aber auf jeden Fall, dass nicht mal einfache Shaderprogramme laufen, die machen fast alles mit sehr einfachen Mitteln "zu Fuß".

    minx, jetzt weiss ich auch woher einige deiner Effekte für den Melting Desktop kommen ...shaking kamera :thumbup:

  • Datentypen

    • Andy
    • 31. Januar 2013 um 19:54

    Hi,
    wie fast zu jedem Thema gab es auch zu diesem schon einige Threads, u.a. diesen

  • Kleinster HD-Kurzfilm

    • Andy
    • 31. Januar 2013 um 19:41

    den Sourcecode von der Musik habe ich mittlerweile gefunden, aber wo ist der von der Grafik?
    Habe nur die raw-files gefunden, mit ellenlangen zahlenlisten....

    Spoiler anzeigen
    Code
    /* This file is generated with raw2h */
    
    
    #ifndef _project_
    #define _project_
    
    
    unsigned char raw_project[] =
    {
      9,4,16,8,5,0,7,20,5,5,0,0,0,5,65,83,68,0,5,1,7,20,5,5,0,0,0,5,70,65,82,66,
      82,65,85,83,67,72,0,5,2,7,20,5,5,0,0,0,5,80,76,65,83,84,73,67,0,5,3,7,20,
      5,5,0,0,0,5,70,65,73,82,76,73,71,72,84,0,5,4,7,20,5,5,0,0,0,5,77,70,88,0,
      5,5,7,20,5,5,0,0,0,5,79,85,84,82,65,67,75,83,0,5,6,7,20,5,5,0,0,0,5,84,82,
      65,67,84,73,79,78,0,5,7,7,20,5,5,0,0,0,5,83,84,82,65,86,65,71,65,78,90,65,
      0,30,0,7,0,0,30,1,7,1,0,30,2,7,2,0,30,3,7,3,0,30,4,7,4,0,30,5,7,5,0,30,6,
    
    
    
    
    uswusf
    Alles anzeigen

    code ist wohl keiner dabei....schade....hätte sonstwas gegeben, um nur den (natürlich kommentierten :rofl: ) code für ne handvoll frames zu sehen

  • Kleinster HD-Kurzfilm

    • Andy
    • 31. Januar 2013 um 19:05

    //Doppelpost ftw!

    wenn man mit VC++2010 Express arbeitet und in der Datei SetupDialog.rc folgende Änderungen vornimmt

    C
    //#include "afxres.h"     auskommentieren
    #include "WinResrc.h"  // dafür die folgenden Zeilen einfügen
    #define IDC_STATIC -1


    dann kann man kompilieren und debuggen...omfg ist das feeeeett....naja, typisch farbrausch eben^^

  • Kleinster HD-Kurzfilm

    • Andy
    • 31. Januar 2013 um 18:34

    Hi,

    Zitat

    Auf, auf Andy Unser Job das nach AutoIt zu bringen

    ...Download läuft^^

  • Desktop effects - 22 Effekte mit BitBlt (früher Melting Desktop)

    • Andy
    • 30. Januar 2013 um 20:37

    yepp, schöne und vor allem einfach umzusetzende Effekte! :thumbup:

  • GGEngine + UDF [UPDATE 15.2.13]

    • Andy
    • 26. Januar 2013 um 22:09

    Hi!

    Sehr, sehr nice! :thumbup:
    Pack die DLL noch in die GGengine.au3, dann muss die auch keiner mehr mitschleppen (direkt dort in den Speicher laden, UEZ hat imho da mal etwas dafür gebastelt)

    Das ist ideal, um kleine Demos zu machen!

    Spoiler anzeigen
    [autoit]

    #include <GGEngine.au3>

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

    $w = 256
    $h = 256

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

    _GGinit()
    $gui = _GGGUIcreate("GGE Demo", $w, $h)
    $ptr = _GGGUIgetIMGptr($gui)

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

    $struct = DllStructCreate("dword[" & $w * $h & "]", $ptr) ;struct erstellen an der Position der bitmap

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

    While Not _GGGUIclosed($gui)

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

    For $i = 1 To $w * $h - 1 ;jedes einzelne pixel....
    DllStructSetData($struct, 1, Random(1, 2 ^ 31 - 1, 1), $i);....mit random-farbe beschreiben ;
    Next
    _GGGUIupdate($gui)
    Sleep(10)
    WEnd

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

    _GGGUIdelete($gui)
    _GGfree()

    [/autoit]


    Schau doch mal nach, warum dieser Code NACH dem schliessen des Fensters abstürzt!

  • OpenCl goes AutoIt Update 31.Dezember 2016

    • Andy
    • 26. Januar 2013 um 14:19

    uups, die Hälfte vergessen^^

    Zitat

    Warum dereferenzierst du alles, um anschliessend den Dereferenzoperator zu löschen? Die Zahl 100 sollte eigentlich eh nicht dereferenziert werden


    Um näherzubringen, dass idR. Pointer an den Kernel übergeben werden und einen Parameter "einzusparen"^^

    Du kannst doch auch die Funktion direkt aufrufen, dann sieht das so aus

    [autoit]

    clSetKernelArg($kernel, 4, DllStructGetSize(dllstructcreate("float")), "float*", $stepx)

    [/autoit]


    da finde ich

    [autoit]

    _CL_SetArg(4, "float*", $stepx)

    [/autoit]


    wesentlich kürzer und einfacher....

  • OpenCl goes AutoIt Update 31.Dezember 2016

    • Andy
    • 26. Januar 2013 um 13:40

    Hi,

    schön dass sich jemand für diese zukunftsorientierte Technik interessiert^^

    Zitat

    Ich kämpfe zwar noch mit ein paar Problemen, aber wenn das erstmal läuft eröffnet diese UDF neue Geschwindigkeitshorizonte [zumindest hoffe ich das ].

    Wenn du mit Problemen kämpfst, bitte Info in diesen Thread. Ich bin mittlerweile schon wesentlich tiefer in die Materie eingestiegen und kann bei einigen Problemen weiterhelfen...
    Auch sind etliche Funktionen und Möglichkeiten schon weiterentwickelt aber noch nicht hier veröffentlicht...eine "UDF" hänge ich mir noch nicht ans Bein....vielleicht wird das irgendwann im Lauf des Jahres aktuell^^
    Als "Freizeit-Programmerer" mit vielen anderen Prioritäten hat man es nicht leicht :rolleyes:

    Wichtig ist, bei Problemen das "$Debug_Flag=1" zu setzen, und den kompletten Konsolenausdruck anzuhängen. Treiberversion der Grafikkarte, CPU und GPU-Modell usw sollten natürlich auch angegeben werden.
    Erschwerend kommt dazu, dass sich die Entwickler der Treiber + SDK´s SEHR bedeckt halten mit detaillierten Informationen. Dabei ist es egal, ob es sich um INTEL,AMD oder NVIDIA handelt.
    Da kann es dann sein, dass auf aktueller Hardware der neueste Treiber mit dem neuesten SDK nicht funktioniert....."Uups, ach ja, auf der Chipgeneration xyz müssen sie den Treiber blablub mit dem SDK abc verwenden, damit die Beispiele (C++ in den SDK´s) überhaupt kompiliert werden..."
    IMHO sehr unbefriedigend, aber wenn eine funktionierende Kombination Hardware/Software gefunden wurde, stehen wirklich extreme Möglichkeiten zur Verfügung.
    Daher ist allererste Pflicht, CLINFO.EXE (bei jeder CL-Installation vorhanden) aufzurufen und ggf. die Ausgabe in eine Textdatei zu schreiben und diese anzuhängen. Ggf. auch einige der Ausgaben der compilierten Beispieldateien aus den SDK´s.
    Wenn es an der AutoIt-Implementation hängt (hehe, nobody is perfect^^) benötige ich natürlich diese Rückinfo!

    Ich habe zzt. Kontakt zu einem kleinen Programmiererteam, dass sich mit Echtzeitverarbeitung von grossen Datenmengen beschäftigt und im letzten Jahr mehrere hunderttausend Euro an Hardware eingespart hatte, weil sie ihre Software optimieren konnten.
    Dann geht es auch nicht mehr darum, ob OpenCL überhaupt funktioniert, sondern darum, die Kernel weiter zu optimieren. Es ist teilweise sehr interessant, sich mit den Interna der Hardware zu beschäftigen. Da muss man einem langjährigen und von mir sehr geschätzten Programmierer erklären, warum ein Kernel plötzlich 3x schneller läuft, nur weil man irgendwo im Code j[x][y] statt j[y][x] verwendet.
    Auf der CPU sind die Speichertransfers sowieso durch den Bus limitiert, da fällt das weniger ins Gewicht, aber auf der GPU mit wesentlich schnellerer (lokaler) Speicheranbindung muss man einfach alle Möglichkeiten ausschöpfen. Vermeidung von Cache-misses FTW! Aber das ist eine andere Geschichte ;)

  • Nochmals zu StringReplace

    • Andy
    • 23. Januar 2013 um 13:09

    Kann sein, dass ich es missverstanden habe, aber bei mir werden in 26 MB Daten über eine Million Ersetzungen getätigt in 200millisekunden

    Spoiler anzeigen
    [autoit]

    $string="Alle Vögel sind schon da!"
    for $i=1 to 20
    $string &=$string
    Next
    $stringlen=stringlen($string) ;~26MB
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $stringlen = ' & $stringlen & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $t=timerinit()
    $ersetzt=stringreplace($string,"Vögel","Rehe",0,1)
    $anzahl=@extended
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $anzahl = ' & $anzahl & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $m=timerdiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]
  • In Datei suchen

    • Andy
    • 23. Januar 2013 um 00:55

    Hi,

    Stringinstr() ist SEHR schnell, wenn man das casesensitive-flag setzt. Also ca. 7-8x schneller als "ohne"

    stringinstr($text,$suchstring) = "langsam"
    stringinstr($text,$suchstring,1) ist also wesentlich schneller

    "langsam" bedeutet, auf meinem Rechner findet Stringinstr() am Ende einer 52MB (!) großen Datei einen Suchstring mit 40 Zeichen innerhalb 2 Sekunden.
    Mit gesetztem casesensitiv-flag wird der Suchtext in 250ms gefunden....
    Vergleich Suchfunktionen

  • Funktion StringReplace ist schrecklich langsam

    • Andy
    • 20. Januar 2013 um 22:20

    chesstiger ,
    die Frage ist, wie man "langsam" definiert^^
    Natürlich hast du recht, eine "Kopie" des Strings benötigt auch etwas Zeit.
    Du kannst es ja gerne mal in C ausprobieren. Ich schätze aber, da das Ziel immer an derselben Speicheradresse liegt und somit dafür kein neuer Speicher alloziert werden muss, dass das Memcopy() auch bei 10000 aufrufen nicht sehr viel ausmacht ;)
    In Assembler habe ich ein Memcopy() per SSE (kopiert 128Bits = 16 Bytes = 4 Dwords pro Speicherzugriff) geschrieben, das ist ca. 2x so schnell wie eine von mir untersuchte C-Funktion (die nur byte- bzw. word-weise kopiert). Aber wie gesagt, daran liegt es sicher nicht....

    Und um das umkopieren zu sparen, mein Tip mit der struct ;) und dllstructsetdata()

  • Funktion StringReplace ist schrecklich langsam

    • Andy
    • 20. Januar 2013 um 12:43

    Hi,

    Zitat

    Du bist aber natürlich 1000mal schneller wenn du eine C-Dll nimmst.

    Zitat

    Oder dann gleich per WinAPI..

    Stringreplace() ist der Wrapper der entsprechenden C(++)-Funktionen ((strlen, strstr, strcpy and strcat)), WinAPI stellt keine Stringreplace-Funktionen zur Verfügung.

    24MB ist doch keine Größe, zeig doch mal das Stück Code, dass so langsam laufen soll.

    Btw, sämtliche Stringfunktionen laufen wesentlich schneller, wenn man den casesense-Parameter richtig setzt. D.H. im Falle von Casesensitivem Suchen/Ersetzen ist die 1 zu verwenden -> schneller.
    Weiterhin macht es Sinn, die Suche einzuschränken, wenn man z.B. weiss, dass der String erst in der 2. Hälfte der Daten steckt, dann hat man nur die halbe Suchzeit.
    Suche per Stringinstr() und ersetzen per StringMid() ist auch eine Alternative, da extrem schnell (wenn casesensitiv)

    Zitat

    In diesen möchte ich tausende kleine Strings einfügen (überschreiben).

    Um immer an der gleichen Possition "einzufügen" (überschreiben der dort liegenden Daten) würde ich die Positionen in ein Feld(Array/struct) schreiben und dann per StringMid()/dllstructsetdata() ersetzen.

  • Hexrechnung

    • Andy
    • 19. Januar 2013 um 02:29

    Hi,

    Zitat

    Könnte mir jemand vielleicht sagen was ich falsch gemacht habe?

    ja^^
    Du hast dir die Daten nicht genau angeschaut....

    123D7812 <> 0x123D7812

    jetzt klar?

    spoiler

    Hex () gibt einen STRING zurück und benötigt als Parameter einen INTEGER. Wenn du nun aber HEX () mit einem String statt eines Integer fütterst....geht das natürlich schief

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™