Nicht erwartete Ausgabe

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Nicht erwartete Ausgabe

01 Jan 2018, 20:36

Code: Select all

ZzoInfos:="0x1d048c" . A_Tab . "0xb1480" . A_Tab . "20180102001640"
StringSplit,Wert,ZzoInfos,A_Tab
MsgBox % ZzoInfos "`r`n" wert1  A_Tab Wert2
Die Ausgabe ist nicht die Erwartete!

PS. das ungekuerzte Script sollte 2 HWND's und einen Zeitstempel
in eine Datei speichern, die von einem anderen Script wieder eingelesen werden.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
wolf_II
Posts: 2688
Joined: 08 Feb 2015, 20:55

Re: Nicht erwartete Ausgabe

01 Jan 2018, 21:02

Versuch mal mit Prozenten:

Code: Select all

StringSplit,Wert,ZzoInfos,%A_Tab%
Ich hoffe das hilft.
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Nicht erwartete Ausgabe

02 Jan 2018, 00:13

Moin Gerdi,

alternativ ('Moderne Zeiten'):

Code: Select all

ZzoInfos := "0x1d048c" . A_Tab . "0xb1480" . A_Tab . "20180102001640"
Werte := StrSplit(ZzoInfos, A_Tab)
MsgBox % ZzoInfos . "`r`n" . Werte[1] . A_Tab . Werte[2]
Gutes neues Jahr!
User avatar
divanebaba
Posts: 804
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Nicht erwartete Ausgabe

02 Jan 2018, 02:42

Ich bevorzuge, als Trennzeichen (Delimiter) für Listen, das | (pipe-Zeichen).
Gegenüber einem TAB hat es den Vorteil, daß es immer gleich geschrieben wird und nicht ausgewertet werden kann oder muss (außer, man benutzt es als Variable - was ich aber so noch nie gesehen habe).
Detailiert begründet: Für den TAB gibt es viele Schreibweisen, je nachdem, welcher Befehl benutzt wird, wie z. Bsp.:
  • A_Tab
  • {Tab}
  • `t
während das pipe-Zeichen (|) einfach nur das pipe-Zeichen ist.
Der Vorteil ist beim Verarbeiten von Listen erkennbar.
Beim Trimmen von führenden oder anhängenden Trennzeichen, hat es den Vorteil, daß man genau weiß, wieviele Stellen man, z. Bsp. bei StringTrim..., anzugeben hat, während es beim TAB kniffeliger ist.
Siehe Dein eigenes Beispiel, in welchem Du mit StringSplit das Auswerten vergessen hast. Das passiert beim pipe-Zeichen nicht so schnell.
Mein Code würde so aussehen:

Code: Select all

ZzoInfos:="0x1d048c" . "|" . "0xb1480" . "|" . "20180102001640"
StringSplit,Wert,ZzoInfos,|
MsgBox % ZzoInfos "`r`n" wert1 A_Tab Wert2 ; hier ist das Tab aus Gründen der besseren Lesbarkeit, nicht von meiner (Schüler-)Empfehlung betroffen
; In der MsgBox liegt auch keine Liste, sondern eine optische Ausgabe vor, oder wie nennt man sowas im Programmierer-Jargon?
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: Nicht erwartete Ausgabe

02 Jan 2018, 02:56

Danke euch beiden,
Anfaengerfehler, ich sollte wohl einfach frueher aufhoeren!

Mein Problem ist erledigt.

Die Ausgabe, bei bewusst uebernommenem Fehler,

Code: Select all

ZzoInfos:="0x1d048c" . A_Tab . "0xb1480" . A_Tab . "20180102001640"
String:="A_Tab"
StringSplit,Wert,ZzoInfos,%String%
MsgBox % ZzoInfos "`r`n" wert1  A_Tab Wert2
verstehe ich trotzdem nicht.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Nicht erwartete Ausgabe

02 Jan 2018, 03:06

Wenn bei der variablen-deklaration bereits expression-style verwendet wird, spräche eigentlich nichts dagegen, dies für den nachfolgnden StringSplit-befehl ebenfalls zu tun. Der befehl nennt sich dann zwar "funktionsaufruf" liest sich aber irgendwie stringenter, zumal in der darauf folgenden ausgabe per MsgBox erneut zum expression-style gewechselt wird ...

Code: Select all

wert := StringSplit(ZzoInfos, A_Tab)
BTW. AFAIK, müssen reine zahlenwerte in ausdrücken nicht als string deklariert werden.
PS. hab gerade beim review des threads gesehen, das just me bereits den passenden, korrekten code zum funktionsaufruf gepostet hatte :thumbup:
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: Nicht erwartete Ausgabe

02 Jan 2018, 03:29

Danke divanebaba,
das Pipe-Zeichen ist bei mir schon anderweitig belegt.

Nun habe ich auch die letztere Ausgabe begriffen
AHK macht aus A_Tab die Einzelbuchstaben A _ T a b und beim b trennt AHK dann.

Bobos Beitrag muss ich noch sichten.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: Nicht erwartete Ausgabe

02 Jan 2018, 03:48

Danke Bobo,
ich habe noch um Punkte ergaenzt

Code: Select all

MsgBox % ZzoInfos "`n" . wert.1  . A_Tab . wert.2 . "`t" . wert.3
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Nicht erwartete Ausgabe

02 Jan 2018, 03:57

Gerdi wrote:Danke Bobo,
ich habe noch um Punkte ergaenzt

Code: Select all

MsgBox % ZzoInfos "`n" . wert.1  . A_Tab . wert.2 . "`t" . wert.3
Würde mich wundern ob das geht?? Die (von just me, s.o.) verwendete syntax zeigt die/eine korrekte schreibweise zur abfrage der elemente eines arrays:

Code: Select all

MsgBox % ZzoInfos "`n" . wert[1] . A_Tab . wert[2] . "`t" . wert[3] 
; beachte hier auch die alternativ möglichen schreibweisen für den TAB!
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Nicht erwartete Ausgabe

02 Jan 2018, 04:18

Moin,

mit AHK geht Einiges! Ich verwende bei 'einfachen Arrays' lieber die Arraysyntax []. Weil aber in AHK auch 'einfache Arrays' Objekte sind, kann man stattdessen auch gern die Objektsyntax . nutzen. Array[1] und Array.1 beschreiben beide das Element mit dem 'Namen' 1 in Array.
User avatar
divanebaba
Posts: 804
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Nicht erwartete Ausgabe

02 Jan 2018, 04:31

Gerdi wrote:... das Pipe-Zeichen ist bei mir schon anderweitig belegt. ...
Es muss nicht unbedingt das pipe-Zeichen sein.
Wichtig ist, daß es ein einstelliges Zeichen ist.
Statt pipe, könntest Du auch ein Unterstrich, das Euro- oder Gleichheits-Zeichen, oder jedes beliebige im Code nicht benutzte (einstellige) Zeichen verwenden.
Die Nutzung von speziell TAB ist etwas kniffelig, also fehleranfällig.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Nicht erwartete Ausgabe

02 Jan 2018, 04:58

just me wrote:Moin,

mit AHK geht Einiges! Ich verwende bei 'einfachen Arrays' lieber die Arraysyntax []. Weil aber in AHK auch 'einfache Arrays' Objekte sind, kann man stattdessen auch gern die Objektsyntax . nutzen. Array[1] und Array.1 beschreiben beide das Element mit dem 'Namen' 1 in Array.
Das jahr fängt ja gut an :o Merci fürs erklärbären. :thumbup:
In den nächsten 300+ tagen sollte für mich wohl doch mal die 'obj.Begierde' aufm AHK-lehrplan stehen*. Vll findet sich dazu ja bereits ein tutorial im forum & yes, HNY everybody :mrgreen:

* na, wer sagts denn! nnnik hat bereits ein tutorial zu dieser wirklich spannenden AHK-funktionalität zu verfügung gestellt. Dafür ein dank an ihn :thumbup:
https://autohotkey.com/boards/viewtopic.php?f=7&t=41332
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Nicht erwartete Ausgabe

02 Jan 2018, 05:06

divanebaba wrote:Es muss nicht unbedingt das pipe-Zeichen sein.
Wichtig ist, daß es ein einstelliges Zeichen ist.
Statt pipe, könntest Du auch ein Unterstrich, das Euro- oder Gleichheits-Zeichen, oder jedes beliebige im Code nicht benutzte (einstellige) Zeichen verwenden.
Ähm, ... :wtf:

Code: Select all

#SingleInstance, Force
string := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
array := StrSplit(string,"JKL")  ; verwende zur trennung eine mehrstellige zeichenkette als delimiter
MsgBox % array[1] "`n" array[2]
"Otherwise, Delimiters contains one or more characters (case sensitive), each of which is used to determine where the boundaries between substrings occur in InputVar. Since the delimiter characters are not considered to be part of the substrings themselves, they are never copied into OutputArray. Also, if there is nothing between a pair of delimiters within InputVar, the corresponding array element will be blank."
User avatar
divanebaba
Posts: 804
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Nicht erwartete Ausgabe

