<?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[ArrayList]]></title><description><![CDATA[<p>hi,</p>
<p>ich habe seit längerem wieder angefangen in c++ zu programmieren und will jetzt eine arrayliste machen.</p>
<p>die klasse schaut so aus:</p>
<pre><code class="language-cpp">template &lt;typename Type&gt; class CArrayList{

private:
	Type* m_pData;
	int m_iSize;
	int m_iMaxSize;

public:
	CArrayList();
	~CArrayList();
	bool Add(Type* pData);
	bool Remove(int i);
	bool Contains(Type* pData);
	Type* Get(int i);
	int GetSize();
	void Clear();
};
</code></pre>
<p>jetzt zu meinem problem, dass in der Add-Methode liegt:</p>
<pre><code class="language-cpp">template &lt;typename Type&gt; bool CArrayList&lt;Type&gt;::Add(Type *pData){

	if(pData == NULL){
		return false;
	}

	if(m_iSize &gt;= m_iMaxSize){

		m_iMaxSize += 32;

		if(m_pData == NULL){
			m_pData = new Type[m_iMaxSize * sizeof(Type)];
			if(m_pData == NULL){
				return false;
			}

		}else{
			void* pNewMemory;
			pNewMemory = new Type[m_iMaxSize * sizeof(Type)];

			if(pNewMemory == NULL){
				return false;
			}

			memmove(pNewMemory, m_pData, m_iSize * sizeof(Type));
			m_pData = (Type*)pNewMemory;
		}
	}

	memcpy((Type*)m_pData + (m_iSize * sizeof(Type)), pData, sizeof(Type));

	m_iSize++;

	return true;
}
</code></pre>
<p>es funktioniert alles solange bis ich über die 32 einträge hinauskomme und neuen speicher allokieren muss<br />
irgendwie kopiert er nicht alles in den neuen bereich und ich weiß nicht warum???</p>
<p>hat da jemand eine ahnung wie das geht</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/156175/arraylist</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 18:53:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156175.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Aug 2006 10:58:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ArrayList on Mon, 14 Aug 2006 10:58:31 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>ich habe seit längerem wieder angefangen in c++ zu programmieren und will jetzt eine arrayliste machen.</p>
<p>die klasse schaut so aus:</p>
<pre><code class="language-cpp">template &lt;typename Type&gt; class CArrayList{

private:
	Type* m_pData;
	int m_iSize;
	int m_iMaxSize;

public:
	CArrayList();
	~CArrayList();
	bool Add(Type* pData);
	bool Remove(int i);
	bool Contains(Type* pData);
	Type* Get(int i);
	int GetSize();
	void Clear();
};
</code></pre>
<p>jetzt zu meinem problem, dass in der Add-Methode liegt:</p>
<pre><code class="language-cpp">template &lt;typename Type&gt; bool CArrayList&lt;Type&gt;::Add(Type *pData){

	if(pData == NULL){
		return false;
	}

	if(m_iSize &gt;= m_iMaxSize){

		m_iMaxSize += 32;

		if(m_pData == NULL){
			m_pData = new Type[m_iMaxSize * sizeof(Type)];
			if(m_pData == NULL){
				return false;
			}

		}else{
			void* pNewMemory;
			pNewMemory = new Type[m_iMaxSize * sizeof(Type)];

			if(pNewMemory == NULL){
				return false;
			}

			memmove(pNewMemory, m_pData, m_iSize * sizeof(Type));
			m_pData = (Type*)pNewMemory;
		}
	}

	memcpy((Type*)m_pData + (m_iSize * sizeof(Type)), pData, sizeof(Type));

	m_iSize++;

	return true;
}
</code></pre>
<p>es funktioniert alles solange bis ich über die 32 einträge hinauskomme und neuen speicher allokieren muss<br />
irgendwie kopiert er nicht alles in den neuen bereich und ich weiß nicht warum???</p>
<p>hat da jemand eine ahnung wie das geht</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116835</guid><dc:creator><![CDATA[Anaconda]]></dc:creator><pubDate>Mon, 14 Aug 2006 10:58:31 GMT</pubDate></item><item><title><![CDATA[Reply to ArrayList on Mon, 14 Aug 2006 11:28:34 GMT]]></title><description><![CDATA[<p>Du brichst dir ja fast einen ab mit dem ganzen void* type* gecaste...</p>
<pre><code class="language-cpp">// ...
size += 32;

type *tmp = data;
data = new type[ size ];
memmove( data, tmp, cnt*sizeof( int ) ); // oder per for, memmove is ja c ;)
data[ cnt++ ] = newvalue;

// ...

if ( tmp ) 
  delete [] tmp;
// ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1116853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116853</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 14 Aug 2006 11:28:34 GMT</pubDate></item><item><title><![CDATA[Reply to ArrayList on Tue, 15 Aug 2006 14:38:37 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>insgesamt scheinst Du vom malloc noch nicht ganz beim new angekommen zu sein ... <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="😉"
    /> (nicht böse gemeint, irgendwann muß man ja mal anfangen)</p>
<p>mal ein paar prinzipielle Beobachtungen (ergänzend zu Davod_pb):</p>
<ul>
<li>Ein delete[] täte auch mal ganz gut bei der ganzen new[]-erei,</li>
<li>&quot;NULL-checken&quot; bringt bei new/new[] auch nichts, weil new/new[] standardmäßig eine bad_allocation-exception schmeißt, wenn es Probleme hat,</li>
<li>new Type[m_iMaxSize * sizeof(Type)] allokiert nicht (m_iMaxSize * sizeof(Type)) <em>Bytes</em>, sondern soviele <em>Objekte</em> !! &quot;new Type[m_iMaxSize]&quot; wäre wohl gewesen, was Du im Sinn hattest,</li>
<li>new[] liefert auch ein Type* zurück, also kann pNewMemory bereits den Typ Type* haben,</li>
<li>man darf bei Standard-Arrays auch gerne mittels [] zugreifen; ich persönlich finde &quot;&amp;m_pData[m_iSize]&quot; deutlich aussagekräftiger als &quot;m_pData, m_iSize * sizeof(Type)&quot;...... <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="😉"
    /> und</li>
<li>Add() sollte ruhig den Wert per const-Referenz entgegennehmen (&quot;const-as-const-can&quot;); hier spart Dir das ebenfalls die NULL-checkerei -&gt; Add(const Type&amp; data);</li>
</ul>
<p>Zum eigentlichen Problem kann ich leider auch nix sagen .... memmove() kenn' ich nicht.<br />
Meine Implementierung wäre</p>
<pre><code class="language-cpp">template &lt;typename Type&gt; 
bool CArrayList&lt;Type&gt;::Add(const Type&amp; data){
	if(m_iSize &gt;= m_iMaxSize) {
		m_iMaxSize += 32;
		Type* pNewMemory = new Type[m_iMaxSize];
		if(m_pData != 0) {
			for(int i=0; i&lt;m_iSize; ++i) pNewMemory[i] = m_pData[i];
			delete[] m_pData;
		}
		m_pData = pNewMemory;
	}
	m_pData[m_iSize++] = data;

	return true;
}
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1117654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1117654</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 15 Aug 2006 14:38:37 GMT</pubDate></item></channel></rss>