Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Statische Arrays in SUBs Dynamisch declarieren ?!?
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 05.10.2005, 21:33    Titel: Statische Arrays in SUBs Dynamisch declarieren ?!? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 05.10.2005, 21:35    Titel: Antworten mit Zitat

Dann benutze doch einfach ein DIM SHARED.

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 05.10.2005, 21:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 05.10.2005, 21:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 05.10.2005, 21:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 05.10.2005, 22:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 05.10.2005, 22:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 05.10.2005, 22:17    Titel: Antworten mit Zitat

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 zwinkern

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 05.10.2005, 22:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 05.10.2005, 22:42    Titel: Antworten mit Zitat

Was ? peinlich

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 zwinkern

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 05.10.2005, 22:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 05.10.2005, 23:01    Titel: Antworten mit Zitat

Hallo,
du kanst die Include-Anweisung auch an den Anfang stellen, erspart dir sogar die Declaration. zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 05.10.2005, 23:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
mjs



Anmeldungsdatum: 26.09.2005
Beiträge: 75
Wohnort: Adelheidsdorf

BeitragVerfasst am: 06.10.2005, 01:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 06.10.2005, 20:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
JJ2005



Anmeldungsdatum: 29.09.2005
Beiträge: 11
Wohnort: Brüssel

BeitragVerfasst am: 07.10.2005, 15:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
JJ2005



Anmeldungsdatum: 29.09.2005
Beiträge: 11
Wohnort: Brüssel

BeitragVerfasst am: 07.10.2005, 16:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 07.10.2005, 17:06    Titel: Antworten mit Zitat

Ähm? Schizophren?! peinlich

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
JJ2005



Anmeldungsdatum: 29.09.2005
Beiträge: 11
Wohnort: Brüssel

BeitragVerfasst am: 07.10.2005, 17:28    Titel: Antworten mit Zitat

jb hat Folgendes geschrieben:
Ähm? Schizophren?! peinlich

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 07.10.2005, 17:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz