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:

Mit einer Funktion ein Array ausgeben

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
tobiasrad



Anmeldungsdatum: 20.09.2005
Beiträge: 1

BeitragVerfasst am: 20.09.2005, 01:05    Titel: Mit einer Funktion ein Array ausgeben Antworten mit Zitat

Hallo, jetzt suche ich schon überall, in der Monster-FAQ, im Kochbuch und im Forum, doch ich kann leider nichts finden.
Also, folgendes Problem, mit Hilfe einer Funktion möchte ich ein Array ausgeben, das ganze habe ich mir so gedacht:
Code:
FUNCTION offnen (nr)
DIM offnenzwischen(1 TO 1) AS artikel
OPEN Pfad$ + "xxx.dat" FOR RANDOM AS #1 LEN = 49
GET #1, nr, offnenzwischen(1)
CLOSE #1
offnen = offnenzwischen
END FUNCTION

Dabei wird schlicht gar nichts ausgegeben, das Feld, welches von der Funktion zurückgegeben wird ist leer.
Besteht die Möglichkeit (und wenn ja wie), mit einer Funktion ein Feld zurückzugeben, oder muss ich mit einer globalen Variable arbeiten, was ich sehr schade fände?

Danke für Antworten, auch danke für einen Hinweis, wo ich so etwas gefunden hätte (QBMonFAQ, Kochbuch oder Forum), dann tut es mir leid, dass ich so blind war.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
helium



Anmeldungsdatum: 10.09.2004
Beiträge: 397
Wohnort: Leverkusen

BeitragVerfasst am: 20.09.2005, 10:51    Titel: Antworten mit Zitat

AFAIK kannst du Felder so nicht zurück geben. Dass musst du dann umständlicherweise über ein (misbrauchtes) Argument machen.
_________________
Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 20.09.2005, 15:18    Titel: Funktionen und Arrays Antworten mit Zitat

Wie helium richtigerweise schreibt, kann der Funktionsrückgabewert keine Array sein.

Man kann aber wohl eine Array als Funktionsparameter zurückgeben - als "Missbrauch" würde ich diese Vorgehensweise nicht bezeichnen. Voraussetzung ist jedenfalls, dass die Array vor Übergabe an die Funktion dimensioniert wurde.

Will man nun den Einsatz globaler Variablen vermeiden, bietet sich als elegante Lösung an, als Funktionsrückgabewert die Anzahl der eingelesenen Artikel zurückzugeben und die Artikeldaten selbst als Funktionsparameter.

Konkret würde ich dies wie folgt anlegen:

Code:
'ARTIKELLISTE
'============

DECLARE SUB putArtikel ()
DECLARE FUNCTION getArtikel% (artikel() AS ANY)

TYPE typArtikel
  bezeich AS STRING * 40
  preis AS CURRENCY
END TYPE

DIM aktArtikel%, anzArtikel%, listenFormat$
REDIM artikel(1 TO 1) AS typArtikel

CLS
PRINT
PRINT "ARTIKELLISTE"
PRINT

putArtikel
anzArtikel% = getArtikel%(artikel())

listenFormat$ = STRING$(LEN(artikel(1).bezeich) - 2, " ")
listenFormat$ = "  \" + listenFormat$ + "\   EUR ##,###.##"

FOR aktArtikel% = 1 TO anzArtikel%
  PRINT USING listenFormat$; artikel(aktArtikel%).bezeich; artikel(aktArtikel%).preis@
NEXT

PRINT
PRINT MID$(STR$(anzArtikel%), 2); " Artikel vorhanden"
PRINT "Ende der Ausgabe"

END

FUNCTION getArtikel% (artikel() AS typArtikel)
  'liest alle in der Artikeldatei "ARTDATEI.DAT" gespeicherten
  ' Artikel in die Array artikel() ein (=Funktionsparameter).

  DIM aktArtikel%, anzArtikel%, dateiNr%

  ON LOCAL ERROR GOTO getArtikelErr

  dateiNr% = FREEFILE
  OPEN "ARTDATEI.DAT" FOR RANDOM AS dateiNr% LEN = LEN(artikel(1))

    anzArtikel% = LOF(dateiNr%) \ LEN(artikel(1))
    REDIM artikel(1 TO anzArtikel%) AS typArtikel

    FOR aktArtikel% = 1 TO anzArtikel%
      GET #dateiNr%, , artikel(aktArtikel%)
         ' GET ohne Satznummer liest den naechsten Datensatz
         ' ein. GET mit expliziter Angabe der Datensatznummer
         ' arbeitet langsamer.
    NEXT

  CLOSE #dateiNr%

  getArtikel% = anzArtikel%

getArtikelEnd:
  EXIT FUNCTION

getArtikelErr:
  IF dateiNr% THEN
    CLOSE #dateiNr%
  END IF
  PRINT "  Fehler in Prozedur 'getArtikel%':"
  PRINT "    Beim Einlesen der Artikeldaten ist Fehler"; ERR; "aufgetreten."
  RESUME getArtikelEnd

END FUNCTION

SUB putArtikel
  ' legt die Artikeldatei "ARTDATEI.DAT" an und schreibt einige
  ' Testdatensaetze hinein.

  DIM artikel AS typArtikel, dateiNr%

  ON LOCAL ERROR GOTO putArtikelErr

  dateiNr% = FREEFILE
  OPEN "ARTDATEI.DAT" FOR RANDOM AS #dateiNr% LEN = LEN(artikel)

    artikel.bezeich = "Tintenfueller"
    artikel.preis@ = 10.89
      PUT #dateiNr%, , artikel

    artikel.bezeich = "Tinte, Fass … 150 ml"
    artikel.preis@ = 3.45
      PUT #dateiNr%, , artikel

    artikel.bezeich = "Druckbleistift, Staerke 0.35 mm"
    artikel.preis@ = 4.59
      PUT #dateiNr%, , artikel

  CLOSE #dateiNr%

putArtikelEnd:
  EXIT SUB

putArtikelErr:
  IF dateiNr% THEN
    CLOSE #dateiNr%
  END IF
  PRINT "  Fehler in Prozedur 'putArtikel':"
  PRINT "    Beim Schreiben der Artikeldaten ist Fehler"; ERR; "aufgetreten."
  RESUME putArtikelEnd

END SUB


lG
pinkpanther zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 21.09.2005, 20:45    Titel: Antworten mit Zitat

Artikel aus meiner Sammlung:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/SUB-Unterprogramme.html

Siehe Untertitel "Möglichkeitsgrenzen im Unterprogrammkonzept von QuickBASIC" - bei anderen Programmiersprachen sind solche durchaus sinnvolle Möglichkeiten vorhanden. Daher gebe ich auch im dortigen Artikel jeweils Hinweise auf Ersatzkonstruktionen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
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 QBasic. 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