SortArray - Wo ist mein Fehler

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

SortArray - Wo ist mein Fehler

Beitrag 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
Es kommt immer auf die Sichtweise des Betrachters an.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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.
Benutzeravatar
Ironsmurf
Beiträge: 111
Registriert: 04.01.2006 12:57
Computerausstattung: AMD FX(tm)-6300 Six-Core Processor
3.50 GHz / 8 GB Ram
Windows 7 / 64bit / Ultimate
Purebasic 5.20 LTS (Windows - x86)
Wohnort: Deutschland

Beitrag 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()
Es kommt immer auf die Sichtweise des Betrachters an.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten