Import & Script-Splittung

08/15/2014 02:23 nofuture#1
Hallo,

ich hänge seit längerem an einem Problem und hoffe,
dass ihr mir weiterhelfen könnt dieses zu lösen :)

Im speziellen geht es dabei um die ImageSearch UDF.

Bislang bestanden meine Scripts nur aus
  • main.au3 (Hauptscript)
  • imagesearch.au3 + imagesearchdll.dll
  • settings.ini
  • Bilder-Ordner (hier sind die benötigten Bilder für imagesearch)
Da das Script mittlerweile mehrere 1000 Zeilen lang ist,
möchte ich es gern der Übersicht halber,
sowie um die Funktionsdateien auch in anderen Scripten
nutzen zu können in mehrere Dateien verpacken,
etwa so:

Code:
/bot/ (@ScriptDir)
   /Bilder/*
   /Funktionen/
      /ImageSearch.au3
      /ImageSearchDLL.dll
      /image.au3 (eigene Image-Funktionen, die auf der imagesearch aufbauen)
   /settings
      /settings.ini
   /main.au3
Hier nun ein Beispielinhalt für die image.au3
Code:
#include "ImageSearch.au3"
Func _test()
   Local $x, $y
   If _ImageSearchArea("../bilder/map.JPG", 1, 3330, 490, 3630, 590, $x, $y, 100) = 1 Then
      MsgBox(0, "", "Test erfolgreich")
   Else
      MsgBox(0, "", "Test fehlgeschlagen")
   EndIf
EndFunc
_test()
Führe ich jetzt die image.au3 direkt aus, wird das Bild gefunden und es erscheint die MsgBox mit Test erfolgreich.
Kommentiere ich nun den Funktionsaufruf _test() aus, ändere den Bilfpfad in "bilder/map.JPG" und starte die main.au3

main.au3
Code:
#include "Funktionen\image.au3"
_test()
bekomme ich die MsgBox Test fehlgeschlagen.

Der Fehler liegt scheinbar beim Import der ImageSearch.au3 oder der .dll,
den Bildpfad habe ich bereits mit FileExists überprüft.
Die ImageSearch.au3 habe ich auch bereits testweise aus dem Ordner entfernt und stattdessen in AutoIT3\Includes kopiert,
genauso habe ich die dll aus dem Verzeichnis nach %windir%\system32\ verschoben.

Ich hoffe ihr habt ne Idee, was ich falsch mache bzw ändern / ausprobieren könnte.


MfG
nofuture
08/15/2014 03:33 Requi#2
Wenn du etwas includest, ist das Script in deinem Script als hättest du es selbst geschrieben.
Heißt der Pfad ist nicht mehr "/ImageSearch.au3" sondern "/Funktionen/ImageSearch.au3"

Aber um Doppelincludes zu vermeiden, würde ich alle Includes in die Hauptklasse schreiben.
08/15/2014 03:52 c0w#3
bin ja echt kein geordneter coder, aber dieses funktionen in verschiedene scripte schieben und dann includen hab ich echt nie verstanden, wenn ich mir ne func für was schreib kommt das ins mainscript in ne func region.
das is doch irgendwie typish c++ programmierer oder :D 10 code teile, 12 dlls :D
08/15/2014 04:50 Requi#4
Quote:
Originally Posted by c0w View Post
bin ja echt kein geordneter coder, aber dieses funktionen in verschiedene scripte schieben und dann includen hab ich echt nie verstanden, wenn ich mir ne func für was schreib kommt das ins mainscript in ne func region.
das is doch irgendwie typish c++ programmierer oder :D 10 code teile, 12 dlls :D
Das ist typisch Programmierer. Wenn man schon programmiert, dann auch geordnet. Bei AutoIt habe ich jetzt auch nie darauf geachtet, aber für C# etc. schon. Aber selbst bei AutoIt kann das von Vorteil sein, da du es wie ein include nutzen kannst für spätere Projekte.
08/15/2014 11:03 nofuture#5
Danke für den Denkanstoß Requi.

Auch wenn es mich jetzt etwas wundert - aber der Includeverweis der ImageSearch.au3 stimmt.
Ich denke, wäre das der Fehler gewesen, hätte mich das Problem auch nicht so lange beschäftigt, da der Funktionsaufruf _ImageSearchArea(...) einen unknown function-fehler hervorrufen dürfte und nicht einfach nur FALSE bzw. 0 zurückgeben.

Das Problem war wohl vielmehr die Architektur (x86 / x64) und der Aufruf der DLL-Datei,
Abhilfe hat es geschafft die ImageSearchDLL.dll in den Hauptordner zu verschieben, alternativ kann auch der Aufruf der DLLCall-Funktion in Zeile 47 der ImageSearch.au3 in meinem Fall auf Funktionen/ImageSearchDLL.dll geändert werden.

bezüglich der doppel-includes stimme ich dir in gewisser Weise zu,
in diesem Fall jedoch soll die image.au3 jedoch die ImageSearch.au3 "ablösen",
sprich alle Bildvergleichsfunktionen, die die ImageSearch.au3 benutzen, sollen hier noch ein Grundgerüst bekommen, um den Funktionsaufruf zu erleichtern.

Hier mal ein Beispiel für eine der Funktionen:
Code:
Func _checkImage($img, $iniDescription, $tolerance, $click = 0, $speed = 10)
   ; $imgpath wird als "bilder" deklariert, $img soll der reine Bildname ohne Endung sein
   $img_complete = $imgpath & "/" & $img & ".JPG"
   ; _getKoordDB liefert top,right,bottom,left als Array zurück - die Daten werden innerhalb der Funktion aus der .ini gezogen.
   $koordArray = _getKoordDB($iniDescription)
   $result = _ImageSearchArea($img_complete, 1, $koordArray[3], $koordArray[0], $koordArray[1], $koordArray[2], $x, $y, $tolerance)
   ; bei Bedarf Mausklicks und Success- oder Fail-Returnwerte
   If $result = 1 Then
	  If $click = 1 Then
		 MouseClick("left", $x, $y, 1, $speed)
	  ElseIf $click = 2 Then
		 MouseClick("left", $x, $y, 2, $speed)
	  EndIf
	  Return 1
   Else
	  Return 0
   EndIf
EndFunc

@c0w
ich muss dich leider enttäuschen - auch wenn ich mich schon länger mal mit C beschäftigen wollte, habe ich bis heute noch keine einzige Zeile code in C geschrieben ;)

Bezüglich der Includes ist es natürlich geschmachsabhängig, ob man gerne alles in einer Datei hat oder den Code "sinnvoll" auf verschiedene Dateien splittet (wobei der Sinn natürlich immer im Auge des Betrachters liegt),
ich denke es kann auf verschiedene Arten Sinn machen:

1) Allgemeine Funktionen wie die ImageSearch-UDF oder auch meine image.au3 (auch wenn diese in anderen Projekten ggf. wegen der Ordnerstruktur ggf. nicht 1:1 übernommen werden kann) - hier spart man sich einfach einiges an Arbeit bei weiteren Projekten, bei denen ähnliche Dinge benötigt werden.
2) Aufteilen verschiedener Code-Segmente, sodass an mehreren Stellen "gleichzeitig" gearbeitet werden kann, ohne ständig im Code hoch- und runterscrollen zu müssen.
3) Übersichtlicher Code, sodass leicht nachvollziehbar ist, was wann und wo gestartet wird.
08/15/2014 20:50 c0w#6
Naja bei mir ists oft der falls, dass ich noch eine Funktion erweiter änder oder kombiniere, wenn ich jetzt 5 includes hab muss ich zick Dateien durchsuchen, so nur mein Main Script. Daher hab ich gern Alles in einer Datei strg f und ich bin sofort an der richtigen func
08/15/2014 21:27 YatoDev#7
Quote:
Originally Posted by Requi View Post
Aber um Doppelincludes zu vermeiden, würde ich alle Includes in die Hauptklasse schreiben.
#include-once
08/16/2014 00:12 butter123#8
Quote:
Originally Posted by c0w View Post
Naja bei mir ists oft der falls, dass ich noch eine Funktion erweiter änder oder kombiniere, wenn ich jetzt 5 includes hab muss ich zick Dateien durchsuchen, so nur mein Main Script. Daher hab ich gern Alles in einer Datei strg f und ich bin sofort an der richtigen func
strg+j springt sogar direkt zur func, bei der der cursor gerade ist ;)