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:

Code: Alles auswählen

With Friend\Body[k]
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 :D

Mancher Feature Request wird auch schnell umgesetzt, wobei mancher recht wenige sind :mrgreen: