# Funktionen Rückgabewerte



## nimloth80 (17 Januar 2011)

Hallo zusammen,

ich habe eine Funktion entdeckt, die folgendermaßen ausschaut:
GetTextByStringId
(stResult:=StringTest,
nResultLength:='512',
stPrefix:='MASCHINE',
stID:='4');

Wie vielleicht auffällt geht es hier um dynamische Texte. 
Ich übergebe in den nResultLength die länge des zu lesenden Strings und in Prefix und ID eben das zu lesende Textelement. In stResult bekommen ich dann den Eintrag aus der dynamschinen Textdatei. Funktioniert soweit gut.


FRAGE:
wie kann eine Funktion an die ich den Wert StringTest übergebe mir diesen beschreiben wenn ich ihn nicht als Pointer übergebe?

Hab schon einige versuche gestartet das hinzubekommen. Klappt aber nicht. 

Jemand eine Idee, OHNE einen POINTER auf STRING zu übergeben?


----------



## PN/DP (17 Januar 2011)

nimloth80 schrieb:


> wie kann eine Funktion an die ich den Wert StringTest übergebe mir diesen beschreiben wenn ich ihn nicht als Pointer übergebe?


Gar nicht. Die Funktion bekommt nicht StringTest übergeben, sondern eine Kopie davon.

Wenn es denn unbedingt ohne Pointer sein muß, dann könntest Du die Funktion als vom Typ STRING deklarieren und die Funktion gibt dann eine geänderte Kopie von StringTest zurück.

Harald


----------



## nimloth80 (18 Januar 2011)

Garnicht ist gut. Die Funktion funktioniert jedenfalls . Ich hab gestern mit dem Steuerungsherstellen gesprochen. Die Funktion ist innerhalb der Bibliothek komplett leer. Die ist also direkt im Laufzeitsystem hinterleg. Da hat man wohl mehr Möglichkeiten.


----------



## StructuredTrash (18 Januar 2011)

Wozu Pointer? stResult ist als VAR_IN_OUT deklariert, das ist doch schon eine Referenz.


----------



## nimloth80 (18 Januar 2011)

Ich hab mal einen Screenie hochgeladen von der Funktion, ich sehe das VAR_IN_OUT hier nicht. Oder kann man das nicht sehen?


----------



## PN/DP (18 Januar 2011)

nimloth80 schrieb:


> Funktioniert soweit gut.
> 
> FRAGE:
> wie kann eine Funktion an die ich den Wert StringTest übergebe mir diesen beschreiben wenn ich ihn nicht als Pointer übergebe?
> ...





nimloth80 schrieb:


> Garnicht ist gut. Die Funktion funktioniert jedenfalls .


 Was funktioniert und was klappt nicht?

Eine Funktion kann nicht in einen String schreiben, wenn ihr die Adresse des Strings nicht bekannt ist.
Wenn der übergebene String nach dem Funktionsaufruf verändert ist, dann wurde er direkt als Pointer übergeben oder das Ändern des original-Strings hat außerhalb der Funktion stattgefunden, z.B. könnte das aufrufende Programm ihn vor dem Aufruf in einen Übergabe-Speicherbereich der Funktion kopieren und nach dem Aufruf aus dem Übergabe-Speicherbereich in den original-String zurückkopieren (das zurückkopieren muß im Quelltext nicht sichtbar sein!).

Könntest Du mal Angaben machen, um welche Steuerung und welches Programmiersystem es sich bei Dir handelt?
Wie ist die genaue Deklaration der Funktion GetTextByStringId?
Was verstehst Du unter "dynamische Texte"?
Irgendwie verstehe ich nicht, was Du nun genau wissen willst. Wo ist Dein Problem?

[EDIT]
OK, ich sehe jetzt Deinen Screenshot.
Da stResult als VAR_INPUT deklariert ist, muß da die Adresse des Strings übergeben werden, in den das Ergebnis geschrieben werden soll.
[/EDIT]

Harald


----------



## nimloth80 (18 Januar 2011)

Es gibt hier gerade nichts, das nicht funktioniert. Ich frage mich nur, warum diese Funktion so funktioniert. Ich benutze eine Berghof SPS mit CoDeSys 2.3.9.7. 

Ich kopier mal eben aus meinem Projekt:
Deklaration:
  stResultTest: STRING(512);
  nResultLengthTest: INT:=512;
  stPrefixTest: STRING(80):='MASCHINE';
  stIDTest: STRING(80):='4';

Funktionaufruf:
GetTextByStringId(stResult:=stResultTest, nResultLength:=nResultLengthTest, stPrefix:=stPrefixTest, stID:=stIDTest);

Rufe ich diese Funktion auf, so bekomme ich in stResultTest den String den ich haben möchte. Ich sehe hier weder Pointer noch Referenzen die übergeben werden und verstehe nicht wieso das geht.




Bei dynamischen Texten wird für die Visualisierung eine XML-Datei hinterlegt. Diese Einträge in der Datei haben ein Prefix und eine ID. Über diese beiden Werte kann in der Visu dann ein Text aus der XML-Datei angezeigt werden. Hat den Vorteil, dass man zur Laufzeit die Sprache verändern kann ohne unendlich viele Strings in CodeSys zu deklarieren.


----------



## StructuredTrash (18 Januar 2011)

Habe mich auf Beckhoff TwinCat bezogen, wo es die selbe Funktion gibt. Scheint nicht herstellerspezifisch zu sein, sondern zur eingebauten CoDeSys-Visu zu gehören. Im Lib-Quelltext ist stResult auch bei TwinCat als VAR_INPUT deklariert, im Beckhoff Infosys steht allerdings in der Funktionsbeschreibung, dass stResult als IN_OUT-Parameter dient. Anders kann es auch nicht funktionieren.


----------

