String Array als (dynamische) Parameter

Anfängerfragen zum Programmieren mit PureBasic.
PeterJ
Beiträge: 28
Registriert: 05.02.2009 21:15

String Array als (dynamische) Parameter

Beitrag 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?
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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.
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
PeterJ
Beiträge: 28
Registriert: 05.02.2009 21:15

Beitrag 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.
Zuletzt geändert von PeterJ am 03.06.2009 17:56, insgesamt 2-mal geändert.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Müsste anders übergeben werden.

Baue mal was...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
PeterJ
Beiträge: 28
Registriert: 05.02.2009 21:15

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Little John

Beitrag von Little John »

Nicht schlecht! :allright:
Willste das nicht nach "Tipps und Tricks" verschieben?

Gruß, Little John
Antworten