C++ für Dumies Prob

Diskutiere C++ für Dumies Prob im Developer Network Forum im Bereich Hardware & Software Forum; Hmmm also wegen Zeiger kommt nächsten Dienstag wieder mein lieber Onkel und erklärt es mir. Ich hab jetzt eine einfache Frage zu Methoden in einem...
  • C++ für Dumies Prob Beitrag #161
A

Airfighter76

Bekanntes Mitglied
Dabei seit
01.04.2009
Beiträge
268
Reaktionspunkte
0
Hmmm also wegen Zeiger kommt nächsten Dienstag wieder mein lieber Onkel und erklärt es mir. Ich hab jetzt eine einfache Frage zu Methoden in einem Code

Code:
$template    = new template();

das ist ein Php Code und meine Frage dazu ist, woher das Programm weis aus welcher anderen Php Datei die Methode kommt. D. h. es gibt mehrere Methoden jede ist in einer Datei und in der Datei, welche ausgeführt wird, steht dieser Code und wo steht jetzt die Datei? Muss die irgendwo reingeschrieben werden? wenn Ja geht das auch in C++ und wie?
 
  • C++ für Dumies Prob Beitrag #162
A

Airfighter76

Bekanntes Mitglied
Dabei seit
01.04.2009
Beiträge
268
Reaktionspunkte
0
So das Problem mit den Zeigern hab ich gelöst, und hier die Codes für die, die ein ähnliches Problem haben.

Code:
		void Beginner(string *pSpieler1, string *pSpieler2, string *pBeginner)
		{
			//Auswahl des Beginners
			cout << endl << "Name des Beginnenden Spielers: ";
			cin  >> *pBeginner;

			// Abgleichen der Eingabe mit den Spielern
			if (*pBeginner == *pSpieler1)
			{

				cout << *pSpieler1 << " bitte klicke auf w" << ue <<"rfeln um das Spiel zu starten" << endl;
			}   

			else if (*pBeginner == *pSpieler2)
			{
				cout << *pSpieler2 << " bitte klicke auf w" << ue <<"rfeln um das Spiel zu starten" << endl;
				*pSpieler2  = *pSpieler1;
				*pSpieler1   = *pBeginner;
			}  
			else
			{
				cout << "ung" << ue <<"ltiger Spielername" << endl;   

			}

		}

und spätter wird er an folgender Stelle so eingebaut

Code:
        do
        {
				Beginner(&sSpieler1, &sSpieler2, &sBeginner);
        }
        while (sBeginner != sSpieler1 && sBeginner != sSpieler2);
 
  • C++ für Dumies Prob Beitrag #163
A

Airfighter76

Bekanntes Mitglied
Dabei seit
01.04.2009
Beiträge
268
Reaktionspunkte
0
So ich hab mal wieder ein Probelm, welches aber relativ einfach zu lösen ist (hoff ich zumindest). Und zwar möchte ich, das mein Programm an einer bestimmten Stelle, die Schleifen beendet und man durch klicken einer beliebigen Taste das Programm beendet. Bei einer schleife kein Problem, einfach nur break; einfügen und fertig ist es. Aber in meinem Fall ist die Stelle im Programm in mehreren Schleifen integriert. Soll ich jetzt einfach öfters break; einfügen?
 
  • C++ für Dumies Prob Beitrag #164
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Da gibt es mehrere Möglichkeiten:
Wenn das Programm nur beendet werden soll, ohne dass vorher noch etwas erledigt werden muss, dann reicht ein return; zum Verlassen der main-Funktion. Damit wird das Programm beendet (wenn ich mich recht entsinne müsste es auch exit(); geben). Soll vor dem Ende noch etwas erledigt werden, kannst du den Block mit den Schleifen in eine eigene Funktion packen und die mit return; verlassen; dadurch wird der Code nach dem Funktionsaufruf natürlich noch ausgeführt. Alternativ kannst du eine zusätzliche bool-Variable ala bool run=true; machen, die in allen Schleifenbedingungen mit && verknüpft ist. Sobald du die irgendwo auf false setzt werden alle Schleifen der Reihe nach verlassen. Natürlich wird da der Code in den Schleifen nach dem run=false noch ausgeführt. Diese Lösung hat noch einen kleinen Nachteil: die zusätzliche Bedingung verlangsamt die Ausführung. In den meisten Szenarien ist das aber allenfalls ein kosmetisches Problem.
Schließlich bleibt noch die Variante, mit einem goto an einen Punkt außerhalb der Schleifen zu springen. Das wird als der so ziemlich einzige Fall angesehen, in dem die Verwendung von goto akzeptabel ist. Mir persönlich gefällt die Variante trotzdem nicht.
 
  • C++ für Dumies Prob Beitrag #165
