<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to VAR_INST Heap oder Stack?</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/1e807903dc/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/1e807903dc/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Deutsch/thread/1e807903dc/</id><updated>2020-02-27T23:46:59.354000Z</updated><subtitle>Recent posts to VAR_INST Heap oder Stack?</subtitle><entry><title>VAR_INST Heap oder Stack?</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/1e807903dc/?limit=25#809c" rel="alternate"/><published>2020-02-27T23:46:59.354000Z</published><updated>2020-02-27T23:46:59.354000Z</updated><author><name>schnasseldag</name><uri>https://forge.codesys.com/u/schnasseldag/</uri></author><id>https://forge.codesys.com4f841d48079c95e72690936623f37f64c3d3d5b1</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Mittels eines kleinen Beispiels habe ich mir die Frage nun selbst beantwortet. &lt;/p&gt;
&lt;p&gt;VAR_INST deklarierte Variable teilen sich den Speicherbereich mit den (Member-) Variablen der Objektinstanz (innerhalb derer die (Member-) Funktion deklariert ist). Von Ihrer Sichtbarkeit (Scope) her sind sie jedoch auf die der (Member-) Funktion beschränkt. Deklarieren mehrere (Member-) Funktionen Variablen desselben Namens, so werden für jede Variablendeklaration auch einzelne Speicherbereiche in der Objektinstanz erzeugt (vermutlich durch das Namemangling des Compilers).&lt;/p&gt;
&lt;p&gt;Überprüft habe ich dies durch einen Wertevergleich einer echten Stackvariable  (VAR_INPUT innerhalb einer Funktion ) und einer VAR_INST-Variable  nach einigen rekursiven Aufrufen der Funktion . Währenddessen die Stackvariable für jeden Funktionsaufruf einen anderen Wert besitzt, wird die VAR_INST Variable  (weil "global" in der Objekinstanz) immer wieder überschrieben. Anbei der Code:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;PUBLIC&lt;/span&gt; &lt;span class="nv"&gt;foo&lt;/span&gt; : &lt;span class="nv"&gt;INT&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
   &lt;span class="nv"&gt;count&lt;/span&gt; : &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INST&lt;/span&gt;
   &lt;span class="nv"&gt;test_count&lt;/span&gt; : &lt;span class="nv"&gt;INT&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;   &lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;test_count&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   &lt;span class="nv"&gt;THIS&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;.&lt;span class="nv"&gt;foo&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;test_count&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   &lt;span class="nv"&gt;bIsStackVariable&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;; // test_count ist eine Stack-Variable&lt;/span&gt;
   &lt;span class="k"&gt;ELSE&lt;/span&gt;
      &lt;span class="nv"&gt;bIsStackVariable&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;; // test_count ist eine Objekt-Variable&lt;/span&gt;
   &lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Was&lt;/span&gt; &lt;span class="nv"&gt;liefert&lt;/span&gt; &lt;span class="nv"&gt;uns&lt;/span&gt; &lt;span class="nv"&gt;nun&lt;/span&gt; &lt;span class="nv"&gt;test_count_count&lt;/span&gt; &lt;span class="nv"&gt;der&lt;/span&gt; &lt;span class="nv"&gt;Funktion&lt;/span&gt; &lt;span class="nv"&gt;foo2&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt;?
