Hi Sascha,
Willkommen an Bo(a)rd. ![]()
Ich denke, du wirst dich hier wohlfühlen. Du wirst kaum woanders soviel Süchtige (nach AutoIt) auf einem Haufen finden.
Also Viel Spaß und Erfolg
Hi Sascha,
Willkommen an Bo(a)rd. ![]()
Ich denke, du wirst dich hier wohlfühlen. Du wirst kaum woanders soviel Süchtige (nach AutoIt) auf einem Haufen finden.
Also Viel Spaß und Erfolg
So würdest du aber alle Controls übereinander schreiben. ![]()
Besser:
[autoit]global $checkbox[20] , $top = 70
for $i = 1 to 20
$checkbox[$i] = GUICtrlCreateCheckbox("Das ist die" & $i & ". Checkbox",70,$top)
$top += 30
Next
Achja, wenn du kein Scite benutzt hast du das Feature natürlich nicht.
Auch in Nostalgie schwelg. ![]()
An so einem Teil habe ich vor 20 Jahren gearbeitet:
A5120 mit 8" Floppy
HD gabs noch gar nicht.
Arbeitsspeicher wahnsinnige 64 KByte RAM.
Monitorauflösung bei 64 x 16 Zeichen, monochrom grün.
Und damit haben wir Lohnabrechnung für 10.000 Beschäftigte gemacht.
Auf einer Floppy lief das Rechenprogramm, auf der anderen waren die Daten.
Für alle, die sich unter einer 8" Floppy nix vorstellen können - die Teile waren so groß, wie eine Mini-Pizza. ![]()
Mega ist manchmal so sparsam ![]()
Style: $BS_DEFPUSHBUTTON
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.
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 entfernen
#include <array.au3>
[/autoit] [autoit][/autoit] [autoit]Dim $ar1[5]
Dim $ar2[5][4]
$ar1[0]=0
$ar1[1]=1
$ar1[3]=0
$ar1[4]=4
$ar2[0][0]="A"
$ar2[1][0]="A"
$ar2[3][0]="A"
$ar2[4][0]="A"
$ar2[0][1]="B"
$ar2[1][1]="B"
$ar2[3][1]="B"
$ar2[4][1]="B"
$ar2[0][3]="D"
$ar2[1][3]="D"
$ar2[3][3]="D"
$ar2[4][3]="D"
_ArrayDisplay($ar1, "1D")
_Array2DEmptyDel($ar1)
_ArrayDisplay($ar1, "1D - leere gelöscht")
_ArrayDisplay($ar2, "2D")
_Array2DEmptyDel($ar2)
_ArrayDisplay($ar2, "2D - leere Zeilen gelöscht")
_Array2DEmptyDel($ar2,1)
_ArrayDisplay($ar2, "2D - und noch leere Spalten gelöscht")
;----------------------------------------------------------------------------------------------------------------------
; 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
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.
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] ZitatDas 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 Schrittes
Das mal als grobe Orientierung, wie du herangehen kannst.
ZitatIf $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.4
EDIT 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 aktualisiert
Edit 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
- _Array2DSortByLen
Edit 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
ZitatOriginal 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) ausgegeben
optional
- es kann eine Anzahl ($ANZ) von Elementen ab Split-Index in das Ziel-Array ausgelagert werden
- alle anderen Einträge verbleiben im Quell-Array
Edit: Bugfix in der Fehlerroutine bei zu großem Wert für $ANZ
;*******************************************************************************************************
; 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
Func _MyFunc()
Local $arOut[10] ; Größe nach Bedarf
;....
Return $arOut
EndFunc