2017-05-03 5 views
2

Ich kenne mich mit QB64 nicht aus und die Dokumentation ist spärlich, daher habe ich Probleme.Falscher Array-Typ, der an ein Unterprogramm übergeben wird

TYPE character 
FName AS STRING * 12 
LName AS STRING * 12 
ID_Num AS INTEGER 
Year AS STRING * 2 
GPA AS DOUBLE 
END TYPE 
DIM LENGTH AS INTEGER 

LENGTH = 11 

REDIM chars(0) AS character 

CLS 

n$ = "names1.txt" 

OPEN n$ FOR INPUT AS #1 

k = -1 

WHILE (NOT (EOF(1))) 
k = k + 1 

REDIM _PRESERVE chars(k) AS character 
INPUT #1, chars(k).FName, chars(k).LName, chars(k).ID_Num, chars(k).Year, 
chars(k).GPA 

WEND 
CLOSE #1 


CALL sortArray(chars(), LENGTH) 

SUB sortArray (score() AS INTEGER, SIZE AS INTEGER) 

DIM x AS INTEGER 
DIM y AS INTEGER 
DIM COMPS AS INTEGER 

x = 0 
y = 0 
COMPS = SIZE - 1 

WHILE y < COMPS 
    x = 0 
    WHILE x < COMPS 
     IF score(x) > score(x + 1) THEN 
      CALL swap2(score(), x) 
     END IF 
     x = x + 1 
    WEND 
    y = y + 1 
    WEND 

    END SUB 



    SUB swap2 (score() AS INTEGER, x AS INTEGER) 
DIM temp AS INTEGER 
temp = score(x + 1) 
score(x + 1) = score(x) 
score(x) = temp 
END SUB 

Ich erhalte eine Fehlermeldung - „Falscher Array-Typ zu Unter bestanden“ auf der folgende Zeile:

CALL sortArray(chars(), LENGTH) 

ich, dass ich davon aus, da ich oben verwendete REDIM, dass die Unter nicht Verarbeitung, aber ich bin mir nicht sicher, wie ich das beheben soll. Letztendlich versuche ich, eine Datei in ein Array einzulesen, dieses Array zu sortieren und dann an den Benutzer auszugeben. Momentan bin ich fest, wie man das Array tatsächlich sortiert.

Jede Hilfe wird geschätzt. Vielen Dank!

+0

Um welche Art von Partitur möchten Sie sortieren? Es gibt keine Score-Eigenschaft im Typ "Charakter". Möchten Sie nach der GPA-Eigenschaft sortieren? –

Antwort

2

Sie übergeben das Array chars(), das Elemente vom Typ character enthält, aber Ihre Subroutine akzeptiert nur ein Array mit Elementen vom Typ INTEGER.

Was Sie brauchen, ist score() AS character (besser chars() AS character genannt), und Sie können auf die Suchergebnisse basierend, was auch immer Sie wünschen Kriterien (z IF score(x).GPA > score(x+1).GPA THEN ...). Auch gibt es eine built-in SWAP statement, die Dinge für Sie tauschen wird, so dass es keine Notwendigkeit gibt, Ihre eigenen zu schreiben (es sei denn, Sie sollten).

0

Hier ist der Code (stark geändert), wobei:

1) Die UDT richtig deklariert sind. 2) Der Redim funktioniert nur, wenn $ dynamic deklariert ist. 3) Die "Blasensortierung" ist kürzer.

REM $DYNAMIC 
TYPE character 
    FName AS STRING * 12 
    LName AS STRING * 12 
    ID_Num AS INTEGER 
    Year AS STRING * 2 
    GPA AS DOUBLE 
END TYPE 
DIM chars(0) AS character 
n$ = "names1.txt" 
OPEN n$ FOR INPUT AS #1 
WHILE NOT EOF(1) 
    k = k + 1 
    REDIM _PRESERVE chars(k) AS character 
    INPUT #1, chars(k).FName, chars(k).LName, chars(k).ID_Num, chars(k).Year, chars(k).GPA 
WEND 
CLOSE #1 
CALL SortArray(chars(), k) 
END 
SUB SortArray (score() AS character, SIZE AS INTEGER) 
' bubble sort 
FOR x = 1 TO SIZE 
    FOR y = x + 1 TO SIZE 
     IF score(x).GPA > score(y).GPA THEN 
      SWAP score(x), score(y) 
     END IF 
    NEXT 
NEXT 
END SUB 
Verwandte Themen