Seite 1 von 2

Array aus Procedure übergeben...

Verfasst: 29.08.2005 14:09
von Ghosty1967
Hallo Leutz...

Also ich bin eigentlich VB'ler, habe aber einige echte Vorteile von PB entdeckt. Ich frage mich allerdings, wie ich einen Array innerhalb einer Procedure erstellen und an den Haupt-Programmteil übergeben kann.
Das Problem ist eigentlich nur eine Übung... Ich möchte gerne den VB-Befehl "Split" in PB realisieren, welcher einen String nach Vorgabe trennt und das Ergebnis als Array zurückgibt.

In VB sieht das so aus 8):

Code: Alles auswählen

===================
Dim Array() as String
MainString="Dies ist ein Test"
Array()=Split(MainString," ")
===================
Als Ergebins hätte das Array eine Dimension von 4 (0...3) und sähe so aus
Array(0)="Dies"
Array(1)="ist"
Array(2)="ein"
Array(3)="Test"
Wie kann man soetwas in PB realisieren... oder gibt es da schon einen Befehl für ?
Wäre für Codeschnipsel sehr dankbar !

Edit by Kiffi: Code-Tags gesetzt

Verfasst: 29.08.2005 14:14
von Kiffi
Du kannst mit [c]StringField()[/c] Deinen VB-Split relativ gut simulieren:

Syntax

Ergebnis$ = StringField(String$, Index, Trennzeichen$)

Beschreibung

Gibt den Feldinhalt des 'String$' an der angegebenen Stelle 'Index' zurück.
'Trennzeichen$' ist das Zeichen, das zur Aufteilung des Strings benutzt wird
(nur ein Zeichen lang). Die erste 'Index' Position ist 1.

Beispiel:

Code: Alles auswählen

  For k=1 To 6
    Debug StringField("Hello I am a split string", k, " ")
  Next
Grüße ... Kiffi

Verfasst: 29.08.2005 14:16
von PMV
Dies sollte dir weiter helfen :D

Code: Alles auswählen

Dim Array.s(4)

MeinString.s ="Dies ist ein Test" 

For num = 1 To 4
  Array(num) = StringField(MeinString, num, " ")
Next

For num = 1 To 4
  Debug Array(num)
Next
MFG PMV

Verfasst: 29.08.2005 14:16
von Tafkadasom2k5

Code: Alles auswählen

Syntax

Ergebnis$ = StringField(String$, Index, Trennzeichen$) 
Beschreibung

Gibt den Feldinhalt des 'String$' an der angegebenen Stelle 'Index' zurück. 'Trennzeichen$' ist das Zeichen, das zur Aufteilung des Strings benutzt wird (nur ein Zeichen lang). Die erste 'Index' Position ist 1. 

Beispiel: 
  For k=1 To 6 
    Debug StringField("Hello I am a split string", k, " ") 
  Next 

Sowas? Die PB Hilfe hilft manchmal schon wunder... ;)
(Oder bin ich aufm falschen Dampfer mit meiner interpretation deiner Frage?)

Gr33tz
Der Marc :allright:

(PB Rulez....bleib dran!!! :allright: :allright: :allright: )

[EDIT]
Mist...erst 3ter...ich dachte ich wär schnell...naja- 56K is eben wunderbar.....mmmpf..
[/EDIT]

Verfasst: 29.08.2005 15:24
von Ghosty1967
Also, erstmal danke...

Den "StringField" Befehl hab ich ja gefunden, aber...

Ich möchte das Array nicht vor dem Procedure-Aufruf dimensionieren müssen, sondern dies soll die Procedure selber übernehmen, sodas ich nach dem Aufruf:

a()=ZerhackDenString("Dies ist ein Test"," ")

ein Array zurückbekomme. Ich müßte ja sonst vorher immer genau wissen, wieviele Teilstrings im übergebenen String enthalten sind. Wieder einmal in VB

Code: Alles auswählen

Dim Array() as String

Array()=Split("Dies ist ein Test"," ")

For i=0 to UBound(Array())   ;(UBound ermittelt die höchste Dimension)
   Print Array(i)
Next i
Ergebnis:
Dies
ist
ein
Test

Wie ich das sehe, muß ich ja bei "StringField" immer einen Index angeben, von dem ich aber nicht immer weiß, welches sein höchster Wert ist.
Wenn ich z.B unbekannte Strings übergebe.

Edit by Kiffi: Code-Tags gesetzt

Verfasst: 29.08.2005 15:35
von Kiffi

Code: Alles auswählen

TestString$ = "Dies ist ein Test"

AnzahlSpaces = CountString(TestString$, " ")

Debug Str(AnzahlSpaces) + " Leerzeichen vorhanden"

Dim MeinArray$(AnzahlSpaces)

For Zaehler = 0 To AnzahlSpaces 
  MeinArray$(Zaehler) = StringField(TestString$, Zaehler+1, " ")
  Debug MeinArray$(Zaehler)
Next 

Debug "Fertig!"
Grüße ... Kiffi

P.S.: Bitte zukünftig den Code in Deinen Beiträgen mit Code-Tags
versehen! Code-Tags können mit dem gleichnamigen Button beim
Verfassen einer Nachricht in den Beitrag eingefügt werden.

Verfasst: 29.08.2005 16:14
von Ghosty1967
Hmmm, das leuchtet mir schon ein :allright:, und es ist auch absolut
nachvollziehbar, da ich soweit schon war. Aber ich danke Dir auf alle
Fälle, das Du versucht hast mir zu helfen !
Ich versuche es noch einmal anders zu formulieren...

Ist es möglich aus einer Procedure mittels "ProcedureReturn" einen Array
an das Programm zurückzugeben und wenn ja wie :D oder geht das
vielleicht mittels "NewList" :oops:

Code: Alles auswählen

Procedure.s ArrayDemo()
  dim t.s()
  t.s(1)="Nur"
  t.s(2)="um"
  t.s(3)="zu"
  t.s(4)="zeigen"
  t.s(5)="was"
  t.s(6)="ich"
  t.s(7)="meine"
  ProcedureReturn t.s()
  ;oder so ähnlich ;)
EndProcedure

Verfasst: 29.08.2005 16:23
von benpicco
Arrays in PureBasic sind immer global verfügbar.
Das selbe gillt auch für Strukturen. Es wäre also sinnlos, ihn als Rückgabewert einer Prozedur zu haben, das ginge dann auch schlecht, weil die Procedur ja nur einen Wert zurückgeben kann.
Ich weiß ja nicht wie das in VB ist, aber ich finde das gut so <)

Verfasst: 29.08.2005 16:26
von ts-soft
>> das ginge dann auch schlecht, weil die Procedur ja nur einen Wert zurückgeben kann
zum Beispiel den Pointer zum Array :D , brauchste aber wirklich nur, wenn Du eine DLL erstellst.

Verfasst: 29.08.2005 16:26
von hardfalcon
Einen Array nicht, aber er kann in einvordefiniertes Array die Daten schreiben. Also ein Interface... Schau mal in der Hilfe unter Interface nach... das steht in der linken Spalte der PB-Hilfe, ca. in der Mitte... :wink: