Frage zu With und EndWith

Für allgemeine Fragen zur Programmierung mit PureBasic.
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Frage zu With und EndWith

Beitrag 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
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Frage zu With und EndWith

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: Frage zu With und EndWith

Beitrag 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
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Frage zu With und EndWith

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
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: Frage zu With und EndWith

Beitrag 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
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: Frage zu With und EndWith

Beitrag von Drago »

@CSHW89 :

Stimmt. Habe es gerade getestet, macht keinen Zeitunterschied.
Nun, wieder mal was dazugelernt....

Danke....
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Frage zu With und EndWith

Beitrag 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!
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
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Frage zu With und EndWith

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten