Arrays als Rückgabewerte von Funktionen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Flush

Betreff: Arrays als Rückgabewerte von Funktionen

BeitragDo, März 22, 2018 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich weiß dass Blitzarray standardmäßig Global sind. Nun habe ich versucht der Kapselung die ich seit Jahren aus anderen Programmiersprachen (Java, C++, C#) kenne Rechnung zu tragen.

Ich habe ein Lokale TestArray erstellt in dem ich ein Array das ich in einer Funktion erstellt habe speichern möchte.
Dann lasse ich mir den Inhalt anzeigen.

Ich bekomme zwar keine Fehlermeldung aber der Inhalt des Arrays ist immer leer.
Heißt das nun, daß Blitzarrays als Rückgabewert völlig unmöglich sind und ich Globale Arrays ändern muß und somit die Vorteile der Kapselung verloren gehen oder mache ich syntaktisch etwas falsch?

Hier mein Source:
BlitzBasic: [AUSKLAPPEN]

Local testArr%[361]
testArr[361] = Test()

For i = 0 To 360
Print testArr[i]
Next

Function Test()
Local arrSin%[361]
k = 0
For j = 0 To 360
sinus = Sin(j)*100
arrSin[k] = sinus
k = k + 1

Return arrSin [361]
Next
End Function



Gruß,
Flush

Jolinah

BeitragDo, März 22, 2018 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Du hast dein Return innerhalb des For, was heisst, dass nur das erste Element abgefüllt werden würde und er dann das Array zurückgibt. Da du Return arrSin[361] geschrieben hast, würde er auch nur die letzte Zahl zurückgeben, nicht das Array selbst. Schreibt man es um zu Return arrSin, so gibt es direkt einen Compiler-Fehler.

Man darf mich gerne korrigieren, aber ich glaube in BlitzBasic/3D geht das noch nicht, mit Arrays zurückgeben.
Dort ist BlitzMax schon etwas fortschrittlicher und Monkey sowie Monkey 2 kommen den modernen Sprachen wohl am nächsten Wink

Eine Möglichkeit ist jedoch:

BlitzBasic: [AUSKLAPPEN]
Type Array
Field arr[361]
End Type

Local testArr.Array = Test()

For i = 0 To 360
Print testArr\arr[i]
Next

Function Test.Array()
Local arrSin.Array = New Array

k = 0
For j = 0 To 360
sinus = Sin(j)*100
arrSin\arr[k] = sinus
k = k + 1
Next

Return arrSin
End Function

Flush

BeitragDo, März 22, 2018 18:06
Antworten mit Zitat
Benutzer-Profile anzeigen
@Jolinah
Stimmt, das Return in der Schleife ist natürlich ein Fehler aber auch nachdem ich das Return aus der Schleife nehme bleibt die Sache mit der ersten Zahl.
Ich glaube auch daß Blitz3D ein Array als Rückgabetyp nicht erlaubt.

Über den Umweg eines Types führt die Sache zum Erfolg Very Happy

Vielen Dank Jolinah!

Gruß,
Flush

Holzchopf

Meisterpacker

BeitragDo, März 22, 2018 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
So viel ich weiss, können BlitzArrays nicht von Funktionen zurückgegeben werden. Habe hier grad kein BB installiert, sonst könnte ich das prüfen.

Was aber geht, ist einfach das "original"-Array in die Funktion zu geben. Denn BlitzArrays werden als Referenz und nicht als Kopie übergeben, BlitzBasic: [AUSKLAPPEN]
Local testArr%[361]
Test(testArr)

For i = 0 To 360
Print testArr[i]
Next

Function Test(arrSin%[361])
k = 0
For j = 0 To 360
sinus = Sin(j)*100
arrSin[k] = sinus
k = k + 1
Next
End Function
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Xeres

Moderator

BeitragDo, März 22, 2018 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Fürs Protokoll: mit Dim erstellte arrays sind automatisch Global. Blitzarrays wie im Beispielcode können lokal deklariert werden, müssen aber eine Konstante Größe haben!
Mit der richtigen Signatur, sollten auch Blitzarrays als Funktionsrückgabewerte möglich sein.
BlitzBasic: [AUSKLAPPEN]
Function Test%[361]() ; Könnte klappen (nicht getestet)
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Flush

BeitragDo, März 22, 2018 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres
Klappt leider nicht, ich bekomme einen Error: Expecting '(' .
Soweit ich weiß kennt Blitz3D nur $, # und % als Identifier für Rückgabewerte, die eckigen Klammern funktionieren nicht!

Danke und Grüße,
Flush

Flush

BeitragDo, März 22, 2018 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf
Deine Version funktioniert auch Very Happy

Grüße und Danke für die schnelle Hilfe,
Flush

Xeres

Moderator

BeitragDo, März 22, 2018 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Blitzarrays werden per Referenz übergeben?! Najagut, etwas random diese Designentscheidung aber hat mich die letzten 15 Jahre auch nicht aufgehalten. Das Blitzarrays Konstant sein müssen war Abschreckung genug.

Ich dachte alle Datentypen ließen sich auch als Funktionsrückgabewerte einsetzen. Types kann man ja auch benutzen
BlitzBasic: [AUSKLAPPEN]
Function CreateTest.Ttest()
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Flush

BeitragDo, März 22, 2018 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres
Ja dass Blitzarrays eine feste Größe brauchen ist sehr nachteilig, der große Vorteil liegt in der Geschwindigkeit Ihrer Nutzung!

Leider klappt die Rückgabe eines mit Dim erstellten Arrays nicht egal wie ich es drehe. Aber die Kapselung ist mir sehr wichtig!
Die Möglichkeiten die Jolinah und Holzchopf genannt haben sind glaube ich das beste was Blitz3D hergibt.

Grüße,
Flush

Xeres

Moderator

BeitragDo, März 22, 2018 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Natürlich gibt es keine Rückgabe bei Dim Arrays - macht ja bei Globalen auch keinen Sinn.
BlitzBasic ist generell nicht gut mit Kapselung vereinbar...
Bei tatsächlich Konstanten Werten wie 360° sind Blitzarrays eine Option. Von einem "Geschwindigkeitsvorteil" würde ich nichts behaupten wollen. Wie groß soll der denn sein? Macht das einen messbaren Unterschied bei einem realen Anwendungsfall?
Bei variablen Mengen sind Types sicher besser.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group