Seite 1 von 2

String Array als (dynamische) Parameter

Verfasst: 03.06.2009 16:17
von PeterJ
Grüß Gott aus München!

In meiner Anwendung habe ich mehrere String Arrays
z.B. Global Dim Master1.s(100), Dim Master2.s(100), etc.

diese möchte ich von einer Routine wahlweise verarbeiten/manipulieren.

Procedure Modify.s(Array Table.S(1))
...
Table(..)=...
...
EndProcedure

Nun habe ich das Problem, das die Festlegung welcher String Array verarbeitet werden soll erst zum Programmablauf ergeben, d.h. ich bekomme die Adresse des arrays und soll nun den Call auf die Modify Routine ausführen. Wenn das ginge also wie folgt:
; *ref enthält die Adresse des zu verarbeitenden Arrays:
Modify(*ref)
Nur leider geht das nicht weil, *ref nicht auf eine Structure verweist. Den String Array in eine Structure zu legen, und dann noch auf die Elemente zu verweisen, habe ich leider auch nicht hingekriegt.

Komischerweise geht aber folgendes:
Modify(@master1) ; ist eigentlich auch nur eine Adresse

Kann mir jemand den Trick zeigen?

Verfasst: 03.06.2009 17:24
von mk-soft
Hallo Peter,

wirst wohl nicht daran vorbeikommen ein weiteren Parameter zu übergeben welches die Kennung (type) des Array beschreibt.

Procedure Modify.s(Type.i, Array Table.S(1))

FF :wink:

Verfasst: 03.06.2009 17:28
von Kaeru Gaman
wieso typ? sind doch alles strings, oder?

ich glaub, er hat grad ein problem, das Array byRef zu übergeben, das ist alles...

Verfasst: 03.06.2009 17:38
von mk-soft
Ach so,

Arrays werden doch immer ByRef übergeben

Code: Alles auswählen

Dim tabelle1.s(1000)
Dim tabelle2.s(100)

Procedure modify(Array tabelle.s(1))

  Debug ArraySize(tabelle())
  
EndProcedure

modify(tabelle1())
modify(tabelle2())
P.S. eine Select case könnte helfen um die richtige tabelle aus zun wählen.

Verfasst: 03.06.2009 17:44
von PeterJ
Kaeru Gaman hat geschrieben:wieso typ? sind doch alles strings, oder?
ich glaub, er hat grad ein problem, das Array byRef zu übergeben, das ist alles...
Das ist korrekt: Ich möchte im Prinzip die Adresse eines beliebigen String arrays übergeben und in der Prozedur einen String Array "drüberlegen".

Die folgende Notation ist falsch, sollte aber das Problem erklären:

Global Dim Table.S(10)
*ref=@table
Modify(*ref)
...
Procedure Modify(Array ParameterTable.S(1)) ;
oder alternativ, wäre ich auc zufrieden mit sowas:
Procedure Modify(*inptr)
*inptr\intable ... ; also das Adressieren mit Pointer auf eine logische Tabelle.

@mk-soft
modify(tabelle1())
modify(tabelle2())
Das ist mir schon klar, dass dies so geht, nur ich habe in Wirklichkeit 50 arrays, d.h. um hier eine dynamische Call Struktur aufzubauen müßte ich
eine unschöne If oder Select Logik für jeden einzelnen Array aufbauen und dann entscheiden, was für ein Call der richtig ist:
Also so z.B. so:
if situation=1
modify(tabelle1())
elseif situation=2
modify(tabelle2())
...
endif
das erschien mir wenig elegant, und wartungsfreundlich.

Verfasst: 03.06.2009 17:47
von mk-soft
Müsste anders übergeben werden.

Baue mal was...

Verfasst: 03.06.2009 17:59
von mk-soft
Fertig.

Code: Alles auswählen

Dim tabelle1.s(10)
Dim tabelle2.s(20)

Structure udtStringArray
  text.s[0]
EndStructure

Procedure Fill(*tabelle.udtStringArray, lenght)

  Protected i
  
  For i = 0 To lenght ; - 1
    *tabelle\text[i] = "Fill " + Str(i)
  Next
  
EndProcedure

Procedure Ausgabe(*tabelle.udtStringArray, lenght)

  Protected i
  
  For i = 0 To lenght ; - 1
    Debug *tabelle\text[i]
  Next
  
EndProcedure

Debug "Test Fill T1 ..."
Fill(@tabelle1(), ArraySize(tabelle1()))
Debug "Test Fill T2 ..."
Fill(@tabelle2(), ArraySize(tabelle2()))
Debug "Test Ausgabe T1 ..."
Ausgabe(@tabelle1(), ArraySize(tabelle1()))
Debug "Test Ausgabe T2 ..."
Ausgabe(@tabelle2(), ArraySize(tabelle2()))

Debug "Ausgabe Array T1"
For i = 0 To ArraySize(tabelle1())
  Debug tabelle1(i)
Next

Debug "Ausgabe Array T2"
For i = 0 To ArraySize(tabelle2())
  Debug tabelle2(i)
Next
P.S. In einer Structure mit ein Array mit der grösse Null "text.s[0]" hat eine besondere bedeutung und kann nur ByRef verwendet werden.

Verfasst: 03.06.2009 18:08
von PeterJ
@mk-soft
Meinen tiefen Respekt! Nur die Feuerwehr ist schneller, hoffe ich jedenfalls!
Das ist genau, das was ich gesucht habe.
mk-soft hat geschrieben:P.S. In einer Structure mit ein Array mit der grösse Null "text.s[0]" hat eine besondere bedeutung und kann nur ByRef verwendet werden.
Das versuche ich noch zu verstehen, werde mal in der Doku schmökern.
Herzlichen Dank nochmal!
Peter

Verfasst: 03.06.2009 18:18
von mk-soft
Mit Arraygrösse Null "Text.s[0]" wird die Bereichsprüfung abgeschaltet und man muss die Bereichsprüfung selber durchführen.
Somit ist es da durch erst möglich Zeiger auf Strukturen zu übergeben wo man vorher nicht weiss wie viele Elemente diese haben.

Steht leider nicht in der Hilfe!

FF :wink:

Verfasst: 03.06.2009 19:18
von Little John
Nicht schlecht! :allright:
Willste das nicht nach "Tipps und Tricks" verschieben?

Gruß, Little John