[VC++.NET] Arbeiten mit Generic::List / Array

the incredible Leitman

Erfahrenes Mitglied
Re: AW: [VC++.NET] Arbeiten mit Generic::List / Array

Wer zur Hölle braucht heutzutage noch Sortieralgorithmen? :D
Schon mal was von IComparable gehört.
Damit kann jedes Objekt, das sich in einem Array befindet, selbert bestimmen wie es sortiert wird.
Da brauchst vonn aussen her gar nichts mehr sortieren...
Interressant....
wirklich interreassant... :D

Wieder was gelernt *freu*
Tja, Sachen gibts mittlerweile schon tztztz... also hätte ich in den langweiligen Informatikstunden in denen wir stundenlang theoretisch irgendwelche Sortier-vorgangsweisen durchgenommen haben eigentlich vergessen und mich stattdessen mit .NET beschäftigen können :eek:
Verdammt verdammt, wieso merkt man alles erst immer wenns zu spät ist? *grml*

nochmal danke Cos

war nett, mit dir zu reden :p
^^
 

Christian Kusmanow

Erfahrenes Mitglied
Re: AW: [VC++.NET] Arbeiten mit Generic::List / Array

Interressant....
wirklich interreassant... :D

Wieder was gelernt *freu*
Tja, Sachen gibts mittlerweile schon tztztz... also hätte ich in den langweiligen Informatikstunden in denen wir stundenlang theoretisch irgendwelche Sortier-vorgangsweisen durchgenommen haben eigentlich vergessen und mich stattdessen mit .NET beschäftigen können :eek:
Verdammt verdammt, wieso merkt man alles erst immer wenns zu spät ist? *grml*
So ernst war nun auch nicht gemeint. Wollt dir nur nahe legen, dass Du dir darum keine Sorgen machen musst.
Sicherlich benötigst die Kenntnisse zu dein einzelnen Algorithmen (!)
Es gibt sicherlich auch Fälle, in denen man allein der Schnelligkeit wegen nicht mit IComparable arbeiten kann.
 

the incredible Leitman

Erfahrenes Mitglied
Re: AW: [VC++.NET] Arbeiten mit Generic::List / Array

Das ist unlogisch. Du hast wohl eher das Point-Objekt vorher aus der Liste entfernt
oder wohl doch direkt überschrieben.
Der Typ einer Sammlung ändert doch nicht das Verhalten von Werttypen. ;)
Ja klar ist das unlogisch, deshalb frag ich ja *gg*
Wenn ichs dir doch sage, ich habe nichts mit meiner Liste oder Objekten in der Liste gemacht, mein gesamter Code sieht so aus:
C++:
// Konstruktor
ZLSControls::ZLSControl_BA::ZLSControl_BA(int i_grid_width,int i_grid_height, List<Point> ^i_pointList)
:ZLSControlBaseClass(i_grid_width,i_grid_height)
{
	this->m_pointList = gcnew List<Point>();

	for each (Point pt in i_pointList)
	{
		this->m_pointList->Add(pt);
	}

	InitializeComponent();
	
	//
	//TODO: Add the constructor code here
	//
}

void ZLSControls::ZLSControl_BA::InitializeComponent(void)
{
}

void ZLSControls::ZLSControl_BA::OnPaint(System::Windows::Forms::PaintEventArgs^ e)
{
	// define a dotted pen to draw left and right splits
	System::Drawing::Pen^ pen = gcnew System::Drawing::Pen(System::Drawing::Color::Black, 2.0F);
	pen->DashStyle = System::Drawing::Drawing2D::DashStyle::Dash;
	
	try
	{
		// Call the OnPaintMethod of the BaseClass
		ZLSControls::ZLSControlBaseClass::OnPaint(e);

		if (this->m_splitLeft == true)
		{
			e->Graphics->DrawLine(pen, 1,0, 1,this->Height);
		}

		if (this->m_splitRight == true)
		{
			e->Graphics->DrawLine(pen, this->Width-1,0, this->Width-1,this->Height);
		}

		array<Point> ^arr = gcnew array<Point>(this->m_pointList->Count);
		
		//arr = this->m_pointList->ToArray();

		for(int idx = 0; idx < this->m_pointList->Count; ++idx)
		{
			if(this->m_pointList[idx].X == 0)
			{
				this->m_pointList[idx].X = this->m_pointList[idx].X + 1;
			}
			if(this->m_pointList[idx].X == this->Width)
			{
				this->m_pointList[idx].X = this->m_pointList[idx].X -1;
			}
			if(this->m_pointList[idx].Y == 0)
			{
				this->m_pointList[idx].Y = this->m_pointList[idx].Y + 1;
			}
			if(this->m_pointList[idx].Y == this->Height)
			{
				this->m_pointList[idx].Y = this->m_pointList[idx].Y -1;
			}
		}

		/*for(int idx = 0; idx < arr->Length; ++idx)
		{
			if(arr[idx].X == 0)
			{
				arr[idx].X = arr[idx].X + 1;
			}
			if(arr[idx].X == this->Width)
			{
				arr[idx].X = arr[idx].X -1;
			}
			if(arr[idx].Y == 0)
			{
				arr[idx].Y = arr[idx].Y + 1;
			}
			if(arr[idx].Y == this->Height)
			{
				arr[idx].Y = arr[idx].Y -1;
			}
		}*/

		arr = this->m_pointList->ToArray();

		/*for each(Point pt in this->m_pointList)
			{
				if(pt.X == 0)
				{
					pt.X = pt.X + 1;
				}
				if(pt.X == this->Width)
				{
					pt.X = pt.X -1;
				}
				if(pt.Y == 0)
				{
					pt.Y = pt.Y + 1;
				}
				if(pt.Y == this->Height)
				{
					pt.Y = pt.Y -1;
				}
			}*/

		e->Graphics->DrawPolygon(pen, arr);
	}
	catch (System::Exception^ e)
	{
		// Error handling
		throw gcnew Exception("Control konnte nicht gezeichnet werden", e);
	}
}
So tut sich nichts, die Werte bleiben unverändert
Wenn ich nun die momentan for-Schleife auskommentiere uns stattdessen die mit for each lafen lasse, komme ich aif dasselbe Ergebnis... -.-

