<?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[Auslagerung Funktion mit struct-Kombination in eigenes .cpp-File]]></title><description><![CDATA[<p>Liebe Forumspezialisten,</p>
<p>derzeit habe ich den gesamten Programmcode in einem .cpp-File. Mittlerweile wird das schon etwas unübersichtlich und ich möchte diverse Funktionen auslagern. Leider habe ein Problem bei der Auslagerung einer readin-Datei in ein eigenes .cpp-File. Das Auslagern eine Zufallszahlenerzeugungs-Funktion ging ohne Probleme (mit Headerdatei und eigener .cpp Datei).</p>
<p>Bei der readin-Datei übergebe ich eine komplexere Kombination aus structs (myStruct *production) an die Funktion und dabei habe ich es bis jetzt noch nicht geschafft die Dateiei „Read_Data.h“ und „Readin.cpp“ richtig zu definieren.</p>
<p>Könnt ihr mir bitte anhand des unten angeführten und reduzierten Beispiels sagen, wie die externen Dateien ausgefüllt gehören, sodass ich in meiner Hauptdatei auf die extern ausgelagerte Readin-Datei korrekt zugreifen kann?</p>
<pre><code>#include&lt;iostream&gt;
#include&lt;vector&gt;
#include&lt;algorithm&gt;
#include&lt;fstream&gt;
#include&lt;string&gt;
#include&lt;Windows.h&gt;
#include &quot;Random_numbers.h&quot;
#include &quot;Read_Data.h&quot;

using namespace std;

// Struct
struct ProdtoBlock{
	int prodnr;
	int blocknr;
};

struct struct_solutions{
	vector&lt;vector&lt;int&gt;&gt; production_per_product;
	vector&lt;vector&lt;int&gt;&gt; setup_route;
};

struct myStruct{
	vector&lt;vector&lt;int&gt;&gt; demand;
	…
	…
	…
	vector&lt;ProdtoBlock&gt;prodtoblock;
	int prodnr;
	int blocknr;
	struct_solutions solutions;
	vector&lt;struct_solutions&gt; save_solutions;
	vector&lt;vector&lt;int&gt;&gt; production_per_product;
	vector&lt;vector&lt;int&gt;&gt; setup_route;
};

// Globale Variablen
int blocki, blockj, products, macroperiods, microperiods;

// Funktionen
void readData(myStruct *production);

int main(){

myStruct production;

readData(&amp;production);

vector&lt;ProdtoBlock&gt; prodtoblock;
vector&lt;struct_solutions&gt; save_solutions;
…
calculatecost(&amp;production);
…
return EXIT_SUCCESS;

}

void readData(myStruct * production)
{
	ifstream in(&quot;ABC.txt&quot;);
	char line[1000];

	if(in.fail())
	{
		cout &lt;&lt; &quot;Couldnt open ABC.txt&quot;;
		exit(0);
	}
	//1. line 
	in.getline(line, 1000);

	//2. line (blocks)
	in.getline(line, 1000, ':');
	in &gt;&gt; blocki;
	blockj = blocki;

	…
	…
	…

	//8-15. line (Demand-Matrix)
	for (int k=0; k &lt; products; k++)
	{
		vector&lt;int&gt; row;

		for (int d=0; d &lt; macroperiods; d++)
		{
			int input=1;
			in &gt;&gt; input;
			row.push_back(input);
		}
		(*production).demand.push_back(row);
	}

}
</code></pre>
<p>Vielen Dank für Eure Hilfe!</p>
<p>Mit freundlichen Grüßen<br />
PaX</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324957/auslagerung-funktion-mit-struct-kombination-in-eigenes-cpp-file</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 07:59:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324957.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Apr 2014 04:47:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auslagerung Funktion mit struct-Kombination in eigenes .cpp-File on Wed, 09 Apr 2014 04:47:36 GMT]]></title><description><![CDATA[<p>Liebe Forumspezialisten,</p>
<p>derzeit habe ich den gesamten Programmcode in einem .cpp-File. Mittlerweile wird das schon etwas unübersichtlich und ich möchte diverse Funktionen auslagern. Leider habe ein Problem bei der Auslagerung einer readin-Datei in ein eigenes .cpp-File. Das Auslagern eine Zufallszahlenerzeugungs-Funktion ging ohne Probleme (mit Headerdatei und eigener .cpp Datei).</p>
<p>Bei der readin-Datei übergebe ich eine komplexere Kombination aus structs (myStruct *production) an die Funktion und dabei habe ich es bis jetzt noch nicht geschafft die Dateiei „Read_Data.h“ und „Readin.cpp“ richtig zu definieren.</p>
<p>Könnt ihr mir bitte anhand des unten angeführten und reduzierten Beispiels sagen, wie die externen Dateien ausgefüllt gehören, sodass ich in meiner Hauptdatei auf die extern ausgelagerte Readin-Datei korrekt zugreifen kann?</p>
<pre><code>#include&lt;iostream&gt;
#include&lt;vector&gt;
#include&lt;algorithm&gt;
#include&lt;fstream&gt;
#include&lt;string&gt;
#include&lt;Windows.h&gt;
#include &quot;Random_numbers.h&quot;
#include &quot;Read_Data.h&quot;

using namespace std;

// Struct
struct ProdtoBlock{
	int prodnr;
	int blocknr;
};

struct struct_solutions{
	vector&lt;vector&lt;int&gt;&gt; production_per_product;
	vector&lt;vector&lt;int&gt;&gt; setup_route;
};

struct myStruct{
	vector&lt;vector&lt;int&gt;&gt; demand;
	…
	…
	…
	vector&lt;ProdtoBlock&gt;prodtoblock;
	int prodnr;
	int blocknr;
	struct_solutions solutions;
	vector&lt;struct_solutions&gt; save_solutions;
	vector&lt;vector&lt;int&gt;&gt; production_per_product;
	vector&lt;vector&lt;int&gt;&gt; setup_route;
};

// Globale Variablen
int blocki, blockj, products, macroperiods, microperiods;

// Funktionen
void readData(myStruct *production);

int main(){

myStruct production;

readData(&amp;production);

vector&lt;ProdtoBlock&gt; prodtoblock;
vector&lt;struct_solutions&gt; save_solutions;
…
calculatecost(&amp;production);
…
return EXIT_SUCCESS;

}

void readData(myStruct * production)
{
	ifstream in(&quot;ABC.txt&quot;);
	char line[1000];

	if(in.fail())
	{
		cout &lt;&lt; &quot;Couldnt open ABC.txt&quot;;
		exit(0);
	}
	//1. line 
	in.getline(line, 1000);

	//2. line (blocks)
	in.getline(line, 1000, ':');
	in &gt;&gt; blocki;
	blockj = blocki;

	…
	…
	…

	//8-15. line (Demand-Matrix)
	for (int k=0; k &lt; products; k++)
	{
		vector&lt;int&gt; row;

		for (int d=0; d &lt; macroperiods; d++)
		{
			int input=1;
			in &gt;&gt; input;
			row.push_back(input);
		}
		(*production).demand.push_back(row);
	}

}
</code></pre>
<p>Vielen Dank für Eure Hilfe!</p>
<p>Mit freundlichen Grüßen<br />
PaX</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393532</guid><dc:creator><![CDATA[PaX_1960]]></dc:creator><pubDate>Wed, 09 Apr 2014 04:47:36 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerung Funktion mit struct-Kombination in eigenes .cpp-File on Wed, 09 Apr 2014 08:49:56 GMT]]></title><description><![CDATA[<p>PaX_1960 schrieb:</p>
<blockquote>
<p>Könnt ihr mir bitte anhand des unten angeführten und reduzierten Beispiels sagen, wie die externen Dateien ausgefüllt gehören, sodass ich in meiner Hauptdatei auf die extern ausgelagerte Readin-Datei korrekt zugreifen kann?</p>
</blockquote>
<p>Bitte weiter reduzieren, bis es minimal ist und noch das Problem zeigt.<br />
Bitte nicht soweit reduzieren, daß es nicht mehr in den Compiler passt. So … im Code bringen mir nix, die machen nur Fehlermeldungen, die nix mit der Frage zu tun haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393551</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 09 Apr 2014 08:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerung Funktion mit struct-Kombination in eigenes .cpp-File on Thu, 10 Apr 2014 05:28:43 GMT]]></title><description><![CDATA[<p>Hallo Volkard,</p>
<p>danke erstmal für deine Antwort. Ich habe das Programm jetzt noch etwas reduziert und so gestaltet, dass du es einfach copy-paste übernehmen kannst. Ich hoffe du kannst damit etwas anfangen.</p>
<pre><code>#include&lt;iostream&gt;
#include&lt;vector&gt;
#include&lt;algorithm&gt;
#include&lt;fstream&gt;
#include&lt;string&gt;
#include&lt;Windows.h&gt;
//#include &quot;Readin.h&quot;

using namespace std;

// Struct
struct ProdtoBlock{
	int prodnr;
	int blocknr;
};

struct myStruct{
	vector&lt;vector&lt;int&gt;&gt; demand;
	vector&lt;ProdtoBlock&gt;prodtoblock;
	int prodnr;
	int blocknr;
};

// Globale Variablen
int products, macroperiods;

// Funktionen
void readData(myStruct *production);

int main(){

	myStruct production;

	readData(&amp;production);

	vector&lt;ProdtoBlock&gt; prodtoblock;

//Ausgabe
		cout &lt;&lt; products &lt;&lt; &quot; &quot; &lt;&lt; macroperiods &lt;&lt;  endl;

	for(int k=0; k &lt; products; k++)
	{
		for( int d=0; d &lt; macroperiods; d++)
		{
			cout &lt;&lt; production.demand.at(k).at(d) &lt;&lt; &quot;\t&quot;;
		}
		cout &lt;&lt; endl;
	}

	getchar();
	getchar();
	return EXIT_SUCCESS;
}

void readData(myStruct * production){
	ifstream in(&quot;Input.txt&quot;);
	char line[1000];

	if(in.fail())
	{
		cout &lt;&lt; &quot;Fehler beim oeffnen von Input.txt&quot;;
		exit(0);
	}
	//1. Zeile Überschrift
	in.getline(line, 1000);

	//3.Zeile (Anzahl Produkte)
	in.getline(line, 1000, ':');
	in &gt;&gt; products;

	//4.Zeile (Anzahl Makro-Perioden)
	in.getline(line, 1000, ':');
	in &gt;&gt; macroperiods;

	//6-7. Zeile (leere Zeilen)
	in.getline(line, 1000);
	in.getline(line, 1000);
	in.getline(line, 1000);

	//8-15. Zeile (Demand-Matrix)
	for (int k=0; k &lt; products; k++)
	{
		vector&lt;int&gt; row;

		for (int d=0; d &lt; macroperiods; d++)
		{
			int input=1;
			in &gt;&gt; input;
			row.push_back(input);
		}
		(*production).demand.push_back(row);
	}
}
</code></pre>
<p>Die Input.txt lautet:</p>
<p>Input für das Programm<br />
Products: 8<br />
Macro-Periods: 5</p>
<p>Demand<br />
1 1 1 1 1<br />
2 2 2 2 2<br />
3 3 3 3 3<br />
4 4 4 4 4<br />
5 5 5 5 5<br />
6 6 6 6 6<br />
7 7 7 7 7<br />
8 8 8 8 8</p>
<p>Also die Frage lautet nun: Wie müssten die Dateien Readin.cpp und Readin.h gestaltet sein, sodass die Funktion readData ausgelagert ist.</p>
<p>Vielen Dank für Eure Hilfe,</p>
<p>mit freundlichen Grüßen<br />
PaX</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393763</guid><dc:creator><![CDATA[PaX_1960]]></dc:creator><pubDate>Thu, 10 Apr 2014 05:28:43 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerung Funktion mit struct-Kombination in eigenes .cpp-File on Thu, 10 Apr 2014 06:50:06 GMT]]></title><description><![CDATA[<p>Ich versuchs mal.</p>
<p>In die <em>Readin.cpp</em> kommt der Code für <em>readData</em> und die globalen Variablen die dazu gehören.<br />
Dort bindest du auch nur die Header ein, die du für den Code brauchst.</p>
<p>In die <em>Readin.h</em> kommen die Deklarationen und Definitionen, die nötig sind, damit du <em>readData</em> (in <code>main</code> ) aufrufen kannst.<br />
Das sind z.B. die <code>structs</code> und auch der Prototyp von <em>readData</em><br />
Dort bindest du auch nur die Header ein, die nötig sind.</p>
<p>Die globalen Variablen darfst du im Header nur bekannt geben. Dazu schreibst du ein extern davor.<br />
Das <code>using namespace std;</code> hat im Header auch nichts zu suchen.</p>
<p>Readin.h</p>
<pre><code>#include&lt;vector&gt;

// Struct
struct ProdtoBlock{
    int prodnr;
    int blocknr;
};

struct myStruct{
    vector&lt;vector&lt;int&gt;&gt; demand;        // anpassen wegen std::
    vector&lt;ProdtoBlock&gt;prodtoblock;    // anpassen wegen std::
    int prodnr;
    int blocknr;
};

// Globale Variablen deklarieren
extern int products, macroperiods;

// Funktionen
void readData(myStruct *production);
</code></pre>
<p>Readin.cpp</p>
<pre><code>#include &lt;nur das nötige&gt;
#include &quot;Readin.h&quot;

using namespace std;  // muss das sein?

// Struct 
//    stehen in Readin.h

// Globale Variablen definieren. Hier wird der Speicherplatz belegt
int products, macroperiods;

// Funktionen 
// void readData(myStruct *production); das steht auch schon in Readin.h
// Andere Funktionen, die du nur hier brauchst kannst du hier deklarieren. Die kommen nicht in den Header

void readData(myStruct * production){
    dein Code hier
}
</code></pre>
<p>main.cpp</p>
<pre><code>#include &lt;auch nur das nötige&gt;
#include &quot;Readin.h&quot;

int main(){

    myStruct production;  // bekannt aus Readin.h

    readData(&amp;production); // bekannt aus Readin.h

    ...
    return EXIT_SUCCESS;
}
</code></pre>
<p>Jede *.cpp Datei wird für sich alleine compiliert. Dazu muss dem Compiler alles bekannt sein, was er dafür braucht.<br />
Dabei werden die Dateien, die bei <code>#include</code> angegeben sind in den Code mit eingefügt (Textersatzt).<br />
Da wo vorher <em>#include &quot;Readin.h&quot;</em> stand, steht dann der ganze Inhalt von Readin.h (auch wieder mit den eingefügten includes).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393767</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Thu, 10 Apr 2014 06:50:06 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerung Funktion mit struct-Kombination in eigenes .cpp-File on Fri, 11 Apr 2014 05:17:10 GMT]]></title><description><![CDATA[<p>Hallo DirkB,</p>
<p>vielen Dank für deine kompetente Hilfe. Du hast das wirklich anschaulich und verständlich erklärt.</p>
<p>Ich verwende das (MyStruct *production) auch noch für andere Funktionen im main-Bereich. Das heißt die Struct-Deklarationen werden von Readin.h &quot;eingespielt&quot; und (MyStruct *production) kann auch von anderen Funktionen verwendet werden. (So wie du es beschrieben hast)</p>
<p>Durch Zufall bin ich auf eine andere Variante gekommen und wollte fragen ob das auch zulässig ist:<br />
Readin.cpp und Readin.h bleiben unverändert, jedoch habe ich die Struct-Deklaration im main-File zusätzlich eingefügt. Damit das ganze funktioniert darf jedoch im main-File das #include &quot;Readin.h&quot; NICHT inkludiert werden.</p>
<p>Ist das auch eine zulässige Variante wenn ich Struct-Deklaration aus Übersichtlichkeit im main-File lassen möchte, weil eben andere Funktion auch darauf zugreifen? (Die &quot;Deklarationen&quot; finden beim auslagern dann halt doppelt statt...)</p>
<p>Vielen Dank,</p>
<p>mit freundlichen Grüßen<br />
PaX</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393954</guid><dc:creator><![CDATA[PaX_1960]]></dc:creator><pubDate>Fri, 11 Apr 2014 05:17:10 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerung Funktion mit struct-Kombination in eigenes .cpp-File on Fri, 11 Apr 2014 07:14:59 GMT]]></title><description><![CDATA[<p>PaX_1960  schrieb:</p>
<blockquote>
<p>Ist das auch eine zulässige Variante wenn ich Struct-Deklaration aus Übersichtlichkeit im main-File lassen möchte,</p>
</blockquote>
<p>Du baust damit eine mögliche Fehlerquelle ein, wenn du die struct änderst.<br />
Du brauchst dann auch noch die Prototypen aus ReadIn.h und ....</p>
<p>Du schreibst den Inhalt von ReadIn.h nochmal in main.c</p>
<p>Aber genau das macht das <em>#include &quot;ReadIn.h&quot;</em> schon automatisch.</p>
<p>Was ist verstehst du unter mehr Übersichtlichkeit?<br />
Nutze deine IDE aus. die kann dir die struct-Member auch anzeigen.</p>
<p>Aus Compilersicht ist das zuläassig.<br />
Aus Sicht der Wartbarkeit, Qualitätssicherung und Sicherheit absolut nicht.</p>
<p>Durch *MyStruct <em>production</em> wird die Variable (Zeiger) <em>production</em> angelegt.<br />
Wo, wann und wie oft du die verwendest ist egal. Du gibst diese Variable ja an die Funktionen weiter.<br />
Der Compiler muss nur bei der Definition und beim Zugriff darauf wissen, wie <em>MyStruct</em> aufgebaut ist.<br />
Dies passiert mit dem <em>#include &quot;ReadIn.h&quot;</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393961</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Fri, 11 Apr 2014 07:14:59 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerung Funktion mit struct-Kombination in eigenes .cpp-File on Fri, 11 Apr 2014 12:02:55 GMT]]></title><description><![CDATA[<p>Ursprünglich habe ich gedacht dass es übersichtlicher ist wenn die struct-Deklaration im main-File bleibt da sie von mehreren veschiedenen Funktion benötigt wird. Es erschien mir unlogisch die Deklaration einer Funktion (in diesem Fall ReadData) zuzuordnen wenn sie von anderen Funktionen auch benötigt wird...<br />
Aber ich finde deine Argumente durchaus einleuchtend, dass diese Mehrfachdeklaration eher eine Fehlerquelle ist, als eine Hilfe bei der Übersichtlichkeit.</p>
<p>Danke jedenfalls für deine Hilfe/Tipps.</p>
<p>Mit freundlichen Grüßen<br />
PaX</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394021</guid><dc:creator><![CDATA[PaX_1960]]></dc:creator><pubDate>Fri, 11 Apr 2014 12:02:55 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerung Funktion mit struct-Kombination in eigenes .cpp-File on Fri, 11 Apr 2014 12:28:04 GMT]]></title><description><![CDATA[<p>Die Deklaration muss auch nicht in <em>ReadIn.h</em> stehen, aber in <em>main.cpp</em> sollte sie auf gar keinen Fall.<br />
Du kannst auch ein <em>myStruct.h</em> machen, wo nur diese <code>struct</code> deklariert wird.<br />
Dies musst du dann aber in <em>ReadIn.cpp</em> einbinden. Und auch in <em>ReadIn.h</em>, da du myStruct in der Paramterliste von <em>readData</em> hast.</p>
<p><em>ReadIn.cpp</em> stellt Funktionen zur Verfügung. Alle Informationen, die der Compiler zur Nutzung dieser Funktionen braucht, kommt in <em>ReadIn.h</em><br />
Aus <em>ReadIn.cpp</em> rufst du dann wiederum andere Module auf (und nutzt deren Header). Das verzweigt sich dann immer weiter nach unten.<br />
<code>main</code> steht da an oberster Stelle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394025</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Fri, 11 Apr 2014 12:28:04 GMT</pubDate></item></channel></rss>