Read Coordinates from Config into Array

06/08/2015 08:20 D2_sid#1
Hallo, ich hab ein kleines Programm geschrieben und versuche es gerade etwas Benutzerfreundlicher zu machen. Ich lese aus einer config.ini Koordinaten und speichere sie einzeln in Variablen. Das sieht so aus:

In der config.ini
Code:
[Koordinaten]
TopX=100
TopY=115
Im Script
Code:
 Global $x1 = IniRead("config.ini", "Koordinaten", "TopX", "0")
 Global $x2 = IniRead("config.ini", "Koordinaten", "TopY", "0")
Dann verwende ich sie im Code an mehreren Stellen etwa so
Code:
 $pos = PixelSearch ( $x1, $x2, $y1, $y2, $a, $b)
Wobei y1 und y2 weitere Koordinaten sind.

Um die config.ini nicht mit den ganzen Koordinaten zu überfluten würde ich sie lieber gleich paarweise einlesen und in arrays abspeichern.

In der config.ini
Code:
[Koordinaten]
Top=100, 115
Und im Script dementsprechend

Dann verwende ich sie im Code an mehreren Stellen etwa so
Code:
 $pos = PixelSearch ( $x[0], $x[1], $y[0], $y[1], $a, $b)
Wobei y1 und y2 weitere Koordinaten sind.

Meine Frage ist: Wie kann ich die Koordinaten aus der config.ini in einem array abspeichern?
06/08/2015 13:08 lolkop#2
Mit einer ini könntest das ganze so lösen:
Code:
IniWrite('config.ini', 'Koordinaten', 'Top', '100, 115')
$split = StringSplit(IniRead('config.ini', 'Koordinaten', 'Top', ''), ', ', 3)
For $x In $split
   ConsoleWrite($x & @CRLF)
Next
Besser wäre es aber komplett auf inis zu verzichten, da diese ineffizient sind.
Am Besten alles über einfache FileRead/Write Operationen handhaben und im Script mit einem kompletten "Config-Array" alles abdecken.

Beispiel:
Code:
Dim $config[10]=['Wert1','Wert2','Wert3','Wert4','Wert5','Wert6','Wert7','Wert8','Wert9','Wert10']

SaveConfig('config')
GetConfig('config')

Func SaveConfig($configName)
   Local $data, $fileHandle = FileOpen($configName,2)
   For $value In $config
	  $data &= $value&'|'
   Next
   FileWrite($fileHandle,StringTrimRight($data,1))
   FileClose($fileHandle)
EndFunc

Func GetConfig($configName)
   $config = StringSplit(FileRead($configName),'|',2)
EndFunc
06/08/2015 15:03 D2_sid#3
Also ich bin mit der config.ini eigentlich ganz zufrieden. Allerdings sieht meine config zur Zeit so aus

Code:
[AUTOPOT]
LifeX=193
LifeY=72
ManaX=187
ManaY=83

[AUTOBATTLE]
TopX=100
TopY=115
BotX=1815
BotY=955
CharX=960
CharY=537
MobX=909
MobY=69
Color1=0xE004E0
Tolerance=10
Vermutlich kommen auch noch weitere Koordinaten dazu, und es werden mehr und mehr Einträge und Variablen. Deshalb wollte ich sie übersichtlicher gestalten, nämlich so:

Code:
[AUTOPOT]
Life=193, 72
Mana=187, 83

[AUTOBATTLE]
Top=100, 115
Bot=1815, 955
Char=960, 537
Mob=909, 69
Color=0xE004E0
Tolerance=10
Und wenn ich die Einträge jeweils in arrays einlese, dann bräuchte ich auch nur die Hälfte der Variablen. Nur ich weiß nicht wie ich diese comma-seperated values in einem array speichere.
06/08/2015 15:46 BladeTiger12#4
Ganz einfach:

Nur PseudoCode & was lolkop sagte stimmt 100%. Würde ich dir auch raten.
Code:
$life = IniRead("...ini", "AUTOPOT", "Life")
$split = StringSplit($life, ",", 2)

$curhp = int($split[0])
$maxHP = int($split[1])
06/08/2015 16:58 lolkop#5
Quote:
Originally Posted by D2_sid View Post
Code:
[AUTOPOT]
LifeX=193
LifeY=72
ManaX=187
ManaY=83

[AUTOBATTLE]
TopX=100
TopY=115
BotX=1815
BotY=955
CharX=960
CharY=537
MobX=909
MobY=69
Color1=0xE004E0
Tolerance=10
Die Aufteilung sieht doch schon ganz gut aus. Was spricht denn dagegen das einfach alles in eine Variable zu lesen?

willst du kompfortabel auf die Werte zugreifen können, bietet sich in dem Fall eine einfache Enum Funktion an.

Beispiel:
Code:
Dim Enum $LifeX, $LifeY, $ManaX, $ManaY, $TopX, $TopY, $BotX, $BotY, $CharX, $CharY, $MobX, $MobY, $Color1, $Tollerance
Dim $config[14]
Mit $config[$LifeX] könnte dann z.B. der Wert von LifeX einfach angesprochen werden, mit $config[$ManaX] der entsprechende Wert von ManaX.
Das Prinzip ist, so hoffe ich, denkbar einfach verständlich.

Quote:
Originally Posted by D2_sid View Post
Code:
[AUTOPOT]
Life=193, 72
Mana=187, 83

[AUTOBATTLE]
Top=100, 115
Bot=1815, 955
Char=960, 537
Mob=909, 69
Color=0xE004E0
Tolerance=10
Hiervon kann man dir nur arg abraten, da du die ohnehin schon ineffiziente und unkompfortable Ini Variante damit noch unübersichtlicher und ineffizienter machen würdest.

Einen minimalen Aufwand bekommst du natürlich wie bereits erwähnt nur mit direkten File-Operatonen hin.

Der von mir vorher gepostete Beispielcode würde sowohl für 10 Werte, als auch für 10000 Werte exakt gleich aussehen (zum Speichern 6 Zeilen, zum Lesen 1 Zeile), während du bei Nutzung der Ini Funktionen für jeden Wert zum lesen und auch schreiben jeweils eine Zeile bräuchtest.
Entsprechend wächst die Komplexität des Codes mit der Ini-Variante Linear um den Faktor 2, während sie mit File-Operationen statisch (unverändert) bliebe.