Wenn ich aber nun direkt nach array<Point> ^arr = gcnew array<Point>(this->m_pointList->Count); meinem array arr die Werte aus der Liste zuweise und danach (nur) die for Schleife mit dem Array ausführen lasse,
wird ein Polygon mit den neuen Werten gezeichnet

Deshalb dachte ich mir simply wtf

EDIT:
OK, danke, schon kapiert :D
Aber bisher wusste ich ja nicht einmal von der Existenz von IComparable oder dergleichen, ich hätte alles per Hand gemacht *lol* Deshalb wieder einmal sehr hilfreich :D
Also, wenn ich einmal so gut bin, dass ich mir über einen Geschwindigkeitsunterschied von einigen µ-Sekunden Gedanken mache, werde ich wieder auf die guten handgemachten Algorithmen zurückkommen :p
Aber bis dahin hilft mir IComp sicherlich viel weiter *gg*
 
Zuletzt bearbeitet:

Christian Kusmanow

Erfahrenes Mitglied
Re: AW: [VC++.NET] Arbeiten mit Generic::List / Array

Wenn ichs dir doch sage, ich habe nichts mit meiner Liste oder Objekten in der Liste gemacht, mein gesamter Code sieht so aus:
[...]
So tut sich nichts, die Werte bleiben unverändert
Wenn ich nun die momentan for-Schleife auskommentiere uns stattdessen die mit for each lafen lasse, komme ich aif dasselbe Ergebnis... -.-

Wenn ich aber nun direkt nach array<Point> ^arr = gcnew array<Point>(this->m_pointList->Count); meinem array arr die Werte aus der Liste zuweise und danach (nur) die for Schleife mit dem Array ausführen lasse,
wird ein Polygon mit den neuen Werten gezeichnet

Deshalb dachte ich mir simply wtf
Wirklich sehr seltsam. Vielleicht ist es ja eine Eigenart von cpp. :confused:
Für mich ist es jeden Falls unlogisch. :D

Was mir aber auffällt das Du jedes mal ein neues Pen-Objekt instanzierst
und dessen Resourcen gar nicht frei gibst. :eek:
C++:
System::Drawing::Pen^ pen = gcnew System::Drawing::Pen(System::Drawing::Color::Black, 2.0F);
pen->DashStyle = System::Drawing::Drawing2D::DashStyle::Dash;
Entweder Du schreibst am Ende der Methode ein pen.Dispose();
oder Du definierst den Pen als Member der aktuellen Klasse und gibts dessen Resourcen
in der Dispose-Implementierung deines Controls frei.

//Edit: [post=1108027]Re: Memory Leak in Compact Framework - Post[/post]
 
Zuletzt bearbeitet:

the incredible Leitman

Erfahrenes Mitglied
Re: AW: [VC++.NET] Arbeiten mit Generic::List / Array

Wirklich sehr seltsam. Vielleicht ist es ja eine Eigenart von cpp. :confused:
Für mich ist es jeden Falls unlogisch. :D
du sagst es... deshalb ja die Frage :p

Was mir aber auffällt das Du jedes mal ein neues Pen-Objekt instanzierst
und dessen Resourcen gar nicht frei gibst. :eek:
C++:
System::Drawing::Pen^ pen = gcnew System::Drawing::Pen(System::Drawing::Color::Black, 2.0F);
pen->DashStyle = System::Drawing::Drawing2D::DashStyle::Dash;
Entweder Du schreibst am Ende der Methode ein pen.Dispose();
oder Du definierst den Pen als Member der aktuellen Klasse und gibts dessen Resourcen
in der Dispose-Implementierung deines Controls frei.[/pos]
möp?

Ich dachte, weil alles managed Code ist, macht das der Destruktor automatisch?
C++:
protected:
	/// <summary>
	/// Clean up any resources being used.
	/// </summary>
	~ZLSControl_BA()
	{
		if (components)
		{
			delete components;
		}
	}
eigentlich brauche ich den pen überhaupt nicht, hab ich nur schnell hinzugefügt...
ich verwende den aus der Basisklasse :)
Aber trotzdem war ich der Meinung, dass er nach Beenden des Programms automatisch disposed wird :confused:

wenn ich pen->Dispose() verwenden will, erhalte ich einen Kompiler error:
"error C2039: 'Dispose' : is not a member of 'System::Drawing::pen'"
 

Christian Kusmanow

Erfahrenes Mitglied
Re: AW: [VC++.NET] Arbeiten mit Generic::List / Array

Ich dachte, weil alles managed Code ist, macht das der Destruktor automatisch?
C++:
protected:
	/// <summary>
	/// Clean up any resources being used.
	/// </summary>
	~ZLSControl_BA()
	{
		if (components)
		{
			delete components;
		}
	}
eigentlich brauche ich den pen überhaupt nicht, hab ich nur schnell hinzugefügt...
ich verwende den aus der Basisklasse :)
Aber trotzdem war ich der Meinung, dass er nach Beenden des Programms automatisch disposed wird :confused:
Ja, nach dem Beenden vielleicht. ABER NICHT WÄHREND DESSEN! :D
Du hast aber tausende Pen-Objekte im Speicher wenn Du jedes mal eines neu anlegst
und es nicht sofort wieder entfernst. Oder bis der GC sich irgend wann darum kümmert.

wenn ich pen->Dispose() verwenden will, erhalte ich einen Kompiler error:
"error C2039: 'Dispose' : is not a member of 'System::Drawing::pen'"
WTF? :D
http://msdn2.microsoft.com/de-de/library/system.drawing.pen.dispose(VS.80).aspx

//Edit: Das wird jetzt zu :offtopic:
Ich denke das Thema ist nun beantwortet. Machen wir in einem neuen Thread weiter,
sofern sich das neue Thema nicht auch schon geklärt hat. :)
 
Zuletzt bearbeitet:

the incredible Leitman

Erfahrenes Mitglied
Re: AW: [VC++.NET] Arbeiten mit Generic::List / Array

Ja, nach dem Beenden vielleicht. ABER NICHT WÄHREND DESSEN! :D
Du hast aber tausende Pen-Objekte im Speicher wenn Du jedes mal eines neu anlegst
und es nicht sofort wieder entfernst. Oder bis der GC sich irgend darum kümmert.
Aye, stimmt! Hast ja Recht... *ups* -.-

Ah jetzt ja...
in C#:
pen.Dispose();
in C++
delete pen;

Aber echt krass, IntelliSense zeigt mir die Funktion an, sobald ich pen-> eingebe,
und laut MSDN auch eine gültige Funktion :confused:

//Edit: Das wird jetzt zu :offtopic:
Ich denke das Thema ist nun beantwortet. Machen wir in einem neuen Thread weiter,
sofern sich das neue Thema nicht auch schon geklärt hat. :)
*eindeutig zustimm*
Passt, Hakerl ,/ *gg*

Eigentlich alles geklärt, danke... erstmal,
du hörst von mir *lol* XD
 

Macan

Mitglied
Grüss euch zwei :)
PS: @Macan:
Ich habe eine Benachrichtigung von dir bekommen, dass du auf dieses Thema geantwortet hat, jedoch sehe ich keinen Beitrag von dir? Was ist da passiert
Ich hatte nur schnell (vielleicht zu schnell) geantwortet, dass ich ein ähnliches Problem habe, wollte es aber dann doch noch ruhen lassen. Einiges wurde nun hier schon erklärt und ich muss das erstmal aussortieren, damit ich wirklich nicht doppelt frage :D In den letzten Tagen war bei mir die Zeit ein bisserl knapp.

Ansonsten war der Thread wieder sehr erhellend :D

EDIT: Ich werde das erst später posten, wenn ich dazu komme und den Thread nicht nur überfliegen kann.
 
Zuletzt bearbeitet:

mashine-obf

Mitglied
Nabend und frohes fest,

wollten den schönen beitrag mal nachvollziehen,

ich habe eine klasse getProperty geschrieben:

HTML:
ref class getProperty
{
public:
CTdxFile^ _TdxFile;
getProperty(void);
getProperty(CTdxFile^ TdxFile);
...
...

jetzt will ich nur Objekte dieser klasse in meine list aufnehmen
Das habe ich so verstanden:

HTML:
List<getProperty> myGenericList = new List<getProperty>();
myGenericList.Add( _getProperty );

aber bei diesem aufruf bekomme ich folgenden fehler:

Fehler 9 error C3225: Das generische Typargument für "T" kann nicht "getProperty" sein, es muss ein Werttyp oder ein Handle für einen Verweistyp sein.

WARUM?
Vielen dank im Voraus
 

Neue Beiträge