 |
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 |
tobiasrad
Anmeldungsdatum: 20.09.2005 Beiträge: 1
|
Verfasst am: 20.09.2005, 01:05 Titel: Mit einer Funktion ein Array ausgeben |
|
|
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 |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 20.09.2005, 10:51 Titel: |
|
|
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 |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 20.09.2005, 15:18 Titel: Funktionen und Arrays |
|
|
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  |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 21.09.2005, 20:45 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|