wie Dateien ohne endung auflisten?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag von Kai »

Joa danke für die Tips, das mit Sizeoff hab ich noch nicht mal gewußt, aber bei meiner function hat das knappe 40 milisecunden gebracht.
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

AND51 hat geschrieben:

Code: Alles auswählen

Procedure.s OhneEndung(File.s)
	Protected *point.Character=@File
	*point+MemoryStringLength(*point)<<#PB_Compiler_Unicode-SizeOf(Character)
	While *point\c
		If *point\c = '.'
			ProcedureReturn PeekS(@File, (*point-@File)>>#PB_Compiler_Unicode)
		ElseIf *point\c = '\' Or *point\c = '/'
			ProcedureReturn File
		EndIf
		*point-SizeOf(Character)
	Wend
	ProcedureReturn File
EndProcedure
Funktioniert schön, aber irgendwie habe ich das Gefühl das es mit
einem zusätzlichen:

Code: Alles auswählen

Or *point = @File
bei dem ElseIf noch etwas sauberer und sicherer wäre...?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

@ Danilo:
Nein, wieso? Die Bedinung bei While sichert die If-Abfragen ab. Die If-Abfragen können keinen IMA erzeugen, denn wenn *point\c auf null zeigt, bedeutet das, dass man bereits beim Anfang des Strings angekommen ist. Dann wird sowieso abgebrochen.

Wenn überhaupt, dann müsste "Or *point = @File" noch mit zu While geschrieben werden. Aber wie gesagt, ich betrachte dies als unnötig (lasse mich aber gern eines besseren belehren!).

btw, ich habe vor Veröffentlichung alle Möglichkeiten durchgetestet: Mit einem Punkt, mit keinem Punkt, mit mehreren Punkten, sogar mit einem Leerstring als Dateinamen - hat alles funktioniert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

AND51 hat geschrieben:@ Danilo:
Nein, wieso? Die Bedinung bei While sichert die If-Abfragen ab. Die If-Abfragen können keinen IMA erzeugen, denn wenn *point\c auf null zeigt, bedeutet das, dass man bereits beim Anfang des Strings angekommen ist. Dann wird sowieso abgebrochen.
Wer sagt Dir denn das vor einem String immer eine 0 stehen wird?

Wie gesagt, funktioniert einwandfrei. Nur wenn es irgendwann in Zukunft
mal nicht mehr so funktioniert (0 vor Strings?), dann ist das Ergebnis
undefiniert.
Aber bitte, wie Du willst. Ich hab auch lange überlegt, aber dachte dann
doch ich weise mal kurz darauf hin. Ich bitte um Verzeihung!
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Wer sagt Dir denn das vor einem String immer eine 0 stehen wird?

yo, das halte ich auch für puren Zufall.
ich kann sogar ganz bewußt dafür sorgen, dass vor einem String keine 0 steht:

Code: Alles auswählen

DataSection
  Data.b 123,56,87,222
  Data.s "Hello Error"
EndDataSection
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

Kaeru Gaman hat geschrieben:> Wer sagt Dir denn das vor einem String immer eine 0 stehen wird?

yo, das halte ich auch für puren Zufall.
ich kann sogar ganz bewußt dafür sorgen, dass vor einem String keine 0 steht:

Code: Alles auswählen

DataSection
  Data.b 123,56,87,222
  Data.s "Hello Error"
EndDataSection
Beispiel ist falsch. Data.s sind Datas, sobald ich diese Lese mit PeekS oder
was ähnlichem wirds zum String und enhält auch die 0 :mrgreen:

Ansonsten hat Danilo wohl recht, vorsicht ist die Mutter der Porzellankiste :wink:
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
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Wer sagt Dir denn das vor einem String immer eine 0 stehen wird?
Stimmt, da hast du Recht.
Bisher war das bei mir jedenfalls immer so, daher habe ich mich darauf verlassen. Andererseits: Da jeder String mit null beendet wird, muss ja wohl vor einem String die terminierende Null des Vorgängerstrings stehen, oder?

Gut, ich will jetzt nicht rumdiskutieren, daher schlage ich das hier vor:

Code: Alles auswählen

Procedure.s OhneEndung(File.s) 
   Protected *point.Character=@File 
   *point+MemoryStringLength(*point)<<#PB_Compiler_Unicode-SizeOf(Character) 
   While *point <> @File
      If *point\c = '.' 
         ProcedureReturn PeekS(@File, (*point-@File)>>#PB_Compiler_Unicode) 
      ElseIf *point\c = '\' Or *point\c = '/' 
         ProcedureReturn File 
      EndIf 
      *point-SizeOf(Character) 
   Wend 
   ProcedureReturn File 
EndProcedure
So geht's doch auch, oder? Man hat so oder so nur 1 Abfrage, finde ich praktisch.

@ Kaeru:
Der String wird an meine Prozedur übergeben, da der Parameter "File.s" protected ist, wird der String eh kopiert und nur die Kopie geparst. Vor dieser Kopie steht (vermute ich) wieder eine null, das hat doch garantiert was mit diesem ganzen Stack/Pop/Push-Kram zu tun, der bei jeder Prozedur ausgeführt wird.
Wie esagt, ich will mich nicht streiten, ich habe meine Lösung entsprechend geändert und werde in Zukunft auch darauf Rücksicht nehmen. Danke für diesen Hinweis!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Jo Danke auch von mir, daran hatte ich vorher nie gedacht wenn ich Pointer mit Strings verwendet habe :allright:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

AND51 hat geschrieben:Wie esagt, ich will mich nicht streiten,
Ich mich auch nicht. :)

Mir ist es nur beim lesen Deines Codes sofort aufgefallen, das Du ein
*point - sizeOf(Character) machst und der Pointer so theoretisch bis
ins Nirvana vor den String gehen kann.
Dann hab ich alles mögliche probiert um den Crash zu beweisen, es
aber nicht geschafft. :D
War auch logisch, wenn man es "von außen" probiert, also ohne die
Prozedur selbst zu verändern. Nach langem überlegen hab ich mich
dann *trotzdem* überwunden mal einen kleinen Hinweis zu schreiben.
Mein Gefühl hat halt weiterhin gemeint das es so nicht ganz richtig ist...
...also ist es doch gut wenn man sich darüber mal austauschen kann.

Freundschaft! :)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Danilo hat geschrieben:Dann hab ich alles mögliche probiert um den Crash zu beweisen, esaber nicht geschafft. :D
Har har, genau daher versuch ich vor der Veröffentlichung immer Crashs herbeizuführen, um diese auszumerzen. :wink:
Danilo hat geschrieben:Freundschaft! :)
Genau! :)

Ach übrigens: Ist es hinsichtlich der Sicherheit besser

Code: Alles auswählen

While *point <> @File
zu schreiben, oder lieber

Code: Alles auswählen

While *point > @File
?
Wie dir ja aufgefallen ist, könnte ich mich ja bei einem Leerstring dank des "-SizeOf(Character)" vor dem eigentlichen String befinden. In diesem Fall wäre doch 2. Varainte besser, oder?

Ich habe erste Variante gepostet, weil ich dachte, diese sei perfoamncemäßig besser.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten