 |
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 |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 11.04.2010, 21:45 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 11.04.2010, 22:10 Titel: |
|
|
Oha, diese Verwendung von CONST kannte ich noch nicht. Werde ich mir gleich mal vormerken.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 12.04.2010, 15:31 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 12.04.2010, 16:08 Titel: |
|
|
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 |
|
 |
hunggar
Anmeldungsdatum: 04.08.2008 Beiträge: 32 Wohnort: Karlsruhe
|
Verfasst am: 21.10.2010, 21:32 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.10.2010, 21:56 Titel: |
|
|
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 |
|
 |
hunggar
Anmeldungsdatum: 04.08.2008 Beiträge: 32 Wohnort: Karlsruhe
|
Verfasst am: 21.10.2010, 22:12 Titel: |
|
|
Wow, danke,
hab´s probiert und siehe da: Es klappt !!
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.
HungGar |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.10.2010, 22:57 Titel: |
|
|
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 |
|
 |
hunggar
Anmeldungsdatum: 04.08.2008 Beiträge: 32 Wohnort: Karlsruhe
|
Verfasst am: 21.10.2010, 23:15 Titel: |
|
|
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.
 |
|
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.
|
|