Page 1 of 1

Probleme eines Script-Noobs

Posted: Mon 27. Apr 2015, 11:28
by gianni
Sehr geehrter Herr Jetter!

Leider benötige ich wieder mal Ihre Hilfe.

Ich bin gerade dabei AngelScript zu erkunden und scheitere bereits bei meinem ersten Versuch.

Was ich erreichen möchte:

Ich möchte eine CSV-Datei mit Delimiter ";" Zeilenweise einlesen und mit "string@[]@ split die einzelnen Werte in ein Array schreiben.
Anschliessend möchte die einzelnen Strings in eine Zahl umwandeln, damit ich damit rechnen kann.

Das Zeilenweise auslesen und ausgeben im Trace-Fenster funktioniert so weit problemlos, doch beim splitten in ein array komme ich schon einige Tage nicht weiter. Wenn ich das Beispiel aus dem Manual ausprobiere bekomme ich beim Compilieren immer eine Fehlermeldung.

Code: Select all

void main ()
{

string str = "A;B;;C";
string@[]@ arr = split(str, ";");

}
Fehlermeldung des Compilers:
Compiling and Starting Script:
C:\Dokumente und Einstellungen\GS\Desktop\OwncloudSynch\Membrain\Netzwerke\atest_string.as

C:\Dokumente und Einstellungen\GS\Desktop\OwncloudSynch\Membrain\Netzwerke\atest_string.as (1, 1) : INFO : Compiling void main()
C:\Dokumente und Einstellungen\GS\Desktop\OwncloudSynch\Membrain\Netzwerke\atest_string.as (5, 7) : ERR : Object handle is not supported for this type
C:\Dokumente und Einstellungen\GS\Desktop\OwncloudSynch\Membrain\Netzwerke\atest_string.as (5, 18) : ERR : No matching signatures to 'split(string, const string)'

2 Error(s).
0 Warning(s):

Könnten Sie mir dabei bitte auf die Sprünge helfen? Wenn es nicht zuviel verlangt ist, könnten Sie mir auch bitte ein Beispiel geben, wie ich auf einen String im Array zugreifen kann und ihn in eine Zahl verwandeln kann.

Mit freundlichen Grüssen!
Gianni

Re: Probleme eines Script-Noobs

Posted: Mon 27. Apr 2015, 13:04
by TJetter
Hallo Gianni,

das Code-Beispiel in der Hilfe zu 'split' ist leider veraltet, bitte entschuldigen Sie die Umstände!.
'split' ist nun eine Methode der String-Klasse und funktioniert wie im unten stehenden Beispiel. Darin werden die eingelesenen Strings auch in Zahlen konvertiert und ein bisschen damit gerechnet, so dass der Zugriff auf das Array hoffentlich klar wird.

Viele Grüße

Code: Select all

void main ()
{
	string str = "5.2;136.6;561.97e-4";		// Input string	
	string[] arr = str.split(";");			        // Array of sub strings	
	
	Trace("\r\n");						// Blank line in trace window
	
	uint len = arr.length();				// Get number of detected sub strings
	
	// Print all sub strings
	for (uint i = 0; i < len; i++)			
	{
		Trace(arr[i] + "\r\n");
	}
	
	double[] values;		// Array for converted values
	double sum = 0;			// Sum over all values
	
	values.resize(len);		// Adjust size of target array
	
	// Convert all values, print thm and sum them up
	for (uint i = 0; i < len; i++)
	{
		values[i] = StringToDouble(arr[i]);
		Trace(values[i] + "\r\n");
		sum += values[i];
	}
	
	Trace("Sum of all values = " + sum + "\r\n");
}

Re: Probleme eines Script-Noobs

Posted: Mon 27. Apr 2015, 13:38
by gianni
Sg. Herr Jetter!

Vielen Dank für die rasche Antwort.

Ich werde jetzt mal mit dem Code-Beispiel ein bisschen herumspielen. Nach kurzem Durchlesen des Codes glaub ich aber, dass ich damit für meine Problemstellung weiterkommen werde.

mfg
Gianni

Re: Probleme eines Script-Noobs

Posted: Mon 27. Apr 2015, 17:01
by gianni
Sehr geehrter Herr Jetter!

Das Beispielskript das Sie mir freundlicherweise zu Verfügung gestellt haben deckt genau die gebrauchte Funktionalität ab und funktioniert auch soweit - wenn da nicht Dezimalkomma und Dezimalpunkt wären.

Die CSV-Datei die ich einlese und weiterverarbeiten möchte, ist die Datei die durch das TrainValidate.as Skript mit Dezimalkomma erzeugt wird.
Beim einlesen bräuchte ich aber einen Dezimalpunkt.

Gibt es eine Funktion mit der ich ein "search und replace" in einem String vornehmen kann. Beim Durcharbeiten des Manuals habe ich leider nichts entsprechenes entdecken können (kann aber auch an mir liegen :( ).

Ein manchmal verzweifelter
Gianni

Re: Probleme eines Script-Noobs

Posted: Mon 27. Apr 2015, 21:27
by TJetter
Hallo Gianni,

ein serach-and-replace gibt es zwar nicht so direkt. Eine solche Funktion wäre aber recht einfach zu implementieren, wenn Sie die Funktion

Code: Select all

int findFirst(const string &in subStr, int startIdx)
der string-Klasse verwenden würden. Damit könnten Sie die Strings nach "," durchsuchen und einzelne gefundene Zeichen innerhalb der strings wie bei einem array mit str = "." ersetzen.

Es geht aber noch viel einfacher:
Die Funktion 'StringToDouble' gibt es auch in einer Version mit zwei Parametern. Der erste Parameter ist der umzuwandelnde string wie im angegebenen Beispiel. Der zweite string ist der Dezimaltrenner.
Also einfach:

Code: Select all

values[i] = StringToDouble(arr[i], ",");
Viele Grüße

Edit: Und hier der Vollständigkeit halber noch der Code zum Ersetzen von Zeichen in einem string, vielleicht brauchen Sie es ja doch mal wieder:

Code: Select all

void main()
{
	string inTest = "1,23";
	string outTest = "";
	if (SearchAndReplace(inTest, outTest, ",", "."))
	{
		Trace(outTest + "\r\n");
	}
}

bool SearchAndReplace(string str, string &out outStr, string searchChar, string replaceChar)
{
	int idx = 0;
	bool ok = (searchChar.length() == 1) && (replaceChar.length() == 1);
	int strLen = str.length();
	
	if (ok)
	{
		do
		{
			idx = str.findFirst(searchChar, idx);
			if (idx >= 0)
			{
				str[idx] = replaceChar[0];
				idx++;
			}
		} while ((idx >= 0) && (idx < strLen));
	}
	
	outStr = str; 
		
	return ok;
}

Re: Probleme eines Script-Noobs

Posted: Tue 28. Apr 2015, 12:56
by gianni
Sg. Herr Jetter!

Ich bin immer wieder fasziniert einerseits von Membrain und andererseits von Ihrem raschen und kompetenten Support.

Ein herzliches Dankeschön, jetzt da dank Ihrer Hilfe die Kernfunktionalität meines geplanten Scriptes sichergestellt ist, kann ich mich voller Optimismus an das eigentliche Script machen.

Nochmals ein herzliches Dankeschön!

Mfg
Gianni