Seite 1 von 1

SortArray - Wo ist mein Fehler

Verfasst: 21.03.2006 11:45
von Ironsmurf
Hallo zusammen
ich möchte gerne ein Array sortieren, nach Vornamen und dann Nachname, leider bekomme ich es nicht hin. Wer ist so freundlich und hilft einem Anfänger?

Code: Alles auswählen

;

Dim Star.Person(100)
Star(   0) \ Vorname$    = "Michael J"
Star(   0) \ Nachname$ = "Fox"

Star(   1) \ Vorname$   = "Christopher"
Star(   1) \ Nachname$ = "Lloyd"

Star(   2) \ Vorname$ = "Mary"
Star(   2) \ Nachname$ ="Steenburgen"

Star(   3) \ Vorname$ = "Thomas F"
Star(   3) \ Nachname$ = "Wilson"

Star(   4) \ Vorname$ = "Lea"
Star(   4) \ Nachname$ = "Thompson"

Star(   5) \ Vorname$ = "Elisabeth"
Star(   5) \ Nachname$ = "Shue"

Star(   6) \ Vorname$ = "Grispin"
Star(   6) \ Nachname$ = "Glover"

Star(   7) \ Vorname$ = "Matt"
Star(   7) \ Nachname$ = "Dillon"

Star(   8) \ Vorname$ = "Kevin"
Star(   8) \ Nachname$ = "Bacon"

Star(   9) \ Vorname$ = "Neve"
Star(   9) \ Nachname$ = "Campell"

Stars
 ConsoleColor(10,0)
  SortArray (Star(),2); Hier liegt der Fehler
   For index.b = 0 To 10
    Namevor$ = Star(index)\Vorname$
    Namenach$   = Star(index)\Nachname$
   If FindString (UCase(Namenach$),UCase(Eingabe$),1) Or FindString (UCase(Namevor$),UCase(Eingabe$),1)
  Print_s(""+Namevor$+" "+Namenach$+"")
 EndIf
 Next

Verfasst: 21.03.2006 12:35
von HeX0R
Du benutzt ein strukturiertes Array, also musst du auch SortStructuredArray()benutzen.

Hättest du übrigens ein lauffähiges Beispiel beigefügt, hätte ich es dir sogar anhand eines Codes gezeigt.

Verfasst: 21.03.2006 12:46
von Lebostein
Wieso muss man eigentlich bei SortStructuredArray() den Typ mit angeben? Wird der nicht durch das OffsetOf(Structure\Field) eindeutig bestimmt? Kann der Compiler nicht daraus selbst den Typ ableiten?

Code: Alles auswählen

Structure Animal
  Name$
  Speed.l
EndStructure

Dim Animals.Animal(2)

Animals(0)\Name$ = "Tiger"
Animals(0)\Speed = 10

Animals(1)\Name$ = "Jaguar"
Animals(1)\Speed = 40

Animals(2)\Name$ = "Zebre"
Animals(2)\Speed = 30

