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:

ARRAYS an SUBs oder FUNCTIONs übergeben

 
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: 03.01.2007, 20:41    Titel: ARRAYS an SUBs oder FUNCTIONs übergeben Antworten mit Zitat

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


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 03.01.2007, 20:53    Titel: Antworten mit Zitat

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. lächeln



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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 03.01.2007, 20:57    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 03.01.2007, 23:57    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 04.01.2007, 15:32    Titel: Antworten mit Zitat

Hm, geht nicht:?
Code:

Dim TestIt As Any Ptr

Und dann:
Code:

TestIt=DieUebergebeneSpeicheradresse

lächeln
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 04.01.2007, 20:17    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 08.01.2007, 22:50    Titel: Antworten mit Zitat

melde mich nun nochmal.

Habs nu einfach so gelassen, da es (bis jetzt zwinkern) 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? Zunge rausstrecken

OK Leute, für heute solls mal gut sein, 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
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 09.01.2007, 19:17    Titel: Antworten mit Zitat

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.
Code:
dim a zstring*20

Oder auch Strings mit Konstanter länge:
Code:
dim b string*20

_________________
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
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
Seite 1 von 1

 
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