02 Jan 2018, 05:57

BoBo wrote:... Ähm, ... :wtf: ...
Leute, muss ich jedesmal bei Adam und Eva anfangen?
Ich bin der Meinung, daß das Verwenden von einstelligen Trennzeichen, bei der Erstellung von Listen, gegenüber dem Verwenden eines TAB-Zeichens von Vorteil ist, da Listenmanipulationen, wie Trim und Bim, Split und Plit und wie sie alle heißen, übersichtlicher sind. Mittlerweile weiß ich auch, daß man auch den Namen der Freundin oder des eigenen Hamsters, als Trennzeichen, verwenden kann.
Von mir aus können die Leute auch "BoBo" als Trennzeichen verwenden, wenn sie glauben, daß sie damit besser fahren. :mrgreen: :mrgreen:
Meister BoBo, jetzt wo Du zum AHK-Jedi ernannt wurdest, empfiehlst Du einstellige oder mehrstellige Trennzeichen für den Aufbau von Listen?
Bitte erleuchte mich Bildungsgeprellten :mrgreen: :mrgreen:
garry
Posts: 3737
Joined: 22 Dec 2013, 12:50

Re: Nicht erwartete Ausgabe

06 Jan 2018, 16:16

danke, BoBo geht auch als delimiter ...

Code: Select all

#warn
#SingleInstance, Force
x:="BoBo"
string = ABCDEFGHIJKL%x%MNOPQRSTUVWXYZ
array := StrSplit(string,x)
MsgBox % array[1] "`n" array[2]
User avatar
divanebaba
Posts: 804
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Nicht erwartete Ausgabe

07 Jan 2018, 09:00

Genauer überlegt ist mein Tip tatsächlich Käse. Ich rede vom "Verarbeiten von Listen"
divanebaba wrote:Ich bevorzuge, als Trennzeichen (Delimiter) für Listen, das | (pipe-Zeichen). ... Der Vorteil ist beim Verarbeiten von Listen erkennbar.
und rate im Beispielcode dann zum Ersetzen von TAB's, welche jedoch nur Zeilenelemente trennen, anstatt das listentypische Zeilenende zu markieren.
Schweigen ist Gold. Hätte ich mal besser keinen Senf beigetragen.
Aus Rücksicht auf die Textmenge, sind beim ersten Beitrag folgende Punkte unerwähnt geblieben. Mein Hinweis gilt strenggenommen nur für das Zeilenende markierende Trennzeichen.
Also mehr dem Ersatz von `n durch ein pipe. TAB's spielen da kaum eine Rolle. Die TAB's im Beispielcode ersetzt zu haben entsetzt :crazy: :crazy: mich im Nachninein nun auch.

Zeilen prüfen, trimmen, entfernen, hinzufügen und vieles mehr zusammengefasst zu "Verarbeiten von Listen". Ich meine beim Abzählen und Trimmen von Zeichen immer wieder Schwierigkeiten bekommen zu haben.
Ein Zeilenumbruch `n wird für Trimmbefehle als ein Zeichen verrechnet, obwohl es schon aus zwei Zeichen besteht.
Ich hatte irgendwann genug und meine, mit einstelligen Trennzeichen, meine programmiertechnischen Lücken recht gut umgegangen zu haben.

Trotz all der Unsicherheiten und Meinungsvielfalten, sind folgende Punkte sicher:
  • Der Tip, die TAB's im Beispielcode durch einstellige Trennzeichen zu ersetzen, ist Käse, das gebe ich zu. :D :D
  • Einfache Trennzeichen mehrstelligen oder komplizierten Sonderzeichen vorzuziehen sehe ich als sinnvoll.
Was ist mit diesem Befehl --> Sort? Nach meinem Wissen akzeptiert dieser nur ein einstelliges Trennzeichen.
Einen Zeilenumbruch `n ist sein Standard. Einen TAB wird er vielleicht auch noch akzeptieren. Aber ein String ist, ohne weiteres, nicht vorgesehen.

Alle Angaben nach allerbestem Unwissen.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Nicht erwartete Ausgabe

07 Jan 2018, 11:38

Ein Zeilenumbruch `n wird für Trimmbefehle als ein Zeichen verrechnet, obwohl es schon aus zwei Zeichen besteht.
CR = `n
In der digitalen Textverarbeitung/-übertragung übernimmt diese Funktion die Rückführung der Schreibmarke an den Anfang der Zeile, sie wird durch ein Steuerzeichen Carriage Return (kurz CR) übertragen. Gegebenenfalls wird in der modernen Datenverarbeitung am Computer zusätzlich die Einfügemarke eine Zeile nach unten gesetzt (Zeilenvorschub, englisch line feed, kurz LF), und damit ein Zeilenumbruch erzeugt, wenn die typografische Absatzmarke ¶ Pilcrow, oder der harte Zeilenumbruch ↵ dargestellt werden soll. Quelle: Wikipedia
LF = `r
Mit dem Aufkommen der elektronischen Datenverarbeitung und der dazugehörigen Peripheriegeräte wie Drucker und Bildschirm wurde auf die Technik der Fernschreiber zurückgegriffen, um den Zeilenumbruch darzustellen und den Cursor zu steuern.

In den verschiedenen Betriebssystemen wurde aber uneinheitlich verfahren. Bei manchen wurde die Interpretation der typografischen Absatzmarke (¶ Pilcrow) durch die Zeichenkette CRLF unverändert weitergenutzt – so etwa bei Windows-üblichen Texteditoren wie Notepad – bei anderen, namentlich Unix und den Unixoiden, wurde dieser auf das einzelne Zeichen LF Line Feed (den hier thematisierten Zeilenvorschub) gekürzt. Und wieder andere Systeme kennen ein eigenes Zeichen NL oder NEL (engl. für New Line oder Next Line), oder ein Zeichen EOL (engl. für End of Line). Aus diesem Grund ist der Austausch von Textdateien zwischen unterschiedlichen Betriebssystemen erheblich erschwert. Viele Programme, zum Beispiel Browser, akzeptieren daher jedes dieser Steuerzeichen als Zeilenvorschub, auch wenn dies technisch nicht ganz korrekt ist. In anderen Programmen unterscheiden CR und LF Absatzende ¶ und den harten Zeilenumbruch ↵ oder den Spaltenumbruch.
Quelle: Wikipedia
Unix > LF
MAC > CR
WIN > CRLF