A

Airfighter76

Bekanntes Mitglied
Dabei seit
01.04.2009
Beiträge
268
Reaktionspunkte
0
Also ich hab mein Problem mit einer Variablen (bei mir iEnde) gelöst, die am Anfang den Wert 0 hat und sobald ein Stein im Haus ist wird sie auf 1 gestetzt. Dazu steht noch in jeder Schleife && iEnde == 0; und somit werden diese dann auch verlassen. So und mein Programm ist jetzt abgeschlossen, zumindest vorerst bis ich visuell programmieren kann (freu mich schon drauf). Möchte ich nun ein anderes Programm programmieren, nämlich ein Snake, in dem man auch die Schlange sieht, wie sie nach oben, links und Co geht. Ich werde hierbei das objekt orientierte programmieren anwenden. Nur meine Frage ist, wie schaffe ich es, das wenn der Benutzer die Pfeiltaste nach oben oder nach unten drückt, das das Programm drauf reagiert und den X oder Y wert der Schlange ändert?
 
  • C++ für Dumies Prob Beitrag #166
A

Airfighter76

Bekanntes Mitglied
Dabei seit
01.04.2009
Beiträge
268
Reaktionspunkte
0
So ich hab noch ein Prob und zwar bei diesem Codeabschnitt
Code:
const char cFeldanzeige [961] =" ";
	for (i=1;i<=ixFeldgroesse; i++)
	{
		cFeldanzeige[i] ="#";
	}
und zwar tritt hier ein Fehler auf : error C2440: '=': 'const char [2]' kann nicht in 'const char' konvertiert werden
 
  • C++ für Dumies Prob Beitrag #167
T

TrµMAn

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
4.882
Reaktionspunkte
2
Ort
Wuppertal
Und wo ist da nun dein Problem? da steht doch was für ein Fehler aufgetreten ist.
versuch es doch mal mit
Code:
char cFeldanzeige[961] = { ' ' , '\0' };
 
  • C++ für Dumies Prob Beitrag #168
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Das geht, aber das:
Code:
cFeldanzeige[i] ="#";
nicht.
"#" ist ein String, bzw. ein char-Array und kann nicht auf einen char zugewiesen werden.
Code:
cFeldanzeige[i] ='#';
wäre korrekt.
Allerdings wird der Compiler auch das nicht mögen, weil du versuchst, auf einen const etwas zuzuweisen. Da stellt sich natürlich die Frage, wie du auf die Idee kommst, eine Variable als const zu deklarieren, wenn du später etwas drauf zuweisen willst.
 
  • C++ für Dumies Prob Beitrag #169
A

Airfighter76

Bekanntes Mitglied
Dabei seit
01.04.2009
Beiträge
268
Reaktionspunkte
0
Ah es funkt, das mit der Konstanten, war nur ein Versuch es weg zu kriegen. Aber ein was verwundert mich, denn die folgende Codezeile ist in meinem Programm integriert und funktioniert auch.
Code:
char cFeldanzeige [961] =" ";
hat das was damit zu tun, da ich hier die ganze Char-Arry anspreche?
 
  • C++ für Dumies Prob Beitrag #170
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Code:
char cFeldanzeige [961] =" ";
schreibt ein Leerzeichen und ein \0 in den Array. Durch die Anführungszeichen wird das Leerzeichen als String (Zeichenfolge, welche mir \0 terminiert werden muss) erkannt.
Also ist cFeldanzeige[961] das Leerzeichen und cFeldanzeige[962] das Abschließende \0.

Bei
Code:
char cFeldanzeige [961] =' ';
wird nur der 962te char im Array gefüllt. Die Hochkommas stehen für einen einzelnen Buchstaben (char), somit wird kein \0 angehängt. Der darauf folgende char wird also nicht geändert.
 
  • C++ für Dumies Prob Beitrag #171
A

Airfighter76

