<?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[Fehlerbei swap: &#x27;für die Initialisierung eines Arrays sind geschweifte Klammern...&#x27;]]></title><description><![CDATA[<p>Ich möchte nichts anderes machen als ein swap von Werten in einem Array. Die Position im Array bestimme ich über</p>
<pre><code class="language-cpp">inline int QFFTW::ArrPos(const int x, const int y)
{
	return y + m_size.y * x;
}
</code></pre>
<p>das Austauschen mache ich über</p>
<pre><code class="language-cpp">std::swap(Array[ArrPos(ix + N/2,iy)], Array[ArrPos(ix,iy)]);
</code></pre>
<p>oder, da das nicht klappt über</p>
<pre><code class="language-cpp">fftw_complex swap=Array[ArrPos(ix + N/2,iy)];
Array[ArrPos(ix + N/2,iy)]=Array[ArrPos(ix,iy)];
Array[ArrPos(ix,iy)]=swap;
</code></pre>
<p>wobei der Fehler natürlich identisch ist:</p>
<blockquote>
<p>1&gt;.\include\fftw\QFFTW.cpp(294) : error C2075: 'swap': für die Initialisierung eines Arrays sind geschweifte Klammern erforderlich<br />
1&gt;.\include\fftw\QFFTW.cpp(295) : error C2106: '=': Linker Operand muss ein L-Wert sein<br />
1&gt;.\include\fftw\QFFTW.cpp(296) : error C2106: '=': Linker Operand muss ein L-Wert sein</p>
</blockquote>
<p>Der Typ 'fftw_complex' wird dabei von einer Bibliothek definiert als 'typedef double fftw_complex[2]'.</p>
<p>Jetzt wüsste ich gerne was den Fehler auslöst, und wie ich das vieleicht lösen kann. Wenn es daran liegt das die Operationen = nicht definiert sind, dann fällt mir jetzt erstmal nur ein mit memcopy zu arbeiten was mir aber bei einzelnen Werte nicht sinnvoll erscheint.</p>
<p>Die komplette Function sieht im Übrigen so aus:</p>
<pre><code class="language-cpp">void QFFTW::Cycle2D(fftw_complex * Array, int N)
{

	// Spalten shiften 
	for (int ix = 0; ix &lt; N;ix++)	
		Cycle(Array + ix * N, N);	
	// Zeilen einzeln shiften

	for (int iy=0;iy&lt;N;iy++)	
	{
		for (int ix=0;ix&lt;N/2;ix++)
		{
			//std::swap(Array[ArrPos(ix + N/2,iy)], Array[ArrPos(ix,iy)]);
			fftw_complex swap=Array[ArrPos(ix + N/2,iy)];
			Array[ArrPos(ix + N/2,iy)]=Array[ArrPos(ix,iy)];
			Array[ArrPos(ix,iy)]=swap;
		}
	}
}

void QFFTW::Cycle(fftw_complex * Array, int N)
{
	fftw_complex * mid = Array + N/2; 
	fftw_complex * end = Array + N; 
	std::rotate(Array, mid, end);

    //std::swap_ranges(Array, mid, mid); 
}
</code></pre>
<p>und macht eine 2D Rotation wie sie bei einer FFT benötigt wird.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215780/fehlerbei-swap-für-die-initialisierung-eines-arrays-sind-geschweifte-klammern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 02:08:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215780.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Jun 2008 13:40:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehlerbei swap: &#x27;für die Initialisierung eines Arrays sind geschweifte Klammern...&#x27; on Sun, 15 Jun 2008 13:40:31 GMT]]></title><description><![CDATA[<p>Ich möchte nichts anderes machen als ein swap von Werten in einem Array. Die Position im Array bestimme ich über</p>
<pre><code class="language-cpp">inline int QFFTW::ArrPos(const int x, const int y)
{
	return y + m_size.y * x;
}
</code></pre>
<p>das Austauschen mache ich über</p>
<pre><code class="language-cpp">std::swap(Array[ArrPos(ix + N/2,iy)], Array[ArrPos(ix,iy)]);
</code></pre>
<p>oder, da das nicht klappt über</p>
<pre><code class="language-cpp">fftw_complex swap=Array[ArrPos(ix + N/2,iy)];
Array[ArrPos(ix + N/2,iy)]=Array[ArrPos(ix,iy)];
Array[ArrPos(ix,iy)]=swap;
</code></pre>
<p>wobei der Fehler natürlich identisch ist:</p>
<blockquote>
<p>1&gt;.\include\fftw\QFFTW.cpp(294) : error C2075: 'swap': für die Initialisierung eines Arrays sind geschweifte Klammern erforderlich<br />
1&gt;.\include\fftw\QFFTW.cpp(295) : error C2106: '=': Linker Operand muss ein L-Wert sein<br />
1&gt;.\include\fftw\QFFTW.cpp(296) : error C2106: '=': Linker Operand muss ein L-Wert sein</p>
</blockquote>
<p>Der Typ 'fftw_complex' wird dabei von einer Bibliothek definiert als 'typedef double fftw_complex[2]'.</p>
<p>Jetzt wüsste ich gerne was den Fehler auslöst, und wie ich das vieleicht lösen kann. Wenn es daran liegt das die Operationen = nicht definiert sind, dann fällt mir jetzt erstmal nur ein mit memcopy zu arbeiten was mir aber bei einzelnen Werte nicht sinnvoll erscheint.</p>
<p>Die komplette Function sieht im Übrigen so aus:</p>
<pre><code class="language-cpp">void QFFTW::Cycle2D(fftw_complex * Array, int N)
{

	// Spalten shiften 
	for (int ix = 0; ix &lt; N;ix++)	
		Cycle(Array + ix * N, N);	
	// Zeilen einzeln shiften

	for (int iy=0;iy&lt;N;iy++)	
	{
		for (int ix=0;ix&lt;N/2;ix++)
		{
			//std::swap(Array[ArrPos(ix + N/2,iy)], Array[ArrPos(ix,iy)]);
			fftw_complex swap=Array[ArrPos(ix + N/2,iy)];
			Array[ArrPos(ix + N/2,iy)]=Array[ArrPos(ix,iy)];
			Array[ArrPos(ix,iy)]=swap;
		}
	}
}

void QFFTW::Cycle(fftw_complex * Array, int N)
{
	fftw_complex * mid = Array + N/2; 
	fftw_complex * end = Array + N; 
	std::rotate(Array, mid, end);

    //std::swap_ranges(Array, mid, mid); 
}
</code></pre>
<p>und macht eine 2D Rotation wie sie bei einer FFT benötigt wird.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529482</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Sun, 15 Jun 2008 13:40:31 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerbei swap: &#x27;für die Initialisierung eines Arrays sind geschweifte Klammern...&#x27; on Sun, 15 Jun 2008 14:26:28 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>Jetzt wüsste ich gerne was den Fehler auslöst, und wie ich das vieleicht lösen kann. Wenn es daran liegt das die Operationen = nicht definiert sind, dann fällt mir jetzt erstmal nur ein mit memcopy zu arbeiten was mir aber bei einzelnen Werte nicht sinnvoll erscheint.</p>
</blockquote>
<p>Die fehlende Möglichkeit, Arrays direkt zu kopieren ist ultimativ das Problem. Eine Möglichkeit wäre, eine entsprechende Überladung für swap zu schreiben (nicht aber im Namensraum std!). z.B. global + using Deklaration für std::swap</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;cstddef&gt;

using std::swap;
template&lt;typename T, std::size_t N&gt;
void swap(T (&amp;x)[N],T (&amp;y)[N])
{
// for_each böte sich an, aber der Funktor dafür ist schwierig...
// swap_ranges hat das gleiche Problem: im Fall eines mehrdimensionalen Arrays
// würde diese Überladung für die anderen Dimensionen unter den Tisch fallen
    for ( std::size_t i = 0; i != N; ++i )
        swap( x[i], y[i] );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1529513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529513</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 15 Jun 2008 14:26:28 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerbei swap: &#x27;für die Initialisierung eines Arrays sind geschweifte Klammern...&#x27; on Sun, 15 Jun 2008 14:57:34 GMT]]></title><description><![CDATA[<p>daran das es sich eigentlich um Arrays handelt hatte ich gar nicht gedacht. Ich habe in der Zwischenzeit das ganze mit memcopys umgeschrieben</p>
<pre><code class="language-cpp">void QFFTW::Cycle(fftw_complex * Array, int N)
{
	complex&lt;double&gt; * SwapArray;
	int Nhalf = N/2;
	SwapArray = new complex&lt;double&gt;[Nhalf];
	memcpy(SwapArray, Array, Nhalf * sizeof(complex&lt;double&gt;));
	memcpy(Array, Array + Nhalf, Nhalf * sizeof(complex&lt;double&gt;));
	memcpy(Array + Nhalf, SwapArray, Nhalf * sizeof(complex&lt;double&gt;));

	delete [] SwapArray;

}

void QFFTW::Cycle2D(fftw_complex * Array, int N)
{

	// Spalten shiften 
	for (int ix = 0; ix &lt; N;ix++)	
		Cycle(Array + ix * N, N);	
	// Zeilen einzeln shiften

	complex&lt;double&gt; * temp = new complex&lt;double&gt;;

	for (int iy=0;iy&lt;N;iy++)	
	{
		for (int ix=0;ix&lt;N/2;ix++)
		{
			int pos1 = ArrPos(ix + N/2,iy);
			int pos2 = ArrPos(ix,iy);			
			memcpy(temp,Array[pos1], 1 * sizeof(complex&lt;double&gt;));
			memcpy(Array[pos1],Array[pos2], 1 * sizeof(complex&lt;double&gt;));
			memcpy(Array[pos2],temp, 1 * sizeof(complex&lt;double&gt;));
		}
	}
	delete temp;
}
</code></pre>
<p>wie verhält sich das den Performance-mäßig zu deinem Vorschlag?</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529537</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Sun, 15 Jun 2008 14:57:34 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerbei swap: &#x27;für die Initialisierung eines Arrays sind geschweifte Klammern...&#x27; on Sun, 15 Jun 2008 15:04:39 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>wie verhält sich das den Performance-mäßig zu deinem Vorschlag</p>
</blockquote>
<p>Probier es aus. Natürlich ist das Ergebnis am Ende uninteressant - was du da machst, ist schlicht undefiniert. Gewöhne dir auf keinen Fall an, Probleme standardmäßig durch memcpy&amp;co. erschlagen zu wollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529543</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 15 Jun 2008 15:04:39 GMT</pubDate></item></channel></rss>