&lt;span class="nv"&gt;foo&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;foo2&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;foo2&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt; &lt;span class="nv"&gt;liefert&lt;/span&gt; &lt;span class="nv"&gt;immer&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="nv"&gt;f&lt;/span&gt;ü&lt;span class="nv"&gt;r&lt;/span&gt; &lt;span class="nv"&gt;deren&lt;/span&gt; &lt;span class="nv"&gt;test_count&lt;/span&gt; &lt;span class="nv"&gt;Variable&lt;/span&gt; &lt;span class="nv"&gt;zur&lt;/span&gt;ü&lt;span class="nv"&gt;ck&lt;/span&gt;. 
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Damit&lt;/span&gt; &lt;span class="nv"&gt;wird&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;der&lt;/span&gt; &lt;span class="nv"&gt;FB1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;Instanz&lt;/span&gt; &lt;span class="nv"&gt;offenbar&lt;/span&gt; &lt;span class="nv"&gt;eine&lt;/span&gt; &lt;span class="nv"&gt;weitere&lt;/span&gt; &lt;span class="nv"&gt;Speicherstelle&lt;/span&gt; &lt;span class="nv"&gt;allociert&lt;/span&gt;. 
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Vom&lt;/span&gt; &lt;span class="nv"&gt;Compiler&lt;/span&gt; &lt;span class="nv"&gt;scheint&lt;/span&gt; &lt;span class="nv"&gt;das&lt;/span&gt; &lt;span class="nv"&gt;wohl&lt;/span&gt; &lt;span class="nv"&gt;per&lt;/span&gt; &lt;span class="nv"&gt;Namemangling&lt;/span&gt; &lt;span class="nv"&gt;der&lt;/span&gt; &lt;span class="nv"&gt;Art&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FB_foo_test_count&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nv"&gt;bzw&lt;/span&gt;.&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FB_foo2_test_count&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nv"&gt;o&lt;/span&gt;.ä. &lt;span class="nv"&gt;gel&lt;/span&gt;ö&lt;span class="nv"&gt;st&lt;/span&gt; &lt;span class="nv"&gt;zu&lt;/span&gt; &lt;span class="nv"&gt;sein&lt;/span&gt;?&lt;span class="o"&gt;!&lt;/span&gt;  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;liefert brav 42 zurück. Deren Variable  "kollidiert" also nicht mit der aus der Funktion .&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;METHOD&lt;/span&gt; &lt;span class="k"&gt;PUBLIC&lt;/span&gt; &lt;span class="n"&gt;foo2&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;
&lt;span class="n"&gt;VAR_INST&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;test_count&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Greifen&lt;/span&gt; &lt;span class="n"&gt;foo2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;und&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;auf&lt;/span&gt; &lt;span class="n"&gt;die&lt;/span&gt; &lt;span class="n"&gt;gleiche&lt;/span&gt; &lt;span class="k"&gt;Variable&lt;/span&gt; &lt;span class="n"&gt;innerhalb&lt;/span&gt; &lt;span class="n"&gt;des&lt;/span&gt; &lt;span class="n"&gt;FB1&lt;/span&gt; &lt;span class="n"&gt;zu&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
&lt;span class="n"&gt;foo2&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;test_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Antwort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Nein&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Der&lt;/span&gt; &lt;span class="n"&gt;Compiler&lt;/span&gt; &lt;span class="n"&gt;erzeugt&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="err"&gt;ü&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;beide&lt;/span&gt; &lt;span class="n"&gt;lokalen&lt;/span&gt; &lt;span class="n"&gt;Variablen&lt;/span&gt; &lt;span class="n"&gt;einen&lt;/span&gt; &lt;span class="n"&gt;eigenen&lt;/span&gt; &lt;span class="n"&gt;Speicherbereich&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="n"&gt;FB1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Objekt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Im Anhang befindet sich der vollständige Testcode.&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="https://forum-de.codesys.com//download/file.php?id=1780" rel="nofollow"&gt;VarInst.zip &lt;span&gt;&lt;span&gt;[375.75 KiB]&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>VAR_INST Heap oder Stack?</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/1e807903dc/?limit=25#448d" rel="alternate"/><published>2020-02-27T23:46:54.605000Z</published><updated>2020-02-27T23:46:54.605000Z</updated><author><name>schnasseldag</name><uri>https://forge.codesys.com/u/schnasseldag/</uri></author><id>https://forge.codesys.com9d7a0d592080d7b8ed01b6397789ef36fd2101fa</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hallo miteinander,&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="https://help.codesys.com/webapp/cds-vartypes-var-inst;product=codesys;version=3.5.11.0" rel="nofollow"&gt;https://help.codesys.com/webapp/cds-vartypes-var-inst;product=codesys;version=3.5.11.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oder andersherum gefragt - wie kommt der Funktionsbaustein an einen Stack? Das kann er doch nur über eine Task, sprich, wenn eine (z.B. globale) Funktion eine lokale Instanz (also auf dem Stack des aufrufenden Threads) einer Klasse erzeugt, die dann eine (Member-) Funktion enthält, welche Ihrerseits eine VAR_INST-Deklaration beinhaltet. Nur in diesem Fall läge die VAR_INST Variable dann tatsächlich auf einem Stack (des aufrufenden Thread/der aufrufenden Task)?! &lt;/p&gt;
&lt;p&gt;Kann mir hier jemand auf die Sprünge helfen? &lt;/p&gt;
&lt;p&gt;PS: Ich komme aus der C/C++ Ecke und tue mich mit solchen Termini leichter &lt;/p&gt;
&lt;p&gt;Schöne Grüße&lt;/p&gt;
&lt;p&gt;schnasseldag&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>