|
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 |
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 05.10.2005, 21:33 Titel: Statische Arrays in SUBs Dynamisch declarieren ?!? |
|
|
Hallo erst mal...
ist ja ne feine Sache. Bei Qbasic hatte ich mit den Arrays in SUBs immer meine Probleme. Bei Freebasic scheint das nun viel besser zu sein.
Jedoch schaff ich folgende Hürde immer noch nicht:
Für mein Prog brauche ich ein Statisches Array in einer Sub. Also ein Array so dimensionieren, daß bei weiteren Aufrufen der SUB die Daten immer noch im Array drin liegen.
Freebasic sagt, nimm einfach STATIC anstelle DIM, und schon gehts.
Ja klar, sicher, so gehts auch:
SUB Beispiel()
STATIC Pixel%(16200) ' hab dafür gesorgt, daß dies nur beim 1. Aufruf passiert
END SUB
in dieser Art funktioniert das scheinbar einwandfrei, aber so kann ichs nicht gebrauchen. Ich (Programmierer) weiß beim Coden noch nicht, wie groß das Array sein muß, da der Anwender dies im Programmlauf beeinflussen wird.
Also probier ich:
SUB Beispiel2()
Gross%=Lang%*Breit% 'nur so, ohne tieferen Sinn
STATIC Pixel%(Gross%)
END SUB
in dieser Version wird das Array scheinbar trotzdem Dynamisch, also beim nächsten SUB-Aufruf ist nix mehr drin. Bei Qbasic wirds ja in der Hilfe so aufgeführt, wenn mit Constanten gedimmt wird (dim a%(22)) dann statisch, wird mit Variablen gedimmt, dann dynamisch.
Nun steh ich vor der Entscheidung, Blick ichs nicht oder gehts nicht?
Kann jemand helfen, wie ich mit Variablen statisch dimme oder zumindest klar sagen, daß das schlichtweg nicht geht?
Danke im Voraus
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 05.10.2005, 21:35 Titel: |
|
|
Dann benutze doch einfach ein DIM SHARED.
jb |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 05.10.2005, 21:44 Titel: |
|
|
Thx jb, das ist sicher eine Möglichkeit,
aber nur bedingt.
Mein Ziel ist eigentlich, eine einzige SUB zu erzeugen,
die im Hauptteil nix einzutragen hat (Dim Shared müßte ja dahin,
sodaß ich z.B. euch diese einzige SUB dann hierreinstelle, egal in was
für ein Prog Ihr(/Ich) das dann einfügt, egal welche Variablennamen
Ihr(/ich) bereits verwendet, soll dat ding dann trotzdem laufen.
Somit wäre DIM SHARED umständlicher zu handhaben.
Trotzdem nochmals Danke _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 05.10.2005, 21:47 Titel: |
|
|
Hm, da hast du recht, aber du könntest doch eine .BI-Datei zusammen mit deinem Prog "ausliefern", in
der das Feld dimensioniert wird, und die includest du dann mit
Code: |
$INCLUDE 'BLABLABLA.BI*
|
in der SUB.
Dann nimmst du noch einen schön langen Feldnamen, wie etwa
Eastler_dart_programmsowieso_feld1, und dann passts.
jb |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 05.10.2005, 21:57 Titel: |
|
|
hm.
über die $Include-Geschichte hab ich in anderer Art schon mal gegrübelt und angetestet.
Wenn ich durchhalte und genügend Zeit finde, sollens mehrere Tools für freebasic werden. oder besser gesagt, SUBs für in die Programme
und Progs, die ganz speziell nur den Quellcode dieser SUBs (sozusagen von außen her) bearbeiten. Für einfacheres Programmieren halt.
Und dabei überlege ich immer noch, ob ich euch/mir zumuten kann, diese SUBs dann per $Include ins Programm einzubinden.
Bei dieser Überlegung ist mir dann klar geworden, daß diese $Includes MEHRFACH vorkommen müßten.
Und im Zusammenhang mit dem Thema hier, wäre dann ein Include am Anfang, mit den ganzen DIMs und weiter hinten dann für die SUBs nochmal welche.
Könnte zu viel werden für nen einfachen Überblick?
Aber hast recht, wenn gar nix geht, ist das ein Weg. _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 05.10.2005, 22:01 Titel: |
|
|
Wenn du eine Toolsammlung machen solltest, wäre es wohl das Beste, ein $include am Anfang zu machen...
Andere Idee: Könnte man nicht das Feld immer als Dummyparameter mitschleppen?
Dann wäre es doch das gleiche wie ein DIM SHARED...
jb |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 05.10.2005, 22:06 Titel: |
|
|
das klingt gut.
Geht sowas? gleich am Anfang per Include
DIMs.....
SUB Sowieso
END SUB
SUB Andersrum
END SUB
also erst Subs Programmieren und danach "Euer" Hauptprogramm?
Das mit dem "dummy-mitschleppen" kenn ich gar nicht? wie ist das gemeint? _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 05.10.2005, 22:17 Titel: |
|
|
Ne, mit den Includes kannst du nur nicht ausführbare Ausdrücke includen, das heißt nur
DECLAREs, DIMs CONSTs usw...
Mit dem Dummy-Mitschleppen meine ich, dass ein Parameter immer mitgenommen wird,
auch bei Aufrufen aus dem Hauptprogramm. Der Parameter wird aber nur von der SUB selber gebraucht.
Es gibt zum Beispiel die Sub
Code: |
DECLARE SUB ErstelleNeuenEintrag(Index, Inhalt$, Feld$())
|
Wenn der Benutzer dann die Sub aufruft, schreibt er das:
Code: |
CALL ErstelleNeuenEintrag(5, "BlaBlaBla", Feld$())
|
Die Sub sieht intern so aus:
Code: |
SUB ErstelleNeuenEintrag(Index, Inhalt$, Feld$())
REDIM Feld(Index)
Feld$(Index) = Inhalt$
END SUB
|
Also ist Feld$() kein Parameter, den der Benutzer ändern kann, sondern dient nur dazu, dass
man Feld$() nicht als SHARED deklarieren muss.
Puh. Ich glaube, jetzt verstehe ich's selbst nicht mehr
jb |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 05.10.2005, 22:36 Titel: |
|
|
ja, klar, is kompliziert
ZUM INCLUDEN:
mit meinen ersten Tests dazu hab ich folgendes Szenario erstellt:
Code: |
REM Datei Haupt.bas
DECLARE SUB PrintAB()
DECLARE SUB PrintCD()
CALL PrintAB
CALL PrintCD
'$INCLUDE: 'AB.bas'
'$INCLUDE: 'CD.bas'
|
Dann die separaten, zu includenden Dateien:
Code: |
REM Datei AB.bas
SUB PrintAB()
Locate 11,1
Print "AB"
END SUB
|
und natürlich noch die
Code: |
REM Datei CD.bas
SUB PrintCD()
Locate 12,1
Print "CD"
END SUB
|
Nach Compilieren der Haupt.bas läuft alles nach Plan,
der Start von Haupt.EXE zeigt auf Zeile 11 AB und auf Zeile 12 CD an.
Somit scheint es möglich zu sein, ganze SUBs in ein Program zu includen.
hm.
Das "Mitschleppen" hab ich jetzt , zumindest erst mal im Ansatz, auch verstanden. Ist auch n Weg.
hm, halt auch nich das gelbe vom Ei _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 05.10.2005, 22:42 Titel: |
|
|
Was ?
Kann man in FB auch ausführbare .BIs includen?
Werde ich mal nachprüfen...
Ah, mit
Code: |
#include "blablabla.BI"
|
geht's schon...
So Leute. Machts gut, ich hau mich hin für heute
jb |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 05.10.2005, 22:48 Titel: |
|
|
Auf die Idee bin ich gekommen, weil irgendwo in ner Beschreibung stand, Include ist so zu verstehen, als Stünde der Inhalt der separaten Datei genau an der Stelle, wo der Include-Befehl steht.
Bleibt halt noch die Frage, was macht FreeBasic mit SUBs, die (per include) direkt am Anfang stehen.
So wie ich FreeBasic kennengelernt habe, könnte sogar auch das funktionieren.
Ich teste das mal aus und melde mich morgen damit wieder.
Vielleicht kommen bis dahin noch n paar Geistesblitze zum Hauptproblem hier _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 05.10.2005, 23:01 Titel: |
|
|
Hallo,
du kanst die Include-Anweisung auch an den Anfang stellen, erspart dir sogar die Declaration.
Code: | REM Datei Haupt.bas
'$INCLUDE: 'AB.bas'
'$INCLUDE: 'CD.bas'
CALL PrintAB
CALL PrintCD
|
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 05.10.2005, 23:12 Titel: |
|
|
Aha,
na das is ja super.
Können dann auch in einer "bi"Datei mehrere SUBs drin sein? werden alle automatisch declariert?
Dann hab ich zwar immer noch das Dim/Static-Problem, bin aber trotzdem n Stück weiter. _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
mjs
Anmeldungsdatum: 26.09.2005 Beiträge: 75 Wohnort: Adelheidsdorf
|
Verfasst am: 06.10.2005, 01:57 Titel: |
|
|
Mach' es doch einfach wie die C-Fraktion:
Code: | SUB meine_sub( BYVAL arg1 AS INTEGER)
STATIC AS INTEGER PTR meine_variable
IF meine_variable=0 THEN
meine_variable = CALLOCATE( SIZEOF(INTEGER) * arg1 )
END IF
END SUB |
Statt INTEGER kannst du auch UDT's (TYPE's) verwenden.
EDIT: Nicht vergessen, den Speicher mit DEALLOCATE( meine_variable ) wieder frei zu geben, wenn du den nicht mehr brauchst.
Gruß,
Mark |
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 06.10.2005, 20:25 Titel: |
|
|
Whow, bin begeistert.
Der Punkt geht einwandfrei an die C-Fraktion, insbesondere an mjs. DANKE
Läuft jetzt super, Variable immer noch belegt, wenn der Programmablauf zum 2. / 3. und wievieltenauchimmer male in die Sub verzweigt.
Kein Eintrag im Hauptprogramm notwendig, alles in der SUB. Super
Nochmals Danke für alles, man liest sich, Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
JJ2005
Anmeldungsdatum: 29.09.2005 Beiträge: 11 Wohnort: Brüssel
|
Verfasst am: 07.10.2005, 15:50 Titel: |
|
|
Dim Gross%
...
SUB Beispiel2()
IF Gross%=0 then
Gross%=Lang%*Breit% 'nur so, ohne tieferen Sinn
STATIC Pixel%(Gross%)
ENDIF
END SUB
Ginge das auch? _________________ <a href="http://esl.jrc.it/envind/dashbrds.htm">The Dashboard - Basic forever!</a> |
|
Nach oben |
|
|
JJ2005
Anmeldungsdatum: 29.09.2005 Beiträge: 11 Wohnort: Brüssel
|
Verfasst am: 07.10.2005, 16:23 Titel: |
|
|
JJ2005 hat Folgendes geschrieben: | Dim Gross%
...
SUB Beispiel2()
IF Gross%=0 then
Gross%=Lang%*Breit% 'nur so, ohne tieferen Sinn
STATIC Pixel%(Gross%)
ENDIF
END SUB
Ginge das auch? |
Ging nich!! Aber das hier laeuft:
#include once "windows.bi"
Option Explicit
Dim Shared Gross%,Lang%,Breit%,e&,t$
Dim Shared Pixel%(Gross%)
Declare Function Beispiel2(D1 As Integer, D2 As Long)
Lang%=5
Breit%=8
Beispiel2(1,123)
Beispiel2(2,456)
Beispiel2(3,789)
t$=Str$(Pixel%(1))+Str$(Pixel%(2))+Str$(Pixel%(3))
MessageBox(0,"Test: "+t$,"Titel",MB_OK)
End 0
Function Beispiel2(Dummy%,PT%)
If Gross%=0 Then
Gross%=Lang%*Breit% 'nur so, ohne tieferen Sinn
ReDim Pixel%(Gross%)
EndIf
Pixel%(Dummy%)=PT%
Function=1
End Function |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 07.10.2005, 17:06 Titel: |
|
|
Ähm? Schizophren?!
jb |
|
Nach oben |
|
|
JJ2005
Anmeldungsdatum: 29.09.2005 Beiträge: 11 Wohnort: Brüssel
|
Verfasst am: 07.10.2005, 17:28 Titel: |
|
|
jb hat Folgendes geschrieben: | Ähm? Schizophren?!
jb |
Klaro! Aber hier ist was Feines:
#include once "windows.bi"
'http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgDim
Option Explicit
Dim Shared Pixel%(1),PixCtr&
PixCtr&=6143
' PixCtr&=6144 'one more, and you have a nice GPF...
Pixel%(PixCtr&)=123456
MessageBox(0,"Test: Element "+Str$(PixCtr&)+"="+Str$(Pixel%(PixCtr&)),"A Dim test",MB_OK)
End 0 |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 07.10.2005, 17:43 Titel: |
|
|
Ich nehme an, du willst darauf hinaus, dass dieser Code funktioniert, obwohl Pixel% nur 2 Indizies (0 und 1) hat; das liegt daran, dass FB nur dann die Indizies überprüft, wenn der Compiler mit der Option -exx aufgerufen wird. Ansonsten wird ein Arrayzugriff etwa so übersetzt:
Wert = *( @Array(LBound(Array)) + Index * Len(Array) )
Es wird also einfach der Wert gelesen/geschrieben, der so viele Bytes hinter dem Beginn des Arrays im Speicher liegt, dass die entsprechenden Indizies davor platz hätten.
Dass dort evtl andere Daten liegen, die z.B. von anderen Programmen oder auch deinem Programm selbst gebraucht werden, wird dabei ignoriert. Wenn du nur einen Wert ließt, wirst du daher meistens auch nur irgendwelche unsinnigen Werte bekommen, mit denen du i.d.R. nichts anfangen kannst. Sobald du aber (wie in deinem Beispiel oben) anfängst, diese Werte zu verändern, riskierst du einen Programmabsturz. _________________ 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 |
|
|
|
|
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.
|
|