Hello, Guest the thread was called258 times and contains 8 replays

last post from JeeK at the

illegal Quantity Error bei 2 hoch 15 ?

  • Hallo Leute,


    ich habe mal eine Frage an die BASIC Spezialisten.

    Ich bekomme bei einem print 32764 and 2hoch15 einen Illegal Quantity Error. Gleiches passiert bei einer IF... THEN Abfrage.

    Simples print 2hoch15 funktioniert dagegen. Gibt es da eine Beschränkung bei diversen Befehlen ähnlich der bei Integer Variablen ?

    Oder gibt's dafür ein Workaround ?

  • Vielleicht mal eine Klammer um 2hoch15? Ich weiß nicht genau, wie die Operator-Präzedenz in Basic ist, aber es sieht so aus als versucht er (32764 and 2 = ) 0 hoch 15 zu rechnen.

    ────────────────────────────────────────────────────────────
    Time of Silence - Time of Silence 2 Development Blog
    ────────────────────────────────────────────────────────────

  • Ich habe 3 Varianten ausprobiert:


    Code
    1. 10 ap=32764
    2. 20 print ap and 2^15
    3. 20 print (ap and (2^15))
    4. 20 print (ap) and (2^15)

    Alle führen zum o.g. Fehler. Bis 2^14 einschl. funktioniert es.

  • Sonst wird alles in einem Ausdruck in Float gerechnet, aber binäres AND und OR scheinen eine Ausnahme zu sein.

    2^15 ist genau 1 zu groß für Integer, PRINT 2^15 geht, A%=2^15 geht auch nicht.


    Als Workaround könnte man was mit >32767 basteln, die Zahl von Hand in Lo/Hi zerlegen und am Ende der Rechnung wieder zusammenführen.

  • Mist hab es vermutet. Dann muss ich mir was anderes überlegen.

    O.g. Code sollte eigentlich dazu verwendet werden ein Auwahlmenü für die 15 Access Gruppen in C*BASE zu bauen, in dem Rechte für die einzelne Gruppe gesetzt oder entzogen werden kann.

    Jede Gruppe wird durch ein Bit repräsentiert. 16384 würde allen Gruppen außer Gruppe15 Zugriff gewähren.

  • Mist hab es vermutet. Dann muss ich mir was anderes überlegen.

    O.g. Code sollte eigentlich dazu verwendet werden ein Auwahlmenü für die 15 Access Gruppen in C*BASE zu bauen, in dem Rechte für die einzelne Gruppe gesetzt oder entzogen werden kann.

    Jede Gruppe wird durch ein Bit repräsentiert. 16384 würde allen Gruppen außer Gruppe15 Zugriff gewähren.

    Statt 2^15 muss man -2^15 nehmen.

    Man steckt die Bit-Wertigkeiten dann aber besser in eine Tabelle, z.B.

    Code
    1. 100 DIMW(16): W=-32768: FOR I=16 TO 1 STEP -1: W(I)=W: W=ABS(W/2): NEXT
    2. 110 REM GRUPPERECHTE VON GRUPPE 16, 8 und 1 (VON 1 BIS 16, BEI MAX. 16 GRUPPEN)
    3. 120 GR = W(16) OR W(8) OR W(1): REM RECHTE FUER GRUPPE 16, 8 UND 1
    4. 130 IF GR AND W(8) THEN PRINT "RECHT FUER GRUPPE 8 VORHANDEN."

    Hier wird W(16) mit -32768 initialisiert, die anderen sind dann positive Werte.

    Aber für 15 Access-Gruppen kommt man aber auch ohne Bit 15 aus, wenn man bei Bit 0 (2^0 = 1) beginnt (also von Bit 0 bis Bit 14)

    1. Access-Gruppe 2^0 = 1

    2. Access-Gruppe 2^1 = 2

    ...

    15. Access-Gruppe 2^14 = 16384


    Das reicht doch so, oder? ^^

  • Code
    1. 1 goto10
    2. 2 h%=a/256: l%=a-256*h%: if b%<8 then l%=l%and(2^b%)
    3. 3 b%=b%-8: if b%>0 then l%=h%and(2^b%)
    4. 4 l%=-(l%>0): return
    5. 10 a=132000: for l=22to0 step-1: b%=l: gosub2: print l%;: next

    Das geht mit 23 Rechten von 0 bis 22.

    Mit 16384 statt 256 und 14 statt 8 müsste es auch von 0 bis 28 gehen, war jetzt zu Faul zum Testen :P

  • Code
    1. 1 goto10
    2. 2 h%=a/256: l%=a-256*h%: if b%<8 then l%=l%and(2^b%)
    3. 3 b%=b%-8: if b%>0 then l%=h%and(2^b%)
    4. 4 l%=-(l%>0): return
    5. 10 a=132000: for l=22to0 step-1: b%=l: gosub2: print l%;: next

    Das geht mit 23 Rechten von 0 bis 22.

    Mit 16384 statt 256 und 14 statt 8 müsste es auch von 0 bis 28 gehen, war jetzt zu Faul zum Testen :P

    Zeile 3 dürfte einen Bug haben, sollte wie folgt aussehen:

    Code
    1. 3 b%=b%-8: if b%>=0 then l%=h%and(2^b%)

    Also es geht von 0 bis 29 (bei jedem Wort lässt man das höchstwertige Bit weg, das sind 2 bei 32, also 30 Bits bleiben übrig, von 0 bis 29).

    Dann hätten wir (ich hab's probiert):

    Code
    1. 1 goto10
    2. 2 h%=a/32768: l%=a-32768*h%: if b%<15 then l%=l%and(2^b%)
    3. 3 b%=b%-15: if b%>=0 then l%=h%and(2^b%)
    4. 4 l%=-(l%>0): return
    5. 10 a=2^29 + 2^16 + 1: for l=29to0 step-1: b%=l: gosub2: print l%;: next

    Damit hätten wir 2 "Words" ausgeschöpft, wobei das höchstwertige (in Dezimaldarstellung mit negativem Wert) Bit vermieden wird.