;Ist doch offensichtlich, dass Animal\Name$ ein String ist:
SortStructuredArray(Animals(), 0, OffsetOf(Animal\Name$), #PB_Sort_String)

;Ist doch offensichtlich, dass Animal\Speed ein Long ist:
SortStructuredArray(Animals(), 0, OffsetOf(Animal\Speed), #PB_Sort_Long)

Verfasst: 21.03.2006 16:19
von ts-soft
@Lebostein
Der Compiler führt den Code nicht aus, er kompiliert ihn. Was er kompiliert
hat ist Vergangenheit, oder er schleppt ne Riesentabelle mit sich rum, um
diese Dinge zu Wissen, wenn er an die Stelle kommt.

Verfasst: 21.03.2006 19:20
von Lebostein
ts-soft hat geschrieben:@Lebostein
Der Compiler führt den Code nicht aus, er kompiliert ihn. Was er kompiliert
hat ist Vergangenheit, oder er schleppt ne Riesentabelle mit sich rum, um
diese Dinge zu Wissen, wenn er an die Stelle kommt.
Hä?

Es geht doch hier auch gar nicht um die Ausführung des geschriebenen Programmes. Gerade eben weil der Compiler VOR der Ausführung tätig wird, hat er doch aufgrund seiner einmaligen Aktion genug Zeit und auch die Möglichkeiten nachzusehen, welcher Datentyp mit OffsetOf() angewählt wird, und diesen Datentyp dann für die EXE-Datei (die er ja zu generieren hat) ein für alle mal festzulegen, so wie man es derzeit eigenhändig tun muss.

Verfasst: 21.03.2006 19:33
von Ironsmurf
Ok, war mein Fehler, war etwas unter Zeitdruck, nun aber ein lauffähiges Script.

Code: Alles auswählen

Structure Person$
  Nachname$
  Vorname$
EndStructure

;#############################

Procedure Print_s(text.s)
CharToOem_(text.s,text.s)
PrintN( text.s)
EndProcedure

;#############################

;Globaliere String$ 
Global Eingabe$ 
Procedure String(text$) 
  If FindString(Eingabe$, text$, 1) 
    ProcedureReturn 1 
  Else 
    ProcedureReturn 0 
  EndIf
EndProcedure

;#################################

Dim Star.Person(100)
Star(   0) \ Vorname$    = "Michael J"
Star(   0) \ Nachname$ = "Fox"

Star(   1) \ Vorname$   = "Christopher"
Star(   1) \ Nachname$ = "Lloyd"

Star(   2) \ Vorname$ = "Mary"
Star(   2) \ Nachname$ ="Steenburgen"

Star(   3) \ Vorname$ = "Thomas F"
Star(   3) \ Nachname$ = "Wilson"

Star(   4) \ Vorname$ = "Lea"
Star(   4) \ Nachname$ = "Thompson"

Star(   5) \ Vorname$ = "Elisabeth"
Star(   5) \ Nachname$ = "Shue"

Star(   6) \ Vorname$ = "Grispin"
Star(   6) \ Nachname$ = "Glover"

Star(   7) \ Vorname$ = "Matt"
Star(   7) \ Nachname$ = "Dillon"

Star(   8) \ Vorname$ = "Kevin"
Star(   8) \ Nachname$ = "Bacon"

Star(   9) \ Vorname$ = "Neve"
Star(   9) \ Nachname$ = "Campell"

;#########################################

OpenConsole()
Repeat
PrintN("")
ConsoleColor(13,0)

;#####################

Eingabe$=""

Eingabe$ = Input()

OemToChar_(Eingabe$,Eingabe$)
PrintN("")

;Entfernt Space von Beginn & Ende des Strings 
  Eingabe$ = Trim(Eingabe$)
   
  ;Konvertiert alle Grossbuchstaben in Kleinbuchstaben 
  Eingabe$ = LCase(Eingabe$) 
;Stars
 ConsoleColor(10,0)
  SortArray (Star(),2); Hier liegt der Fehler
   For index.b = 0 To 10
    Namevor$ = Star(index)\Vorname$
    Namenach$   = Star(index)\Nachname$
   If FindString (UCase(Namenach$),UCase(Eingabe$),1) Or FindString (UCase(Namevor$),UCase(Eingabe$),1)
  Print_s(""+Namevor$+" "+Namenach$+"")
 EndIf
 Next
 
 ;#########################################################

ForEver
CloseConsole()

Verfasst: 21.03.2006 21:31
von Deeem2031
Lebostein hat geschrieben:
ts-soft hat geschrieben:@Lebostein
Der Compiler führt den Code nicht aus, er kompiliert ihn. Was er kompiliert
hat ist Vergangenheit, oder er schleppt ne Riesentabelle mit sich rum, um
diese Dinge zu Wissen, wenn er an die Stelle kommt.
Hä?

Es geht doch hier auch gar nicht um die Ausführung des geschriebenen Programmes. Gerade eben weil der Compiler VOR der Ausführung tätig wird, hat er doch aufgrund seiner einmaligen Aktion genug Zeit und auch die Möglichkeiten nachzusehen, welcher Datentyp mit OffsetOf() angewählt wird, und diesen Datentyp dann für die EXE-Datei (die er ja zu generieren hat) ein für alle mal festzulegen, so wie man es derzeit eigenhändig tun muss.
Das wär ja total kompliziert, glaub kaum das Fred sich das antuen würde. Genauso wie eine Runtime-Lösung für das Problem, denn es wird zwar eine Liste gespeichert ob an dem Offset ein String steht oder nicht, trotzdem wäre es praktisch unsinnig und unsicher den Typen automatisch zu erkennen.