Include, Globale Variablen & Private
Übersicht

TritiumBetreff: Include, Globale Variablen & Private |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
N'Abend allerseits,
seit gestern habe ich folgendes Problem: Ich möchte mein Programm in mehrere logische Stücke aufteilen, die dann in einer zentralen Datei eingebunden werden. Gleichzeitig gibt es Globale Variablen, die sowohl in der Hauptdatei als auch in den Unterdateien benutzt werden sollen. Include möchte ich möglichst vermeiden, da ich mir sonst den Einsatz von Private überflüssig mache. Wie schaffe ich es also, dass ich gleichzeitig Private verwenden und in allen Dateien auf die globalen Variablen zugreifen kann? Schonmal vielen Dank für die Hilfe! ![]() |
||
-Phoenix- |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn du diese variablen überall nutzen willst wirst du wohl oder über bei diesen variablen auf private verzichten müssen
wenn sie aber nur an gewissen stellen nötig sind, kannst du die variablen ja mit einer function/method nutzen indem du sie als argument mitschickst es kommt drauf an wie du es machen willst (du kannst übrigens private für einige globals haben und public für andere, bist nicht gezwungen alle globals gleich private zu machen) |
||
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die globalen Variablen möchte ich nicht Private machen, es geht um Types. Hab ich nicht ganz verständlich ausgedrückt, sorry ![]() Mh, ich weiß nicht ganz, wie ich das Problem beschreiben soll... Ich möchte in der Hauptdatei meine globalen Variablen definieren, die auch Types sein können, die in den Unterdateien definiert sind. Dazu muss ich die Unterdateien logischerweise in der Hauptdatei einbinden. Nun habe ich in den Unterdateien aber manche Types als Private deklariert, da sie nur innerhalb der entsprechenden Unterdatei von Bedeutung sind und man sie deshalb in der Hauptdatei nicht sehen soll. Gleichzeitig benötigt die Unterdatei einige der globalen Variablen, die ich in der Hauptdatei definiere. Ich definiere sie dort, da es durchaus sein kann, dass Unterdatei a auf eine globale Variable zugreift, die von einem Typ ist, der in Unterdatei b definiert wird. Nun stehe ich aber vor einem Dilemma: 1) Ich binde die Unterdateien per Include in der Hauptdatei ein, dann können die Unterdateien auf die in der Hauptdatei definierten globalen Variablen zugreifen, dafür verliert aber das in der Unterdatei verwendete Private seine Bedeutung --> Ich sehe in der Hauptdatei Types, die in der Unterdatei eigentlich als Private definiert wurden. 2) Ich binde die Unterdateien per Import in der Hauptdatei ein, dann sind die in den Unterdateien als Private definierten Types in der Hauptdatei nicht sichtbar, dafür wissen die Unterdateien nichts von der Existenz der in der Hauptdatei definierten globalen Variablen --> Auch Mist Ich bin mir nicht ganz sicher, ob das Klarheit schafft, aber besser kann ich es grade nicht formulieren ![]() |
||
-Phoenix- |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich würde in dem fall das Private weglassen und include benützen, ich kenn keinen weg bei IMPORT eine globale variabel zu nutzen
bei import kann nur der die importiert die functionen globale und types der importierte datei nutzen, die importierte datei muss ohne information von aussen auskommen daher kenn ich kein weg das zu erreichen, aber vielleicht weiss jemand anderes ja einen weg |
||
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe mich (unter anderem für mein Tutorial) eingehend mit BlitzMax' Innenleben und mit dem generierten Assemblercode beschäftigt. Das Problem bei der Benutzung von globalen Variablen mit Import in zwei Richtungen ist der BlitzMax-Compiler:
BlitzMax: [AUSKLAPPEN] 'main.bmx BlitzMax: [AUSKLAPPEN] 'imp.bmx Hier regt sich BlitzMax auf, weil es einzeln beide Dateien kompiliert und in der zweiten Datei nirgends festgelegt ist, wo das x herkommt. Daher liegt es nahe, x (in imp.bmx) als extern zu deklarieren. Jetzt gibt es einen "Duplicate Identifier"-Error, weil der Compiler - nur so kann ich mir das erklären - die zwei Dateien nicht hintereinander kompiliert, sondern mit der ersten beginnt und dann beim Import mit der zweiten beginnt und alle globalen Variablen in dieselbe Variablenliste aufnimmt -> x kommt einmal als intern deklarierte und einmal als extern deklarierte Variable vor. Es gibt eine Möglichkeit, den Compiler "auszutricksen". Dazu schreibt man: BlitzMax: [AUSKLAPPEN] 'imp.bmx Es gibt keine mir bekannte Möglichkeit, die es erlaubt, in der Importdatei auch x als Variablennamen zu verwenden. Das ganze müsste mit Funktionen genauso funktionieren, bei Types bin ich mir nicht sicher. mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es ist ja auch nicht weiter verwunderlich, da ein Import ja ein Stück in sich geschlossenen Code einbinden soll. Der Vorteil an Imports liegt ja gerade darin dass schon vorgefertigte Objektdateien verwendet werden können - die Compilezeit ist also massiv reduziert da die Imports nur noch gelinkt werden müssen.
Zugegeben ist das Private-Public-Verhalten von BMax hier ein Hemmschuh. Aber Import funzt wie es soll - zirkuläre Imports können auch durch anderes Design vermieden werden. |
||
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 |
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Thunder: Dein Code ergibt bei mir leider nur folgendes:
Code: [AUSKLAPPEN] Building main
Compiling:imp.bmx flat assembler version 1.69.14 (1603110 kilobytes memory) 3 passes, 2597 bytes. Compiling:main.bmx flat assembler version 1.69.14 (1603722 kilobytes memory) C:/Programme/BlitzMax/.bmx/main.bmx.gui.debug.win32.x86.s [69]: _bb_x: error: symbol already defined. Build Error: Failed to assemble C:/Programme/BlitzMax/.bmx/main.bmx.gui.debug.win32.x86.s Process complete Bladerunner hat Folgendes geschrieben: Es ist ja auch nicht weiter verwunderlich, da ein Import ja ein Stück in sich geschlossenen Code einbinden soll. [...] Zugegeben ist das Private-Public-Verhalten von BMax hier ein Hemmschuh. Aber Import funzt wie es soll - zirkuläre Imports können auch durch anderes Design vermieden werden.
Ja, mir war von vornherein bewusst, dass Import für so etwas nicht 100%ig richtig ist. Im Prinzip suche ich sowas wie ein 'Include', das Private berücksichtigt - also kurz gesagt (normal) funktionierendes Private/Public... ![]() |
||
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Tritium: Danke für den Tipp. Im Debugmodus scheint es nicht zu funktionieren. Da muss man in der main.bmx ein NoDebug unter das SuperStrict stellen (das nimmt der Hauptdatei aber die Debugfunktionalitäten):
BlitzMax: [AUSKLAPPEN] 'main.bmx (Debugmodus) mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mh, das ist allerdings schade - Debugging ist ja leider schon wichtig ![]() Bedeutet das denn, dass das Debugging dann nur in der main.bmx deaktiviert ist und in den anderen Dateien noch funktioniert? Oder muss man dann auf Debugging komplett verzichten? |
||
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit NoDebug wäre Debugging nur in der Maindatei deaktiviert. Ich habe leider keinen Weg gefunden, das ohne Debug hinzubekommen, weil sich BlitzMax im Debugmodus generell anders verhält. Aus einem, mir völlig unbekannten Grund, wird nämlich x im Debugmodus in der Assemblerdatei doppelt deklariert (einmal als extrn und einmal als public).
Man könnte auch bei jeder Kompilation die extrn-Deklaration entfernen, aber das ist doch sehr unhandlich. mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
OK, Danke! | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group