<?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[Struktur als Eingabe UND Rückgabewert einer Funktion !?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Struktur Matrix gebastelt, die ich in einer Funktion als Eingabe- und Rückgabewert verwenden möchte.<br />
Ist das möglich? Falls ja, wie?</p>
<p>Genauer: Ich möchte die Schursche Normalform einer Matrix A bestimmen. Dazu benötige ich eine Struktur Matrix, eine Funktion die mir die QR-Zerlegung meiner Matrix berechnet und in der Main-Funktion möchte ich das Q meiner QR-Zerlegung in eine Iteration einbauen.<br />
Die QR-Zerlegung erhält als Eingabe die Matrix A.</p>
<p>Vielen Dank schonmal!</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240504/struktur-als-eingabe-und-rückgabewert-einer-funktion</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 22:41:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240504.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 May 2009 11:57:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Thu, 07 May 2009 11:57:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Struktur Matrix gebastelt, die ich in einer Funktion als Eingabe- und Rückgabewert verwenden möchte.<br />
Ist das möglich? Falls ja, wie?</p>
<p>Genauer: Ich möchte die Schursche Normalform einer Matrix A bestimmen. Dazu benötige ich eine Struktur Matrix, eine Funktion die mir die QR-Zerlegung meiner Matrix berechnet und in der Main-Funktion möchte ich das Q meiner QR-Zerlegung in eine Iteration einbauen.<br />
Die QR-Zerlegung erhält als Eingabe die Matrix A.</p>
<p>Vielen Dank schonmal!</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1707081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707081</guid><dc:creator><![CDATA[C++--Neuling]]></dc:creator><pubDate>Thu, 07 May 2009 11:57:53 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Thu, 07 May 2009 13:06:46 GMT]]></title><description><![CDATA[<p>Übergib einfach einen Pointer auf deine Struktur oder eine Referenz an deine Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1707138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707138</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 07 May 2009 13:06:46 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Thu, 07 May 2009 14:04:36 GMT]]></title><description><![CDATA[<p>Danke. Wie mache ich das?<br />
Kannst du das bitte an einem Beispiel zeigen? (Bin wie mein Name sagt nicht gerade bewandert...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1707176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707176</guid><dc:creator><![CDATA[C++--Neuling]]></dc:creator><pubDate>Thu, 07 May 2009 14:04:36 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Thu, 07 May 2009 14:09:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct Matrix {
};

Matrix *SchurscheAlsRef(const Matrix &amp; m) { ... }
Matrix *SchurscheAlsPointer(const Matrix *m) { ... }

Matrix m1;
Matrix *m2 = SchurscheAlsRef(m);
Matrix *m3 = SchurscheAlsPointer(&amp;m);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1707178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707178</guid><dc:creator><![CDATA[esskar]]></dc:creator><pubDate>Thu, 07 May 2009 14:09:17 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Thu, 07 May 2009 16:30:37 GMT]]></title><description><![CDATA[<p>Ganz, ganz böse. Returne niemals einen Zeiger oder eine Referenz auf ein lokales Objekt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1707272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707272</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 07 May 2009 16:30:37 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Thu, 07 May 2009 16:56:53 GMT]]></title><description><![CDATA[<p>Wenn ich keine Zeiger oder Referenz einem lokalen Objekt zuweisen soll, wie geht's dann?</p>
<p>Ich sende mal den Programmcode den ich habe (der geht soweit), ich möchte die Funktion &quot;schmidtortho&quot; (QR-Zerlegung) in mein Programm einbauen. Ihr braucht die Funktion nicht nachzuvollziehen, ich glaube das ist nicht nötig.<br />
Muss nicht am Ende der Funktion noch so etwas wie &quot; *schmidtortho = Q&quot; stehen? (Ich möchte Q als Matrix zurückliefern.)</p>
<pre><code>// Schmidt-Orthogonalisierung berechnen
Matrix *schmidtortho(const struct Matrix &amp;A) {
  int h,i,j;
  double qa[NMAX*NMAX], ra[NMAX*NMAX], va[NMAX*NMAX];
  struct Matrix Q, R, V;
  double *Aptr, *Aptr3;

  double *Qptr, *Qptr2, *Qptr3, *Qptr4;
  double *Rptr, *Rptr3;
  double f, nor;

  strcpy(Q.name,&quot;Q&quot;);
  Q.m = A.m; Q.n = A.n; Q.a = qa;

  strcpy(R.name,&quot;R&quot;);
  R.m = A.n; R.n = A.n; R.a = ra;

  // Schleife über alle Spalten j der Matrix A
  Aptr = A.a;
  Qptr = Q.a; 
  Rptr = R.a;
  for (j=0; j&lt;Q.n; j++) {
    Aptr3 = Aptr; // j-te Spalte
    Qptr3 = Qptr; // j-te Spalte
    for (i=0; i&lt;Q.m; i++) {
      *Qptr3 = *Aptr3; // Q(:,j)=A(:,j), Spalte j von A nach Q kopieren
      Aptr3 += Q.n; Qptr3 += Q.n;
    }

    // q_j = a_j - sum_{h=1}^{j-1} &lt;a_j, q_h&gt; q_h
    Qptr2=Q.a;  // h-te Spalte 
    Rptr3=Rptr; // j-te Spalte
    for (h=0; h&lt;j &amp;&amp; h&lt;Q.m; h++) {
      Aptr3=Aptr; // j-te Spalte
      Qptr4=Qptr2; // h-te Spalte
      f=0.;
      for (i=0; i&lt;Q.m; i++) {
	f += *Aptr3 * *Qptr4;
	Aptr3+=Q.n; Qptr4+=Q.n;   // A(:,j)^T * Q(:,h)
	} 

      Qptr3=Qptr; // j-te Spalte
      Qptr4=Qptr2; // h-te Spalte

      for (i=0; i&lt;Q.m; i++) {
	*Qptr3 -= f* *Qptr4;
	Qptr3 += Q.n; Qptr4 += Q.n; // Q(:,j)=Q(:,j) - f*Q(:,h)
      }

      *Rptr3 = f; 
      Rptr3 += R.n; // R(h,j)
      Qptr2++; // nächste h-Spalte
    }
    // Normierungsfaktor berechnen
    Qptr3=Qptr; // j-te Spalte
    *Rptr3 = 0.; // R(j,j) = 0.
    for (i=0; i&lt;Q.m; i++) {
      *Rptr3 += *Qptr3 * *Qptr3;
      Qptr3 += Q.n; // R(j,j) = Q(:,j)^T * Q(:,j)
    } 

    Qptr3 = Qptr; // j-te Spalte
    if (*Rptr3 &gt; 1.e-10) {
      *Rptr3 = sqrt(*Rptr3); // sqrt(R(j,j))
      //      printf(&quot;Rjj %f %f&quot;, *Rptr3, f);

      // Normieren der Spalte j von Q
      for (i=0; i&lt;Q.m; i++) {
	*Qptr3 /= *Rptr3;   
	Qptr3 += Q.n; // Q(:,j)=Q(:,j) / R(j,j)
      }
    } 
    else {
      *Rptr3 = 0.;  // R(j,j) = 0.
      for (i=0; i&lt;Q.m; i++) {
	*Qptr3 = 0.; 
	Qptr3 += Q.n; // Q(:,j)=0.
      }
    }
    Rptr3+= Q.n;
    for (h=j; h&lt;Q.n; h++) {
      *Rptr3 = 0.; // R(j+1:Q.n , j)=0.
      Rptr3 += Q.n;
    } // Spalten q_j und r_j sind berechnet

    Aptr++; Qptr++; Rptr++; // nächste j-te Spalte
  } // Ende der j-Schleife

  // Probe rechnen: V=A; V=V-Q*R, 
  V.m = A.m; V.n = A.n; V.a = va;
  Aptr = A.a; Aptr3 = V.a;
  for (i=0; i &lt; A.m*A.n; i++) *(Aptr3++) = *(Aptr++); // V=A;
  VminusQR(Q,R,V);
  nor = norminf(V);
}
</code></pre>
<p>Die Struktur Matrix sieht so aus:</p>
<pre><code>struct Matrix {  
  int m,n; // Zeilen- und Spaltenanzahl der Matrix
  double *a; // Zeiger auf 1. Eintrag in der Matrix
  char name[7]; // Matrixname mit &lt;=6 Buchstaben, Init. mit strcpy
};
</code></pre>
<p>Und mein Hauptprogramm etwas verkürzt:</p>
<pre><code>int main ( )
{ 
  const int nmat =2;  // Anzahl der Matrizen
  struct Matrix mat[nmat]; // Array von Matrizen

  // Initialisierung der Matrizen 
  // Speicherformat: zeilenweise, jedoch als eindimensionale Arrays
  double A[] = { 
    -3.,1.,
    1.,2. };
  double B[] = {
         0.,0.,
         0.,0.};

  // Initialisierung des Matrizen-Arrays mit Namen, Dimensionen und Einträgen
  strcpy(mat[0].name,&quot;A&quot;);
  mat[0].m = 2; mat[0].n = 2; mat[0].a = A;
  strcpy(mat[1].name,&quot;B&quot;);
  mat[1].m = 2; mat[1].n = 2; mat[1].a = B;

  UND HIER SOLL HIN:  mat[1] = schmidtortho (mat[0])

}
</code></pre>
<p>Ich hoffe dass war jetzt nicht zu lang... danke nochmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1707298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707298</guid><dc:creator><![CDATA[C++--Neuling]]></dc:creator><pubDate>Thu, 07 May 2009 16:56:53 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Thu, 07 May 2009 17:07:36 GMT]]></title><description><![CDATA[<p>Code, der für das Problem viel zu lang, fragwürdig eingerückt und ohne Syntaxhighlighting da steht, wird eher selten angeschaut. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Also benutze [cpp]-Tags und versuche, nur den relevanten Teil zu posten. Deine Matrixberechnung ist für das Problem irrelevant. Zudem würde ich dir raten, die Funktion zu unterteilen, dann wird der Algorithmus auch übersichtlicher. Abgesehen davon könntest du das Ganze ein wenig objektorientierter gestalten. Wenn du schon in C++ programmierst, kannst du von so vielen Zeigern und Arrays wegkommen und Probleme in Klassen gliedern. Statt des unsicheren <code>strcpy</code> und C-Strings wäre <code>std::string</code> eine gute Möglichkeit. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Zu deinem Problem: Ich rate davon ab, Zeiger zurückzugeben, wenn es nicht nötig ist. Das erhöht nämlich nur die Gefahr von ungültigem Zugriff (wegen lokaler Variablen) oder vergessener Freigabe (bei selbst allokiertem Speicher).</p>
<pre><code class="language-cpp">Matrix func() // Rückgabetyp Matrix - kein Zeiger, keine Referenz.
{
    Matrix m; // hier brauchst du KEIN struct vorne dran
    ...       // mache etwas mit m
    return m; // gib m als Kopie zurück.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1707306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707306</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 07 May 2009 17:07:36 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Thu, 07 May 2009 18:29:17 GMT]]></title><description><![CDATA[<p>OK, ein weiterer Versuch, vielleicht ists jetzt kurz genug. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>C++--Neuling schrieb:</p>
<blockquote>
<p>Wenn ich keine Zeiger oder Referenz einem lokalen Objekt zuweisen soll, wie geht's dann?</p>
<p>Ich sende mal den Programmcode den ich habe (der geht soweit), ich möchte die Funktion &quot;schmidtortho&quot; (QR-Zerlegung) in mein Programm einbauen. Ihr braucht die Funktion nicht nachzuvollziehen, ich glaube das ist nicht nötig.<br />
Muss nicht am Ende der Funktion noch so etwas wie &quot; *schmidtortho = Q&quot; stehen? (Ich möchte Q als Matrix zurückliefern.)</p>
<pre><code>[cpp]
// Schmidt-Orthogonalisierung berechnen
Matrix *schmidtortho(const struct Matrix &amp;A) {
  struct Matrix Q;
  strcpy(Q.name,&quot;Q&quot;);
  
  MATRIX Q WIRD VERARBEITET...
  Q SOLL ALS RÜCKGABEWERT DER FUNKTION DIENEN. (Wie geht das?)
}
[/cpp]
</code></pre>
<p>Die Struktur Matrix sieht so aus:</p>
<pre><code>[cpp]
struct Matrix {  
  int m,n; // Zeilen- und Spaltenanzahl der Matrix
  double *a; // Zeiger auf 1. Eintrag in der Matrix
  char name[7]; // Matrixname mit &lt;=6 Buchstaben, Init. mit strcpy
};
[/cpp]
</code></pre>
<p>Und mein Hauptprogramm etwas verkürzt:</p>
<pre><code>[cpp]
int main ( )
{ 
  const int nmat =2;  // Anzahl der Matrizen
  struct Matrix mat[nmat]; // Array von Matrizen

  // Initialisierung der Matrizen 
  // Speicherformat: zeilenweise, jedoch als eindimensionale Arrays
  double A[] = { 
    -3.,1.,
    1.,2. };
  double B[] = {
         0.,0.,
         0.,0.};

         
  // Initialisierung des Matrizen-Arrays mit Namen, Dimensionen und Einträgen
  strcpy(mat[0].name,&quot;A&quot;);
  mat[0].m = 2; mat[0].n = 2; mat[0].a = A;
  strcpy(mat[1].name,&quot;B&quot;);
  mat[1].m = 2; mat[1].n = 2; mat[1].a = B;
  
  UND HIER SOLL HIN:  mat[1] = schmidtortho (mat[0])

}
[/cpp]
</code></pre>
<p>Ich hoffe dass war jetzt nicht zu lang... danke nochmal!</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1707389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707389</guid><dc:creator><![CDATA[C++--Neuling]]></dc:creator><pubDate>Thu, 07 May 2009 18:29:17 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Fri, 08 May 2009 09:32:37 GMT]]></title><description><![CDATA[<p>Per value zurückgeben:</p>
<pre><code class="language-cpp">Matrix schmidtortho(const Matrix&amp; A)
{
    Matrix Q;
    ...
    return Q;
}
</code></pre>
<p>Lies lieber noch ein Stückchen weiter in deinem Buch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1707611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707611</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 08 May 2009 09:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Fri, 08 May 2009 16:32:13 GMT]]></title><description><![CDATA[<p>Steht schon weiter oben. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Aber irgendwie beschleicht mich das Gefühl, C++-Neuling kann nur mit konkreter Hilfe (d.h. wir sollen seinen Code vervollständigen) etwas anfangen. Vielleicht täusche ich mich aber auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1707875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707875</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 08 May 2009 16:32:13 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur als Eingabe UND Rückgabewert einer Funktion !? on Sat, 09 May 2009 13:26:14 GMT]]></title><description><![CDATA[<p>Danke. Klappt jetzt, muss noch andere Funktionen schreiben, ich versuchs aber erstmal alleine. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Sorry, hatte das nicht richtig zur Kenntnis genommen. Aber den Code sollt ihr mir nicht schreiben.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20068">@Michael</a>: Hab das in meinem Buch nicht gefunden.</p>
<p>So wie ihr das geschrieben habt ist das für mich der einfachst denkbare Weg, ich dachte das hätte ich so schon probiert... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1708152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1708152</guid><dc:creator><![CDATA[C++--Neuling]]></dc:creator><pubDate>Sat, 09 May 2009 13:26:14 GMT</pubDate></item></channel></rss>