Wie funkioniert das mit den Funktionen ?

Übersicht BlitzBasic Allgemein

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

Bura.Tino

BeitragDo, Dez 17, 2009 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh Entschuldigung großer Meister das ich in einem Forum nochmal nachfrage, wenn ich etwas noch nicht verstanden habe. Hätte ich in einem Forum natürlich nicht machen dürfen. *unwürdigist* Rolling Eyes
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

NightPhoenix

BeitragDo, Dez 17, 2009 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Welche Variablen werden überschrieben? Selbst wenn a und b global sind dürften sie nicht überschrieben werden. Va und Vb logischerweise schon.
Also was ist jetzt dein Problem mit den Funktionen?

*edit*

Dennoch solltest du in der Funktion keine Globalen Variablennamen deklarieren.

Also schreib einfach (wenn Va, Vb, a und b global):
Code: [AUSKLAPPEN]
Function Test()
    Va=a+1
    Vb=b+2
End Function
  • Zuletzt bearbeitet von NightPhoenix am Do, Dez 17, 2009 16:22, insgesamt 4-mal bearbeitet

Bura.Tino

BeitragDo, Dez 17, 2009 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ging darum wieso Va und Vb überschrieben sind. Das schien mir nicht ganz logisch.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

NightPhoenix

BeitragDo, Dez 17, 2009 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Va und Vb müssen global sein damit du sie in einer Function weiter verwenden kannst.
Wenn sie nur lokal in der Hauptschleife sind so musst du sie der Function übergeben.
Code: [AUSKLAPPEN]
Function Test(Va,Vb)
    Va=...
    Vb=...
End Function


Wenn du das nicht tust sind diese innerhalb der Function sozusagen neue Variablen mit einem Wert gleich 0.

Bura.Tino

BeitragDo, Dez 17, 2009 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
@NightPhoenix
Das ist mir natürlich klar. Deswegen hatte ich sie ja am Anfang globalisiert.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
  • Zuletzt bearbeitet von Bura.Tino am Do, Dez 17, 2009 16:41, insgesamt einmal bearbeitet

NightPhoenix

BeitragDo, Dez 17, 2009 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann hättest du diese Frage nicht stellen dürfen wenn alles klar ist. Zitat:
Dennoch würde ich gerne verstehen wieso die Variablen überschrieben werden !?


Va und Vb sind global, also werden sie auch in der Function verändert und bleiben auch für "außerhalb der Function" so verändert, weil sie global sind. Wenn sie lokal wären dann wäre das nicht so.
 

Kruemelator

BeitragDo, Dez 17, 2009 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Überschrieben passt hier nicht, sie sind in der Funktion nur "gesperrt".
Man sperrt globale Variablen in einer Funktion in dem man sie also Local deklariert, oder sie als Übergabe Variable für die Funktion angibt.

Bura.Tino

BeitragDo, Dez 17, 2009 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber genau das ist es ja was ich nicht verstehe. Nach meinem Verständnis müsste es natürlich so sein wie Du sagst, aber das ist es ja eben nicht
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

Kruemelator

BeitragDo, Dez 17, 2009 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Global Va,Vb

Function Test(Va,Vb)
   Va=Va+1
   Vb=Vb+2
End Function

Va und Vb sind hier global, das heist, sie können in jeder Funktion benutzt werden, mit einer Ausnahme:
Wenn sie für eine Funktion gesperrt wurden. Und das ist hier der Fall. Nämlich hier:
Code: [AUSKLAPPEN]
Function Test(Va,Vb)

Weil du dort Va und Vb als Übergabeparameter angegeben hast, steht Va und Vb in der Funktion nicht mehr für die globale Variable. Das selbe passiert auch wenn du das in der Funktion schreibst.
Code: [AUSKLAPPEN]
Local Va,Vb

Ist dazu da, damit man nicht ausversehen eine globalen Variable ändert, in einer Funktion, nur weil man den selben Variablennamen benutzt hat.

NightPhoenix

BeitragDo, Dez 17, 2009 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Also einfach:
Code: [AUSKLAPPEN]
Function Test()
    Va=a+1
    Vb=b+2
End Function
und schon werden sie verändert.

Falls du einige der 4 globalen (Va, Vb, a, b) sperren willst: (bsp Va, Vb)
Code: [AUSKLAPPEN]
Function Test(Va,Vb)
    Va=a+1
    Vb=b+2
End Function
so wie Kruemelator sagte.

Problem gelöst?

Bura.Tino

BeitragDo, Dez 17, 2009 16:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist gelöst, wie ich vorhin schon schrieb. Mir ging es um das Verständnis, wieso das nicht geht. Jetzt ist mir das allerdings auch klar, aber den Grund dafür finde ich nicht wirklich verständlich. Wer programmiert schließt ja solche Konflikte von vorn herein gleich aus.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

BladeRunner

Moderator

BeitragDo, Dez 17, 2009 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Augenscheinlich nicht, sonst hättest Du das Problem ja nicht gehabt Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

D2006

Administrator

BeitragDo, Dez 17, 2009 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das nennt sich Datenkapselung. Stell dir vor du machst eine tolle Funktion, die z.B. prüft ob eine übergebene Zahl eine Primzahl ist. Die ist so toll, dass du sie hier ins Codearchiv stellst. Aber nun könnte es ja zu Problemen kommen, wenn jemand deinen Code benutzt und globale Variablen hat, die genauso heißen wie die lokalen in deiner Funktion. Wäre ziemlich unvorhersehbar, was dann passiert. Und deswegen haben Funktionen ihren eigenen Variablenraum und man kann Variablen explizit als lokal deklarieren, egal ob es eine globale mit gleichem Namen gibt oder nicht.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Bura.Tino

BeitragDo, Dez 17, 2009 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
@Bladerunner
Ich hatte das Problem ja, weil es diese Variablen überschreibt und nicht, weil ich etwas nicht ausgeschlossen habe. Ich habe es auf dem für mich logischsten Weg probiert, aber das hat ja nicht funktioniert.

@D2006
In so einem Fall könnte es natürlich zu Konflikten kommen. Also das stimmt schon was Du sagst, aber wenn ich eine Funktion veröffentlichen würde, so würde ich die für die Funktion reservierten Variablen mit dazu schreiben und somit wüsste jeder welche er nicht in seinem Programm anderweitig nutzen kann.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

Midimaster

BeitragDo, Dez 17, 2009 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, wenn Du die Funktion nur selbst in Deinem einen Programm verwendest, lässt sich so ein Umweg mit unvollständiger Kapselung schon mal coden....

Weitergeben, auch in Kombinationen mit "Warnhinweisen" Laughing is nich'. Hier ist die perfekte Trennung von innen und außen ein MUSS. Und zwar auch schon dann, wenn Du sie nur innerhalb mehrerer Deiner Projekte nutzt.

Eine Funktion ist nur dann eine Funktion, wenn sie sich an diese eisernen Regeln hält. Stell Dir ein BlitzBasic vor, mit einer Liste von nur mal eben 1.000 "leider benutzten" Variablennamen. Keinen würde beim programmieren auf eine solche Sprache setzen.

Wenn eine Funktion veröffentlicht wird, dann muss Sie gekapselt sein! Ohne wenn und aber, ohne Hinweise. Oft enthalten solche Funktionen sogar mehr als 50% Code, der nur dazu dient, Versuche, falsche Werte zu übergeben, zu verhindern.

Bei Deiner Funktion heißt das: doch mit Types arbeiten.

Es ist natürlich auch ein Unding, dass BB keine ByRef kennt. Hier besteht seitens der Entwickler leider auch kein Interesse mehr, dies zu verbessern. Für B3D gilt leider das gleiche. Es wirkt manchmal wie von vor 10 Jahren. BlitzMax hat da ganz andere Ansprüche. Und es bleibt zu hoffen, das B3D irgendwann als BlitzMax-Mod angeboten wird.
  • Zuletzt bearbeitet von Midimaster am Fr, Dez 18, 2009 1:55, insgesamt einmal bearbeitet

FireballFlame

BeitragFr, Dez 18, 2009 0:41
Antworten mit Zitat
Benutzer-Profile anzeigen
B3D-SDK?
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Jamagin

Betreff: no types...

BeitragFr, Dez 18, 2009 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich arbeite sehr gerne mit Types und kann sie auch nicht mehr missen. Meine Programme bestehen eigentlich nur aus Funktionen welche vom Hauptprogramm aufgerufen werden. Und Inlinefunktionen, welche in Funktionen aufgerufen werden. In den Anfängen der Computer (C64, MSX, etc.) hab ich auch, ging ja damals nicht anders mit Goto und Gosubs gearbeitet. Aber ich finde Types schon klasse, zumal wenn man eine Listenfunktion schreiben muß, diese einfach dafür ganz gut geeignet sind. Natürlich das blättern in der Liste ist mit Types aufwendiger zu bewerkstelligen aber es ist machbar.
Also ich könnte mir ein Programmieren ohne Types nicht vorstellen aber belehrt mich eines Besseren wenn ich falsch liege.

Trau dich und benutze Types, natürlich kannst du auch mit DIM arbeiten, aber ich denke, einmal mit Types, dann ist es undenkbar oder?

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Nicdel

BeitragFr, Dez 18, 2009 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
aber ich denke, einmal mit Types, dann ist es undenkbar oder?


Finde ich nicht. Types sind zwar schön dynamisch, eine Karte speicher ich aber doch lieber in einem Array. Das ist schneller und ich kann auf einzelne Felder besser zugreifen.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Jamagin

Betreff: wg Types

BeitragFr, Dez 18, 2009 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
... sagte ja eh, daß die Listenbearbeitung bzw. der Zugriff auf einzelne Typefelder etwas komplex ist aber machbar. Klar, Maps oder Karten in Array's ist auch nicht schlecht, aber das meiste mach ich eben mit Types. Wenn ich mich zurückerinnere mein erstes Shot-em-up game, ja da hab ich auch eine Scrollmap gemacht eben mit Array's. Aber sonst sämtliche Spielobjekte hab ich alle mit den Types gelöst!
Es bleibt eh jeden selbst überlassen! Ich hab ja nur meine Meinung zu diesem Thema kundgetan!

Man sollte eben alles ausprobieren und für sich dann die beste Lösung heranziehen!

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Bura.Tino

BeitragFr, Dez 18, 2009 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich bin, auch wenn das vielleicht so rüberkam, kein Anfänger, sondern programmiere mittlerweile seit 22 Jahren. Types sind mir wohl vertraut und auch ich arbeite sehr gern damit. Allerdings kommt es natürlich darauf an was man machen will.
Wenn ich ein Tilebasiertes Spiel machen würde, dann würde ich für die Karte ein Array verwenden und für die Gegner und sowas natürlich mit Types arbeiten. Bei dem was ich gerade mache werde ich später auch auf Types umsteigen, aber am Anfang wäre das wie mit Kanonen auf Spatzen zu schießen. Deswegen wollte ich es eben noch nicht mit Types machen.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group