Bei der verwendung von AHK ist dies ebenfalls beim (be)schreiben von dateien mittels FileAppend von interesse ... (auszug aus der AHK online hilfe *)
End of line (EOL) translation: To disable EOL translation, prepend an asterisk to the filename. This causes each linefeed character (`n) to be written as a single linefeed (LF) rather than the Windows standard of CR+LF. For example: *C:\My Unix File.txt.

If the file is not already open (due to being inside a file-reading loop), EOL translation is automatically disabled if Text contains any carriage return and linefeed pairs (`r`n). In other words, the asterisk option described in the previous paragraph is put into effect automatically. However, specifying the asterisk when Text contains `r`n improves performance because the program does not need to scan Text for `r`n.
* ... welche man/frau sich auch in deutscher sprache anschaun kann. Einfach im menü von "en" (English) auf "de" (Deutsch) wechseln.
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Nicht erwartete Ausgabe

08 Jan 2018, 03:12

Moin,

das reizt den Erklärbären. ;)
divanebaba wrote:Ein Zeilenumbruch `n wird für Trimmbefehle als ein Zeichen verrechnet, obwohl es schon aus zwei Zeichen besteht.
Zeilenumbruch -> New Line -> NL
Der Zeilenumbruch besteht auf Windowssystemen standardmäßig tatsächlich aus zwei Zeichen: `r`n.
Diese sind (in genau dieser Reihenfolge)
  • Wagenrücklauf -> Carriage Return -> CR -> `r
  • Zeilenvorschub -> Line Feed -> LF -> `n
Wenn Du einen solchen Zeilenumbruch per Trim() Funktion entfernen willst, musst Du auch beide Zeichen angeben, z.B.

Code: Select all

RTrim(Zeile, "`r`n")
Das Ganze kommt von den guten alten mechanischen Schreibmaschinen. Bei denen wurde das Papier in einen beweglichen Schlitten bzw. Wagen (engl. carriage) eingespannt. Für jedes Zeichen gab es einen Hebel mit zugehöriger Taste. Diese Hebel waren halbkreisförmig angeordnet und bewegten sich in Richtung der Mitte der Maschine. Die Ausgangsstellung des Papierwagens war deshalb auf der rechten Seite, damit man mit dem Schreiben auf der linken Seite des Papiers beginnen konnte.

Jedesmal, wenn man eine Taste drückte, wurde der zugehörige Hebel mit dem Zeichen in Richtung Papier geschleudert und übertrug das Zeichen über ein Tintenband auf das Papier. Anschließend rückte der Papierwagen automatisch eine Zeichenbreite nach links. Auf den Hebeln befanden sich in der Regel zwei Zeichen, die übereinander angeordnet waren, z.B. Klein- und Großbuchstabe. Damit man beide nutzen konnte, gab es eine Hochstelltaste (engl. shift). DIe tat, was der Name besagt. Sie hob mechanisch die Achse an, auf der die Hebel montiert waren, damit das untere Zeichen auf den Schreibbereich des Tintenbands traf.

Für den Zeilenumbruch (NL) gab es einen eigenen großen Hebel, üblicherweise auf der rechten Seite der Maschine. Dieser kombinierte normalerweise zwei Funktionen:
  • Er schob den Papierwagen in die Ausgangsstellung auf der rechten Seite -> Carriage Return -> CR
  • Er schob das Papier um eine Zeilenhöhe nach oben -> Line Feed -> LF
Windows hat dieses System für den Zeilenumbruch in die elektrische Welt übernommen; einige andere Betriebssysteme nicht. Deshalb nochmal die bereits von BoBo erstellte Tabelle:
BoBo wrote:Zeilenumbruch:
Unix > LF > `n
MAC > CR > `r
WIN > CRLF > `r`n

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: gero and 25 guests