Frohes Neues Jahr 2018 auch von mir
Den Rutsch hätten wir ja schon mal geschafft , jetzt kommt der Rest !
Gruß Musashi
Frohes Neues Jahr 2018 auch von mir
Den Rutsch hätten wir ja schon mal geschafft , jetzt kommt der Rest !
Gruß Musashi
Hallo Andy !
Bzgl. der Revisionen sollte sich jeder ein eigenes Bild machen. Leider wird das dadurch erschwert, dass die älteren Versionen nicht mehr downzuloaden sind. Imho wurden noch vor einigen Jahren auf der Website die früheren Revisionen verlinkt. Ich jedenfalls finde diese Versionen nicht mehr.
Da ich inhaltlich z.Zt. nur wenig beitragen kann, habe ich mal die 'Fußarbeit' des Suchens übernommen.
Vielleicht hilft es dem einen oder anderen ja weiter !
Hier das gesamte Manual (Stand 2007, also wie in deinem Link zu Volume 4) :
Volume 1 : Publication No.=24592 Revision 3.14 ( September 2007)
http://pdinda.org/icsclass/doc/A…Programming.pdf
Volume 2 : Publication No.=24593 Revision 3.14 (September 2007)
http://pdinda.org/icsclass/doc/A…Programming.pdf
Volume 3 : Publication No.=24594 Revision 3.14 (September 2007)
http://pdinda.org/icsclass/doc/A…nstructions.pdf
Volume 4 : Publication No.=26568 Revision 3.10 (September 2007)
http://pdinda.org/icsclass/doc/A…nstructions.pdf
Volume 5 : Publication No.=26569 Revision 3.09 (September 2007)
http://pdinda.org/icsclass/doc/A…nstructions.pdf
Ggf. auch interessant :
Publication No.=43479 Revision 3.01 (August 2007)
http://pdinda.org/icsclass/doc/A…SSE5_Instrs.pdf
Publication No.=25481 Revision 2.26 (July 2007)
http://pdinda.org/icsclass/doc/A…ecification.pdf
Publication No.=34434 Revision1.20 (February 2007)
http://pdinda.org/icsclass/doc/A…ecification.pdf
Zu :
AMD64 Architecture - Programmer’s Manual Volume 1 - Application Programming
Aktuell : Publication No.=24592 Rev.=3.22 Date=December 2017
Ich habe mal nach einer möglichst alten Revision gesucht, und die 3.09 (Sept. 2003) gefunden. Ein kurzer Vergleich mit der aktuellen Revision 3.22 zeigt, dass hier die meisten Grafiken erhalten geblieben sind.
Offenbar leiden nicht alle Volumes unter dem angesprochenen Qualitätsverfall .
Nebenbei : Warum kann man im Bereich Skripte nur Dateien bis max. 1 MB (und nicht 5 MB) hochladen ?
Gruß Musashi
Hallo Andy !
Ich meine die 128Bit-Media-Instructions, also die Referenz der SSE-Befehle Public.nr. #26568. In den neueren Versionen ist keine einzige (!) grafische Entsprechung. Kein Wunder, dass so gut wie niemand diese Befehlserweiterungen nutzt, übrigens auch per Intrinsics aus diversen Hochsprachen heraus, wenn niemand auch nur annähernd lt. der Beschreibung in der Lage ist nachzuvollziehen, was diese Befehle überhaupt bewirken!
Der Witz dabei ist, dass jeder sofort anhand der grafischen Entsprechung im Debugger SEHEN kann, wie die Inhalte der 128-Bit-Register aussehen sollten.
Erst mal 'Danke' für die schnelle Antwort !
Die von Dir in Beitrag #20 als Beispiel gezeigte Grafik stammt ja aus :
AMD64 Architecture - Programmer’s Manual Volume 4 - 128-Bit Media Instructions
Publication No.=26568 Revision=3.10 Date=September 2007 -> HADDPD -> Seite 111 ff.
In der aktuellen Revision 3.21 der Publication No. 26568 (Dezember 2017) fehlt diese Grafik (für Interessierte -> siehe Seite 141 ff.). Nachdem ich mir die Revisionen etwas genauer angesehen habe trifft das, wie Du bereits geschrieben hast, leider wirklich auf viele der erklärenden Grafiken zu.
Mir fällt, offen gesagt, kein plausibler Grund ein, warum sich die Qualität der Dokumentation im Rahmen der Revisionen derart verschlechtert hat - oder wurde sie absichtlich verschlechtert !?.
Anschlussfrage (hoffentlich nerve ich Dich nicht ) :
Wie sieht es mit den Volumes 1,2,3 und 5 aus. Wären auch hier die älteren Revisionen vorzuziehen, und falls ja, hättest Du die Downloadlinks ?
Irgendwie komme ich, trotz Zeitmangel, doch etwas auf den Geschmack .
Gruß Musashi
Hallo Andy !
Und hier die (alten, aber um Klassen besseren) AMD-Docs zu den SSE-Befehlen http://www.share-online.biz/dl/QPV4OG1P30 mit sofort nachvollziehbaren Bildern wie die Register miteinander interagieren.
Frage :
Wenn Du schreibst, dass die alten AMD-Docs um Klassen besser sind, meinst Du das im Vergleich zu den aktuellen Revisionen dieser Docs, oder zu neueren Dokumentationen im Allgemeinen ?
Auf den schnellen Blick scheint die Revision 3.10 (September 2007) des Volumes 4 tatsächlich einige Grafiken zu enthalten, die in der Revision 3.21 (Dezember 2017) fehlen, bzw. anders dargestellt werden.
Ich habe den aktuellen Stand des AMD-Programmer’s Manual (mit Links) hier mal zusammengefasst !
Das Manual setzt sich aus den folgenden Volumes zusammen :
Volume 1: Application Programming 24592
Volume 2: System Programming 24593
Volume 3: General-Purpose and System Instructions 24594
Volume 4: 128-Bit and 256-Bit Media Instructions 26568
Volume 5: 64-Bit Media and x87 Floating-Point Instructions 26569
Downloadinfos :
AMD64 Architecture - Programmer’s Manual Volume 1
Application Programming
Publication No.=24592 Rev.=3.22 Date=December 2017
Download : https://support.amd.com/TechDocs/24592.pdf
AMD64 Architecture - Programmer’s Manual Volume 2
System Programming
Publication No.=24593 Rev.=3.29 Date=December 2017
Download : https://support.amd.com/TechDocs/24593.pdf
AMD64 Architecture - Programmer’s Manual Volume 3
General-Purpose and System Instructions
Publication No.=24594 Rev.=3.25 Date=December 2017
Download : https://support.amd.com/TechDocs/24594.pdf
AMD64 Architecture - Programmer’s Manual Volume 4
128-Bit and 256-Bit Media Instructions
Publication No.=26568 Rev.=3.21 Date=December 2017
Download : https://support.amd.com/TechDocs/26568.pdf
'Ältere Version' von Andy :
AMD64 Architecture - Programmer’s Manual Volume 4
128-Bit Media Instructions
Publication No.=26568 Rev.=3.10 Date=September 2007
Download : http://www.share-online.biz/dl/QPV4OG1P30
AMD64 Architecture - Programmer’s Manual Volume 5
64-Bit Media and x87 Floating-Point Instructions
Publication No.=26569 Rev.=3.14 Date=September 2016
Download : https://support.amd.com/TechDocs/26569_APM_v5.pdf
Ob man diese PDF's direkt hier im Forum posten darf, kann und möchte ich nicht beurteilen .
Im Lizenztext steht (Auszug) :
"Durch dieses Dokument wird keine Lizenz, auch nicht implizit oder durch Rechtsverwirkung, für geistige Eigentumsrechte gewährt."
Da die Links zu den neuen Revisionen aber von 2016/2017 stammen, dürften sie wohl noch für längere Zeit Bestand haben.
Schlussbemerkung :
Ich finde das ganze Thema wirklich spannend, auch wenn mir wahrscheinlich (leider) die Zeit fehlt, intensiver einzusteigen. Meine oberflächlichen Gehversuche dbzgl. stammen noch aus dem letzten Jahrtausend .
Trotzdem dürfte es einige interessierte, wenn auch stille, Mitleser geben. In diesem Sinne - Weiter so
Gruß Musashi
Hallo Oscar !
Vielen Dank, insbesondere für die extra-ausführlichen Kommentare
Hier zum Vergleich mal die Laufzeitdaten meines, schon etwas in die Jahre gekommenen, PC's :
ASM-Code-Size: 221 Bytes
Test-Array: 1000000 Elemente
ArrayCreate: 2065.598 ms
Array2Struct: 1797.610 ms
ASM_Sort: 65.873 ms
Struct2Array: 1999.078 ms
_ArraySort: 56228.328 ms
Gruß Musashi
Hallo Sascha123456 !
leider bin ich mir mit der exe nicht sicher welche das sein könnte die für den start des programmes verantwortlich ist, den da starten mehrere..
Wenn ich '3D Messmaschine' und 'Zeiss\CALYPSO 6.4' lese, dann handelt es sich wohl nicht um eine 300 EUR Software . In der Regel hat man für so etwas einen Wartungs-/Supportvertrag und einen Ansprechpartner.
Frage doch bitte mal nach, ob man, und falls ja, welche, Datei wie starten kann. Anschließend dürfte es den Helfern hier wesentlich leichter fallen, dein Problem zu lösen.
Gruß Musashi
Und was ist wenn die software bereits offen ist? Würde er diese dann nochmal öffnen?
Das kann ich leider nicht genau sagen, da ich die Software nicht kenne. Bei Standardprogrammen wie Excel, OpenOffice etc. wäre das einfach, da hier der Aufbau der Parameter bekannt ist.
Es gibt verschiedene Szenarien, z.B. :
- Es wird eine neue Instanz des Programmes gestartet
- calypso.im wird als neuer Reiter innerhalb des bereits aktiven Programmes angezeigt
- Es darf nur eine Instanz gestartet sein, und ein weiterer Start wird abgelehnt
Gibt es bei Euch keinen Experten oder eine Dokumentation, die man befragen könnte ?
Suche mal nach Stichworten wie :
Kommandozeile , Kommandozeilenparameter, Parameterübergabe oder commandline.
Du kannst ja auch einfach mal etwas herumprobieren .
Run("C:\Program Files (x86)\Zeiss\CALYPSO 6.4\bin\vwnt.exe " & "C:\Program Files (x86)\Zeiss\CALYPSO 6.4\calypso.im", '', @SW_MAXIMIZE )
oder
Run("C:\Program Files (x86)\Zeiss\CALYPSO 6.4\bin\vwnt.exe " & "calypso.im", '', @SW_MAXIMIZE )
Gruß Musashi
Wie würde das als script aussehen ?
Simples Beispiel :
Global $sFilename = @ScriptFullPath ; voller Pfad des aktuellen Skriptes
; Dateiname als Parameter an Notepad übergeben :
Run("notepad.exe " & $sFilename, '', @SW_MAXIMIZE )
Ob die von Dir verwendete .exe-Datei eine Parameterübergabe vorsieht, kann ich nicht beurteilen.
EDIT :
Hmm ok, aber im grunde muss das skript ja eine datei über diese software öffnen. Wäre das dann diese Parameter übergabe?
Ja !
Gruß Musashi
Sry also die exe ist folgende C:\Program Files (x86)\Zeiss\CALYPSO 6.4\bin\vwnt.exe
Aber ich weiß nicht genua was was mit Parameter übergeben gemeint ist
Häufig kann man Programmen, wie im akt. Beispiel einer .exe-Datei, zusätzliche Werte (Parameter) übergeben.
Das hängt aber von der Gestaltung des Programmes selbst ab (ggf. mal im Hause einen Experten fragen).
Theoretisch könnte das so aussehen :
C:\Program Files (x86)\Zeiss\CALYPSO 6.4\bin\vwnt.exe "calypso.im"
Gruß Musashi
Nochmal für uns, du Öffnest aus dem Pfad "C:\Zeiss_Programme\Programmierbereich\1234\inspection" die Programm exe?
Wie heißt die genaue Exe Datei die du öffnest?
Hallo Sascha123456 !
Man öffnet über die Steuerung über dem pfad C:\Zeiss_Programme\Programmierbereich\1234\inspection diese inspection datei . Über windwos selsbt kann man diese gar nciht öffnen
Beantworte doch bitte die Frage von gmmg !
- Wie heißt die .exe-Datei ?
- Kann man dieser .exe-Datei die Inspection-Datei z.B. als Parameter übergeben ?
Zur Zeit ist das alles Kaffeesatzleserei
Gruß Musashi
Hallo sstuercke !
Nachdem ich gerade die 'Pre-Beta' von Bitnugger gesehen habe, wollte ich mein Skript gar nicht mehr posten Nebenbei : Cooler Ansatz
Aber was soll's, schaden tut es ja auch keinem. Es ist eine Mischung aus den Beiträgen #3 und #4.
Bei der Version von Oscar ist die Schriftgröße fest eingestellt. Ich habe sie über ein simples Näherungsverfahren berechnet. Du kannst ja mal die beiden Textblöcke wechselseitig ein- bzw. auskommentieren.
Am Ende wirst und solltest Du natürlich das Skript von Bitnugger verwenden.
#include <WindowsConstants.au3>
;Global $sMessageText = 'Ich soll einen Alarmmonitor für meine Freiwillige Feuerwehr ' & _
; 'aufbauen. Der Meldetext ist dabei immer sehr lang (mehr als ' & _
; '100 Zeichen). Jetzt suche ich ein Skript welches das Anpassen ' & _
; 'der Textgröße und automatische Zeilenumbrüche ermöglicht.'
Global $sMessageText = 'Ich soll einen Alarmmonitor für meine Freiwillige Feuerwehr ' & _
'aufbauen. Der Meldetext ist dabei immer sehr lang (mehr als ' & _
'100 Zeichen). Jetzt suche ich ein Skript welches das Anpassen ' & _
'der Textgröße und automatische Zeilenumbrüche ermöglicht.' & _
'Hier kommt noch ein Zusatztext, um die Veränderungen der ' & _
'jeweiligen Textgröße anzuzeigen. 100 % perfekt läuft das ' & _
'zwar alles nicht, aber etwas flexibler ist es schon :-)'
Global $hGui = GUICreate('Meldung', 640, 480, -1, -1, BitOR($WS_POPUP, $WS_MAXIMIZE))
GUISetBkColor(0xFF6060)
Global $aWindowSize = WinGetClientSize($hGui)
Global $iFrameSize = 10
Global $iWindowWidth = $aWindowSize[0] - (2 * $iFrameSize)
Global $iWindowHeight = $aWindowSize[1] - (2 * $iFrameSize)
Global $fRatioXY = $iWindowWidth / $iWindowHeight
Global $fX = 1
Global $fY = StringLen($sMessageText)
Global $iNOofCharsX
While $fX < (($fY * $fRatioXY) * 2)
$fY = StringLen($sMessageText) / $fX
$fX += 1
$iNOofCharsX = $fX
WEnd
; Funktion von @AspirinJunkie für Zeilenumbrüche anwenden :
Global $sOuttext = StringRegExpReplace($sMessageText, '.{1,' & $iNOofCharsX & '}\K(\b|\Z)', '\0' & @CRLF)
; Schriftgröße für maximale Fensternutzung berechnen :
Global $fCharSize = Int ($iWindowWidth / $iNOofCharsX)
ConsoleWrite('@@ $fCharSize=' & $fCharSize & @CRLF)
Global $idMessage = GUICtrlCreateLabel($sOuttext, $iFrameSize, $iFrameSize, $iWindowWidth, $iWindowHeight)
GUICtrlSetFont($idMessage, $fCharSize, 400, 0, 'Lucida Console')
GUICtrlSetBkColor($idMessage, 0xEEEEEE)
GUISetState(@SW_SHOW)
Do
Until GUIGetMsg() = -3
Alles anzeigen
Gruß Musashi
Nachtrag - nur der Vollständigkeit halber und ggf. für interessierte User :
Die Anforderung von Mikki war :
Im Zielverzeichnis ($sDestDir) nach Dateinamen zu suchen, die mit den ersten 6 Zeichen von Dateinamen aus dem Quellverzeichnis ($sSourceDir) übereinstimmen.
Ich (und anfangs auch Du) bin von der Annahme ausgegangen, dass eine Teilstringsuche ($iCompare=1) am Anfang beginnt. Dem ist aber nicht so ! Sucht man z.B. nach 2208-2 , dann wird auch abc2208-2002.txt als Treffer gewertet. Was fehlt ist ein Parameter der festlegt, ob der Teilstring am Anfang, irgendwo oder am Ende stehen muss/darf.
Es gibt aber die folgende, wenn auch wenig einsteigerfreundliche, Variante :
Den Parameter $iCompare=3 verwenden, und den Teilstring als regulären Ausdruck angeben.
Ersetzt man in meinem Beitrag #12 die Zeile 27 :
$iVergleich = _ArraySearch($aFileList_Dest, $sPlannummern_Source, 0, 0, 0, 1)
mit :
$iVergleich = _ArraySearch($aFileList_Dest, '(?i)(^)' & $sPlannummern_Source, 0, 0, 0, 3)
dann funktioniert es. Zur Info : '(?i)(^)' = (Groß/Kleinschreibung egal)(am Anfang)
Das macht die Verwendung von _ArraySearch in diesem Fall aber auch nicht 'charmanter' .
Gruß Musashi
Hallo autoiter
2208-2 ist sowohl Teil von 2208-2002.txt als auch von abc2208-2002.txt als auch von 22208-2004.txt.
Meine Güte, bin ich blöd ! Den Fall, dass der Teilstring auch irgendwo in der Mitte sitzen darf, hatte ich so aus _ArraySearch gar nicht herausgelesen. Ich bin immer davon ausgegangen, dass der Vergleich mit dem ersten Zeichen beginnt und mich gefragt, wo denn bitte das Problem sei. Zu meiner Entschuldigung kann ich nur anführen, dass ich _ArraySearch bisher nie verwendet habe. Ich mag die händische Verarbeitung von Arrays i.d.R. eh lieber . Na ja, danke, dann wäre das ja geklärt.
Gruß Musashi
Ich persönlich ziehe die Lösung mit den 2 Schleifen hier auch vor !
Aus Interesse (nicht aus Rechthaberei ) wollte ich aber mal wissen, ob es auch mit _ArraySearch geht.
autoiter : In deinem Beitrag #8 gibt es eine kleine Macke (ist mir auch nur zufällig aufgefallen ) :
For $i = 0 To UBound($aFileList_Source) - 1
$Plannummern_Source = StringLeft($aFileList_Source[$i], 6)
For $ii = 0 To UBound($aFileList_Dest) - 1
... usw.
Falls die Anzahl der Dateien im SourceDir und im DestDir identisch sind, dann wird auch der Index [0] der Arrays (Anzahl der Elemente) verglichen und als Treffer gewertet. Die Schleifen müssen also bei 1 starten, nicht bei 0.
Das Ziel von Mikki ist es ja zu prüfen, ob Dateien in beiden Verzeichnissen vorkommen, die die Bedingung :
-> die ersten x Charakter sind identisch (hier x=6)
erfüllen. (Hinweis : die Macke mit 0 als Startwert im Vergleich 2 habe ich noch so gelassen)
#include <MsgBoxConstants.au3>
#include <File.au3>
#include <Array.au3>
Global $sSourceDir = @ScriptDir & '\source'
Global $sDestDir = @ScriptDir & '\dest'
Global $aFileList_Source , $aFileList_Dest
Global $sPlannummern_Source , $sPlannummern_Dest
Global $iVergleich
Global $iCompareChars = 6 ; Länge des Teilstrings für den Vergleich
; Arrays besetzen :
$aFileList_Source = _FileListToArray($sSourceDir, "*.*", $FLTA_FILES)
$aFileList_Dest = _FileListToArray($sDestDir, "*.*", $FLTA_FILES)
;~ _ArrayDisplay($aFileList_Source, 'Source-Dateien')
;~ _ArrayDisplay($aFileList_Dest, 'Dest-Dateien')
; 1. Vergleich mit _ArraySearch :
ConsoleWrite('-========================================================' & @CRLF)
ConsoleWrite('Länge des Teilstrings = ' & $iCompareChars & @CRLF)
ConsoleWrite('' & @CRLF)
ConsoleWrite('------------- Vergleich 1 - _ArraySearch ----------------' & @CRLF)
For $i = 1 To UBound($aFileList_Source) - 1
$sPlannummern_Source = StringLeft($aFileList_Source[$i], $iCompareChars)
$iVergleich = _ArraySearch($aFileList_Dest, $sPlannummern_Source, 0, 0, 0, 1)
If @error Then
ConsoleWrite('!V1 : Fehler oder kein Datei gefunden -> @error = ' & @error & '>' & @CRLF)
Else
ConsoleWrite('+V1 : Dest-List Eintrag gefunden <' & $aFileList_Dest[$iVergleich] & '>' & @CRLF)
EndIf
Next
; 2. Vergleich mit zwei Schleifen (@autoiter):
ConsoleWrite('' & @CRLF)
ConsoleWrite('------------- Vergleich 2 - zwei Schleifen (@autoiter) ----------------' & @CRLF)
For $i = 0 To UBound($aFileList_Source) - 1
ConsoleWrite('>V2 : Sourcearray Element <' & $i & '>' & @CRLF)
$sPlannummern_Source = StringLeft($aFileList_Source[$i], $iCompareChars)
For $y = 0 To UBound($aFileList_Dest) - 1
$sPlannummern_Dest = StringLeft($aFileList_Dest[$y], $iCompareChars)
ConsoleWrite('V2 : FileList_Source <' & $aFileList_Source[$i] & '>' & _
' FileList_Dest <' & $sPlannummern_Dest & '>' & @CRLF)
If $sPlannummern_Source == $sPlannummern_Dest Then
ConsoleWrite('+V2 : ==> Dest-Eintrag gefunden <' & $aFileList_Dest[$y] & '>' & @CRLF)
ExitLoop
Else
ConsoleWrite('!V2 : ==> Dest-Eintrag UNGLEICH Source-Eintrag' & @CRLF)
EndIf
Next
ConsoleWrite('' & @CRLF)
Next
Alles anzeigen
Enthält das DestDir die Datei 2008-2002.txt , dann melden beide Vergleiche einen Treffer. Benennt man diese Datei z.B. in 2008-7002.txt um, dann nicht. Ich habe den o.a. Code und zwei Beispielverzeichnisse mal angehängt.
Möglicherweise ist mein Kopf aber auch nur noch in einer Fehlerschleife gefangen - war ein langer Tag
Gruß Musashi
ArraySearch im Compare-Mode war eine dumme Idee
Nicht unbedingt : Setzt man das Flag $iCompare auf 1, führt _ArraySearch auch eine Teilsuche aus.
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <File.au3>
#include <Array.au3>
Global $Window_Main
Global $Button
Global $aFileList_Source, $aFileList_Dest
Global $Vergleich, $Suche
Global $Source = @ScriptDir & '\source' , $Dest = @ScriptDir & '\dest'
Global $Plannummern_Source, $Plannummern_Dest
; Startfenster erzeugen
Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
$Window_Main = GUICreate("Standard", 200, 60)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSE_clicked_Window_Main")
$Button = GUICtrlCreateButton("Dateien wählen", 10, 10, 180, 40)
GUICtrlSetOnEvent($Button, "Button_clicked")
GUISetState(@SW_SHOW)
While 1
Wend
Func Button_clicked()
$aFileList_Source = _FileListToArray($Source, "*.*", $FLTA_FILES)
$aFileList_Dest = _FileListToArray($Dest, "*.*", $FLTA_FILES)
For $i = 1 To UBound($aFileList_Source) - 1
$Plannummern_Source = StringLeft($aFileList_Source[$i], 5)
ConsoleWrite('@@ Element' & $i & ' Source = <' & $aFileList_Source[$i] & ' PlanNr = ' & $Plannummern_Source & '>' & @CRLF)
$Vergleich = _ArraySearch($aFileList_Dest, $Plannummern_Source, 0, 0, 0, 1)
If @error Then
;Msgbox(0, "Meldung", "Fehler oder kein Datei gefunden" & @error)
ConsoleWrite('@@ Fehler oder kein Datei gefunden -> @error = ' & @error & '>' & @CRLF)
Else
;MsgBox(0, "Meldung", "Datei gefunden: " & $aFileList_Dest[$Vergleich])
ConsoleWrite('@@ Datei gefunden <' & $aFileList_Dest[$Vergleich] & '>' & @CRLF)
EndIf
Next
EndFunc
Func CLOSE_clicked_Window_Main()
Exit
EndFunc
Alles anzeigen
Gruß Musashi
Hallo gem !
Lustiges kleines Spiel, das mich an alte Gameboy-Zeiten erinnert .
Erstelle doch noch eine .zip mit ausschließlich den Dateien, die für den Betrieb unter AutoIt benötigt werden, also :
Snake.au3, icon.ico, sowie die .wav's : collision.wav ,gift1.wav, gift2.wav, gift3.wav, gift4.wav
Die wäre klein genug, um sie als Dateianhang zum Beitrag zu posten. Manche laden möglicherweise nicht so gerne von externen Quellen, und Du hättest hier gleich auch einen Downloadzähler.
Der Downloadlink auf das Gesamtpaket (alle Sprachen) kann für Interessierte ja so bleiben.
Gruß Musashi
Nachtragsfrage :
Hex(1) ergibt 00000001
Hex(1.0) ergibt 3FF0000000000000 , also wie bei Hex(2^0)
Soweit so klar.
Warum klappt es aber bei Exponenten > 0 ? Ab Hex(2^1) stimmt es, hier wird 2 und nicht 2.0 verwendet.
Gruß Musashi
Entweder habe ich in der Schule nicht gut genug aufgepasst, oder aber AutoIt rechnet falsch?!
Doch, Du hast in der Schule aufgepasst.
Wir gehen hier davon aus, dass sowohl die Basis a , als auch der Exponent n natürliche Zahlen (0,1,2,3,4 usw.) sind.
Dann ist a^n ; mit n=0 immer 1
Global $iExp, $iTest
ConsoleWrite('Beispiel Bitnugger : '& @CRLF)
ConsoleWrite('> 2^0 = ' & 2^0 & @CRLF)
ConsoleWrite('+ 2^0 = 0x' & Hex(2^0) & @CRLF)
ConsoleWrite('- -------------------------------------------------------------------' & @CRLF)
ConsoleWrite('> 0 = 0x' & Hex(0) & @CRLF)
ConsoleWrite('> 1 = 0x' & Hex(1) & @CRLF)
$iTest = 2^0 ; --> 1
ConsoleWrite('> 1 = 0x' & Hex($iTest) & @CRLF)
For $iExp = 0 To 10
ConsoleWrite('+ -------------------------------------------------------------------' & @CRLF)
ConsoleWrite(' Exponent= ' & $iExp & ' -> 2^' & $iExp & ' = ' & 2^$iExp & @CRLF)
ConsoleWrite(' 2^0 Dec = ' & Dec(Hex(2^$iExp)) & @CRLF)
ConsoleWrite(' 2^1 Hex = 0x' & Hex(2^$iExp) & @CRLF)
Next
Alles anzeigen
Konsolenausgabe :
Beispiel Bitnugger :
> 2^0 = 1
+ 2^0 = 0x3FF0000000000000
- -------------------------------------------------------------------
> 0 = 0x00000000
> 1 = 0x00000001
> 1 = 0x3FF0000000000000
+ -------------------------------------------------------------------
Exponent= 0 -> 2^0 = 1
2^0 Hex = 0x3FF0000000000000
2^0 Dec = 4607182418800017408
+ -------------------------------------------------------------------
Exponent= 1 -> 2^1 = 2
2^1 Hex = 0x0000000000000002
2^1 Dec = 2
+ -------------------------------------------------------------------
Exponent= 2 -> 2^2 = 4
2^2 Hex = 0x0000000000000004
2^2 Dec = 4
+ -------------------------------------------------------------------
Exponent= 3 -> 2^3 = 8
2^3 Hex = 0x0000000000000008
2^3 Dec = 8
+ -------------------------------------------------------------------
Exponent= 4 -> 2^4 = 16
2^4 Hex = 0x0000000000000010
2^4 Dec = 16
+ -------------------------------------------------------------------
Exponent= 5 -> 2^5 = 32
2^5 Hex = 0x0000000000000020
2^5 Dec = 32
Alles anzeigen
Interessant :
Schreibt man direkt Hex(1) , dann kommt 00000001 heraus.
Schreibt man aber Hex(2^0) , wobei 2^0 ja 1 ist, dann kommt 3FF0000000000000 heraus.
Ab Exponenten > 0 läuft alles ! Möglicherweise also wirklich ein Bug der Funktion Hex.
EDIT :
Dann wäre, unter der Voraussetzung 'natürliche Zahlen', also Hex(Int(2^0)) wohl ok, oder ? Zumindest stimmt das Ergebnis.
Gruß Musashi
Hallo Bitnugger
Würde mich auch schwer wunden, wenn dem nicht so währe... sehr gewundert hat mich aber, wie SciTE darauf reagiert und was passiert, wenn du die noch geöffnete Datei in notepad änderst und dann speichern willst!
Warum, und wo, etwas passiert, habe ich anhand des Codes schon verstanden .
Ich wollte nur, und völlig kritikfrei, darauf hinweisen, dass das Skript nach dem Test nicht mehr lauffähig ist.
Das mag den einen oder anderen Leser möglicherweise doch etwas verwirren. Der Grund ist, wie beschrieben und von Dir wohl auch beabsichtigt, dass der Test auf das laufende Skript selbst angewendet wird (-> @ScriptFullPath).
Ich habe es daher - quick and dirty - mal so modifiziert, dass eine separate Testdatei (locktest.txt) verwendet wird :
;-- TIME_STAMP 2017-11-25 18:00:00
; V 0.2 (Original by Bitnugger , modified by Musashi)
#Region ;************ Includes ************
#Include <WinAPI.au3>
#include <WinAPIFiles.au3>
#EndRegion ;************ Includes ************
If Not HotKeySet('{ESC}', '_Exit') Then Exit 1
; Statt das Skript selbst zu verwenden(@ScriptFullPath), eine Testdatei anlegen :
Global $g_sTestFilename = @ScriptDir & '\locktest.txt'
Global $g_hTestFile = FileOpen($g_sTestFilename, $FO_OVERWRITE)
If $g_hTestFile = -1 Then
ConsoleWrite('! Error creating ' & $g_sTestFilename & @CRLF)
Exit -1
Else
; Testzeilen eintragen :
FileWrite($g_hTestFile, 'Line01:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'& @CRLF)
FileWrite($g_hTestFile, 'Line02:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB' & @CRLF)
FileWrite($g_hTestFile, 'Line03:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC' & @CRLF)
FileWrite($g_hTestFile, 'Line04:DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD' & @CRLF)
FileWrite($g_hTestFile, 'Line05:EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE')
FileClose($g_hTestFile)
EndIf
Global $g_bLock = False, $g_hFile, $g_iOffset = 0, $g_iLength = FileGetSize($g_sTestFilename)
Global $g_iCreation = $OPEN_EXISTING, $g_iAccess = $GENERIC_READ, $g_iShare = BitOR($FILE_SHARE_READ, $FILE_SHARE_WRITE)
;~ _WinAPI_CreateFileEx ( $sFilePath, $iCreation [, $iAccess = 0 [, $iShare = 0 [, $iFlagsAndAttributes = 0 [, $tSecurity = 0 [, $hTemplate = 0]]]]] )
$g_hFile = _WinAPI_CreateFileEx($g_sTestFilename, $g_iCreation, $g_iAccess, $g_iShare) ; [, $iFlagsAndAttributes = 0 [, $tSecurity = 0 [, $hTemplate = 0]]]]] )
If $g_hFile = -1 Then Exit -1
ConsoleWrite('$g_hFile = ' & $g_hFile & @CRLF)
If _WinAPI_LockFile($g_hFile, $g_iOffset, $g_iLength) Then
ConsoleWrite('! File ist now locked!' & @CRLF & _
'> Now you can even try to open, change or delete the file ... you will not succeed as long as the lock has not been released! ;-)' & @CRLF & _
'- Press ESC for UnLock File and Exit!' & @CRLF & @CRLF)
$g_bLock = True
; notepad darf die Datei öffnen... aber nichts ändern! ;-)
Run('notepad.exe ' & $g_sTestFilename)
; wir selbst dürfen Daten an das Ende des Files anhängen!
Local $hFile = FileOpen($g_sTestFilename, $FO_APPEND)
FileWrite($hFile, "ConsoleWrite('Test' & @CRLF)")
; aber nicht innerhalb des gelockten Bereichs!
FileSetPos($hFile, $g_iLength - 100, $FILE_BEGIN)
Local $iWrite = FileWrite($hFile, @CRLF & @CRLF & "; ########################################################################################################" & @CRLF)
ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $iWrite --> " & $iWrite & @CRLF & "!@ " & @TAB & "#Error: " & @error & @CRLF)
; auch erstaunlich, dass FileSetPos die Position in der geöffneten Datei richtig setzt, obwohl Daten angehangen wurden.
FileSetPos($hFile, 1, $FILE_END)
Local $iWrite = FileWrite($hFile, @CRLF & @CRLF & "; ********************************************************************************************************" & @CRLF)
FileClose($hFile)
; und bitte darauf achten, wie SciTE reagiert, nachdem die Datei geändert wurde!!!
Else
ConsoleWrite("File can't locked!" & @CRLF & 'Error: ' & _WinAPI_GetLastError() & @CRLF & 'ErrorMessage: ' & _WinAPI_GetLastErrorMessage() & @CRLF)
Exit 2
EndIf
While 1
Sleep(1000)
WEnd
Func _Exit()
If $g_bLock = True Then _WinAPI_UnLockFile($g_hFile, $g_iOffset, $g_iLength)
ConsoleWrite('File ist unlocked!' & @CRLF)
_WinAPI_CloseHandle($g_hFile)
; notepad can open the file! ;-)
Run('notepad.exe ' & $g_sTestFilename)
Exit
EndFunc
Alles anzeigen
Allgemein :
Wie SciTE bei @ScriptFullPath reagiert, und das Editieren->Speichern der Datei in Notepad, fand ich auch überraschend .
Gruß Musashi
Hallo Bitnugger
Ja, erneut ein schönes Beispiel !
Im Ablauf kommt es aber zu Fehlern, ich versuche das mal halbwegs zu beschreiben :
1. Skript starten (Go) :
-> Notepad wird geöffnet
-> Am Ende des Skriptes (innerhalb von Notepad) wird folgendes angezeigt :
...
Func _Exit()
If $g_bLock = True Then _WinAPI_UnLockFile($g_hFile, $g_iOffset, $g_iLength)
ConsoleWrite('File ist unlocked!' & @CRLF)
_WinAPI_CloseHandle($g_hFile)
; notepad can open the file! ;-)
Run('notepad.exe ' & @ScriptFullPath)
Exit
EndFuncConsoleWrite('Test' & @CRLF)
; ********************************************************************************************************
Alles anzeigen
-> Notepad schließen (X)
-> Die Skriptanzeige in Scite ist nun leer
-> ESC -> Notepad wird wieder angezeigt
-> Notepad schließen (X)
-> Die Skriptanzeige in Scite bleibt leer
2. sauberes Skript erneut starten (Go) :
-> Notepad wird geöffnet
-> Am Ende des Skriptes (innerhalb von Notepad) wird folgendes angezeigt (s.o.)
-> In Notepad ESC drücken
-> Die Skriptanzeige in Scite bleibt erhalten, ist am Ende aber wieder fehlerhaft :
...
Run('notepad.exe ' & @ScriptFullPath)
Exit
EndFuncConsoleWrite('Test' & @CRLF)
; ********************************************************************************************************
(Außerdem gibt es ganz am Ende auch noch ein Sonderzeichen)
-> Notepad schließen (X)
==> so ist der Code am Ende auch gespeichert
==> erneutes Laden und Build führt zu Fehlern
Gruß Musashi