Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Keks
Anmeldungsdatum: 03.11.2007 Beiträge: 156 Wohnort: Dose
|
Verfasst am: 09.03.2008, 13:50 Titel: Mehrere Werte für eine Variable |
|
|
Nein, ich meine kein Array. Eher sowas:
variable = 43, 2, 56, 21, 23
Ist sowas irgendwie möglich? Mir kommt es halt drauf an, dass es möglichst wenig Schreiberei ist.
Danke  _________________ RUN "brain.exe"
Datei nicht gefunden |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 09.03.2008, 15:50 Titel: |
|
|
Hallo
Wenn es, wie in deinem Beispiel, bei fünf ganzahligen Werten im Bereich von 0-63 bleibt, dann könntest du diese 5x6 Bit in eine 32-Bit LONG INTEGER packen.
Code: | CLS
wert%(0) = 43
wert%(1) = 2
wert%(2) = 56
wert%(3) = 21
wert%(4) = 23
variable& = wert%(0) 'Werte in variable& packen
FOR a = 1 TO 4
variable& = variable& + wert%(a) * (64 ^ a)
NEXT
FOR a = 0 TO 4 'und wieder entpacken
maske& = 0
FOR b = a * 6 TO a * 6 + 5
maske& = maske& + 2 ^ b
NEXT
wertneu%(a) = (variable& AND maske&) / 64 ^ a
NEXT
FOR a = 0 TO 4 'Anzeigen
PRINT wertneu%(a)
NEXT |
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Keks
Anmeldungsdatum: 03.11.2007 Beiträge: 156 Wohnort: Dose
|
Verfasst am: 09.03.2008, 19:09 Titel: |
|
|
Ah ok. Es geht halt um die Deklarierung, deswegen bringt das da oben nicht so viel.
Dann muss ich halt schreiben^^ _________________ RUN "brain.exe"
Datei nicht gefunden |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 09.03.2008, 21:26 Titel: |
|
|
Nur zur Information: QB kennt keine Array()-Funktion wie beispielsweise PHP und VBScript; am ehensten eignet sich daher das Laden des Arrays mittels READ und DATA, also
Code: | DIM variable%(1 TO 5)
FOR i%=1 TO 5
READ variable%(i%)
NEXT i%
DATA 43, 2, 56, 21, 23 |
Wenn es um grössere Datenmengen geht, solltest Du die Werte besser sogar ab einer separaten Datei einlesen, um den ohnehin knappen konventionellen Speicher nicht unnötig zu belasten! _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Heizi

Anmeldungsdatum: 19.01.2005 Beiträge: 309
|
Verfasst am: 10.03.2008, 13:52 Titel: |
|
|
du könntest dafür einen extra Typ machen.
hmm ich hoff ich screib das jetzt richtig ist schon ne Weile her dass
ich das das letzte Mal gemacht hab^^
Code: |
TYPE variable
a as integer
b as integer
c as integer
end TYPE
declare function v( a as integer, b as integer, c as integer) as variable
dim x as variable
x=v(1,2,3)
function v( a as integer, b as integer, c as integer) as variable
v.a=a
v.b=b
v.c=c
end function
|
Source funktioniert wahrscheinlich nciht hab sitz hier grad im Büro und
hab Mittagspause kanns also nicht testen
 |
|
Nach oben |
|
 |
Keks
Anmeldungsdatum: 03.11.2007 Beiträge: 156 Wohnort: Dose
|
Verfasst am: 10.03.2008, 15:36 Titel: |
|
|
Ja, sowas wäre sehr praktisch.
Bei dem Code hängt es am as variable, da wird , , ) oder Ende der Anweisung erwartet. Lässt man es weg, funktionier die Funktion nicht. _________________ RUN "brain.exe"
Datei nicht gefunden |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 10.03.2008, 17:13 Titel: |
|
|
Keks hat Folgendes geschrieben: | Ja, sowas wäre sehr praktisch.
Bei dem Code hängt es am as variable, da wird , , ) oder Ende der Anweisung erwartet. Lässt man es weg, funktionier die Funktion nicht. |
Nein. Die Zeile muß drin sein, damit Du X als Variable vom Typ "Variable" ansprechen kannst (ein anderer Name für den Variablentyp wäre auch sinnvoller).
Außerdem braucht eine Function einen Rückgabewert. Sonst läßt sich das auch per Sub lösen.
Allerdings sollte man die Dimensionierung der Variable innerhalb der Sub vornehmen:
Code: | sub v( a as integer, b as integer, c as integer)
Dim x as variable
x.a=a
x.b=b
x.c=c
end sub
|
Wenn Du die Werte des UDT außerhalb der Funktion brauchst, empfiehlt es sich, den UDT als Referenz mit zu übergeben:
Code: | Type variable
a As Integer
b As Integer
c As Integer
End Type
Declare sub v(ByRef x as variable, a as integer, b as integer, c as integer)
Dim x As variable
sub v(ByRef x as variable, a as integer, b as integer, c as integer)
x.a=a
x.b=b
x.c=c
End sub
v(x, 1, 2, 3)
Print x.a; x.b; x.c
sleep
|
_________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Keks
Anmeldungsdatum: 03.11.2007 Beiträge: 156 Wohnort: Dose
|
Verfasst am: 10.03.2008, 18:16 Titel: |
|
|
Funktioniert das bei dir?
Bei mir meckert Quickbasic bei "ByRef x as variable,". _________________ RUN "brain.exe"
Datei nicht gefunden |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 10.03.2008, 18:20 Titel: |
|
|
Lass mal das ByRef weg, das ist FreeBASIC-spezifisch.
Passender Ersatz in QB war glaub ich der Aufruf der Sub über CALL. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 10.03.2008, 18:36 Titel: |
|
|
konnte man byref in QB nicht auch explizit angeben? _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 10.03.2008, 18:38 Titel: |
|
|
Jedenfalls nicht in QBasic:
Referenz: ByRef
Referenz: ByRef hat Folgendes geschrieben: |
Unterschiede zu QB:
Neu in FreeBASIC
[...]
|
_________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 10.03.2008, 18:42 Titel: |
|
|
Stimmt... Aber die Fehlermeldung dazu ist schon krass, hatte das gar nicht mehr so in Erinnerung
 _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 10.03.2008, 20:59 Titel: |
|
|
Keks hat Folgendes geschrieben: | Funktioniert das bei dir?
Bei mir meckert Quickbasic bei "ByRef x as variable,". |
Ach, QuickBasic...! Hättest Du frühersagen sollen. Ich habs mit FB gemacht, und da läuft es. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 10.03.2008, 22:52 Titel: |
|
|
Elektronix hat Folgendes geschrieben: | Hättest Du frühersagen sollen. Ich habs mit FB gemacht, und da läuft es. |
Vielleicht hättest du auch einfach früher nachsehen sollenen, in welchem Unterforum du antwortest
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 11.03.2008, 08:58 Titel: |
|
|
An dieser Stelle sei ausdrücklich auf
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/SUB-Unterprogramme.html
Speziell Untertitel "Möglichkeitsgrenzen im Unterprogrammkonzept von QuickBASIC" beachten!
In FreeBasic wurden, wie mir in der dortigen Befehlsreferenz auch schon aufgefallen sind, diverse derartige Sprachkonstrukte hineingenommen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 11.03.2008, 11:06 Titel: |
|
|
So, hab jetzt nochmal nachgeschaut: Parameterübergabe "ByRef" ist bei QBasic der Standard. Das kann man also weglassen. Die Declaration "ByRef" gibt es in QBasic nicht. "ByVal" geht nur bei Unterprogrammen aus anderen Sprachen.
Hier das Programm unter QuickBasic getestet:
Code: | TYPE OwnVar
a AS INTEGER
b AS INTEGER
c AS INTEGER
END TYPE
DECLARE SUB ChangeOwnVar (X AS OwnVar, a AS INTEGER, b AS INTEGER, c AS INTEGER)
DIM X AS OwnVar
CALL ChangeOwnVar(X, 1, 2, 3)
PRINT X.a; X.b; X.c
'sleep 'Nur, wenn in FB mit -lang qb compiliert wird
SUB ChangeOwnVar (X AS OwnVar, a AS INTEGER, b AS INTEGER, c AS INTEGER)
X.a = a
X.b = b
X.c = c
END SUB
|
_________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Lutz Ifer Grillmeister

Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 11.03.2008, 13:39 Titel: |
|
|
Elektronix hat Folgendes geschrieben: | Die Declaration "ByRef" gibt es in QBasic nicht. "ByVal" geht nur bei Unterprogrammen aus anderen Sprachen. |
Nicht ganz.
Code: | '***************************************************************************
' CALLREVA.BAS = Unterschied zwischen "Call by Reference" und "by Value"
' ============
' Dieses QBasic-Programm demonstriert anschaulich den Unterschied
' zwischen den beiden Parameteruebergabe-Methoden "Call by Reference" und
' "Call by Value".
'
' An die SUB quadrat wird die Variable a% als Parameter uebergeben. Einmal
' "by reference" und einmal "by Value" (Parameterwert in Klammern). Die
' SUB quadriert den uebergebenen Parameter und zeigt das Ergebnis an.
' Wie man sieht, veraendert die SUB bei "Call by reference" den Wert der
' Parametervariablen a% des Hauptprogramms von 3 auf 9, waehrend sie bei
' "Call by Value"' unveraendert bleibt.
'
' (c) Thomas Antoni, 23.2.2005 - www.qbasic.de
'***************************************************************************
'
DECLARE SUB quadrat (b%)
CLS
PRINT "Call by Reference"
PRINT "-----------------"
a% = 3
PRINT "Vor dem Aufruf der Sub hat a% im Hauptprogramm den Wert"; a%
CALL quadrat(a%)
'Es wird die Adresse von a% an die SUB uebergeben
PRINT "Nach dem Aufruf der Sub hat a% im Hauptprogramm den Wert"; a%
'
PRINT
PRINT "Call by Value"
PRINT "-----------------"
a% = 3
PRINT "Vor dem Aufruf der Sub hat a% im Hauptprogramm den Wert"; a%
CALL quadrat((a%))
'a% in Klammern => Es wird der Wert von a% uebergeben
PRINT "Nach dem Aufruf der Sub hat a% im Hauptprogramm den Wert"; a%
SLEEP
END
'
SUB quadrat (b%)
b% = b% ^ 2
PRINT b%
END SUB
|
_________________ Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 11.03.2008, 14:55 Titel: |
|
|
Danke, Lutz, den Trick mit den Klammern kannte ich noch nicht . Dachte schon mit Schrecken, call by Value wäre in QB gar nicht möglich.
Noch ein Vorteil bei FreeBasic: Da muß ich mir nicht die ganzen Präfixe und Zusatzzeichen merken. ByVal, ByRef, as Integer usw ist doch viel verständlicher als ((x)), (x), %, &...  _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett.
Zuletzt bearbeitet von Elektronix am 11.03.2008, 14:57, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 11.03.2008, 14:56 Titel: |
|
|
Übrigens derartige Probleme und Details wie BYVAL/BYREF werden ansonsten auch in meinem zuvor genannten Artikel ausführlich diskutiert. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
|