Seite 2 von 2

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Verfasst: 09.11.2010 20:34
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

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Verfasst: 09.11.2010 20:40
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:

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Verfasst: 10.11.2010 00:59
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 ;-) )

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Verfasst: 23.07.2012 23:16
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.

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Verfasst: 23.07.2012 23:26
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. ^^

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Verfasst: 24.07.2012 01:06
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:

Re: Spontaner Fall von Unwissenheit über Stringvergleiche

Verfasst: 24.07.2012 01:24
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.