Anfänger Problem



  • Darter schrieb:

    Dass das so wie ich es jetzt habe nicht funktinoiert ist mir auch klar

    War mir auch schon klar, aber ich muss doch ein "Normales" Char in ein WCHAR bzw. in ein TCHAR uminterpretieren können, oder etwa nicht ?

    Ws mir nciht klar ist, was ist denn der unterschied zwischen einem WCHAR und einem TCHAR ?

    Wenn ich zur definition von TCHAR springe dinde ich volgendes :
    typedef WCHAR TCHAR, *PTCHAR;

    Also so wie ich das sehe ist ein TCHAR auch nur ein ein WCHAR, nur dass ich bei einem TCHAR direkt den pointer habe ?

    zu einem 2 Frage :

    Ich habe in der msdn nach einerString - Formatierungsfunktion gesucht, und nichts richtiges gefunden, also hab ich gegogelt und bin auf sprintf gestoßen, jedoch kam bei beinen Versuchen nie etwas richtiges dabei raus.

    Ach was mir eben aufgefallen ist, die speicherung der Größe der Client bereichs kann ich mir ja sparen, da ich die Größe des Clientbereiches auch direkt wärend der WM_PAINT abfragen kann.



  • Erstens: Was sich hinter TCHAR verbirgt, hängt von deinen Projekteinstellungen ab (wahlweise char oder wchar_t) - hier im Forum gibt es schon genug Threads zum Thema (such mal nach UNICODE).

    Zweitens: sprintf() stammt aus der C-Standardbibliothek und kennt sich nur mit einfachen char's aus - für den Umgang mit TCHAR gibt es die _stprintf. Alternativ gibt es auch Umwandlungsfunktionen/Makros wie A2T() zur Übersetzung zwischen den String-Typen.



  • Hey ich nochmal.

    Ich habs nun hinbekommen, aber das denn eine brauchbare Lösunug, oder ist das eher ein walkaround, welches man verbessern könnte ?

    #include <stdio.h>
    #include <windows.h>
    #include <TCHAR.h>
    #include "resource.h"
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    	static TCHAR szAppName[] = TEXT ("Erster Test") ;
    	HWND		hwnd ;
    	MSG			msg ;
    	WNDCLASS	wndclass ;
    
    	wndclass.style			= CS_HREDRAW | CS_VREDRAW ;
    	wndclass.lpfnWndProc	= WndProc ;
    	wndclass.cbClsExtra		= 0 ;
    	wndclass.cbWndExtra		= 0 ;
    	wndclass.hInstance		= hInstance ;
    	wndclass.hIcon			= LoadIcon (NULL, MAKEINTRESOURCE(IDI_ICON1)) ;
    	wndclass.hCursor		= LoadCursor (NULL, IDC_ARROW) ;
    	wndclass.hbrBackground	= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    	wndclass.lpszMenuName	= NULL ;
    	wndclass.lpszClassName	= szAppName ;
    
    	if (!RegisterClass (&wndclass))
    	{	// Unicode Compilierung kann nur ein fehler sein !
    		MessageBox (NULL, TEXT("Fehler"), szAppName, MB_ICONERROR) ;
    		return 0 ;
    	}
    
    	hwnd = CreateWindow (szAppName,					//Name der Fensterklasse
    						TEXT ("FenterTitel ^^"),	//Fenstertitel
    						WS_OVERLAPPEDWINDOW,		//Styles
    						CW_USEDEFAULT,				//X-Pos
    						CW_USEDEFAULT,				//Y-Pos
    						CW_USEDEFAULT,				//Breite
    						CW_USEDEFAULT,				//Höhe
    						NULL,						//Parent Fenster
    						NULL,						//Menü
    						hInstance,					//Programm-Kopiezähler
    						NULL) ;						//Sonstige Parameter
    
    	ShowWindow (hwnd, iCmdShow) ;
    	UpdateWindow (hwnd) ;
    
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage (&msg) ;
    		DispatchMessage (&msg) ;
    	}
    	return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC			hdc ;
    	PAINTSTRUCT ps ;
    	RECT		rect ;
    	static int	iClientSizeW ;
    	static int	iClientSizeH ;
    	TCHAR		szBuffer[100] ;
    	//GetSystemMetrics (SM_CXSCREEN) ;
    	//GetSystemMetrics (SM_CYSCREEN) ;
    
    	switch (message)
    	{
    	case WM_PAINT :
    		hdc = BeginPaint (hwnd, &ps) ;
    		GetClientRect (hwnd, &rect) ;				
    		_stprintf(szBuffer, _T ("Breite %d Höhe %d"), rect.right, rect.bottom);
    		DrawText (hdc, (LPCWSTR)szBuffer, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
    		EndPaint (hwnd, &ps) ;		
    		return 0 ;
    
    	case WM_SIZE :
    		GetClientRect (hwnd, &rect) ;	
    		iClientSizeW = rect.right ;
    		iClientSizeH = rect.bottom ;
    		return 0 ;
    
    	case WM_DESTROY :
    		PostQuitMessage (0) ;
    		return 0 ;
    
    	}
    	return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    

    EDIT: Sry für die etwas schlechte Formatierung des textes, wird leider nur hier so dargestellt hmm...

    mfg



  • Hey.

    Erstmal sry für den Doppelpost, ich hätte den Oberen natürlich Editieren können, dann wäre dieser aber etwas lang geworden.

    Ich wollte meine Bisherige Anwendung nun einfach mal um zwei buttons wereitern.

    Den Style, die Beschrieftung, die xPos und die yPos, wollte ich in einer Structur hinterlegen, um die buttons leichter erstellen zu können (Siehe die for Schleife).

    Nur leider läuft etwas schief, es scheint, als würde ddas mit der x - Position passen, jedoch liegen die Beiten Schaltfläschen übereinander, obwohl ich ihnen verschiedene y - Werte zugewiesenn habe.

    Was mache ich falsch?

    #include <stdio.h>
    #include <windows.h>
    #include <TCHAR.h>
    #include "resource.h"
    
    struct Enemy
    {
    	int HP ;
    	int Power ;
    } ;
    
    struct
    {
    	int iStyle ;
    	TCHAR * szText ;
    	int iX ;
    	int iY ;
    }
    button[] =
    {
    	BS_DEFPUSHBUTTON, TEXT ("Add"), 50, 50,
    	BS_DEFPUSHBUTTON, TEXT ("Delete"), 50, 100
    } ;
    
    #define NUM (sizeof button / sizeof button[0])
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    bool AddEnemy (int Index, struct Enemy Data[1] )
    {
    	Data[Index].HP = 10 ;
    	Data[Index].Power = 10 ;
    	return true ;
    }
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {		
    
    	static TCHAR szAppName[] = TEXT ("Erster Test") ;
    	HWND		hwnd ;
    	MSG			msg ;
    	WNDCLASS	wndclass ;
    
    	wndclass.style			= CS_HREDRAW | CS_VREDRAW ;
    	wndclass.lpfnWndProc	= WndProc ;
    	wndclass.cbClsExtra		= 0 ;
    	wndclass.cbWndExtra		= 0 ;
    	wndclass.hInstance		= hInstance ;
    	wndclass.hIcon			= LoadIcon (NULL, MAKEINTRESOURCE(IDI_ICON1)) ;
    	wndclass.hCursor		= LoadCursor (NULL, IDC_ARROW) ;
    	wndclass.hbrBackground	= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    	wndclass.lpszMenuName	= NULL ;
    	wndclass.lpszClassName	= szAppName ;
    
    	if (!RegisterClass (&wndclass))
    	{	// Unicode Compilierung kann nur ein fehler sein !
    		MessageBox (NULL, TEXT("Fehler"), szAppName, MB_ICONERROR) ;
    		return 0 ;
    	}
    
    	hwnd = CreateWindow (szAppName,					//Name der Fensterklasse
    						TEXT ("FenterTitel ^^"),	//Fenstertitel
    						WS_OVERLAPPEDWINDOW,		//Styles
    						CW_USEDEFAULT,				//X-Pos
    						CW_USEDEFAULT,				//Y-Pos
    						CW_USEDEFAULT,				//Breite
    						CW_USEDEFAULT,				//Höhe
    						NULL,						//Parent Fenster
    						NULL,						//Menü
    						hInstance,					//Programm-Kopiezähler
    						NULL) ;						//Sonstige Parameter
    
    	ShowWindow (hwnd, iCmdShow) ;
    	UpdateWindow (hwnd) ;
    
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage (&msg) ;
    		DispatchMessage (&msg) ;
    	}
    	return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC			hdc ;
    	PAINTSTRUCT ps ;
    	RECT		rect ;
    	TCHAR		szBuffer[100] ;
    	static		HWND hwndButton[NUM] ;
    	int			i ;
    	static int cxChar, cyChar ;
    	//GetSystemMetrics (SM_CXSCREEN) ;
    	//GetSystemMetrics (SM_CYSCREEN) ;
    
    	switch (message)
    	{
    	case WM_CREATE :
    		cxChar = LOWORD (GetDialogBaseUnits()) ;
    		cyChar = HIWORD (GetDialogBaseUnits()) ;
    		for (i = 0 ; i < NUM ; i++)
    		{
    			hwndButton[i] = CreateWindow ( TEXT ("Button"),								// Classenname
    										   button[i].szText,							// Beschrichftung
    										   WS_CHILD | WS_VISIBLE | button[i].iStyle,	// Style
    										   button[i].iX,								// xPos
    										   button[1].iY,								// yPos
    										   20 * cxChar,									// Breite
    										   7 * cyChar / 4,								// Höhe
    										   hwnd,										// Parent
    										   (HMENU) i,									// Ist hier die ID, hat nichts mit einem Menü zu tun !
    										   ((LPCREATESTRUCT) lParam) -> hInstance, NULL ) ;										   
    		}
    		return 0 ;
    
    	case WM_PAINT :
    		hdc = BeginPaint (hwnd, &ps) ;
    		GetClientRect (hwnd, &rect) ;				
    		_stprintf(szBuffer, _T ("Breite %d Höhe %d"), rect.right, rect.bottom);
    		DrawText (hdc, (LPCWSTR)szBuffer, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
    		EndPaint (hwnd, &ps) ;		
    		return 0 ;
    
    	case WM_SIZE :
    
    		return 0 ;
    
    	case WM_COMMAND :
    
    		return 0 ;
    
    	case WM_DESTROY :
    		PostQuitMessage (0) ;
    		return 0 ;
    
    	}
    	return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    


  • Darter schrieb:

    Ich habs nun hinbekommen, aber das denn eine brauchbare Lösunug, oder ist das eher ein walkaround, welches man verbessern könnte ?

    Sieht aus meiner Sicht recht brauchbar aus - obwohl ich vermutlich die Berechnungen für die TExt-Position und den Inhalt nicht in der WM_PAINT-Behandlung durchgeführt hätte sondern in der WM_SIZE.

    Bei deinem zweiten Code fällt mir auf Anhieb nichts auf - es ist nur ein wenig befremdlich, wenn beide Buttons mit dem Stil BS_DEFPUSHBUTTON erstellt werden.

    PS: Auf lange Sicht würde ich von den static-Variablen abrücken und die fensterbezogenen Daten lieber auf andere Weise übergeben.



  • Hey.
    Gleich ne weitere Frage, was mache ich hier falsch ?
    Im Prinzip weiß ich eben nie wie viele Feinde ich habe, dehalb muss das struct Array zur laufzeit vergrößer/verkleinert werden.

    Ich hab mal google befragt und ein paar sachen gefunden bsw. das hier :
    http://www.tutorials.de/c-c/174049-strukturvariablen-zur-laufzeit-erstellen.html

    Also nun hab ich ne Struktur mit einem Int HP und einem Int Power.
    Wie es dort beschrieben wird habe ich nun einen Pointer darauf.
    ich berechne mir die aktuelle Anzahl der Feinde, speichere die Inhalte temporär, erhöhe die Aanzahl um 1 und schreibe die alten Werte wieder hinen, jedoch passt irgendwas nicht.

    #include <stdio.h>
    #include <windows.h>
    #include <TCHAR.h>
    #include "resource.h"
    
    struct ENEMY
    {
    	int HP ;
    	int Power ;
    } ;
    
    ENEMY *Feinde = 0;
    
    struct
    {
    	int iStyle ;
    	TCHAR * szText ;
    	int iX ;
    	int iY ;
    }
    button[] =
    {
    	BS_DEFPUSHBUTTON, TEXT ("Add"), 50, 50,
    	BS_DEFPUSHBUTTON, TEXT ("Delete"), 300, 50
    } ;
    
    #define NUM (sizeof button / sizeof button[0])
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    bool AddEnemy ()
    {	
    	// Bisherige Anzahl der Feinde ermitteln
    	int iEnemyAnz = (sizeof Feinde / sizeof Feinde[0]) ;	
    	TCHAR szBuffer[100] ;
    	_stprintf(szBuffer, _T ("Anzahl %d"), iEnemyAnz);
    	MessageBox (NULL, szBuffer, TEXT("Anzahl bevor"), NULL) ;
    	//Alte Daten Temporär Speichern
    	ENEMY TmpEMEMYS[100] ;
    	for (int i = 0 ; i < iEnemyAnz ; i++)
    	{
    		TmpEMEMYS[i].HP = Feinde[i].HP ;
    		TmpEMEMYS[i].Power = Feinde[i].Power ;
    	}
    
    	Feinde = new ENEMY[iEnemyAnz + 1] ;
    
    	// Alte Daten In das neue Array Kopieren
    	for (int i = 0 ; i < iEnemyAnz ; i++)
    	{
    		Feinde[i].HP = TmpEMEMYS[i].HP ;
    		Feinde[i].Power = TmpEMEMYS[i].Power ;
    	}
    
    	// Dem neuen Feind Werte zuweisen
    	Feinde[iEnemyAnz + 1].HP = 100 ;
    	Feinde[iEnemyAnz + 1].Power = 10 ;
    	iEnemyAnz = (sizeof Feinde / sizeof Feinde[0]) ;	
    	_stprintf(szBuffer, _T ("Anzahl danach %d"), iEnemyAnz);
    	MessageBox (NULL, szBuffer, TEXT("Anzahl danach"), NULL) ;
    	return true ;
    }
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {			
    	static TCHAR szAppName[] = TEXT ("Erster Test") ;
    	HWND		hwnd ;
    	MSG			msg ;
    	WNDCLASS	wndclass ;
    
    	wndclass.style			= CS_HREDRAW | CS_VREDRAW ;
    	wndclass.lpfnWndProc	= WndProc ;
    	wndclass.cbClsExtra		= 0 ;
    	wndclass.cbWndExtra		= 0 ;
    	wndclass.hInstance		= hInstance ;
    	wndclass.hIcon			= LoadIcon (NULL, MAKEINTRESOURCE(IDI_ICON1)) ;
    	wndclass.hCursor		= LoadCursor (NULL, IDC_ARROW) ;
    	wndclass.hbrBackground	= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    	wndclass.lpszMenuName	= NULL ;
    	wndclass.lpszClassName	= szAppName ;
    
    	if (!RegisterClass (&wndclass))
    	{	// Unicode Compilierung kann nur ein fehler sein !
    		MessageBox (NULL, TEXT("Fehler"), szAppName, MB_ICONERROR) ;
    		return 0 ;
    	}
    
    	hwnd = CreateWindow (szAppName,					//Name der Fensterklasse
    						TEXT ("FenterTitel ^^"),	//Fenstertitel
    						WS_OVERLAPPEDWINDOW,		//Styles
    						CW_USEDEFAULT,				//X-Pos
    						CW_USEDEFAULT,				//Y-Pos
    						CW_USEDEFAULT,				//Breite
    						CW_USEDEFAULT,				//Höhe
    						NULL,						//Parent Fenster
    						NULL,						//Menü
    						hInstance,					//Programm-Kopiezähler
    						NULL) ;						//Sonstige Parameter
    
    	ShowWindow (hwnd, iCmdShow) ;
    	UpdateWindow (hwnd) ;
    
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage (&msg) ;
    		DispatchMessage (&msg) ;
    	}
    	return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC			hdc ;
    	PAINTSTRUCT ps ;
    	RECT		rect ;
    	TCHAR		szBuffer[100] ;
    	static		HWND hwndButton[NUM] ;
    	int			i ;
    	static int cxChar, cyChar ;
    	static TCHAR szTop[] = TEXT ("Index     HP     Power") ;
    	static int iEnemyAnz = (sizeof Feinde / sizeof Feinde[0]) ;	
    
    	switch (message)
    	{
    	case WM_CREATE :
    		cxChar = LOWORD (GetDialogBaseUnits()) ;
    		cyChar = HIWORD (GetDialogBaseUnits()) ;
    		for (i = 0 ; i < NUM ; i++)
    		{
    			hwndButton[i] = CreateWindow ( TEXT ("Button"),								// Classenname
    										   button[i].szText,							// Beschrichftung
    										   WS_CHILD | WS_VISIBLE | button[i].iStyle,	// Style
    										   button[i].iX,								// xPos
    										   button[1].iY,								// yPos
    										   20 * cxChar,									// Breite
    										   7 * cyChar / 4,								// Höhe
    										   hwnd,										// Parent
    										   (HMENU) i,									// Ist hier die ID, hat nichts mit einem Menü zu tun !
    										   ((LPCREATESTRUCT) lParam) -> hInstance, NULL ) ;										   
    		}
    		return 0 ;
    
    	case WM_PAINT :
    		hdc = BeginPaint (hwnd, &ps) ;
    		GetClientRect (hwnd, &rect) ;				
    		//_stprintf(szBuffer, _T ("Breite %d Höhe %d"), rect.right, rect.bottom);
    		//DrawText (hdc, (LPCWSTR)szBuffer, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
    		SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
    		SetBkMode (hdc, TRANSPARENT) ;
    		// Die Spalten Zeichnen, und zwar Immer zentriert
    		TextOut (hdc,  (rect.right / 2) - ((cxChar * lstrlen (szTop)) / 2), 10 *cyChar, szTop, lstrlen (szTop)) ;
    
    		for (i = 0 ; i < iEnemyAnz ; i++)
    		{
    			_stprintf(szBuffer, _T ("%-16s   %d     %d"), i, Feinde[i].HP, Feinde[i].Power);
    			TextOut (hdc,  (rect.right / 2) - ((cxChar * lstrlen (szTop)) / 2), 15 *cyChar * i, szBuffer, lstrlen (szBuffer)) ;
    		}
    		EndPaint (hwnd, &ps) ;		
    		return 0 ;		
    
    	case WM_SIZE :
    
    		return 0 ;
    
    	case WM_COMMAND :		
    		switch (wParam)
    		{
    		case 0 : // Add			
    			AddEnemy () ;			
    			break ;
    		}
    		return 0 ;
    
    	case WM_DESTROY :
    		delete[] Feinde ;
    		PostQuitMessage (0) ;
    		return 0 ;
    
    	}
    	return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    


  • Diese sizeof-Konstruktion, die du zur Bestimmung der bisherigen Anzahl verwendest, funktioniert nur mit Arrays, deren Größe zur Compilezeit bekannt ist. Für dynamisch erzeugte Arrays mußt du dir selber notieren, wieviele Elemente sie haben - oder du nutzt einen STL-Container wie std::vector<>, der das für dich übernimmt:

    std::vector<ENEMY> feinde;
    
    bool AddEnemy()
    {
      TRACE("vorher: %d\n", feinde.size());
      ENEMY neuerFeind = { 100, 10 };
      feinde.push_back(neuerFeind);
      TRACE("hinterher: %d\n", feinde.size());
      return true;
    }
    


  • Hey.

    Ja auf vector bin ich auch scon gestoßen, jedoch dachte ich mich zu erinnern, dass der zugriff auf die einzellnen Element recht kompliziert sei.

    Im Pronzip habe ich ja dann kein "Richtiges" Array mehr, sondern eher eine liste, da frage ich mich, auf die einzellnen Elemente zugreifen kann, buw. ihnen Werte zuweisen und auslesen kann.

    Aber noch zu ener Frage von oben:

    ich habe hier ja eine Struktur mit Infos über meine Schaltflächen :

    struct
    {
    	int iStyle ;
    	TCHAR * szText ;
    	int iX ;
    	int iY ;
    }
    button[] =
    {
    	BS_DEFPUSHBUTTON, TEXT ("Add"), 50, 50,
    	BS_DEFPUSHBUTTON, TEXT ("Delete"), 50, 100
    } ;
    

    und hier werden die Schaltflächen erstellt :

    cxChar = LOWORD (GetDialogBaseUnits()) ;
    		cyChar = HIWORD (GetDialogBaseUnits()) ;
    		for (i = 0 ; i < NUM ; i++)
    		{
    			hwndButton[i] = CreateWindow ( TEXT ("Button"),								// Classenname
    										   button[i].szText,							// Beschrichftung
    										   WS_CHILD | WS_VISIBLE | button[i].iStyle,	// Style
    										   button[i].iX,								// xPos
    										   button[1].iY,								// yPos
    										   20 * cxChar,									// Breite
    										   7 * cyChar / 4,								// Höhe
    										   hwnd,										// Parent
    										   (HMENU) i,									// Ist hier die ID, hat nichts mit einem Menü zu tun !
    										   ((LPCREATESTRUCT) lParam) -> hInstance, NULL ) ;										   
    		}
    

    Eigendlich müsste doch nun der eine Button auf der y Koordinate 50 und der Andere bei 100 liegen, jedoch werden bei mir die Buttons genau übereinander Dargestellt.

    Was genau mache ich falsch ?

    EDIT: Ach noch was, mit welchem Button Style bekomme ich denn den look hien, den man bei win7 und Vista hat, bei den ganz normalen Buttons ?



  • Darter schrieb:

    Hey.

    Ja auf vector bin ich auch scon gestoßen, jedoch dachte ich mich zu erinnern, dass der zugriff auf die einzellnen Element recht kompliziert sei.

    Im Pronzip habe ich ja dann kein "Richtiges" Array mehr, sondern eher eine liste, da frage ich mich, auf die einzellnen Elemente zugreifen kann, buw. ihnen Werte zuweisen und auslesen kann.

    Ist auch nicht schwerer als bei einem normalen Array - der vector<> versteckt effektiv die Speicherverwaltung und Umkopiererei, die du bei der Arbeit mit new[]/delete[] manuell erledigen müsstest. Du kannst mit dem Index-Operator "feinde[pos]" auf die einzelnen Elemente zugreifen wie bei einem "echten" Array.



  • Ok, danke.
    Hast du da vllt was gutes zum einlesen Parat, sonst geh ich halt googeln ^^



  • Für's erste könntest du mal meinen Magazin-Artkiel zur STL ansehen, ansonsten sollte ein gutes C++ Buch auch den Umgang mit der STL erläutern.


Anmelden zum Antworten