Probleme mit SortStructuredList

Anfängerfragen zum Programmieren mit PureBasic.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Probleme mit SortStructuredList

Beitrag von Agent »

Kann mir jemand verraten, warum folgender Code-Ausschnitt nicht funktioniert?

Code: Alles auswählen

#max_appname_length=20

;- STRUCTURES
Structure ApplicationInfo
  AppName.s[#max_appname_length]
  AppPath.s[1000]
EndStructure

;- LISTS
NewList Applications.ApplicationInfo()

AddElement(Applications())
Applications()\AppName="Test 1"

AddElement(Applications())
Applications()\AppName="Test 2"



SortStructuredList(Applications(), 0, OffsetOf(Applications()\AppName), #PB_Sort_String)


ForEach Applications()
  Debug Applications()\AppName
Next
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Du solltest die Fehlermeldung richtig lesen, aber keine Ansgt, dafür hast du ja mich :wink:
Structure not found: Applications()
Und da hat er Recht: Applications(9 ist eine Liste und keine Struktur!

So muss es richtig lauten, dann funktioniert's auch (Zur Demonstration habe ich die Elemente Test 1+2 neu angeordnet, damit man den Sortiereffekt sieht):

Code: Alles auswählen

#max_appname_length=20 

;- STRUCTURES 
Structure ApplicationInfo 
  AppName.s[#max_appname_length] 
  AppPath.s[1000] 
EndStructure 

;- LISTS 
NewList Applications.ApplicationInfo() 

AddElement(Applications()) 
Applications()\AppName="Test 2" 

AddElement(Applications()) 
Applications()\AppName="Test 1" 



SortStructuredList(Applications(), 0, OffsetOf(ApplicationInfo\AppName), #PB_Sort_String) 


ForEach Applications() 
  Debug Applications()\AppName 
Next
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Sorry, aber ich muss jetzt irgendwie was nicht verstanden haben:

Du deklarierst in deiner Struktur einen statischen Array:

Code: Alles auswählen

  AppName.s[#max_appname_length]
Mit dem Datentyp String.

Nun setzt du irgendwas(k.A. welches element du in diesem Array nimmst) dieses Strings auf "Test 2" im zweiten Element und "Test 1" im ersten Element. | Ich weiß echt nicht warum der Compiler da nicht meckert, dass du dem Pointer zu diesem Array einen String zuweißt und es dann sogar noch funktioniert. Normalerweise nimmt man ein char-array(in den man speicherbereiche kopiert/ausliest) oder fixed string für sowas aber nicht einen String-Array.

[EDIT]
Ein paar Sätze von mir sind verwirrend :freak: . Ich hab nen senkrechten Strich hingemacht ab wann man es lesen kann.
Zuletzt geändert von DarkDragon am 26.09.2006 13:46, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

DarkDragon hat Recht.

Eigentlich sollte es bestimmt so aussehen:

Code: Alles auswählen

#max_appname_length=20

;- STRUCTURES
Structure ApplicationInfo
  AppName.s{#max_appname_length}
  AppPath.s{1000}
EndStructure

;- LISTS
NewList Applications.ApplicationInfo()

AddElement(Applications())
Applications()\AppName="Test 2"

AddElement(Applications())
Applications()\AppName="Test 1"

SortStructuredList(Applications(), 0, OffsetOf(ApplicationInfo\AppName), #PB_Sort_String)

ForEach Applications()
  Debug Applications()\AppName
Next
Allerdings macht hier SortStructuredList() einen Fehler und ich weiß nicht
warum, liegt wohl an den neuen begrenzten Strings.

Hier mal mit einem anderen Beispiel:

Code: Alles auswählen

Structure TextTest
  s.s;{100}       ; <- Das Kommentarzeichen am Anfang mal entfernen
  l.l
EndStructure

NewList Text.TextTest()

AddElement(Text()) : Text()\s = "zebra"      : Text()\l = 1
AddElement(Text()) : Text()\s = "Auerhahn"   : Text()\l = 2
AddElement(Text()) : Text()\s = "amsel"      : Text()\l = 3
AddElement(Text()) : Text()\s = "tierschutz" : Text()\l = 4

SortStructuredList(Text(), 2, OffsetOf(TextTest\s), #PB_Sort_String)

ForEach Text()
  Debug Str(Text()\l) + ": " + Text()\s
Next
Dazu fällt mir gerade noch ein, dass man die Hilfe bei den ganzen
Sortier-Funktionen etwas umändern sollte. Und zwar der Teil mit den
"Options":
0: Sortiert das Array in aufsteigender Richtung (kleine Zahlen zuerst, Strings werden mit Berücksichtigung der Groß-/Kleinschreibung sortiert)
1: Sortiert das Array in absteigender Richtung (große Zahlen zuerst, Strings werden mit Berücksichtigung der Groß-/Kleinschreibung sortiert)
2: Sortiert ein String-Array ohne Berücksichtigung der Groß-/Kleinschreibung (a=A, b=B etc..) in aufsteigender Richtung
3: Sortiert ein String-Array ohne Berücksichtigung der Groß-/Kleinschreibung (a=A, b=B etc..) in absteigender Richtung
Ich zumindest dachte lange Zeit es gibt keine Möglichkeit Strings mit
Berücksichtigung der Groß- und Kleinschreibung zu sortieren. Irgendwann
hab ich das dann aber zufällig gemerkt.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

Hallo ihr 2

Schön das ihr euch damit beschäftigt habt. Die verdammten Code-Ausschnitte führen immer wieder zu fehlern :(

Aber egal. Trotzdem geht es nicht, warum? Funktioniert die SortStruc...nicht mit strings??
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

>Hallo ihr 2
Also ich seh hier 3... :?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

*hehe*

1. ja
2. vergess ich immer meine posts abzusenden

Ich habs übrigens gelöst und den Fehler gefunden ;)

Vielen Dank!



Es darf nicht

Code: Alles auswählen

OffsetOf(Applications()\AppName)
sondern muss

Code: Alles auswählen

OffsetOf(ApplicationInfo\AppName)
heißen!

Die Structure habe ich nun wie folgt:

Code: Alles auswählen

Structure ApplicationInfo
  AppName.s
  AppPath.s
EndStructure 
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hab ich das nicht gesagt oder werde ich ignoriert? :(
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten