 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 26.11.2005, 13:24 Titel: CONSTRUCTOR: Aufrufzeitpunkt |
|
|
Hallo Leute!
Ich wollte nachfragen, ob jemand den GENAUEN Punkt kennt, an dem eine Prozedur mit der CONSTRUCTOR-Klausel aufgerufen wird.
(Referenz: http://fb.exp-soft.de/r.php?s=CONSTRUCTOR ; ich hoffe, Mecki hat diesen Eintrag schon hochgeladen)
Mein Problem ist nämlich das Folgende:
Ich schreibe an einem Programm mit 2 BAS-Dateien. Eine ist dabei das Hauptmodul, die andere wird via #INCLUDE eingebunden.
In der CONSTRUCTOR-Sub wird eine FUNCTION aus der eingebundenen BAS aufgerufen; diese FUNCTION greift auf ein SHARED-Array zu, das eigentlich im Header der eingebundenen BAS dimensioniert wurde. Dennoch führt UBOUND an diesem Array zu einem Programmabsturz, freeBASIC behandelt es also, als wäre es noch nicht dimensioniert.
Wenn ich die CONSTRUCTOR-Klausel entferne, und die FUNCTION ganz normal im Hauptmodul aufrufe, funktioniert aber alles ganz so wie es soll.
Man könnte meine Frage also auch so formulieren:
Welche Anweisungen werden ausgeführt, bevor die CONSTRUCTOR-SUB ausgeführt wird?
In jedem Fall sind das DECLARE und TYPE.
DIM SHARED zählt - wie ich es sehe - nicht dazu.
Danke für eure Antworten.
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 26.11.2005, 13:36 Titel: |
|
|
nein hat er noch nicht..
Aber zu deinem Problem: include wird vom Compiler bearbeitet, ist also zum programmaufruf schon garnicht mehr existent. Die Construktor-Methode wird wahrscheinlich aber gaaanz am anfang vor allem aufgerufen, von daher musst du da drin dann wohl das feld dimensionieren. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 26.11.2005, 13:40 Titel: |
|
|
War einer meiner ersten Lösungsansätze, aber:
Fehler-Nr: 59
Illegal in a SUB or FUNCTION, found: 'SHARED'
No Way...
Evtl funzts mit COMMON SHARED, das zählte ja unter QB zu den nicht-ausführbaren Anweisungen, und hat auch unter FB noch Sonderstellungen...
//Edit:
Dieser Code funktionert:
Code: | Declare Sub Foo
Common Shared A()
GetKey
Sub Foo Constructor
Redim A(5)
? Ubound(A)
End Sub |
_________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 26.11.2005, 13:56 Titel: |
|
|
kanst du das so benutzen:
oder geht das ned?
sub foo constructor
static var()
end sub _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 26.11.2005, 14:10 Titel: |
|
|
Sicher, innerhalb der Constructor wäre das Array dann verfügbar, aber ich brauche ein Globales, und ein Static Shared existiert nicht.
Anyway, Die COMMON-Methode ist ganz passabel.
Dennoch sollte man das evtl. den Devs melden? _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 26.11.2005, 15:33 Titel: |
|
|
red auf jeden fall ma mit denen, vllt können dies dir erklären wies genau abläuft. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 26.11.2005, 23:25 Titel: |
|
|
Hatte in meinem Projekt ähnliche Probleme mit den Includeten Subs.
Der Vollständigkeit halber zu
Programmteile mittels INCLUDE in ein Listing einbinden :
Im Hauptprogramm entscheidet die Reihenfolge der Angaben, was in den Subs zur Verfügung steht.
ein Code: |
'$Include: 'Zusatzdatei.bas'
DECLARE SUB Irgendwas()
DIM WasWeisIch$(100)
|
führt dazu, das die Programmzeilen in Zusatzdatei.bas keine Ahnung von dem Gedimmten WasWeisIch$ haben ! Ebenfalls unbekannt ist die SUB Irgendwas ! (so wars bei mir, FreeBasic0.14b-WIN)
Richtig müßte das Heißen:
Code: |
DIM WasWeisIch$(100)
DECLARE SUB Irgendwas()
'$Include: 'Zusatzdatei.bas'
|
Jetzt ist von Zusatzdatei.bas aus die Sub ansprechbar und auch die WasWeisIch$(1 bis 100) sind vorhanden.
========================================
Das SHARED innerhalb einer SUB hab ich grad vorhin als Stolperfalle in nem Alten Prog gehabt.
In der FreeBasic-Hilfe steht auch was, das SHARED nur im Hauptprogramm zu stehen hat.
==> COMMON SHARED am Anfang des Programms macht die Variable für sämtliche SUBs zugänglich.
(ja ja, und wenn man das Include dann nach dem Common-Shared bringt, ist auch in der Zusatzdatei.bas die Variable greifbar.....)
========================================
Wenn man in der Zusatzdatei.bas Statische Variablen in den Subs braucht ist ja der erste Gedanke:
Code: |
REM DATEI: Zusatzdatei.bas = zum Includen in andere Listings
SUB Unterroutine()
STATIC StatischeWerteBox%(100)
'.....Routinenbefehle...
END SUB
|
So funktioniert das auch.
Aber eine Stolperfalle ist auch drin ! mit:
Code: |
REM DATEI: Zusatzdatei.bas = zum Includen in andere Listings
SUB Unterroutine()
Feldgroesse%=100
STATIC StatischeWerteBox%(Feldgroesse%)
'.....Routinenbefehle...
END SUB
|
wird nicht statisch gedimmt! beim nächsten Aufruf dieser Routine sind die erzeugten Inhalte aus dem vorigen Aufruf nicht mehr da!
ERKLÄRUNG: Wird in der SUB mittels einer direkten Zahl (z.B.100) als Feldgroeße statisch gedimmt, erfolgt dies auch statisch. Wird die Feldgroeße aber per Variable (Feldgroesse%) angegeben wird Dynamisch gedimmt !
Hm. Diese Hürde entsteht, wenn man beim Programmieren noch nicht wissen kann, wie groß das Array werden muß. Wenn der Anwender des Programms durch seine Eingaben die Größe des Arrays erst festlegt.
LÖSUNG: in einem früheren Post hat mir mjs (im letzten drittel der ersten Seite des Threads) dann erklärt, daß, und wie das trotzdem geht!
(suche nach: Statische Arrays in SUBs Dynamisch declarieren im FreeBasic-Forum
oder klicke http://forum.qbasic.at/viewtopic.php?t=1641&postdays=0&postorder=asc&start=0)
Hoffe diese Tipps können helfen
Euer Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|