Array aus Procedure übergeben...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Array aus Procedure übergeben...

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag 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]
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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.
a²+b²=mc²
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag 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
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag 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 <)
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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:
Antworten