Spontaner Fall von Unwissenheit über Stringvergleiche

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Beitrag von Josef Sniatecki »

:o

OMG... ich habe bisher immer gedacht, dass diese Operationen immer nur die Längen der Strings vergleichen würden.
Regenduft hat geschrieben:Nun mal Hand auf's Herz: Wer war auch eine lange Zeit so dumm?
:oops: :mrgreen:

Gruß Josef
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Beitrag von Regenduft »

Thema-Bug: x86 Win = ไม่มีปัญหา (haben ja schon genug bestätigt... schön, dass mein Bekenntnis einen Nebeneffekt hatte :wink: )
DrFalo hat geschrieben:
STARGÅTE hat geschrieben:Toll :allright:
Gell! :mrgreen: Ich finds logisch...
Is' ja auch logisch. Man muss nur auf die Idee kommen (oder den Bedarf haben) Strings auf ihre "Größe" hin zu vergleichen. :roll:

Ähnlich wie bei folgendem:

Code: Alles auswählen

schubidubiduwah$ = "oink"
*zeigerlein.Quad = @schubidubiduwah$
*zeigerlein\q = 'bing'
Debug schubidubiduwah$
@ Josef : Heißt das Du hast niemals Len() verwendet? :shock: Und trotzdem so geile Spiele schreiben... schäm' Dich... :wink:


Nebenbei: STARGÅTE und cxAlex hat den passenden Smilie vergessen :wink:
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Beitrag von STARGÅTE »

Regenduft hat geschrieben:Ähnlich wie bei folgendem:

Code: Alles auswählen

schubidubiduwah$ = "oink"
*zeigerlein.Quad = @schubidubiduwah$
*zeigerlein\q = 'bing'
Debug schubidubiduwah$
Ich kenn/und benutze das aber eh um schnell was zu ersetzen:

Code: Alles auswählen

Structure CharacterArray : c.c[0] : EndStructure

Text$ = "BeispIel"
*Character.CharacterArray = @Text$
*Character\c[5] = 'i'
Debug Text$
Und früher wo es noch kein ReverseString gar, hab ich das immer so meine Strings gedreht:

Code: Alles auswählen

Structure CharacterArray : c.c[0] : EndStructure

Procedure MyReverseString(*Character.CharacterArray)
  Protected i, m = MemoryStringLength(*Character)-1, n = m/2
  For i = 0 To n
    Swap *Character\c[i], *Character\c[m-i]
  Next
EndProcedure

Text$ = "Beispielstring"
MyReverseString(@Text$)
Debug Text$
Wobei diese Variante (weil sie mit Pointer arbeitet und den String im Speicher dreht, sogar immer noch schneller ist ;-) )
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Beitrag von Regenduft »

Den Thread hier muss ich jetzt aber nochmal ausbuddeln. Das hatte ich ja damals total übersehen!
STARGÅTE hat geschrieben:Structure CharacterArray : c.c[0] : EndStructure
...
*Character\c[5] = 'i'
Und das funktioniert sogar! ... ? :o

Ein statisches Array in einer Struktur mit Größe #Null ist also sozusagen (ohne Überläufe zu berücksichtigen) unendlich groß?! Wie kommt man denn auf die Idee?! Ist das bei C etwa auch so? Steht ja in der PB-Doku, dass die Syntax von C übernommen wurde (deshalb ja auch das andere Verhalten relativ zu dynamischen Arrays). Da habe ich ja eine echte Stargate-Perle übersehen!
(Sehr verspätet aber:) Ein fettes Danke! :allright:

Da muss ich jetzt aber flott meinen Präprozessor überarbeiten! <)
Ich schiebe da beim Parsen immer die Zeiger vorwärts und rückwärts, dabei geht es viel komfortabler (und schätze mal auch effizienter)!

Gibt's da noch andere (C-)Tricks? Oder irgendwelche Fallen? Ich besitze da nur ein sehr flachen Wissen. Auf die schnelle habe ich zum Beispiel festgestellt, dass man sich im Fall von zwei "Null-Arrays" die StructureUnion sparen kann, was ja nicht ganz unlogisch ist, wenn man bedenkt, dass die Struktur eine Größe von #Null hat, bzw. beide Arrays ein Offset von #Null.

Code: Alles auswählen

Structure CharacterArray
  c.c[0]
  s.s{1}[0]
EndStructure

Text$ = "BeispIel"
*Character.CharacterArray = @Text$
*Character\c[5] = 'i'
*Character\s[6] = "E"

Debug Text$
Debug ""
Debug SizeOf(CharacterArray)
Debug ""
Debug OffsetOf(CharacterArray\c)
Debug OffsetOf(CharacterArray\s)
Aber wie sieht das jetzt z.B. bei einer strukturierten Variable statt einem strukturierten Zeiger aus? Dann würde man ja eine Variable mit der Größe von Null Byte erstellen, was zwar von PB nicht angemeckert wird, aber zur Folge hat, dass man den Purifier aktivieren sollte. :wink:
Natürlich könnte ich jetzt mal fleißig drauf losprobieren, was wie wo wann passiert, aber es kann natürlich gut sein, dass ich da eine Falle oder einen Trick übersehe.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
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

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Beitrag von NicTheQuick »

:lol:
immer wieder schön, wenn jemand ganz aus dem Häuschen ist, wenn er was entdeckt hat, was schon ewig überall benutzt wird. Also ein Stargate-Trick ist das jetzt nicht wirklich. ^^
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Beitrag von Regenduft »

Hab's halt bei Stargate entdeckt, darum ist er jetzt das "Opfer" meiner Begeisterung. :mrgreen:
Ich habe gerade mal das Forum kurz durchsucht und auch nur Codes von Stargate (mehrfach) und einen Code von hjbremer gefunden, in denen das vorkommt.

Und jetzt frage ich mich schon wieder ob hier das StructureUnion einen tieferen Sinn hat:

Code: Alles auswählen

Structure CharacterArray
   StructureUnion
      c.c[0]
   EndStructureUnion
EndStructure
(War mit dem Strg+W zu schnell, darum kein Link)

Ich habe das aber echt noch nie in einem Quelltext gesehen, kann aber natürlich auch sein, dass ich es einfach übersehen habe (wie Ende 2010, als ja Stargate damit auf mein Posting geantwortet hatte). In der PB-Doku steht ja auch nichts in der Richtung drin.

Da merkt man halt wieder, dass ich reiner Hobbyprogrammierer bin. :lamer:
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Beitrag von STARGÅTE »

Ein statisches Array in einer Struktur mit Größe #Null ist also sozusagen (ohne Überläufe zu berücksichtigen) unendlich groß?!
Nein, so ist das nicht ganz richtig. Das Array nimmt keinen Platz (0 Bytes) in der Struktur ein.
Bei einem statisches Array mit 0 Felder ist nur der Debugger ruhig, wenn auf ein Feld über dem Maximum zugegriffen wird. Kompiliert ist das ja nichts weiter als Ort+Feld*Strukturgröße.
Aber wie sieht das jetzt z.B. bei einer strukturierten Variable statt einem strukturierten Zeiger aus?
Natürlich darfst du in eine Variable mit dieser Struktur nicht reinschreiben.

Der [0]-Trick wurde glaube ich sogar offiziell veröffentlicht (weiß nicht mehr wo), also mein Trick ist es nicht!

Strukturen wie CharacterArray, LongArray usw. sind inzwischen (zumindest bei mir) schon Standardstrukturen, einfach um schnell einen revervierten Speicher mit Sachen zu füllen.
CharacterArray wird sehr oft im Forum genutzt, um schnelle Stringmanipulation zu ermöglichen.

Zum StructureUnion: Nein es hat an dieser Stelle keinen tieferen Sinn.
In den meisten Codes ist auch kein StructureUnion.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten