String Array als (dynamische) Parameter
String Array als (dynamische) Parameter
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?
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?
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
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

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Ach so,
Arrays werden doch immer ByRef übergeben
P.S. eine Select case könnte helfen um die richtige tabelle aus zun wählen.
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())
Zuletzt geändert von mk-soft am 03.06.2009 17:45, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Das ist korrekt: Ich möchte im Prinzip die Adresse eines beliebigen String arrays übergeben und in der Prozedur einen String Array "drüberlegen".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...
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.
Zuletzt geändert von PeterJ am 03.06.2009 17:56, insgesamt 2-mal geändert.
Müsste anders übergeben werden.
Baue mal was...
Baue mal was...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Fertig.
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.
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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
@mk-soft
Meinen tiefen Respekt! Nur die Feuerwehr ist schneller, hoffe ich jedenfalls!
Das ist genau, das was ich gesucht habe.
Herzlichen Dank nochmal!
Peter
Meinen tiefen Respekt! Nur die Feuerwehr ist schneller, hoffe ich jedenfalls!
Das ist genau, das was ich gesucht habe.
Das versuche ich noch zu verstehen, werde mal in der Doku schmökern.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.
Herzlichen Dank nochmal!
Peter
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
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

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive