SortStructuredArray() - Aenderung oder Bug?

Für allgemeine Fragen zur Programmierung mit PureBasic.
blastar
Beiträge: 25
Registriert: 10.06.2011 17:23

SortStructuredArray() - Aenderung oder Bug?

Beitrag von blastar »

Hallo,

ich wollte mal ein etwas aelteres Projekt mit der aktuellsten PB 5.60 versuchen... allerdings scheitert es an dem Befehl 'SortStructuredArray()'. Im Gegensatz zu 4.61 & 5.31 scheint dieser nun nicht mehr mit multidimensionalen Feldern umgehen zu koennen.

[15:34:19] [ERROR] SortStructuredArray(): Multi-dimensioned Array is Not support by SortArray().

Die Fehlermeldung im LOG bezieht sicher auf 'SortArray()' und da steht auch in der Hilfe 'Multi-dimensioned arrays are not supported'. Dieser Hinweiss findet sich allerdings nicht unter 'SortStructuredArray()' und hat auch bisher mit multidimensionalen Feldern bestens funktioniert.

Hat sich hier was geaendert? Wurde der Befehl 'SortStructuredArray()' geaendert und die Funktion duch einen anderen Befehl ersetzt?
Wenn das so gewollt ist... gibt es einen Ersatz/Workaround?

Dieser (aus der Hilfe) erweiterte Code laeuft unter 4.61 & 5.31 ohne Probleme:

Code: Alles auswählen

Structure Animal
    Name$
    Speed.l
  EndStructure

  Dim Animals.Animal(2, 2)

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

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

  Animals(2,2)\Name$ = "Zebra"
  Animals(2,2)\Speed = 30
  
  Debug "***************"
  Debug "Sorted by Name"
  Debug "***************"
  
  SortStructuredArray(Animals(), 0, OffsetOf(Animal\Name$), #PB_String)
  
  For l= 0 To 2
    For k=0 To 2
      Debug Animals(k,l)\Name$+" - Speed: "+Str(Animals(k,l)\Speed)
    Next
  Next      
  
  Debug "***************"
  Debug "Sorted by Speed"
  Debug "***************"
  
  SortStructuredArray(Animals(), 0, OffsetOf(Animal\Speed), #PB_Long)

  For l= 0 To 2
    For k=0 To 2
      Debug Animals(k,l)\Name$+" - Speed: "+Str(Animals(k,l)\Speed)
    Next
  Next      
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: SortStructuredArray() - Aenderung oder Bug?

Beitrag von GPI »

Das es funktioniert hat, war vermutlich ein Bug. Wie genau will man auch ein Multi-Array sortieren? Darf man sie aus der zweiten Dimension in die erste reinsortieren etc?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
blastar
Beiträge: 25
Registriert: 10.06.2011 17:23

Re: SortStructuredArray() - Aenderung oder Bug?

Beitrag von blastar »

Ich weiss gar nicht mehr wie ich darauf gekommen bin aber SortStructuredArray() griff bisher linear auf ein 2D-Array zu. Ueber die Angaben START & END (kann man z.B. ueber COLUMN & ArraySize(Animals(), 2) errechnen) konnte man gezielt einzelne Spalten sortiere. Bei der Nutzung eines INDEX-Wertes in der Struktur konnte man anschliessend die restlichen Spalten entsprechend sortieren. Schade das das nicht mehr geht....

Falls das ein BUG war, ich will den wiederhaben! 8)

hier mal eine besserer Code dazu:

Code: Alles auswählen

Structure Animal
    Name.s
    Speed.l
  EndStructure

  Dim Animals.Animal(2, 2)
  
  ; zu Land
  Animals(0,0)\Name = "Gepard"
  Animals(0,0)\Speed = 122 
  Animals(0,1)\Name = "Antilope"
  Animals(0,1)\Speed = 90 
  Animals(0,2)\Name = "Strauß"
  Animals(0,2)\Speed = 70
  
  ; zu Wasser
  Animals(1,0)\Name = "Schwertwal"
  Animals(1,0)\Speed = 70 
  Animals(1,1)\Name = "Barrakuda"
  Animals(1,1)\Speed = 150 
  Animals(1,2)\Name = "Feuerqualle"
  Animals(1,2)\Speed = 2
  
  ; zu Luft
  Animals(2,0)\Name = "Wanderfalke"
  Animals(2,0)\Speed = 320
  Animals(2,1)\Name = "Moorente"
  Animals(2,1)\Speed = 106 
  Animals(2,2)\Name = "Kiebitz"
  Animals(2,2)\Speed = 150  
  
  Debug "**********************"
  Debug " # Orginal"
  Debug "**********************"
  For x = 0 To 2
    For y = 0 To 2
      Debug Animals(x,y)\Name+" - Speed: "+Str(Animals(x,y)\Speed)
    Next    
    Debug "*"  
  Next      

  SortStructuredArray(Animals(), #PB_Sort_Ascending, OffsetOf(Animal\Name), #PB_String, 0, 2)
  Debug "**********************"
  Debug " # Land sorted by Name"
  Debug "**********************"
  For x = 0 To 2
    For y = 0 To 2
      Debug Animals(x,y)\Name+" - Speed: "+Str(Animals(x,y)\Speed)
    Next    
    Debug "*"  
  Next      
  
  SortStructuredArray(Animals(), #PB_Sort_Descending, OffsetOf(Animal\Speed), #PB_Long, 3, 5)
  Debug "**********************"
  Debug " # Wasser sorted by Speed"
  Debug "**********************"
  For x = 0 To 2
    For y = 0 To 2
      Debug Animals(x,y)\Name+" - Speed: "+Str(Animals(x,y)\Speed)
    Next    
    Debug "*"  
  Next      
  
  SortStructuredArray(Animals(), #PB_Sort_Ascending, OffsetOf(Animal\name), #PB_String, 6, 8)
  Debug "**********************"
  Debug " # Luft sorted by Name"
  Debug "**********************"
  For x = 0 To 2
    For y = 0 To 2
      Debug Animals(x,y)\Name+" - Speed: "+Str(Animals(x,y)\Speed)
    Next    
    Debug "*"  
  Next
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: SortStructuredArray() - Aenderung oder Bug?

Beitrag von ccode_new »

Hi blastar,

das ist JETZT ein BUG von PureBasic beim Debugger.

Probiere deinen Code mal ohne Debugger-Ausgabe und mit "DisableDebugger".

Es sollte funktionieren.

Also der Bug liegt eindeutig bei Pure-Basic.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
blastar
Beiträge: 25
Registriert: 10.06.2011 17:23

Re: SortStructuredArray() - Aenderung oder Bug?

Beitrag von blastar »

Ok, wo geht es jetzt zum hochdotiertem Purebasic-Bug-Bounty-Programm! 8)
Aber stimmt, ohne Debugger laeuft das ganze... hmm, das ist natuerlich keine Option weil beim schreiben der Debugger immer eingeschaltet ist. :|

Hier nochmal ein Code zum testen ohne DEBUG-Output:

Code: Alles auswählen

Structure Animal
  Name.s
  Speed.l
EndStructure

Global Dim Animals.Animal(2, 2)

; zu Land
Animals(0,0)\Name = "Gepard"
Animals(0,0)\Speed = 122 
Animals(0,1)\Name = "Antilope"
Animals(0,1)\Speed = 90 
Animals(0,2)\Name = "Strauß"
Animals(0,2)\Speed = 70

; zu Wasser
Animals(1,0)\Name = "Schwertwal"
Animals(1,0)\Speed = 70 
Animals(1,1)\Name = "Barrakuda"
Animals(1,1)\Speed = 150 
Animals(1,2)\Name = "Feuerqualle"
Animals(1,2)\Speed = 2

; zu Luft
Animals(2,0)\Name = "Wanderfalke"
Animals(2,0)\Speed = 320
Animals(2,1)\Name = "Moorente"
Animals(2,1)\Speed = 106 
Animals(2,2)\Name = "Kiebitz"
Animals(2,2)\Speed = 150  

If OpenWindow(0, 0, 0, 484, 180, "SortStructuredArray() Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  ListIconGadget(0,  0,  0, 490, 160, "Animal", 80)
  AddGadgetColumn(0, 1, "Speed", 80)
  AddGadgetColumn(0, 2, "Animal", 80)
  AddGadgetColumn(0, 3, "Speed", 80)
  AddGadgetColumn(0, 4, "Animal", 80)
  AddGadgetColumn(0, 5, "Speed", 80)
  ButtonGadget(10,   0, 160, 80, 20, "Sort Name")
  ButtonGadget(11,  80, 160, 80, 20, "Sort Speed")
  ButtonGadget(12, 160, 160, 80, 20, "Sort Name")
  ButtonGadget(13, 240, 160, 80, 20, "Sort Speed")
  ButtonGadget(14, 320, 160, 80, 20, "Sort Name")
  ButtonGadget(15, 400, 160, 80, 20, "Sort Speed")
  
  For x.w = 0 To 2
    AddGadgetItem(0,-1,Animals(0,x)\Name+Chr(10)+Animals(0,x)\Speed+Chr(10)+Animals(1,x)\Name+Chr(10)+Animals(1,x)\Speed+Chr(10)+Animals(2,x)\Name+Chr(10)+Animals(2,x)\Speed)
  Next

  Repeat
    
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
      Case #PB_Event_Gadget  
        Select EventGadget()
          Case 10 
            SortStructuredArray(Animals(), #PB_Sort_Ascending, OffsetOf(Animal\Name), #PB_String, 0, 2)
          Case 11 
            SortStructuredArray(Animals(), #PB_Sort_Ascending, OffsetOf(Animal\Speed), #PB_Long, 0, 2)
          Case 12 
            SortStructuredArray(Animals(), #PB_Sort_Ascending, OffsetOf(Animal\Name), #PB_String, 3, 5)
          Case 13 
            SortStructuredArray(Animals(), #PB_Sort_Ascending, OffsetOf(Animal\Speed), #PB_Long, 3, 5)
          Case 14 
            SortStructuredArray(Animals(), #PB_Sort_Ascending, OffsetOf(Animal\Name), #PB_String, 6, 8)
          Case 15 
            SortStructuredArray(Animals(), #PB_Sort_Ascending, OffsetOf(Animal\Speed), #PB_Long, 6, 8)
        EndSelect
        
      ClearGadgetItems(0)
      For x.w = 0 To 2
        AddGadgetItem(0,-1,Animals(0,x)\Name+Chr(10)+Animals(0,x)\Speed+Chr(10)+Animals(1,x)\Name+Chr(10)+Animals(1,x)\Speed+Chr(10)+Animals(2,x)\Name+Chr(10)+Animals(2,x)\Speed)
      Next
        
    EndSelect      
  ForEver
  
EndIf
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: SortStructuredArray() - Aenderung oder Bug?

Beitrag von ccode_new »

Naja dann schreibe halt erstmal immer vor so einem Code...

z.Bsp.:

Code: Alles auswählen

DisableDebugger
;SortStructuredArray(Animals(), #PB_Sort_Ascending, OffsetOf(Animal\Name), #PB_String, 0, 2)
...und wenn du mit solchen Sachen fertig bist schreibe wieder:

Code: Alles auswählen

EnableDebugger
Außerdem solltest du eben eine andere Debug-Ausgabe-Möglichkeit wählen (z.B. PrintN oder MessageRequester,...)

Ansonsten sollte das eben bald möglichst mal gefixt werden.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
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

Re: SortStructuredArray() - Aenderung oder Bug?

Beitrag von ts-soft »

Jetzt nochmal zum Mitschreiben:
Der Code wird so nicht unterstützt! Ob eine Ausführung mit oder ohne Debugger möglich ist, ist dabei unerheblich.
Ein "scheinbares" funktionieren macht den Code auch nicht richtiger. Die Debugger-Meldung wird schon korrekt sein,
Abschaltung des Debuggers und ignorieren macht das ganze nicht besser.

Entweder FeatureRequest im engl. Forum oder auf eigenes Risiko, mit dem Debugger entsprechende Codestellen aussparen,
und das Problem ignorieren, was aber in keinem Falle ratsam wäre!

Es ist kein Bug und muß nichts gefixed werden!
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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: SortStructuredArray() - Aenderung oder Bug?

Beitrag von ccode_new »

Der Code wird so nicht unterstützt!
Der Code wird aber so unterstützt.

Sonst würde es doch nicht gehen, oder?

Wo liegt den der Fehler? Der Code läuft doch absolut stabil.

Die Hilfe und die Funktion im Allgemeinen verbieten doch so etwas nicht!

....
Dieses Statement lasse ich jetzt einfach mal so stehen.

Egal ob BUG, oder nicht!
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
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

Re: SortStructuredArray() - Aenderung oder Bug?

Beitrag von ts-soft »

ccode_new hat geschrieben:
Der Code wird so nicht unterstützt!
Der Code wird aber so unterstützt.

Sonst würde es doch nicht gehen, oder?
Hat damit nichts zu tun!

Wenn eine Funktion dokumentiert ist, als funktionierend, dann kann sie bei nichtfunktion ein Bug sein. Ansonsten handelt es sich lediglich um ein undokumentiertes Feature, was keinen Anspruch darauf erheben kann, zu funktionieren.
Wo liegt den der Fehler? Der Code läuft doch absolut stabil.
Sicher? Unter allen unterstützten OS Versionen, also MacOS, Linux, Windows und deren Revisionen getested?
Auch 32- und 64-Bit Version?
Ich glaube eher weniger das Du zur Aussage: Absolut Stabil, qualifiziert bist, weil Du kannst ja nur testen unter den
Bedingungen, die Dir zur Verfügung stehen.
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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: SortStructuredArray() - Aenderung oder Bug?

Beitrag von ccode_new »

Wo liegt den der Fehler? Der Code läuft doch absolut stabil.
Sicher? Unter allen unterstützten OS Versionen, also MacOS, Linux, Windows und deren Revisionen getested?
Auch 32- und 64-Bit Version?
Ich glaube eher weniger das Du zur Aussage: Absolut Stabil, qualifiziert bist, weil Du kannst ja nur testen unter den
Bedingungen, die Dir zur Verfügung stehen.
Da hast du natürlich vollkommen Recht!

Also z.B. unter Windows PB 5.60 x86 und x64 funktioniert es perfekt und unter Linux Mate 16.04 PB 5.60 x64 auch.

Außerdem gibt es wohl einige Dokumentierte PB-Funktionen die weniger stabil als diese Funktion laufen.

Diese Funktion hat schon mal eine größere Stabilität als so manche PB-Zeichenfunktion mit diversen Zeigerzugriff-Fehlern unter Linux.

Außerdem hättest du dir die Fehlermeldung mal genau ansehen sollen.

Diese Fehlermeldung ist nämlich schon ein einziger Bug.

Dort steht doch wortwörtlich schon "SortArray()":
[ERROR] SortStructuredArray(): Multi-dimensioned array is not support by SortArray().

An dieser Stelle müsste ja sonst SortStructuredArray() stehen, oder?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten