wie Dateien ohne endung auflisten?
Funktioniert schön, aber irgendwie habe ich das Gefühl das es mitAND51 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
einem zusätzlichen:
Code: Alles auswählen
Or *point = @File
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
@ 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.
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
Wer sagt Dir denn das vor einem String immer eine 0 stehen wird?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.
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
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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:
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.
Der Weise weiß, dass er ein Narr ist.
- 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
Beispiel ist falsch. Data.s sind Datas, sobald ich diese Lese mit PeekS oderKaeru 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
was ähnlichem wirds zum String und enhält auch die 0

Ansonsten hat Danilo wohl recht, vorsicht ist die Mutter der Porzellankiste

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

> 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: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!
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
@ 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
Ich mich auch nicht.AND51 hat geschrieben:Wie esagt, ich will mich nicht streiten,

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.

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
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Har har, genau daher versuch ich vor der Veröffentlichung immer Crashs herbeizuführen, um diese auszumerzen.Danilo hat geschrieben:Dann hab ich alles mögliche probiert um den Crash zu beweisen, esaber nicht geschafft.

Genau!Danilo hat geschrieben:Freundschaft!

Ach übrigens: Ist es hinsichtlich der Sicherheit besser
Code: Alles auswählen
While *point <> @File
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