Seite 1 von 1
Frage zu With und EndWith
Verfasst: 06.03.2012 19:03
von Drago
In dem Beispielcode der Hilfe steht folgender Code :
Code: Alles auswählen
Structure Body
Weight.l
Color.l
Texture.l
EndStructure
Structure Person
Name$
Age.l
Body.Body[10]
EndStructure
Friend.Person
For k = 0 To 9
With Friend\Body[k]
\Weight = 50
\Color = 30
\Texture = \Color*k
Debug \Texture
EndWith
Next
Jetzt meine Frage :
Sollte das With und das EndWith nicht außerhalb der For / Next Schleife stehen ?
Oder würde das zu irgendwelchen Fehler führen ?
Bei mir wird alles korrekt angezeigt, auch wenn ich es außerhalb der Schleife setze.
Grüßle Klaus
Re: Frage zu With und EndWith
Verfasst: 06.03.2012 19:09
von CSHW89
Es ist egal, wo With und EndWith stehen. Es ist ein Macro, d.h. jedes '\' ohne ein Identifier vorher, wird durch 'Friend\Body[k]\' ersetzt, unzwar noch vor dem Kompilieren. Siehe auch das hier, man kann sogar das With außerhalb der Schleife plazieren, und das EndWith in die Schleife.
Code: Alles auswählen
Structure Body
Weight.l
Color.l
Texture.l
EndStructure
Structure Person
Name$
Age.l
Body.Body[10]
EndStructure
Friend.Person
With Friend\Body[k]
For k = 0 To 9
\Weight = 50
\Color = 30
\Texture = \Color*k
Debug \Texture
EndWith
Next
Re: Frage zu With und EndWith
Verfasst: 06.03.2012 19:18
von Drago
Ok, sollte es dann nicht in der Hilfe stehen ?
Und der Beispielcode sollte dann auch geändert werden,
da es schon von der Geschwindigkeit unsinnig ist, es dann
in der Schleife laufen zu lassen.
Grüßle
Re: Frage zu With und EndWith
Verfasst: 06.03.2012 19:23
von CSHW89
Es steht in der Hilfe:
Dies ist eine Compiler-Direktive und funktioniert ähnlich wie ein Makro, d.h. der angegebene 'Ausdruck' wird automatisch vor allen Backslash '\'-Zeichen eingefügt, denen kein Leerzeichen oder ein Operator vorangeht. Der Code verhält sich identisch zu seiner erweiterten Version.
Und mit der Laufzeit hat es nix zu tun, weil, wie gesagt, der Ausdruck vor dem Kompilieren so eingefügt wird. D.h. dieser Ausdruck wird bei jedem '\' erneut berechnet, egal wo With steht, oder du komplett auf With verzichtest.
lg Kevin
Re: Frage zu With und EndWith
Verfasst: 06.03.2012 19:27
von NicTheQuick
Interessant. Das geht sogar mit 'EnableExplicit' und obwohl sich 'k' erst in der Schleife ändert.
Code: Alles auswählen
EnableExplicit
Structure Body
Weight.l
Color.l
Texture.l
EndStructure
Structure Person
Name$
Age.l
Body.Body[10]
EndStructure
Define Friend.Person, k.i
With Friend\Body[k]
For k = 0 To 9
\Weight = 50
\Color = 30
\Texture = \Color*k
Next
EndWith
For k = 0 To 9
Debug Friend\Body[k]\Texture
Next
Re: Frage zu With und EndWith
Verfasst: 06.03.2012 19:41
von Drago
@CSHW89 :
Stimmt. Habe es gerade getestet, macht keinen Zeitunterschied.
Nun, wieder mal was dazugelernt....
Danke....
Re: Frage zu With und EndWith
Verfasst: 06.03.2012 19:51
von STARGÅTE
Weil zu diesem Zeitpunkt:
Weder das "k" in das Body[] eingesetzt wird,
noch klar ist, was überhaupt k, Body usw. sind.
Es wird einfach nur die exakte Zeichenfolge nach dem With: "Friend\Body[k]"
vor jedes freie \ gesetzt.
Es ist hat also auch kein Vorteil sowas wie:
Code: Alles auswählen
With IrgendeineMap(Key)\AndereMap(Key)
\Variable
\String
;...
EndWith
zu schreiben, wenn man ein geschwindigkeitsvorteil haben möchte.
Da hier trotzdem jedesmal wieder die Map-Elemente gesucht werden.
Dann lieber:
Code: Alles auswählen
*Objekt.Structure = @IrgendeineMap(Key)\AndereMap(Key)
With *Objekt
\....
EndWith
Das geht dann wiederum nur in der schleife!
Re: Frage zu With und EndWith
Verfasst: 06.03.2012 20:19
von ts-soft
Übrigens, als es um neue Funktionen für PB 4 ging, habe ich With - EndWith vorgeschlagen, da ich es
aus anderen Sprachen kenne, nimmt ja nur Schreibarbeit ab, und Fred hat nur wenige Minuten später
diesen Vorschlag angenommen
Mancher Feature Request wird auch schnell umgesetzt, wobei mancher recht wenige sind
