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:

Array Daten an SUB's, Array Rückgabewerte von SUB's
Gehe zu Seite Zurück  1, 2
 
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
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 11.04.2010, 21:45    Titel: Antworten mit Zitat

Einfach const beim Datentyp mit angeben:
Code:
sub test( a() as const integer)
    print a(0)    'Geht
    a(2) = 4      'Geht nicht, Fehler 109
end sub



dim i(3) as integer
i(0) = 4
test(i())
sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 11.04.2010, 22:10    Titel: Antworten mit Zitat

Oha, diese Verwendung von CONST kannte ich noch nicht. Werde ich mir gleich mal vormerken. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 12.04.2010, 15:31    Titel: Antworten mit Zitat

Ich dachte das wäre noch gar nicht implementiert? Erst vor wenigen Wochen habe ich im FBEXT Code gestöbert. Da Stand auch öfters mal ein Const an Parametern, aber immer mit dem Vermerk, dass das erst in 0.21 implementiert werden (soll).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 12.04.2010, 16:08    Titel: Antworten mit Zitat

Mit fbc 0.20 funktioniert es jedenfalls.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hunggar



Anmeldungsdatum: 04.08.2008
Beiträge: 32
Wohnort: Karlsruhe

BeitragVerfasst am: 21.10.2010, 21:32    Titel: Antworten mit Zitat

Hallo Freunde,
zu dem ursprünglichen Thema, nämlich Daten in Form von Arrays an eine SUB zu übergeben, habe ich folgendes Problem:

Test.bas(1) error 56: Illegal specification, at parameter 1 (a) of Testsub() in 'DECLARE SUB Testsub (a(1 TO 100) AS INTEGER, b AS INTEGER)'
Test.bas(5) error 56: Illegal specification, at parameter 1 (a) of Testsub() in 'SUB Testsub (a(1 TO 100) AS INTEGER, b AS INTEGER)'


Programmiert habe ich Folgendes:

1 DECLARE SUB Testsub (a(1 TO 100) AS INTEGER, b AS INTEGER)
2 DIM a(1 TO 100) AS INTEGER
3 DIM b AS INTEGER
4 End
--------------------------------------------
5 SUB Testsub (a(1 TO 100) AS INTEGER, b AS INTEGER)
6 END SUB



Mit der Variablen b gibts keine Probleme, aber mit dem Array a(1 to100)
Gibts eine einfache Lösung ?


Vielen Dank,
HungGar
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.10.2010, 21:56    Titel: Antworten mit Zitat

Hallo!
hunggar hat Folgendes geschrieben:
Test.bas(1) error 56: Illegal specification, at parameter 1 (a) of Testsub() in 'DECLARE SUB Testsub (a(1 TO 100) AS INTEGER, b AS INTEGER)'
Test.bas(5) error 56: Illegal specification, at parameter 1 (a) of Testsub() in 'SUB Testsub (a(1 TO 100) AS INTEGER, b AS INTEGER)'

Werden Arrays als Formalparameter übergeben, tauchen die Dimensionen in der Signatur der Funktion nicht auf. Man gibt stattdessen als Formalparameter nur an, dass ein Array übergeben wird, nicht aber, wie groß es ist. Die Größe des Arrays richtet sich alleine nach seiner Deklaration mit DIM.

So funktioniert es also:
Code:
DECLARE SUB Testsub (a() AS INTEGER, b AS INTEGER)
DIM a(1 TO 100) AS INTEGER
DIM b AS INTEGER
END

SUB Testsub (a() AS INTEGER, b AS INTEGER)
  Print b
  Print "---"
  For i As Integer = LBound(a) To UBound(a)
    Print a(i)
  Next i
END SUB

Mit den Funktionen LBOUND und UBOUND lassen sich dann innerhalb der SUB die Grenzen des Arrays ermitteln.

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
hunggar



Anmeldungsdatum: 04.08.2008
Beiträge: 32
Wohnort: Karlsruhe

BeitragVerfasst am: 21.10.2010, 22:12    Titel: Antworten mit Zitat

Wow, danke,
hab´s probiert und siehe da: Es klappt !!
lächeln


Nun hab ich mit meiner SUB noch zwei (bzw drei) Fehlermeldungen:

Test.bas(8 ) error 159: Invalid assignment/conversion in 'a = INKEY()'
Test.bas(9) error 21: Type mismatch, found 'THEN' in 'IF a = "a" THEN PRINT "Das war die Taste a": b = 2 : GOTO Anker'
Test.bas(10) error 21: Type mismatch, found 'AND' in 'IF a = "b" AND b = 2 THEN PRINT "Das war die Taste b" : GOTO Anker2'


Geschrieben hab ich Folgendes:

DECLARE SUB Testsub (a AS INTEGER, b AS INTEGER)
DIM a AS INTEGER
DIM b AS INTEGER
b = 1
End

-------------------------------------------------
SUB Testsub (a AS INTEGER, b AS INTEGER)

Anker:
a = INKEY()
IF a = "a" THEN PRINT "Das war die Taste a": b = 2 : GOTO Anker
IF a = "b" AND b = 2 THEN PRINT "Das war die Taste b" : GOTO Anker2
GOTO Anker

Anker2:
END SUB



Wenn ich den Code zwischen "Anker:" und "GOTO Anker" im eigentlichen Programm schreibe, gibts damit keine Probleme.
In der SUB dagegen bekomme ich oben genannte Fehlermeldungen.

Ich programmiere sehr gern mit FB, bin aber weiß Gott keine große Leuchte,
und ich kann mir nicht erklären, warum das nicht funktioniert.



Bedanke mich bereits im Voraus.
lächeln
HungGar
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.10.2010, 22:57    Titel: Antworten mit Zitat

Auf das Springen mit GOTO sollte man der Übersichtlichkeit halber lieber verzichten.
Außerdem liefert INKEY eine Zeichenkette (STRING) zurück und keinen INTEGER. Schließlich kann man ja auch ein Fragezeichen oder ein y eingeben und nicht nur 0 bis 9. Das führt zu der ersten Fehlermeldung.
Mit den IF-Abfragen wird dann mit den Zeichenketten "a" und "b" verglichen, obwohl a und b ja als INTEGER auf Ganzzahlen festgelegt sind.

Mit folgendem Code funktioniert es also:
Code:
DECLARE SUB Testsub (a AS INTEGER, b AS INTEGER)

DIM a AS INTEGER
DIM b AS INTEGER
b = 1

Testsub 123, 456

End


'-------------------------------------------------
SUB Testsub (a AS INTEGER, b AS INTEGER)
Dim c AS STRING
Do 'TuFolgendes...
    c = INKEY  'INKEY gibt STRING (Zeichenkette) zurueck und nicht INTEGER, da
               'INTEGER nur fuer Ganzzahlen ist, waehrend INKEY ja auch nicht-
               'numerische Werte wie "a" oder "?" zurueckliefern kann.
    IF (c = "a") THEN
        PRINT "Das war die Taste a"
        b = 2
    END IF
    IF (c = "b") AND (b = 2) THEN
        PRINT "Das war die Taste b"
        EXIT DO 'Schleife verlassen
    END IF
Loop '...ImmerWieder! (Loop-ing zurueck zu DO oben)
END SUB

Die DO...LOOP-Schleife hat hier auch die GOTOs und Sprungmarken abgelöst.

Wichtig: Die Verwendung der Parameter ist in dem Code etwas "unorthodox". Variablen, die man lediglich innerhalb von SUBs benutzen will, muss man nicht als Parameter deklarieren, sondern das geschieht mit DIM innerhalb der SUB:
Code:
Sub GibZehnMalHalloAus ()
Dim i As Integer
For i = 1 To 10
  Print "Hallo"
Next i
End Sub

Dieses i ist dann nur innerhalb der SUB gültig. Außerhalb der SUB kann es anderweitig deklariert werden.
Die Parameter wie im Code ganz oben benutzt man hingegen für Situationen wie die folgende:
Code:
Sub GibXMalHalloAus (ByVal x As Integer)
Dim i As Integer
For i = 1 To x
  Print "Hallo"
Next i
End Sub

GibXMalHalloAus ( 5 )

Sleep
End

In dem Fall wird der SUB eine zusätzliche Information "mitgegeben", was über den Parameter geschieht.

Es gibt außerdem zu beachten, dass man Parameter in FB auf 2 Arten übergeben kann: ByVal und ByRef.
Der Unterschied liegt (vereinfacht gesagt) darin, dass bei ByVal nur der Wert der Variablen, also z.B. eine Zahl, an die SUB weitergereicht wird, während mit ByRef die Variable, also die Schachtel, die die Zahl enthält, weitergegeben wird. Dieser Unterschied kommt zum Tragen, wenn der Parameterwert in der SUB geändert wird:
Code:
DECLARE SUB LieblingszahlA (ByVal x As Integer)
DECLARE SUB LieblingszahlB (ByRef x As Integer)

Dim As Integer i
i = 3

Print "Die Lieblingszahl von Arno Nuehm ist: " & i
Print

LieblingszahlA (i)

Print "Die Lieblingszahl von Arno Nuehm ist: " & i
Print "...immer noch!"
Print

LieblingszahlB (i)

Print "Die Lieblingszahl von Arno Nuehm ist jetzt: " & i
Sleep
End



SUB LieblingszahlA (ByVal x As Integer)
    x = 7
END SUB

SUB LieblingszahlB (ByRef x As Integer)
    x = 8
END SUB

_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
hunggar



Anmeldungsdatum: 04.08.2008
Beiträge: 32
Wohnort: Karlsruhe

BeitragVerfasst am: 21.10.2010, 23:15    Titel: Antworten mit Zitat

räusper ... peinlich ...

ok

Danke für die ausführliche Erklärung.
Ich habe das Problem nun gelöst.

Dass ich unorthodox programmiere, weiß ich eigentlich,
liegt bestimmt daran, dass mir das niemand beigebracht hat,
sondern ich es mir selbst soweit erarbeitet habe.


Nochmals vielen Dank,
jetzt funktioniert alles.
lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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
Gehe zu Seite Zurück  1, 2
Seite 2 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