Seite 1 von 3
Filer v1.00 Alpha 31
Verfasst: Di 20. Dez 2005, 17:46
von Elle4u
Filer v1.00 Alpha 31
-> 20.12.2005 17:25 Uhr
- neu: Menü: Datei-Sortierung in Ansicht "DataFiles" kann nun eingestellt werden (Alphabetisch, nach Dateigröße, nach Aufnahmedatum)
- neu: Menü: Datei-Sortierung in Ansicht "MP3" kann nun eingestellt werden (Alphabetisch, nach Dateigröße, nach Dateidatum)
- neu: mit der Taste "blau" kann die Datei-Sortierung auch direkt in der Verzeichnis-Ansicht durchgewechselt werden. Die jeweilige Einstellung wird sofort in der INI abgespeichert.
- neu: Das Menü von Filer kann nun direkt über TSRCommander aufgerufen werden
- geändert: Es wird nun das ImproBox Bookmark-File von Version 2.0 und 2.01b1 gleichzeitig unterstützt
- geändert: Aussehen des Fortschrittsbalken beim Festplattenplatz
- bekannter BUG: Alphabetische Datei-Sortierung in Ansicht "DataFiles" nicht korrekt (Warum?)
- bekannter BUG: Filer funktioniert auf 5200c nur teilweise
Verfasst: Di 20. Dez 2005, 17:55
von DeJe
bekannter BUG: Alphabetische Datei-Sortierung in Ansicht "DataFiles" nicht korrekt (Warum?)
Mit was machst Du die Sortierung? String-Sortierung ist teilweise "tricky" in C, insbesondere bei den Umlauten wird es kompliziert. Sieh Dir mal die hex-Werte für die Buchstaben und Sonderzeichen in der ASCII-Table an, vielleicht hilft Dir das.
Verfasst: Di 20. Dez 2005, 18:05
von Elle4u
DeJe hat geschrieben:Mit was machst Du die Sortierung? String-Sortierung ist teilweise "tricky" in C, insbesondere bei den Umlauten wird es kompliziert. Sieh Dir mal die hex-Werte für die Buchstaben und Sonderzeichen in der ASCII-Table an, vielleicht hilft Dir das.
Hallo.
Ich verstehe halt nicht warum es bei Verzeichnissen und MP3s funktioniert...
Hier der "Sortier-Code" (Bubblesort
![:o :o](./images/smilies/redface.gif)
ops: ):
Code: Alles auswählen
//sortiere gefundene Dateien nach Name
if (((FilerMode == Show_Dir_DataFiles || FilerMode == Show_Dir_RecycleBin) && options.SortDataFiles == 0) || (FilerMode == Show_Dir_MP3 && options.SortMP3 == 0)) {
for (Counter = 0; Counter < FileCount; Counter++) {
for (Counter2 = FileCount - 1; Counter2 > Counter; Counter2--) {
if (strcmp(FileList[Counter2 - 1].File.name, FileList[Counter2].File.name) > 0) {
FileTemp = FileList[Counter2 - 1];
FileList[Counter2 - 1] = FileList[Counter2];
FileList[Counter2] = FileTemp;
}
}
}
}
Verfasst: Di 20. Dez 2005, 18:55
von Harvey
Bei aufgenommenen Filmen ist der erste Buchstabe manchmal ein Sonderzeichen.
Verfasst: Di 20. Dez 2005, 19:05
von DeJe
Hast Du mal ein Beispiel wo eine "falsche" Sortierung kommt?
Verfasst: Di 20. Dez 2005, 19:10
von Elle4u
DeJe hat geschrieben:Hast Du mal ein Beispiel wo eine "falsche" Sortierung kommt?
Der Knochenjäger
40 Tage und 40 Nächte
Big Brother
NUMB3RS
...
Das ist nicht so ganz alphabetisch
Evtl. wg. dem ä in ...jäger?
EDIT: Wobei ich gerade merke: In einem anderen Verzeichnis ist es auch das 1. File was nicht stimmt... Evtl. habe ich mich da vertan?
Verfasst: Di 20. Dez 2005, 19:17
von Harvey
Schau mal mit Hilfe von Altair, ob der 1. Buchstabe ein "|" ist.
Es kann zwar sein, dass Knockenjäger nicht zwischen Knochenjager und Knochenjbger landet, aber so sollte es nicht sein.
Achja: Gross- und Kleinbuchstaben spielen auch eine Rolle, trotzdem passt dein Beispiel nicht (ob die Library stricmp kann weiss ich nicht, dem wäre die Gross-Kleinschreibung egal)
Verfasst: Di 20. Dez 2005, 19:32
von Elle4u
Harvey hat geschrieben:Schau mal mit Hilfe von Altair, ob der 1. Buchstabe ein "|" ist.
Es kann zwar sein, dass Knockenjäger nicht zwischen Knochenjager und Knochenjbger landet, aber so sollte es nicht sein.
Achja: Gross- und Kleinbuchstaben spielen auch eine Rolle, trotzdem passt dein Beispiel nicht (ob die Library stricmp kann weiss ich nicht, dem wäre die Gross-Kleinschreibung egal)
OK. DAS war es. In beiden Verzeichnissen!
Vielen Dank!
Dann ist der Bug doch kein Bug.
stricmp geht leider nicht.
Verfasst: Di 20. Dez 2005, 20:30
von topfkieker
Hallo!
Hatte das gleiche Problem wie Elle4U. Aber wie kommt es zu dem "|" vor einem Dateinamen (Topfield-Bug)???
Gruß topfkieker
Verfasst: Di 20. Dez 2005, 20:41
von mastercb
topfkieker hat geschrieben:
Hatte das gleiche Problem wie Elle4U. Aber wie kommt es zu dem "|" vor einem Dateinamen
Noch eine Frage @Elle4U:
Kannst Du im Filer gleich eine "Dateinamenskorrektur" einbauen ?? (d.h. if (erstes Zeichen ="|" Then verschiebe den ganzen Dateinamen um eins nach links).
oder, wenn Dir das zu "heiß" ist: Wende doch den Ausdruck einfach jeweils vor Deinen internen Sortierroutine an (in der lokalen String-Kopie)
Verfasst: Di 20. Dez 2005, 20:50
von Elle4u
mastercb hat geschrieben:Noch eine Frage @Elle4U:
Kannst Du im Filer gleich eine "Dateinamenskorrektur" einbauen ?? (d.h. if (erstes Zeichen ="|" Then verschiebe den ganzen Dateinamen um eins nach links).
oder, wenn Dir das zu "heiß" ist: Wende doch den Ausdruck einfach jeweils vor Deinen internen Sortierroutine an (in der lokalen String-Kopie)
Man könnte ein Rename einbauen solange keine Aufnahme/Wiedergabe dieses Files läuft. Dürfte eigentlich kein Problem sein...
![:santa: :santa:](./images/smilies/santa.gif)
Verfasst: Di 20. Dez 2005, 20:50
von Harvey
Ich weiss nicht, wonach ich im alten Board suchen muss. Irgend einem ist aufgefallen, unter welchen Umständen das passiert.
Nicht durch den Compiler gelaufen, von daher sehr wahrscheinlich buggy. Laufzeit: keine Ahnung. äöüß: unberücksichtigt, weil ich den topfinternen Code nicht kenne.
Code: Alles auswählen
int stricmp(unsigned char* s1, unsigned char* s2)
{
unsigned char *p1, *p2;
unsigned char c1, c2;
for (p1=s1,p2=s2; *p1<>0 && *p2<>0; p1++,p2++)
{
c1 = *p1;
if (c1 >= 97 && c1 < 122) c1-=32;
c2 = *p2;
if (c2 >= 97 && c2 < 122) c2-=32;
if (c1 > c2) return -1;
else if (c1 < c2) return 1;
}
return 0;
}
Verfasst: Di 20. Dez 2005, 20:52
von thensch
Elle4u hat geschrieben:Man könnte ein Rename einbauen solange keine Aufnahme/Wiedergabe dieses Files läuft. Dürfte eigentlich kein Problem sein...
Das wäre wohl die beste Lösung.
Verfasst: Di 20. Dez 2005, 20:52
von digitus
Hallo Elle;
Wieso machst Du die Sortierung über den Befehl strcmp ??
Für so einen SortierAlgo denke ich es ist wirklich besser die Strings in einzelne Zeichen zu zerlegen diese dann in ASCII Werte ( Hex ) umzurechnen, dann zu vergleichen.
greetings
Verfasst: Di 20. Dez 2005, 21:38
von Elle4u
thensch hat geschrieben:Das wäre wohl die beste Lösung.
Habe es jetzt versucht (testweise mal mit allen Aufnahmen, welche mit "g" beginnen):
Code: Alles auswählen
TAP_SPrint(textBuf, "%s", File.name);
textBuf[1] = 0;
if (strcmp(textBuf, "g") == 0) {
TAP_Hdd_Rename(File.name, &File.name[1]);
}
FileList[FileCount].File = File;
FileCount++;
Wenn ich dies mache werden zwar die Files umbenannt aber gehen trotzdem mit dem alten Namen ins Array. Ein abspielen des Files ist dann (durch den falschen Namen) z.B. nicht möglich
Kann mir bitte jemand einen Tip geben wie man es besser macht?
![:o :o](./images/smilies/redface.gif)
ops:
Thx!
Verfasst: Di 20. Dez 2005, 21:39
von Elle4u
digitus hat geschrieben:Hallo Elle;
Wieso machst Du die Sortierung über den Befehl strcmp ??
Für so einen SortierAlgo denke ich es ist wirklich besser die Strings in einzelne Zeichen zu zerlegen diese dann in ASCII Werte ( Hex ) umzurechnen, dann zu vergleichen.
greetings
Weil ich nicht weiß, wie man das macht?
![:o :o](./images/smilies/redface.gif)
ops:
![:o :o](./images/smilies/redface.gif)
ops:
![:o :o](./images/smilies/redface.gif)
ops:
Und weil ich das eine gute Möglichkeit fand...
Verfasst: Di 20. Dez 2005, 21:53
von mega
Elle4u hat geschrieben:Weil ich nicht weiß, wie man das macht?
![:o :o](./images/smilies/redface.gif)
ops:
![:o :o](./images/smilies/redface.gif)
ops:
![:o :o](./images/smilies/redface.gif)
ops:
Und weil ich das eine gute Möglichkeit fand...
char c;
int j;
c = meinstring
; // Gibt das Zeichen an Stelle i im String
j = (int)meinstring; // Gibt den ASCII-Wert des Zeichens an Stelle i im String
Hoffe mal, der Topf kann das so wie in ANSI C
Verfasst: Di 20. Dez 2005, 21:55
von DeJe
Für so einen SortierAlgo denke ich es ist wirklich besser die Strings in einzelne Zeichen zu zerlegen diese dann in ASCII Werte ( Hex ) umzurechnen, dann zu vergleichen.
?? strcmp macht doch nichts anderes. Zeichen für Zeichen wird der ASCII-Wert verglichen...
Verfasst: Di 20. Dez 2005, 22:03
von Harvey
Der Codeschnipsel ist zu wenig für mich (zumal ich die API nur theoretisch kenne).
Er sollte aber abgesehen vom eigentlichen Problem nicht funktionieren, da z.B. strcmp("ga", "g") nicht 0 liefert, da ga größer ist als g ("sollte deshalb, weil mich jetzt wundert, dass es funktionierte).
Wahrscheinlich musst Du das Directory nach dem Umbenennen noch einmal komplett einlesen. Die Übergabe "File.name" bedeutet zwar, dass TAP_Hdd_Rename den Namen ändern könnte, wenn es wollte. Wer aber sagt, dass der neue Dateiname nicht erst mal in eine lokale Variable kopiert wird um damit weiter zu arbeiten, der Parameter deshalb aber nie verändert wird?
Verfasst: Di 20. Dez 2005, 22:09
von Elle4u
Harvey hat geschrieben:Er sollte aber abgesehen vom eigentlichen Problem nicht funktionieren, da z.B. strcmp("ga", "g") nicht 0 liefert, da ga größer ist als g ("sollte deshalb, weil mich jetzt wundert, dass es funktionierte).
Ich kürze ja vorher den String auf nur ein Zeichen:
Dadurch funktioniert es.
Harvey hat geschrieben:Wahrscheinlich musst Du das Directory nach dem Umbenennen noch einmal komplett einlesen.
Denke ich auch...
Harvey hat geschrieben:Die Übergabe "&File.name[1]" bedeutet zwar, dass TAP_Hdd_Rename den Namen ändern könnte, wenn es wollte.
Sogar kann
Harvey hat geschrieben:Wer aber sagt, dass der neue Dateiname nicht erst mal in eine lokale Variable kopiert wird um damit weiter zu arbeiten, der Parameter deshalb aber nie verändert wird?
Tja. Der rename klappt aber der parameter ändert sich nicht... Hm. Evtl. kann ich den ja auch umsetzten...
mal schnell
![:type: :type:](./images/smilies/yltype.gif)