 |
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: 03.01.2007, 20:41 Titel: ARRAYS an SUBs oder FUNCTIONs übergeben |
|
|
Erst mal wünsche ich euch allen nachträglich ein gutes 2007, mögen viele FreeBasic-Programme entstehen.
Zu meinem Problem: Sitze nach langer Zeit wiedermal am Programmieren mit FreeBasic. Schreibe ein paar meiner Routinen aus FB0.15 für FB 0.16 um (Gosub gibts nicht mehr in Subs).
Dabei muß ich auch Arrays als Parameter an die Subs übergeben. Aber nicht nur einen einzelnen Array-Eintrag sondern komplett.
War mir eigentlich sicher, daß das einfach zu bewerkstelligen sei - Erst das Array Dimmen, dann die Sub Declarieren und Erstellen, danach mittels CALL MeineSub(Arrayname) aufrufen und übergeben.
Macht aber Fehler. Hm.
Bei meiner Sucherei im Forum hier fand ich nen Post aus monat 9 2006, der besagt, daß bei der Deklaration der Sub schon Klammern hinter den Namen des Arrays gesetzt werden sollen:
Code: | DECLARE SUB MeineSub( ArrayName() ) |
Auch beim Erstellen der Sub das gleiche dann:
Code: | SUB MeineSub( ArrayName() )
...
END SUB |
Aber auch dies bringt nur Fehler.
Bin ich nun doch zu blöd? oder hat sich das seit FB0.15 geändert?
Ergänzend noch dazugefügt, ich will in der SUB dann auch direkt im eigentlichen Array ändern, Deklariere also mit ByRef, wie in der Dokumentation das so beschrieben steht.:
Code: | DECLARE SUB MeineSub(ByRef MeinArray)
SUB MeineSub(ByRef MeinArray)
...
END SUB
CALL MeineSub(MeinArray) |
Mach ich zumindest das dann richtig? _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 03.01.2007, 20:53 Titel: |
|
|
Hallo.
Dir auch noch nachträglich ein gutes neues Jahr!
Code: | DECLARE SUB ArrayBearbeiten(Zahlen() as integer)
dim i as integer
dim test(1 to 10) as integer
CLS
PRINT "VORHER"
LOCATE 1, 11: PRINT "NACHHER"
'Array mit Testzahlen füllen und anzeigen
Randomize Timer
for i = 1 to 10
test(i) = fix(RND*100)
locate i+1, 2: PRINT STR(test(i))
next i
ArrayBearbeiten test()
'Ergebnis anzeigen
for i = 1 to 10
locate i+1, 12: PRINT STR(test(i))
next i
sleep: end
SUB ArrayBearbeiten(Zahlen() as integer)
dim i as integer
for i = lbound(zahlen) to ubound(zahlen)
zahlen(i)=zahlen(i)+1
next i
END SUB |
Funktioniert bei mir mit FB 0.16 stable und FB 0.17 testing ohne Probleme.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Zuletzt bearbeitet von Sebastian am 03.01.2007, 20:59, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 03.01.2007, 20:57 Titel: |
|
|
Code: | Dim a(10)
SUB Inpu(a())
for i=0 to 10
input a(i)
next i
END SUB
SUB Outpu(a())
for i=0 to 10
print a(i)
next i
END SUB
inpu(a())
outpu(a())
sleep |
Geht doch.
Zitat: | DECLARE SUB MeineSub(ByRef MeinArray())
SUB MeineSub(ByRef MeinArray())
...
END SUB
CALL MeineSub(MeinArray()) |
Das macht einen grossen Unterschied. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 03.01.2007, 23:57 Titel: |
|
|
Erst mal vielen Dank für eure Hilfe.
Klar, Ihr habt Recht, macht mans richtig, dann gehts.
In dem Falle ist aber Richtig-Machen nicht das, was
ich in der Dokumentation gelesen hatte.
Eure Beispiele laufen bei mir jetzt auch, danke.
Nur, Ihr habt den Parameter "BYREF" weggelassen, das war dann der Fehler bei mir.
Jedoch stand in der Dokumentation, daß in der 0.17er-stable Release nicht mehr standard sein wird, daß Arrays BYREF übergeben werden. HM.
Und wie hier im Thread festzustellen ist, kann ByRef bei Arrayübergabe nicht mit angegeben werden. Somit wird wieder ein Anpassen jetzt geschriebener Routinen notwendig werden, wenn die nächste FB-Version freigegeben wird.
Überlege mir grad, ob es für mich nun nicht besser ist, wenn ich die Speicheradresse des Arrays an die Sub übergebe. Aber erstens, weiß ich nur, wie ich diese erhalte, aber nicht, wie ich dann in der Sub ein ArrayName auf diese Speicherstelle 'verbiege'.
Zweitens grauts mir, im Hauptprogramm nach ner Speicheradresse zu fragen und erst in der SUB mit diesem Wert zu arbeiten. Was passiert eigentlich, wenn das Betriebssytem genau dazwischen den Ram aufräumt und sich die Adresse dadurch verschiebt? Weiß das jemand?
Grüße von Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 04.01.2007, 15:32 Titel: |
|
|
Hm, geht nicht:?
Code: |
Dim TestIt As Any Ptr
|
Und dann:
Code: |
TestIt=DieUebergebeneSpeicheradresse
|
 _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 04.01.2007, 20:17 Titel: |
|
|
Eastler_dart hat Folgendes geschrieben: | Überlege mir grad, ob es für mich nun nicht besser ist, wenn ich die Speicheradresse des Arrays an die Sub übergebe. Aber erstens, weiß ich nur, wie ich diese erhalte, aber nicht, wie ich dann in der Sub ein ArrayName auf diese Speicherstelle 'verbiege'.
Zweitens grauts mir, im Hauptprogramm nach ner Speicheradresse zu fragen und erst in der SUB mit diesem Wert zu arbeiten. Was passiert eigentlich, wenn das Betriebssytem genau dazwischen den Ram aufräumt und sich die Adresse dadurch verschiebt? Weiß das jemand? |
Ist doch egal, wenn Windows das RAM aufräumt, deine Adressen sind so wie so relativ.
Das heisst Windows schiebt dein Programm im RAM rum, aber dein Programm merkt davon nichts.
Heikel sind nur dynamische Konstrukte wie die typischen Strings von FB, aber um die geht es hier ja nicht.
Übrigens ist das Übergeben der Adresse in C++ eine übliche Möglichkeit um ByRef ein Array zu bearbeiten, _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 08.01.2007, 22:50 Titel: |
|
|
melde mich nun nochmal.
Habs nu einfach so gelassen, da es (bis jetzt ) super läuft. ByRef nicht angeben, dann klappts erst mal.
Damit steht halt auch fest, wenn die 0.17er-stable-Version so wie sie angekündigt wurde kommt, muß ich entweder bei 0.16 bleiben oder ich darf dann nicht vergessen, die ByRef's noch einzufügen, sonst läufts ja nicht in künftigen 0.17er.
Somit danke Sebastian und Michael Frey, eure Lösung ist nun auch meine.
@Mao:
doch, dein Beispiel sollte laufen, ist aber nur die Halbe Antwort, soweit ich das Blicke.
Im Hauptprogramm also
Code: | DECLARE SUB ArrayBearbeiten(Adresse AS ANY PTR)
Dim MeinARRAY(10)
DIM ArrayAdresse AS ANY PTR
ArrayAdresse=@MeinArray ' Also die Speicheradresse in ArrayAdresse
CALL ArrayBearbeiten(ArrayAdresse)
END
SUB ArrayBearbeiten(Adresse AS ANY PTR)
PRINT Adresse 'Zeigt einen Nummerischen Wert, = die Adresse
TestIt = Adresse 'setzt auch bloß den Nummerischen Wert nach TestIt
'eigentlich wollte ich sowas:
DIM ArrayInDerSUB(100)
"SETZE ARRAY-RAM-ADRESSE von" ArrayInDerSub() auf den Wert von Adresse
'somit wäre meine Logik:
@ArrayInDerSUB = Adresse 'glaub aber nicht das das geht
' und wenns geht, was passiert mit dem
' durch den Dim-Befehl reservierten RAM??
END SUB |
Ich wollte aber ursprünglich in der SUB ein Array "dimmen" und dessen Adresse auf die Übergebene "umbiegen", sodaß dieses "Sub-Array" auf die Selbe Speicherstelle zeigt, wie das Main-Array.
Also nichts anderes, als das Array ByRef übergeben, jedoch ohne ByRef anzugeben, da es noch Fehler macht.
Ob jetzt @ArrayInDerSUB = Adresse dafür gut ist, muß ich mal bei Gelegenheit testen.
@Michael Frey:
Erst mal rießigen Dank. Du hast mir 2 Antworten gegeben.
1) dieses RAM-Aufräumen vom Betriebssystem wirkt sich nicht auf Freebasic aus, brauch ich also keine Angst mehr haben, mit Speicheradressen zu jonglieren.
2) ich hatte früher schonmal mit Type's was Probiert, in den Types waren außer X, Y, Breit, Hoch und ähnliches auch Name$ mit eingeschlossen. Solche Type-Variablen hab ich dann durch mehrere SUBs geschleust. Das Ergebnis war, Positionen Breiten und Höhen kamen sauber an, wurde wie gewünscht angezeigt, aber die Namensbezeichnungen verloren sich ständig, fanden sich aber auch komischerweise beim nächsten Durchlauf immer mal wieder. Hatte damals schon den Verdacht, daß bei Strings das alles irgendwie schwieriger ist.
Raucht euer Kopf jetzt auch?
OK Leute, für heute solls mal gut sein, man liest sich
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 09.01.2007, 19:17 Titel: |
|
|
Eastler_dart hat Folgendes geschrieben: | 2) ich hatte früher schonmal mit Type's was Probiert, in den Types waren außer X, Y, Breit, Hoch und ähnliches auch Name$ mit eingeschlossen. Solche Type-Variablen hab ich dann durch mehrere SUBs geschleust. Das Ergebnis war, Positionen Breiten und Höhen kamen sauber an, wurde wie gewünscht angezeigt, aber die Namensbezeichnungen verloren sich ständig, fanden sich aber auch komischerweise beim nächsten Durchlauf immer mal wieder. Hatte damals schon den Verdacht, daß bei Strings das alles irgendwie schwieriger ist. |
ZStrings lössen solche Probleme, weil derren Länge beim Definieren fest steht.
Oder auch Strings mit Konstanter länge:
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
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.
|
|