<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen?]]></title><description><![CDATA[<p>Hi leute, ich habe mal wieder ein Problem bei dem ich eure Hilfe brauche.</p>
<p>Ich benutze bei einem Projekt(c++) eine Bibiliothek welche in c geschreiben ist, was an sich auch erst mal keine Probleme gemacht hatt.</p>
<p>Ich habe die von der c Bibiliothek bereitgestellten Funktionen in einer Klasse gekapselt. bei einer Funktion habe ich jedoch ein Problem.</p>
<p>So solte es nach der Bibiliotheksdokumentation aussehen:</p>
<pre><code>modbus_t *ctx;
//modbus_new_tcp leifert eine adresse auf die strukt modbus_t zurück oder NULL //falls ein fehler aufgetreten ist
ctx = modbus_new_tcp(&quot;127.0.0.1&quot;, 1502);
if (ctx == NULL) {
    fprintf(stderr, &quot;Unable to allocate libmodbus context\n&quot;);
    return -1;
}
}
</code></pre>
<p>Das ganze habe ich in eine Fkt gepackt welche dann so aus siet:</p>
<pre><code>bool libmodbusConnector::createContext(modbus_t* mbctx, std::string ip, int port){
  mbctx = modbus_new_tcp(ip.c_str(), port);
  if (mbctx==NULL){
  return false; //kontext konte nicht eingerichtet werden
  }
}
</code></pre>
<p>wenn ich nun aus der main diese Funktion Aufrufe und und versuche den kontext zu erstellen, dann wird der zeiger nicht verändert, d.h. mbctx bleibt auf den initialisierten wert &quot;hängen&quot; und beim nächsten benutzten stürtzt das ganze ab.</p>
<p>Wenn ich aber die Funktion direkt in der main aufrufe, also etwa so :</p>
<pre><code>int main(argc....){
.
.
  modbus_t *mbctx= modbus_new_tcp(ip, port)
  return 0;
}
</code></pre>
<p>dann kalppt es.<br />
kann mir hier jemand ein bischen Licht ins Dunkel bringen??</p>
<p>Danke schonmal vorab.<br />
Mfg BabCom</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326598/variable-wird-nach-übergabe-via-pointer-nicht-geändert-woran-kanns-liegen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 26 May 2026 13:48:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326598.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jun 2014 17:21:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Wed, 25 Jun 2014 17:21:06 GMT]]></title><description><![CDATA[<p>Hi leute, ich habe mal wieder ein Problem bei dem ich eure Hilfe brauche.</p>
<p>Ich benutze bei einem Projekt(c++) eine Bibiliothek welche in c geschreiben ist, was an sich auch erst mal keine Probleme gemacht hatt.</p>
<p>Ich habe die von der c Bibiliothek bereitgestellten Funktionen in einer Klasse gekapselt. bei einer Funktion habe ich jedoch ein Problem.</p>
<p>So solte es nach der Bibiliotheksdokumentation aussehen:</p>
<pre><code>modbus_t *ctx;
//modbus_new_tcp leifert eine adresse auf die strukt modbus_t zurück oder NULL //falls ein fehler aufgetreten ist
ctx = modbus_new_tcp(&quot;127.0.0.1&quot;, 1502);
if (ctx == NULL) {
    fprintf(stderr, &quot;Unable to allocate libmodbus context\n&quot;);
    return -1;
}
}
</code></pre>
<p>Das ganze habe ich in eine Fkt gepackt welche dann so aus siet:</p>
<pre><code>bool libmodbusConnector::createContext(modbus_t* mbctx, std::string ip, int port){
  mbctx = modbus_new_tcp(ip.c_str(), port);
  if (mbctx==NULL){
  return false; //kontext konte nicht eingerichtet werden
  }
}
</code></pre>
<p>wenn ich nun aus der main diese Funktion Aufrufe und und versuche den kontext zu erstellen, dann wird der zeiger nicht verändert, d.h. mbctx bleibt auf den initialisierten wert &quot;hängen&quot; und beim nächsten benutzten stürtzt das ganze ab.</p>
<p>Wenn ich aber die Funktion direkt in der main aufrufe, also etwa so :</p>
<pre><code>int main(argc....){
.
.
  modbus_t *mbctx= modbus_new_tcp(ip, port)
  return 0;
}
</code></pre>
<p>dann kalppt es.<br />
kann mir hier jemand ein bischen Licht ins Dunkel bringen??</p>
<p>Danke schonmal vorab.<br />
Mfg BabCom</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405580</guid><dc:creator><![CDATA[BabCom]]></dc:creator><pubDate>Wed, 25 Jun 2014 17:21:06 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Wed, 25 Jun 2014 17:30:31 GMT]]></title><description><![CDATA[<p>Stichwort: Call by Value, Call by Reference.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405582</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 25 Jun 2014 17:30:31 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Wed, 25 Jun 2014 17:47:26 GMT]]></title><description><![CDATA[<p>Hallo,<br />
sehr einseitige Fragen heute <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
<a href="http://www.c-plusplus.net/forum/326594" rel="nofollow">Klick mich</a>...<br />
MFG John.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405583</guid><dc:creator><![CDATA[John1]]></dc:creator><pubDate>Wed, 25 Jun 2014 17:47:26 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Wed, 25 Jun 2014 22:42:30 GMT]]></title><description><![CDATA[<p>ok, aber das ist glaube ich nicht wirklich das Problem??<br />
ich poste einfach noch mal alle relevanten stellen.</p>
<p>Die Struktur moddbus_t wir im headerfile modbus.h definiert und ich habe diese auch eingebunden.</p>
<p>devRead.cpp</p>
<pre><code>modbus_t *myMbCtx = NULL;
			try{
				//versuche einen Kontext Anzulegen
				//so gets 
				/*	myMbCtx = modbus_new_tcp(cfgDevice[i].getAdresse().c_str(), MBPORT);
				if(myMbCtx == NULL){//
					return false;
				}*/

				//so nicht
				modbusConnector-&gt;createKontext(myMbCtx, cfgDevice[i].getAdresse(), MBPORT);
			}catch(devReadExcept&amp; dre){
				throw(dre);
			};
			//versuche eine verbindung aufzubauen
			try{
				modbusConnector-&gt;connect(myMbCtx);	// Verbindung Aufbauen
				//modbus_connect(myMbCtx);
			}catch(devReadExcept&amp; dre){
				throw(dre);//fehler eine ebene tiefer werfen
			}
</code></pre>
<p>Die funktion:</p>
<pre><code>bool libModbusConnector::createKontext(modbus_t* mbctx, std::string ip, int port){

	//Adresse wird nicht übernommen
        //der prototyfp der funktion modbus_new_tcp wird im header modbus.h definiert
        //modbus_t* modbus_new_tcp(const char *ip_address, int port);
	mbctx = modbus_new_tcp(ip.c_str(), port);
	if(mbctx == NULL){
		throw devReadExcept(modbus_strerror(errno), errno, -1);
		return false;
	}
	return true;
}

bool libModbusConnector::connect(modbus_t* mbctx){

	if(modbus_connect(mbctx) == -1){
		modbus_free(mbctx);
		throw devReadExcept(modbus_strerror(errno), errno, -1);
		//CONNECT IST FEHLGESCHLAGEN
		return false;
	}
	return true;
}
</code></pre>
<p>Wenn ich es also wie oben auskommentiert mache dann klappts ohne Probleme.<br />
Wenn ich aber wie nicht auskommentiert mache dann schlägt es fehl.</p>
<p>sobald die Funktion aufgerufen wird gibt die Funktion modbus_new_tcp(...) nicht mehr die Adresse der angelegten Struktur zurück sondern ändert an der Adresse garnichts.</p>
<p>mfg jpk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405621</guid><dc:creator><![CDATA[BabCom]]></dc:creator><pubDate>Wed, 25 Jun 2014 22:42:30 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Wed, 25 Jun 2014 22:48:30 GMT]]></title><description><![CDATA[<p>BabCom schrieb:</p>
<blockquote>
<p>ok, aber das ist glaube ich nicht wirklich das Problem??</p>
</blockquote>
<p>Doch, das ist genau das Problem. Änderungen an lokalen Variablen werden generell nicht zum Aufrufer übernommen, da die übergebenen Argumente lediglich in die Parameter kopiert werden (&quot;Call-by-value&quot;). Um dem abzuhelfen, kann man Referenzen benutzen (oder Zeiger):</p>
<pre><code class="language-cpp">void funktion(modbus_t*&amp; mbctx) {
//                     ^
  mbctx = irgendwas;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2405622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405622</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 25 Jun 2014 22:48:30 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Wed, 25 Jun 2014 23:33:02 GMT]]></title><description><![CDATA[<p>ok, danke schon mal dafür das klappt soweit.</p>
<p>Aber ich verstehe eigentlich nicht warum. Kann mir das jemand noch genauer erklären?</p>
<p>mfg BabCom</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405626</guid><dc:creator><![CDATA[BabCom]]></dc:creator><pubDate>Wed, 25 Jun 2014 23:33:02 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Thu, 26 Jun 2014 04:03:02 GMT]]></title><description><![CDATA[<pre><code>void foo(int bar) 
{
  bar = 5;
}

int main(void)
{
 int a = 2;
 foo(a);
 //Welchen Wert hat a jetzt und warum?
  ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2405638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405638</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Thu, 26 Jun 2014 04:03:02 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Thu, 26 Jun 2014 06:31:16 GMT]]></title><description><![CDATA[<p>Etwas ausführlicher<br />
<a href="http://de.wikibooks.org/wiki/C++-Programmierung/_Weitere_Grundelemente/_Prozeduren_und_Funktionen" rel="nofollow">http://de.wikibooks.org/wiki/C++-Programmierung/_Weitere_Grundelemente/_Prozeduren_und_Funktionen</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405642</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 26 Jun 2014 06:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Thu, 26 Jun 2014 06:54:52 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>mir fällt auf, dass Du eine komische Vorstellung von exceptions hast. Du fängst eine exception um sie gleich wieder zu werfen. Erstens kannst Du im catch-block einfach ein &quot;throw;&quot; ohne irgendwas machen, um die selbe Exception weiter zu werfen und zweitest brauchst Du sie nicht zu fangen, wenn Du sie sowieso nur weiter wirfst. Also der Code lässt sich wesentlich vereinfachen. Statt:</p>
<pre><code>modbus_t *myMbCtx = NULL;
			try{
				modbusConnector-&gt;createKontext(myMbCtx, cfgDevice[i].getAdresse(), MBPORT);
			}catch(devReadExcept&amp; dre){
				throw(dre);
			};
			try{
				modbusConnector-&gt;connect(myMbCtx);	// Verbindung Aufbauen
			}catch(devReadExcept&amp; dre){
				throw(dre);//fehler eine ebene tiefer werfen
			}
</code></pre>
<p>reicht:</p>
<pre><code>modbus_t *myMbCtx = NULL;
	modbusConnector-&gt;createKontext(myMbCtx, cfgDevice[i].getAdresse(), MBPORT);
	modbusConnector-&gt;connect(myMbCtx);	// Verbindung Aufbauen
</code></pre>
<p>Ist doch gleich viel übersichtlicher.</p>
<p>Und im createKontext macht das &quot;return false&quot; so gar keinen Sinn. Es wird nicht erreicht, da vorher eine Exception geworfen wird. Überhaupt brauchst Du den Rückgabewert nicht. Es wird ja sowieso immer true zurück gegeben. Mach dann gleich ein void draus.</p>
<p>Dein eigentliches Problem wurde hier ja schon erläutert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405645</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Thu, 26 Jun 2014 06:54:52 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Wed, 02 Jul 2014 14:09:02 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/32185">@DirkB</a><br />
2, da a als call by Value übergeben wird. soweit ist mir das klar.<br />
Im aktuellen fall habe ich nicht verstanden warum mann das so machen muss:</p>
<pre><code>void funktion(modbus_t*&amp; mbctx
//                     ^
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9578">@tntnet</a><br />
nun ja ich fange die da, weil ich pro Ebene ggf noch weitere Informationen zu dem Fehler in meine error klasse schreibe (das ist z.B. die Sensor ID bei der der Fehler aufgetreten ist etc.), die auf höheren ebenen evtl nicht bekannt sind.<br />
Zugegebener maßen ist das in dem ggegebenen bsp. nicht drin weils nicht zum Problem gehört. Das ganze würde vollständig dann ca so aus sehen:</p>
<pre><code>modbus_t *myMbCtx = NULL;
            try{
                modbusConnector-&gt;createKontext(myMbCtx, cfgDevice[i].getAdresse(), MBPORT);
            }catch(devReadExcept&amp; dre){
                throw(dre);
            };
            try{
                modbusConnector-&gt;connect(myMbCtx);  // Verbindung Aufbauen
            }catch(devReadExcept&amp; dre){
                //weitere infos einfügen
                int id;
                id = cfgDevice[i].getID(); //ermittelt die aktuelle id des gelesenen sensors
                 dre.setID(id); 
                throw(dre);//fehler eine ebene tiefer werfen
            }
</code></pre>
<p>Desweiteren werte ich die Fehler hier aus und löse z.B. bei einem verbindungsabbruch einen Reconnect aus.</p>
<p>mfg BabCom</p>
<p>edit:</p>
<p>tntnet schrieb:</p>
<blockquote>
<p>Und im createKontext macht das &quot;return false&quot; so gar keinen Sinn. Es wird nicht erreicht, da vorher eine Exception geworfen wird. Überhaupt brauchst Du den Rückgabewert nicht. Es wird ja sowieso immer true zurück gegeben. Mach dann gleich ein void draus.</p>
</blockquote>
<p>Da hast du recht. Das ist auf einer früheren Version gewachsen wo ich das noch ohne exeptions gelöst hatte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405946</guid><dc:creator><![CDATA[BabCom]]></dc:creator><pubDate>Wed, 02 Jul 2014 14:09:02 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Fri, 27 Jun 2014 13:51:40 GMT]]></title><description><![CDATA[<p>BabCom schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/32185">@DirkB</a><br />
2, da a als call by Value übergeben wird. soweit ist mir das klar.<br />
Im aktuellen fall habe ich nicht verstanden warum mann das so machen muss:</p>
<pre><code>void funktion(modbus_t*&amp; mbctx
//                     ^
</code></pre>
</blockquote>
<p>Weil es in deinem Fall genau das gleiche ist, nur dass der Typ nicht int, sondern modbus_t* heißt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405947</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 27 Jun 2014 13:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to Variable wird nach Übergabe via Pointer nicht geändert woran kanns liegen? on Fri, 27 Jun 2014 14:11:04 GMT]]></title><description><![CDATA[<p>habs jetzt gerafft sry das ich so lange auf dem Schlauch stand.</p>
<p>mfg BabCom</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405952</guid><dc:creator><![CDATA[BabCom]]></dc:creator><pubDate>Fri, 27 Jun 2014 14:11:04 GMT</pubDate></item></channel></rss>