C++ Nachhilfe



  • Hallo zusammen,

    und zwar hätte ich mal eine kleine Frage. Ich beschäftige mich in letzter Zeit viel mit C++, lese eifrig Tutorials und versuche mich in viele Richtungen zum Thema weiterzubilden. Immerzu kommen da natürlich Fragen auf. Ich möchte hier mal die Gelegenheit nutzen freundlich anzurfragen, ob jemand der sich mit der Materie schon lang auseinandersetzt bzw gut auskennt mir evtl. etwas Nachhilfe geben könnte. Also vielleicht mal einen Abend mit Teamspeak und Teamviewer, wo ich einmal paar brennende Fragen los werden kann. Noch kurz etwas zu meiner Person: Ich bin 25 Jahre alt und würde mich nicht als blutigen Anfänger beim programmieren allgemein bezeichnen. Ich habe die letzten 3 Jahre für eine Arma3-Community an einem Server gescriptet (also die armaeigene Scriptsprache SQF in Verbindung mit einer SQL Datenbank). Ich danke jetzt schonmal falls sich jemand meldet

    🙂 👍



  • Dafür ist dieses Forum da. Dann lernen auch andere.



  • Ok, dann frage ich hier mal direkt. (Ich habe alles vorher bei google gesucht, bin aber manchmal auch aus Antworten nicht schlau geworden. Deshalb Frage ich hier nochmal)

    Frage 1: Wenn ich getchar() nutze und das mit CodeBlocks compile (GNU GCC) bekomme ich einen Fehler. Das Problem ist einfach, dass ich dort die stdio.h nicht included habe. Mache ich dies, läuft es problemlos. Allerdings habe ich vor CodeBlocks mit VisualStudio gearbeitet. Dort ging es ohne stdio.h. Also mit ist klar, dass VisualStudio einen anderen Compiler nutzt, aber können da echt solche Unterschiede entstehen? Anbei sei gleich gesagt, dass ich kein Problem damit habe diese einzubinden, ich wollte nur nochmal nachfragen.

    Frage 2: Es geht um den Unterschied zwischen Debug/Release. Ich habe das auch bei google gesucht und auch einige Antworten gefunden. Das Problem hierbei war, dass es zwar sicherlich korrekt beschrieben wurde, aber ich mir nicht viel darunter vorstellen kann. Es wäre also super, wenn mir jemand mal vielleicht anhand einer Metapher erklärt, wo der Unterschied liegt. Bis jetzt mache das vom Name her abgeleitet so, dass ich solange ich an einem Projekt arbeite, debugge. Sobald ich das Projekt fertig habe und es auch an andere Leute verteile, release ich.

    Frage 3: Ich habe mir auch das Thema Pointer/Zeiger angeschaut. Das funktioniert auch soweit gut. Allerdings frage ich mich wo so etwas in der Praxis Anwendung findet. Vielleicht kann ja mal jemand ein Beispiel schreiben wo so etwas Sinn macht.

    Frage 4: (Sicher dumme Anfängerfrage) Man kann ja Funktionen in andere Scripts auslagern. Also damit meine ich, einen Headerdatei erstellen sowie eine cpp Datei dazu wo dann die Funktionen komplett drin stehen. Von dort aus sollen dann Werte wieder zurückgeschickt werden. Das ganze funktioniert auch super, solange die Rückgabewerte zum Beispiel Integer sind. Nun habe ich aber ein kleines Programm geschrieben, welches eingegebenen Text verschlüsselt. Dieser ist dann vom Datentyp ein String. Und da liegt schon das Problem. Ich kann keine Strings in die externe Datei übergeben, sowie auch keine zurückbekommen. Wie löst man sowas?

    Frage 5: Ich habe eine kleines Spiel geschrieben als Konsolenanwendung. Das fande meine Freundin auch ganz nett und wollte es am liebsten auch auf dem Tablett spielen. Mir ist klar, dass es wahrscheinlich unendlich schwer ist, C++ auf einem Android Gerät zum laufen zu bekommen. Zumindest für mich gerade^^. Also dachte ich einfach um. Ich habe mir aus dem PlayStore eine IDE zum C++ schreiben geladen. Diese funktioniert auch eigentlich recht gut für die Dinge die ich so damit schreibe. (Also eigentlich nur paar kleine Tests) Das Spiel jedoch funktioniert jedoch nicht, da ich logischer weise nicht die windows.h nutzen kann und somit nicht die Console per System("cls") clearen kann. Ich bin eh nicht so der Freund davon diese Systemfunktionen zu nutzen. Das fühlt sich irgendwie auch falsch an die Befehle die ich beim Batch schreiben nutze dort in ein C++ Script reinzuschreiben. Nunja, nun habe ich nach alternativen gesucht für das Problem. Die Antworten die ich dazu fande waren jedoch nicht so hilfreich, da die meisten einfach nur wissen wollten wie das bei Linux funktioniert. Dort funktioniert das ja anscheinend via clear. Aber das löst mein Problem leider nicht. Wisst ihr eine Alternative wie das funktionieren kann?

    Frage 6: Abschließend noch eine Frage zum schreiben eines GUIs. Ich möchte Anwendungen mit grafischer Oberfläche schreiben. Ich habe gelesen, dass C++ dafür ja eher nicht vorgesehen ist, aber allerhand zusätzliches gibt, was man dazu benutzen kann. Auch hier im Forum steht da schon viel. So viel, dass ich nicht weiß mit was ich mich beschäftigen soll. Ich möchte, dass die Anwendungen ohne Installationen von Zusatzsoftware laufen und ich nicht unbedingt an feste Vorlagen gebunden bin. Und anbei noch etwas was mir regelrecht peinlich ist. Ich habe Youtube Videos zur Programmierung von GUIs angeschaut und auch etwas gefunden was für mich selbst funktioniert hat. Nur bin ich mir nicht sicher wie man das nennt was ich da überhaupt brav abgetippt habe. (Ich schreibe auch manchmal Dinge aus Tutorials raus, zerlege diese dann und versuche das zu verstehen). Wie nennt man das und wird diese Methode überhaupt großartig verwendet um GUIs zu schreiben?

    Hier ist dieses Beispiel aus dem Tutorial:

    #include <windows.h>
    #include <string>
    #include <iostream>
    
    #define FILE_MENU_NEW 1
    #define FILE_MENU_OPEN 2
    #define FILE_MENU_EXIT 3
    #define CHANGE_TITLE 4
    
    LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
    
    void AddControls(HWND);
    
    HMENU hMenu;
    HWND hEdit;
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow)
    {
    	WNDCLASSW wc = { 0 };
    
    	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.hInstance = hInst;
    	wc.lpszClassName = L"myWindowClass";
    	wc.lpfnWndProc = WindowProcedure;
    
    	if (!RegisterClassW(&wc))
    		return -1;
    
    	CreateWindowW(L"myWindowClass", L"My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500,
    		NULL, NULL, NULL, NULL);
    	MSG msg = { 0 };
    
    	while (GetMessage(&msg, NULL, NULL, NULL))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return 0;
    }
    
    LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
    {
    	switch (msg)
    	{
    	case WM_COMMAND:
    
    		switch (wp)
    		{
    		case FILE_MENU_EXIT:
    			DestroyWindow(hWnd);
    			break;
    		case FILE_MENU_NEW:
    			MessageBeep(MB_ICONINFORMATION);
    			break;
    		case CHANGE_TITLE:
    			wchar_t text[100];
    
    			GetWindowTextW(hEdit, text, 100);
    
    			std::wstring ws(text);
    			std::string str(ws.begin(), ws.end());
    
    			SetWindowTextW(hWnd, text);
    			break;
    
    		}
    
    		break;
    	case WM_CREATE:
    		AddControls(hWnd);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProcW(hWnd, msg, wp, lp);
    	}
    }
    
    void AddControls(HWND hWnd)
    {
    	CreateWindowW(L"static", L"Enter Text Here :", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER, 200, 100, 100, 50, hWnd, NULL, NULL, NULL);
    	hEdit = CreateWindowW(L"Edit", L"...", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 200, 152, 100, 50, hWnd, NULL, NULL, NULL);
    
    	CreateWindowW(L"Button", L"Change Title", WS_VISIBLE | WS_CHILD, 200, 204, 100, 50, hWnd, (HMENU)CHANGE_TITLE, NULL, NULL);
    
    }
    

    Seid bitte nicht zu grob beim Antworten, ich stehe noch am Anfang : 😃 👍



  • Zhavok schrieb:

    Ok, dann frage ich hier mal direkt. (Ich habe alles vorher bei google gesucht, bin aber manchmal auch aus Antworten nicht schlau geworden. Deshalb Frage ich hier nochmal)

    Frage 1: Wenn ich getchar() nutze und das mit CodeBlocks compile (GNU GCC) bekomme ich einen Fehler. Das Problem ist einfach, dass ich dort die stdio.h nicht included habe. Mache ich dies, läuft es problemlos. Allerdings habe ich vor CodeBlocks mit VisualStudio gearbeitet. Dort ging es ohne stdio.h. Also mit ist klar, dass VisualStudio einen anderen Compiler nutzt, aber können da echt solche Unterschiede entstehen? Anbei sei gleich gesagt, dass ich kein Problem damit habe diese einzubinden, ich wollte nur nochmal nachfragen.

    Der Standard verlangt, daß getchar() in stdio.h deklariert sein muß. Er verbietet aber nicht, daß stdio.h von anderen Headern inkludiert wird.

    Zhavok schrieb:

    Frage 2: Es geht um den Unterschied zwischen Debug/Release. Ich habe das auch bei google gesucht und auch einige Antworten gefunden. Das Problem hierbei war, dass es zwar sicherlich korrekt beschrieben wurde, aber ich mir nicht viel darunter vorstellen kann. Es wäre also super, wenn mir jemand mal vielleicht anhand einer Metapher erklärt, wo der Unterschied liegt. Bis jetzt mache das vom Name her abgeleitet so, dass ich solange ich an einem Projekt arbeite, debugge. Sobald ich das Projekt fertig habe und es auch an andere Leute verteile, release ich.

    Der Debug-modus ist eine Übersetzungsart, die dafür sorgt, daß alle notwendigen Informationen in der Programmdatei enthalten sind, damit das Programm auch in einem Debugger ausgeführt werden kann und der Debugger dabei den Zusammenhang wischen Programm und Quelltext herstellen kann.

    Zhavok schrieb:

    Frage 3: Ich habe mir auch das Thema Pointer/Zeiger angeschaut. Das funktioniert auch soweit gut. Allerdings frage ich mich wo so etwas in der Praxis Anwendung findet. Vielleicht kann ja mal jemand ein Beispiel schreiben wo so etwas Sinn macht.

    In C++ ist der Einsatz von Zeigern meistens nicht sinnvoll.

    Zhavok schrieb:

    Frage 4: (Sicher dumme Anfängerfrage) Man kann ja Funktionen in andere Scripts auslagern. Also damit meine ich, einen Headerdatei erstellen sowie eine cpp Datei dazu wo dann die Funktionen komplett drin stehen. Von dort aus sollen dann Werte wieder zurückgeschickt werden. Das ganze funktioniert auch super, solange die Rückgabewerte zum Beispiel Integer sind. Nun habe ich aber ein kleines Programm geschrieben, welches eingegebenen Text verschlüsselt. Dieser ist dann vom Datentyp ein String. Und da liegt schon das Problem. Ich kann keine Strings in die externe Datei übergeben, sowie auch keine zurückbekommen. Wie löst man sowas?

    Das geht normalerweise problemlos. Wie hast Du es denn bisher versucht?

    Zhavok schrieb:

    Frage 5: Ich habe eine kleines Spiel geschrieben als Konsolenanwendung. Das fande meine Freundin auch ganz nett und wollte es am liebsten auch auf dem Tablett spielen. Mir ist klar, dass es wahrscheinlich unendlich schwer ist, C++ auf einem Android Gerät zum laufen zu bekommen. Zumindest für mich gerade^^. Also dachte ich einfach um. Ich habe mir aus dem PlayStore eine IDE zum C++ schreiben geladen. Diese funktioniert auch eigentlich recht gut für die Dinge die ich so damit schreibe. (Also eigentlich nur paar kleine Tests) Das Spiel jedoch funktioniert jedoch nicht, da ich logischer weise nicht die windows.h nutzen kann und somit nicht die Console per System("cls") clearen kann. Ich bin eh nicht so der Freund davon diese Systemfunktionen zu nutzen. Das fühlt sich irgendwie auch falsch an die Befehle die ich beim Batch schreiben nutze dort in ein C++ Script reinzuschreiben. Nunja, nun habe ich nach alternativen gesucht für das Problem. Die Antworten die ich dazu fande waren jedoch nicht so hilfreich, da die meisten einfach nur wissen wollten wie das bei Linux funktioniert. Dort funktioniert das ja anscheinend via clear. Aber das löst mein Problem leider nicht. Wisst ihr eine Alternative wie das funktionieren kann?

    Android ist eine gan andere Umgebung, die mit reinem Standard C++ wohl nicht programmiert werden kann (Zumindest keine Konsolenanwendung). Aber es gibt hierfür Frameworks.

    Zhavok schrieb:

    Frage 6: Abschließend noch eine Frage zum schreiben eines GUIs. Ich möchte Anwendungen mit grafischer Oberfläche schreiben. Ich habe gelesen, dass C++ dafür ja eher nicht vorgesehen ist, aber allerhand zusätzliches gibt, was man dazu benutzen kann. Auch hier im Forum steht da schon viel. So viel, dass ich nicht weiß mit was ich mich beschäftigen soll. Ich möchte, dass die Anwendungen ohne Installationen von Zusatzsoftware laufen und ich nicht unbedingt an feste Vorlagen gebunden bin. Und anbei noch etwas was mir regelrecht peinlich ist. Ich habe Youtube Videos zur Programmierung von GUIs angeschaut und auch etwas gefunden was für mich selbst funktioniert hat. Nur bin ich mir nicht sicher wie man das nennt was ich da überhaupt brav abgetippt habe. (Ich schreibe auch manchmal Dinge aus Tutorials raus, zerlege diese dann und versuche das zu verstehen). Wie nennt man das und wird diese Methode überhaupt großartig verwendet um GUIs zu schreiben?

    Hier ist dieses Beispiel aus dem Tutorial:

    #include <windows.h>
    #include <string>
    #include <iostream>
    
    #define FILE_MENU_NEW 1
    #define FILE_MENU_OPEN 2
    #define FILE_MENU_EXIT 3
    #define CHANGE_TITLE 4
    
    LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
    
    void AddControls(HWND);
    
    HMENU hMenu;
    HWND hEdit;
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow)
    {
    	WNDCLASSW wc = { 0 };
    
    	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.hInstance = hInst;
    	wc.lpszClassName = L"myWindowClass";
    	wc.lpfnWndProc = WindowProcedure;
    
    	if (!RegisterClassW(&wc))
    		return -1;
    
    	CreateWindowW(L"myWindowClass", L"My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500,
    		NULL, NULL, NULL, NULL);
    	MSG msg = { 0 };
    
    	while (GetMessage(&msg, NULL, NULL, NULL))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return 0;
    }
    
    LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
    {
    	switch (msg)
    	{
    	case WM_COMMAND:
    
    		switch (wp)
    		{
    		case FILE_MENU_EXIT:
    			DestroyWindow(hWnd);
    			break;
    		case FILE_MENU_NEW:
    			MessageBeep(MB_ICONINFORMATION);
    			break;
    		case CHANGE_TITLE:
    			wchar_t text[100];
    
    			GetWindowTextW(hEdit, text, 100);
    
    			std::wstring ws(text);
    			std::string str(ws.begin(), ws.end());
    
    			SetWindowTextW(hWnd, text);
    			break;
    
    		}
    
    		break;
    	case WM_CREATE:
    		AddControls(hWnd);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProcW(hWnd, msg, wp, lp);
    	}
    }
    
    void AddControls(HWND hWnd)
    {
    	CreateWindowW(L"static", L"Enter Text Here :", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER, 200, 100, 100, 50, hWnd, NULL, NULL, NULL);
    	hEdit = CreateWindowW(L"Edit", L"...", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 200, 152, 100, 50, hWnd, NULL, NULL, NULL);
    
    	CreateWindowW(L"Button", L"Change Title", WS_VISIBLE | WS_CHILD, 200, 204, 100, 50, hWnd, (HMENU)CHANGE_TITLE, NULL, NULL);
    
    }
    

    Seid bitte nicht zu grob beim Antworten, ich stehe noch am Anfang : 😃 👍

    Das ist Windows API. Das füllt auch viele Bücher. Beschäftige Dich lieber mit einem Framework wie z.B. QT.

    VG


  • Mod

    In C++ ist der Einsatz von Zeigern meistens nicht sinnvoll.

    Das ist pauschal einfach falsch. Und als Antwort auf seine Frage irreführend und nutzlos.



  • Sry, dass ich erst jetzt antworte.

    Vielen Dank für die Antworten. Ich habe jetzt auch noch vieles herausgefunden. Frage 4 hat sich jetzt auch erledigt. Das funktioniert wie ich es auch mit Integern gemacht habe. Keine Ahnung warum das vorher nicht ging. Hab sicher was falsch gemacht. Allgemein muss ich sagen, dass ich auch noch viele Probleme hatte als ich jetzt angefangen habe mit Codeblocks zu schreiben. Wie zum Beispiel bei Frage 1. Aber jetzt komme ich damit ganz gut klar. Vielen Dank auch für den Tipp mit QT. Hab mir da die letzten Tage paar Videos zu angeschaut. Sobald ich mit C++ näher vertraut bin werde ich mal schauen wie ich damit zu recht komme. Aber für die nächste Zeit ist erstmal nur Konsole angesagt. QT macht für mich einen ganz guten Eindruck und scheint genau zu sein wonach ich suche.

    🙂 👍


Anmelden zum Antworten