Mega ist manchmal so sparsam ![]()
Style: $BS_DEFPUSHBUTTON
Beiträge von BugFix
-
-
Ist das 'ne Scherzfrage ? Oder ist hier irgendwo 'ne versteckte Kamera ?
Waluev, wenn du das nicht selbst beantworten kannst, bin ich sehr, sehr traurig.
Dann sehe ich keine Zukunft für Sachsens Gymnasiasten.
$ChatDir nimmt den gewählten Pfad auf.
[autoit]
Ich weiß ja nicht welchen Sinn es macht, den eben gewählten Pfad jetzt gleich nochmal anzuzeigen.
Aber eine Möglichkeit wäre:MsgBox( 0,"Der soeben gewählte Pfad lautet: " & $ChatDir )
[/autoit] -
Ich kanns nicht ändern, irgendwie liebe ich Arrays :]
Hier eine Löschfunktion für leere Zeilen / Spalten
_Array2DEmptyDel(ByRef $avArray [, $Col=0])
- arbeitet mit 1D / 2D Arrays
- es werden leere Einträge entfernt
- in 2D Arrays können optional statt Zeilen leere Spalten entfernt werden
- Standardeinstellung ist Zeilen entfernenSpoiler anzeigen
[autoit]#include <array.au3>
[/autoit] [autoit][/autoit] [autoit]Dim $ar1[5]
[/autoit] [autoit][/autoit] [autoit]
Dim $ar2[5][4]$ar1[0]=0
[/autoit] [autoit][/autoit] [autoit]
$ar1[1]=1
$ar1[3]=0
$ar1[4]=4$ar2[0][0]="A"
[/autoit] [autoit][/autoit] [autoit]
$ar2[1][0]="A"$ar2[3][0]="A"
[/autoit] [autoit][/autoit] [autoit]
$ar2[4][0]="A"
$ar2[0][1]="B"
$ar2[1][1]="B"$ar2[3][1]="B"
[/autoit] [autoit][/autoit] [autoit]
$ar2[4][1]="B"
$ar2[0][3]="D"
$ar2[1][3]="D"$ar2[3][3]="D"
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$ar2[4][3]="D"_ArrayDisplay($ar1, "1D")
[/autoit] [autoit][/autoit] [autoit]
_Array2DEmptyDel($ar1)
_ArrayDisplay($ar1, "1D - leere gelöscht")_ArrayDisplay($ar2, "2D")
[/autoit] [autoit][/autoit] [autoit]
_Array2DEmptyDel($ar2)
_ArrayDisplay($ar2, "2D - leere Zeilen gelöscht")
_Array2DEmptyDel($ar2,1)
_ArrayDisplay($ar2, "2D - und noch leere Spalten gelöscht");----------------------------------------------------------------------------------------------------------------------
[/autoit]
; Function _Array2DEmptyDel(ByRef $avArray [, $Col=0])
;
; Description Delete empty Array elements
; Delete all emty Rows or all empty Columns
; Works also with 1D-Array (only Rows)
;
; Parameter $avArray Given Array
; optional $Col set 1 to delete empty Columns; default is 0 to delete empty Rows
;
; Return Succes -1 ByRef the given Array without empty Elements, resized
; Failure 0 and set @error = 1
;
; Author BugFix ([email='bugfix@autoit.de'][/email])
;----------------------------------------------------------------------------------------------------------------------
Func _Array2DEmptyDel(ByRef $avArray, $Col=0)
If ( Not IsArray($avArray) ) Then
SetError(1)
Return 0
EndIf
Local $UBound2nd = UBound($avArray,2)
If @error = 2 Then
Local $arTMP[1]
For $i = 0 To UBound($avArray)-1
If StringLen($avArray[$i] > 0) Then
If StringLen($arTMP[UBound($arTMP)-1]) = 0 Then
$arTMP[UBound($arTMP)-1] = $avArray[$i]
Else
ReDim $arTMP[UBound($arTMP)+1]
$arTMP[UBound($arTMP)-1] = $avArray[$i]
EndIf
EndIf
Next
Else
If $Col = 0 Then
Local $arTMP[1][$UBound2nd], $val, $len
For $i = 0 To UBound($avArray)-1
$val = ''
For $k = 0 To $UBound2nd-1
$val &= $avArray[$i][$k]
Next
If StringLen($val) > 0 Then
$len = 0
For $k = 0 To UBound($arTMP,2)-1
$len &= StringLen($arTMP[UBound($arTMP)-1][$k])
Next
If $len = 0 Then
For $k = 0 To $UBound2nd-1
$arTMP[UBound($arTMP)-1][$k] = $avArray[$i][$k]
Next
Else
ReDim $arTMP[UBound($arTMP)+1][$UBound2nd]
For $k = 0 To $UBound2nd-1
$arTMP[UBound($arTMP)-1][$k] = $avArray[$i][$k]
Next
EndIf
EndIf
Next
Else
Local $arTMP[UBound($avArray)][1], $val, $len
For $k = 0 To $UBound2nd-1
$val = ''
$notEmpty = 0
For $i = 0 To UBound($avArray)-1
$val &= $avArray[$i][$k]
If StringLen($val) > 0 Then
$notEmpty = 1
ExitLoop
EndIf
Next
If $notEmpty = 1 Then
$len = 0
For $i = 0 To UBound($arTMP)-1
$len &= StringLen($arTMP[$i][UBound($arTMP,2)-1])
Next
If $len = 0 Then
For $i = 0 To UBound($avArray)-1
$arTMP[$i][0] = $avArray[$i][$k]
Next
Else
ReDim $arTMP[UBound($avArray)][UBound($arTMP,2)+1]
For $i = 0 To UBound($avArray)-1
$arTMP[$i][UBound($arTMP,2)-1] = $avArray[$i][$k]
Next
EndIf
EndIf
Next
EndIf
EndIf
$avArray = $arTMP
Return -1
EndFunc ;==>_Array2DEmptyDel -
Dein Skript ist recht umfangreich, hab im Moment nicht die Zeit mich da reinzulesen.
Aufgrund der Fehlermeldung gehe ich davon aus, dass [$z] einen Wert außerhalb der definierten Arraygröße angenommen hat.
Debugge doch mal $z über die Console ( markieren und Alt+D ). -
Hab jetzt nicht in dein Script geschaut, aber wahrscheinlich hätte dir "ContinueCase" geholfen.
[autoit]$a = 7
[/autoit]
Select
Case $a < 9
MsgBox(0, '', "< 9")
ContinueCase ; auch die kommende Bedingung wird geprüft
Case $a = 7
MsgBox(0, '', "= 7")
EndSelect -
Grundsätzlich ja.
Wobei du nicht die Punkte angibst, die abgefahren werden sollen, sondern vergleichst ob unter Beibehaltung der Fahrtrichtung der nächste Punkt innerhalb der möglichen Route liegt. Anderenfalls mußt du mit Änderung der Fahrtrichtung reagieren. -
Also mal eben ein kleines Beispiel hierzu geht nicht.
Um den skizzierten Ablauf zu codieren sind geschätzte 500 Codezeilen notwendig. Es ist wirklich sehr umfangreich.Ich hab doch schon den ersten Schritt getan, einen Pseudo-PAP erstellt.
Mach den nächsten Schritt und erfasse die Streckenkoordinaten. Solltest du gar keinen Plan haben, wie du da herangehen sollst, überlege ob dieses Projekt als Anfangsobjekt geeignet ist.
Vielleicht solltest du dich erst mal mit Funktionen und Abläufen im Detail vertraut machen und dann solch komplexe Abläufe gestalten.
-
Ermittele im Vorfeld ob Ubound($Array1) oder Ubound($Array2) größer ist.
[autoit]
Wenn das neue Array größer ist, passe das alte mit ReDim an die Größe an.If UBound($arrayNeu) > UBound($arrayAlt) Then ReDim $arrayAlt[UBound($arrayNeu)]
[/autoit] -
Zitat
Das mit dem Debuggen versteh ich nicht ganz, wo genau muss ich $i markieren, habs ja öfters im Code?
Ich hatte es auf die Schleife in deiner Func vergleich() bezogen, dort war der Fehler ja aufgetreten.ZitatJetzt interessiert mich eigentlich nur noch, warum es über meinen _ArrayMaxIndex nicht geht.
Zitat_ArrayMaxIndex
Returns the index where the highest value occurs in the array._ArrayMaxIndex() liefert den Index zurück an dem der größte Wert steht. Das kann also auch 0 sein.
-
Ist das ein Flash-Game?
Ist zwar nicht sehr schwer, aber recht umfangreich zu programmieren.
Schritt 1
Die Strecke muß in Screenkoordinaten umgesetzt werden, also alle zur Strecke gehörenden Screenkoordinaten müssen in einem Array erfaßt werden.Schritt 2
Du mußt ein eindeutiges Erkennungsmerkmal für dein Fahrzeug haben. Sollte kein Problem sein, da auf der Strecke dein Fahrzeug das einzige Element mit rot und gelb ist ( PixelGetColor ).Schritt 3
Programmablauf
- Startposition des Fahrzeugs ermitteln ( PixelSearch )
- nächste mögliche Position des Fahrzeugs ermitteln, aktuelle Position + mögliche Richtung auf der Strecke
- Lenkimpuls geben
- in diesem Bereich mußt du dann wiederum mit PixelSearch() die aktuelle Position ermitteln
- dabei immer Abgleich mit Streckenwerten für die Richtungsbestimmung des nächsten SchrittesDas mal als grobe Orientierung, wie du herangehen kannst.
-
Zitat
If $array_alt[$i] = ^ ERROR
Weist darauf hin, dass $array_neu[$i] kein gültiger Parameter für dieses Array ist.
Vermutlich ist $array_neu kleiner als $array_alt, somit verweist [$i] auf ein nicht existierendes Element.
Mach doch mal ne Consolenausgabe für $i ( $i markieren, Alt+D ). Dann siehst du an welcher Stelle es crasht. -
Hi,
da es ja doch so nach und nach immer mehr wird, habe ich mich entschlossen mal alle meine Array-UDF's in eine "ArrayMore.au3" zu packen.Falls noch mehr hinzukommt, werde ich dies hier aktualisieren.
Edit 30.12.2013
Bugs in _Array2DEmptyDel() und _Array2DDblDel() beseitigt. Aktuelle Version: v 0.4EDIT 25.07.07
Es ist doch einiges hinzugekommen, bzw. wurden die Funktionen, die bisher nur mit 1D-Arrays arbeiteten (oder Dim 2 begrenzt auf 2) erweitert auf 2D ohne Begrenzung.<<NEU>>
Die Calltips für alle hier aufgeführten Funktionen, inklusive Löschfunktion für die Tipps der vorigen Version im Programm: "SetCallTip.au3".NEU 23.02.08:
- Hinzugefügt: _Array2DAdd, _Array2DPop, _Array2DPush
- Calltipps aktualisiertEdit 02.03.08
Die Datenbank hatte mein Edit verschluckt :D, also nun nochmal:
- ein Bug in _Array2DDblDel beseitigt (nur das erste Doppel wurde bereinigt)
- alle Variablen lokal deklariert (nun dürfte kein Fehler mehr bei Verwendung von Opt('MustDeclareVars') auftreten.Edit 17.05.08
Durch die neue Prod 3.2.12.0 einige kleine Veränderungen in den Funktionen:
- _ArraySort_2ary
- _Array2DSortByLenEdit 05.11.08
- neue Funktion: _Array2DMinMax()
- noch nicht in die ArrayMore.au3 eingebunden
- vorerst hier zu finden_ArraySort_2ary()
sortiert 2D Arrays mehrstufig (z.B. nach Spalte 1 und für gleiche Werte in 1 wird nach Spalte 2 sortiert)
Habe dazu eine alternative, leistungsfähigere Version erstellt, die mit SQLite arbeitet.
_Array2DSortFree()
Die aktuelle Version, hier im selben Thread, Post 15
Diese Funktion kann aber nicht in die ArrayMore.au3 integriert werden - Erklärung s. hier_Array2DSortByLen()
sortiert 1D/2D Arrays nach Länge der Einträge_Array2DDblDel()
entfernt doppelte Einträge in 1D/2D Arrays_Array2DInsert()
fügt 1 Element (leer oder mit Daten) an gegebener Position ein
arbeitet mit 1D/2D Arrays_Array2DSplit()
splittet 1D/2D Arrays ab gegebener Position in 2 Arrays
optional wird eine Anzahl Elemente in ein Zielarray exportiert_Array2DEmptyDel()
löscht leere Zeilen; in 2D Arrays Zeilen oder optional Spalten_Array2DJoin()
verbindet 2 Arrays zu einem, 1D/2D -Arrays, auch untereinander
Größe der 2.ten Dimension muß nicht übereinstimmen
ab Prod 3.2.12.0 eine ähnliche Standard-UDF - aber nur für 1D-Arrays: _ArrayConcatenate()_Array2DDelete()
löscht eine Zeile aus einem 1D/2D -Array am gegebenen ZeilenIndex_Array2DSearch()
sucht nach allen oder einmaligem Auftreten des Suchbegriffs in einem 1D/2D -Array
ein Array mit dem/den gefundenen Index(es) wird zurückgeliefert
ab Prod 3.2.12.0 eine vergleichbare Standard-UDF: _ArrayFindAll()_Array2DMirror()
spiegelt ein 2D-Array, Zeilen werden zu Spalten und umgekehrt_SubArray2DGetEntry()
gibt den Wert eines Elements aus einem 1D/2D-Array als Element eines 1D/2D-Arrays zurück_SubArray2DSetEntry()
setzt den Wert eines Elements in einem 1D/2D-Array als Element eines 1D/2D-Arrays_Array2DAdd()
fügt einen Eintrag einem 1D/2D-Array am Ende hinzu
Spaltenwerte in 2D-Arrays sind durch '|' zu trennen
wird die Funktion ohne Wertübergabe aufgerufen, wird die Arraygröße um 1 erhöht_Array2DPop()
gibt den letzten Wert eines 1D/2D-Arrays zurück und löscht ihn gleichzeitig vom Array
Arraygröße wird dabei um 1 verringert_Array2DPush()
fügt Einzelwerte oder Arrays in 1D/2D-Arrays ein ohne deren Größe zu verändern
es kann vom Anfang oder vom Ende eingefügt werden, überzählige Elemente werden 'herausgeschoben'
(in etwa wie bei LIFO und FIFO in Registern)DL bisher: 1430
-
Zitat
Original von lordalex
und wie würde so ein code aussehen?Das hängt natürlich vom Parcour ab. Wo willst du denn rumfahren ? Auf 'ner Web-Site oder einem selbst erstellten Kurs ?
Gib mal ein paar mehr Infos, dann kann ich dir auch mehr Hinweise geben.
-
Wozu brauchst du die Länge des Tastendrucks, wenn du den Parcour abfahren willst?
Da müßtest du ja einen Geschwindigkeitsvektor berücksichtigen, um zu wissen, nach welcher Zeit dein Cursor einen Eckpunkt erreicht hat.
Zeitsteuerung ist also wenig erfolgversprechend.Du brauchst also eine Schleife,in der du ständig deine Position innerhalb deines Parcours ermittelst + der Position, die du bei Beibehaltung der Richtung im nächsten Schritt erreichen würdest, und mit entsprechenden Steuerbefehlen reagierst.
Um nicht an die Begrenzungen zu stoßen, kannst du ja eine Pufferzone einbauen (Puffer-Position = Position +/- 2 Pixel) -
Hi,
und wieder was für meine Array-UDF-Sammlung
Im Hilfe-Forum war letztens das Thema Array splitten aktuell.
Das habe ich zum Anlaß genommen und eine Splitfunktion erstellt._Array2DSplit(ByRef $AR_SOURCE, ByRef $AR_TARGET, $iFROM=-1 [, $ANZ=-1])
Die Variable für Ziel-Array muß auch als Array deklariert werden. Die Anzahl der Elemente spielt keine Rolle, die Größe wird innerhalb der Funktion angepaßt.
- arbeitet mit 1D und 2D Arrays
- Anzahl der Elemente in 2.ter Dimension beliebig- splittet ein Quell-Array ($AR_SOURCE) ab Array-Index ($iFROM)
- Einträge vor Split-Index verbleiben im Quell-Array
- Einträge ab Split-Index werden im Ziel-Array ($AR_TARGET) ausgegebenoptional
- es kann eine Anzahl ($ANZ) von Elementen ab Split-Index in das Ziel-Array ausgelagert werden
- alle anderen Einträge verbleiben im Quell-ArrayEdit: Bugfix in der Fehlerroutine bei zu großem Wert für $ANZ
Spoiler anzeigen
[autoit];*******************************************************************************************************
[/autoit]
; Funktion _Array2DSplit(ByRef $AR_SOURCE, ByRef $AR_TARGET, $iFROM=-1 [, $ANZ=-1])
;
; Beschreibung Splittet ein 1D/2D Array ab Indexposition, optional wird Anzahl Einträge ausgelagert
;
; Parameter $AR_SOURCE Array mit Ausgangsdaten
; $AR_TARGET Array mit abgesplitteten Daten
; $iFROM Index ab dem gesplittet wird
; optional $ANZ Anzahl Elemente, die abgesplittet werden sollen
;
; Rückgabe Erfolg -1
; Fehler 0 @error = 1 Ausgangsvariablen sind keine Arrays
; @error = 2 kein Startindex oder Index außerhalb Bereich
;
; Autor BugFix ([email='bugfix@autoit.de'][/email])
;*******************************************************************************************************
Func _Array2DSplit(ByRef $AR_SOURCE, ByRef $AR_TARGET, $iFROM=-1, $ANZ=-1)
If ( Not IsArray($AR_SOURCE) ) Or ( Not IsArray($AR_TARGET) ) Then
SetError(1)
Return 0
EndIf
If $ANZ = -1 Then $ANZ = UBound($AR_SOURCE)-$iFROM
If ( $iFROM < 0 ) Or ( $iFROM > UBound($AR_SOURCE)-1 ) Or ( $ANZ < 1 ) Or ( $ANZ > (UBound($AR_SOURCE)-$iFROM) ) Then
SetError(2)
Return 0
EndIf
Local $UBound2nd = UBound($AR_SOURCE,2)
If @error = 2 Then
Local $arTMP[1]
ReDim $AR_TARGET[$ANZ]
ReDim $arTMP[UBound($AR_SOURCE)-$ANZ]
For $k = 0 To $iFROM-1
$arTMP[$k] = $AR_SOURCE[$k]
Next
$j = 0
For $i = $iFROM To $iFROM+$ANZ-1
$AR_TARGET[$j] = $AR_SOURCE[$i]
$j += 1
Next
For $i = $iFROM+$ANZ To UBound($AR_SOURCE)-1
$arTMP[$k] = $AR_SOURCE[$i]
$k +=1
Next
$AR_SOURCE = $arTMP
Return -1
Else
Local $arTMP[1][$UBound2nd]
ReDim $AR_TARGET[$ANZ][$UBound2nd]
ReDim $arTMP[UBound($AR_SOURCE)-$ANZ][$UBound2nd]
For $k = 0 To $iFROM-1
For $i = 0 To $UBound2nd-1
$arTMP[$k][$i] = $AR_SOURCE[$k][$i]
Next
Next
$j = 0
For $i = $iFROM To $iFROM+$ANZ-1
For $l = 0 To $UBound2nd-1
$AR_TARGET[$j][$l] = $AR_SOURCE[$i][$l]
Next
$j += 1
Next
For $i = $iFROM+$ANZ To UBound($AR_SOURCE)-1
For $l = 0 To $UBound2nd-1
$arTMP[$k][$l] = $AR_SOURCE[$i][$l]
Next
$k +=1
Next
$AR_SOURCE = $arTMP
Return -1
EndIf
EndFunc ;==>_Array2DSplit -
[autoit]
Func _MyFunc()
[/autoit]
Local $arOut[10] ; Größe nach Bedarf
;....
Return $arOut
EndFunc -
Ich verstehe nicht, wozu eine kpl. Datei in die Zwischenablage kopiert werden soll.
Es reicht doch der Pfad, alles andere kann dann doch in weiteren Schritten folgen. -
Hi,
ich war mal so frei, deine Syntaxstruktur anzupassen.
Sonst kann man sich da schlecht reinlesen.
Spoiler anzeigen
[autoit]Func _FileChangeDir($lFilePath)
[/autoit]
Local $er = FileChangeDir($lFilePath)
If $er = 0 Then; Pfad konnte nicht vom Standard FileChangeDir geändert werden
Local $i, $lVolLetter
Local $lPos = StringInStr($lFilePath, ":")
If $lPos > 1 Then
Local $lVolName = StringLeft($lFilePath, $lPos)
Local $fPath = StringMid($lFilePath, $lPos+1)
Local $var = DriveGetDrive("all")
If NOT @error Then
For $i = 1 to $var[0]
If (DriveGetLabel($var[$i]) & ":") == $lVolName Then
$lVolLetter = $var[$i]
Exitloop
EndIf
Next
If $lVolLetter <> "" Then
$er = FileChangeDir($lVolLetter & $fPath)
If $er = 1 Then
Return("1"); Arbeitsverzeichnis erfolgreich geändert
Else
Return("0"); Fehler im Dateipfad
EndIf
Else
Return("0"); kein Volume mit diesem Namen gefunden
EndIf
EndIf
Else
Return("0"); ungültiger Volumename
EndIf
Else
Return("1"); Arbeitsverzeichnis erfolgreich geändert (Standard FileChangeDir)
EndIf
EndFunc -
Die Syntax ist korrekt, sollte gehen.
Laß dir doch mal vor der Schleife $var ausgeben:
_ArrayDisplay($var)
Dann kannst du sicher sein, dass auch Daten übergeben werden. -
Auch von mir:
til lykke med fødselsdagen