Bekanntes Mitglied
Dabei seit
01.04.2009
Beiträge
268
Reaktionspunkte
0
Ah danke für die Erklärung Max. Ich bin grade beim einlesen der Tasten, also wenn man Pfeil nach oben drückt, dann geht die Schlange nach oben. Ich hab dazu ne Seite mit den entsprechenden Code gefunden (http://www.datasource.de/programmierung/tab01_tastaturcodes.html). Nur leider weis ich nicht genau wie die Funktion ReadKey, die dort beschrieben ist funktionieren soll, da bei mir ein Fehler kommt, das die Variable ReadKey nicht deklariert wurde. Dazu kommt noch, das ich laut der Seite eine Funktion draus machen soll, aber was soll in die Funktion rein? Bin grad völlig ratlos und mach jetzt erstmal ne Pause bis Morgen. Bei mir sieht die Stelle grad so aus.
Code:
	ReadKey();
        // hoch
	if (ReadKey()==72) {
		p.y -= 1; 
	}
 
  • C++ für Dumies Prob Beitrag #172
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Also soweit ich weiß gibt es in C++ (im Gegensatz zu C#) keine Readkey-Funktion. Ich glaub das gemeint ist, du sollst dir deine eigene ReadKey-Funktion basteln. Hierzu ein kleiner Gedankenanstoß:
In conio.h ist die Funktion "getch()" (bzw. "_getch()") enthalten. Diese Funktion gibt den char zurück, welche gedrückt wurden (Beliebt bei Consolenapplicationen, welche auf ein y/n o.ä warten).
Den char kannst du Problemlos in einen Integer einlesen. Ein cast ist überflüssig. Diesen Integer "switchst" du dann:
Code:
#include <conio.h> 

int main() {

	int buffer;
	do {
		switch(buffer = _getch()) {
			case 72:	//Up
				//y.p -= 1;
				break;

			case 80:	//Down
				//y.p += 1;
				break;  

			case 75:	//Links
				//x.p -= 1;
				break;

			case 77:	//Rechts
				//x.p += 1;
				break;
			
		}
	} while(buffer != 27);

	return 0;
}

Somit hast du deine eigene KeyCode-Funktion innerhalb von 3 Zeilen geschrieben:
Code:
int KeyCode() {
	return _getch();
}
Was aber eigentlich total überflüssig ist. ;) Verwende einfach anstelle von "KeyCode()" das oben erwähnte "_getch()". Hat exakt den selben Effekt.
 
  • C++ für Dumies Prob Beitrag #173
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Code:
char cFeldanzeige [961] =" ";
schreibt ein Leerzeichen und ein \0 in den Array. Durch die Anführungszeichen wird das Leerzeichen als String (Zeichenfolge, welche mir \0 terminiert werden muss) erkannt.
Also ist cFeldanzeige[961] das Leerzeichen und cFeldanzeige[962] das Abschließende \0.
Das stimmt so nicht ganz. Die Zeile ist eine Variablendeklaration. D.h. es wird ein char-Array mit 961 Elementen (0-960) angelegt. Der String ist ein Initializer; d.h. die ersten beiden Elemente werden initialisiert; und zwar das Element 0 mit dem Leerzeichen und das Element 1 mit dem Null-Character; die restlichen Elemente haben einen zufälligen Wert.

Nur zur Sicherheit der Hinweis: Man kann C-Strings (also char-Arrays) auf diese Weise keinen Text zuweisen; das funktioniert nur hier bei der Variablendeklaration. Das ist ein wesentlicher Unterschied zu C++.

Unter Windows könntest du für die Tastenabfrage auch die Funktion GetAsyncKeystate verwenden; Beispiele dazu sollte Google zur Genüge finden. Aber der von Max gezeigte Weg ist auf jeden Fall genau so eine saubere Lösung.
 
  • C++ für Dumies Prob Beitrag #174
A

Airfighter76

Bekanntes Mitglied
Dabei seit
01.04.2009
Beiträge
268
Reaktionspunkte
0
So ich habe jetzt noch 2 Probleme. 1. Warum kann ich bei einer "swich" in die case keine do-while Schleife einfügen? Bei mir kommt da immer Fehler.
Code:
		switch(ibuffer = _getch()) {
			case 72:	//Up
				do{
				p.y -= 1;
				}
				while(!(ibuffer== 80 || ibuffer==75 || ibuffer== 77));
				break;

			case 80:	//Down
				do{
				p.y += 1;
				}
				while(!(ibuffer== 72|| ibuffer== 75 || ibuffer== 77));
				break;

			case 75:	//Left
				do{
				p.x -= 1;
				{
				while(!(ibuffer== 72|| ibuffer== 80 || ibuffer== 77));
				break;

			case 77:	//Right
				do{
				p.x += 1;
				}
				while(!(ibuffer== 72|| ibuffer== 80 || ibuffer== 75));
				break;
			
		}
Mein 2. Problem ist, das ich noch einen Code brauche (der in den oben aufgeführten Code in die do-while Schleife soll), der das Programm ganz kurz anhält und dann weiter laufen lässt (damit 1. die Schlange nicht inerhalb von 1 sec am anderen Ende des Feldes ist und 2. man nicht immer eine Taste drücken muss, damit sich die Schlange bewegt).
 
  • C++ für Dumies Prob Beitrag #175
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Zu 1.: Ich weiß ja nicht, ob das schon mal gesagt wurde :rolleyes: , aber es hilft, wenn man die Fehlermeldung auch hinschreibt. Spontan würde ich mal auf die falsche geschwungene Klammer im case 75 tippen.

Zu 2.: So wie du dir vorstellst, funktioniert das nicht. ibuffer wird vor dem switch (durch die Zuweisung ibuffer=_getch()) gesetzt und ändert dann seinen Wert nicht mehr, solange es nicht neu zugewiesen wird. Alle deine while-Schleifen würden also endlos weiterlaufen und das Programm damit hängen. Eigentlich gibt es nur eine wirklich saubere Art, wie man sowas löst. Eine Hauptschleife führt immer wieder die Tastenabfrage aus; zusätzlich wird die vergangene Zeit seit dem letzten Schleifendurchlauf gemessen. In einem Switch wird dann die Taste abgefragt, und die vergangene Zeit mit der gewünschten Geschwindigkeit multipliziert, um die Positionsänderung seit dem letzten Schleifendurchlauf zu berechnen. Diese Änderung wird dann zur aktuellen Position addiert. So ist das Programm unabhängig von der Ausführungsgeschwindigkeit und es gibt auch keine unnötigen Verschachtelungen.
Manche Spiele wurden früher so geschrieben, dass in jedem Schleifendurchlauf ein bestimmter Wert zur Position addiert wurde. Das führte dann zu dem Effekt, dass die Spiele auf schnelleren Rechnern zu schnell liefen und mitunter unspielbar wurden. Auch deshalb gab es zu diesen Zeiten noch den berühmten Turbo-Button.
 
  • C++ für Dumies Prob Beitrag #176
A

Airfighter76

Bekanntes Mitglied
Dabei seit
01.04.2009
Beiträge
268
Reaktionspunkte
0
Zu 1. ich weis, das man normalerweise den Fehler mit hinschreibt, aber die Meldung war für mich ziehmlich verwirrend. Auf 2. Blick sah ich jetzt, das es ein Fehler mit irgendeiner Klammer sein musste, da der Fehler so aussah : fatal error C1075: Dateiende erreicht, bevor das zugehörige Element für das linke Element Klammer "{" in "c:\dokumente und einstellungen\air\eigene dateien\proggen\snake\snake\snake.cpp(57)" gefunden wurde. Der Fehler ist nun behoben. Zu 2. hätte ich eine andere Idee gehabt, nämlich das das Programm wie vorhin gesagt kurz angehalten wird und zwar über einen System befehl, soweit ich weis heist er sleep. Nur das einbauen funkt bei mir nicht ganz.
Code:
system("sleep 10");
Fals es so nicht möglich, versuche ich es mit deiner Variante cmddegi.
 
  • C++ für Dumies Prob Beitrag #177
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
"sleep 10" hält das Programm für 10s an; bin mir nicht sicher, ob sleep auch Kommazahlen akzeptiert, aber ich denke eher nicht. D.h. dein Programm läuft dann im besten Fall im Sekundentakt.
Außerdem ist es - zumindest meiner Ansicht nach - generell schlechte Praxis, Funktionalität mittels system-Befehl einzubauen. Das aufgerufene Programm muss ja auf dem Zielrechner vorhanden sein, und man legt sich auf das verwendete Betriebssystem fest. Nach Möglichkeit sollten Standard-Funktionen aus C verwendet werden, und wenns nicht anders geht, API-Funktionen des Betriebssystems (was natürlich auch eine Einschränkung der Portierbarkeit nach sich zieht).

Prinzipiell ist es aber natürlich möglich, diese Funktionalität so zu erreichen. Wurde auch früher oft so gemacht.
 
  • C++ für Dumies Prob Beitrag #178
T

TrµMAn

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
4.882
Reaktionspunkte
2
Ort
Wuppertal
die funktion
Code:
Sleep(DWORD dwMilliseconds);
befindet sich in der windows.h und erwartet einen unsigned int als angabe für die tausendstel Sekunden die gewartet werden sollen
 
  • C++ für Dumies Prob Beitrag #179
A

Airfighter76

Bekanntes Mitglied
Dabei seit
01.04.2009
Beiträge
268
Reaktionspunkte
0
Ok, dann wär ich jetzt für deine Möglichkeit cmddegi, nur mein Problem hierbei ist, das ich nicht den Befehl weis, mit dem ich die Aktuelle Zeit in eine Variable (Typ Char) speichern kann.
 
  • C++ für Dumies Prob Beitrag #180
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Zeit in einen char wird wohl nicht laufen, aber ein DWORD ist dafür ganz gut geeignet.
Hier steht alles benötigte:
http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx
 
Thema:

C++ für Dumies Prob

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben