Seite 2 von 2
Verfasst: 21.06.2008 16:17
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.
Verfasst: 21.06.2008 16:51
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:
bei dem ElseIf noch etwas sauberer und sicherer wäre...?
Verfasst: 21.06.2008 17:20
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.
Verfasst: 21.06.2008 17:31
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!
Verfasst: 21.06.2008 17:35
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
Verfasst: 21.06.2008 17:38
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
Ansonsten hat Danilo wohl recht, vorsicht ist die Mutter der Porzellankiste

Verfasst: 21.06.2008 17:40
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!
Verfasst: 21.06.2008 17:46
von milan1612
Jo Danke auch von mir, daran hatte ich vorher nie gedacht wenn ich Pointer mit Strings verwendet habe

Verfasst: 21.06.2008 17:56
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.

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!

Verfasst: 21.06.2008 18:00
von AND51
Danilo hat geschrieben:Dann hab ich alles mögliche probiert um den Crash zu beweisen, esaber nicht geschafft.

Har har, genau daher versuch ich vor der Veröffentlichung immer Crashs herbeizuführen, um diese auszumerzen.
Danilo hat geschrieben:Freundschaft!

Genau!
Ach übrigens: Ist es hinsichtlich der Sicherheit besser
zu schreiben, oder lieber
?
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.