C++ Ein paar Fragen zu C++

Spieler1.Name[0] = '\0';

in deinem Beispiel würde das nullte Element bzw. Index folgendes bewirken ->

Hier wird der Array-Kette, die 30 Byte (Elemente) lang ist, an die erste Position ([0]) der Wert 0 zugewiesen. Man könnte das Zeichen '\0' auch durch 0 oder 0x00 ersetzten. Jedoch hat sich eingebürgert das '\0' Zeichen zu verwenden, da es auf einen String bzw. Char-Array deutet. Man weiß automatisch als Mensch, dass es hier wohl um einen Text handelt den auch ein Mensch lesen kann.

Viel wichtiger ist es aber, dass hier die Zeichenkette (Array-Kette) direkt zu beginn terminiert wird. (muss aber auch nicht, Erklärung steht weiter unten)
D.h. Würde man versuchen über den Befehl "cout " oder "printf" die Kette Spieler1.Name auszugeben, dann würde die Ausgabe bereits zu beginn abbrechen, da die Zeichenkette quasi leer ist. Das Zeichen '\0' ist quasi ein STOP Befehl für die Ausgabe auf Schirm.

In deinem Beispiel wird einfach die Zeichenkette so initialisiert, dass der Inhalt vom String nicht existiert. Der Anwender muss diese Zeichenkette erst mit seinem Text füllen.

Man kann zB. auch so initialisieren ->
Spieler1.Name[0] = 'N';
Spieler1.Name[1] = 'A';
Spieler1.Name[2] = 'M';
Spieler1.Name[3] = 'E';
Spieler1.Name[4] = '\0';

dann würde auf dem Bildschirm "NAME" erscheinen...

Du musst dir bloß merken welche Steuerungsbefehle für die Stringausgabe wichtig sind. Dazu gehört ganz wichtig die '\0'. Würde dieser Steuerungsbehl nicht stehen, dann hätte man sofort einen Memory Leak (ist meist nicht schlimm aber wirklich nicht schön), d.h. die cout oder printf Funktion würde die Zeichenkette solange ausgeben bis irgendwo im Ram der Wert 0 vorkommt.
 
Ein String ist im Prinzip ein Array aus Chars. Und das '\0' signalisiert das Ende des Strings.
 
Aber man muss doch Platz haben um einen Namen für Spieler eins einzugeben
Das bringt doch nichts spieler1.name [0] = 0 zuschreiben dann kann doch garkein Name angegeben werden
 
\0 (sic!) an erster Stelle bedeutet doch nur, dass hier ein "leerer String" im char-Array steht. Das ist bloß die Initialisierung, d.h. da kann man gern in Folge was anderes reinschreiben.

Ich wundere mich ja, dass du beim C++-Lernen überhaupt mit char-Arrays rumfrickelst, statt mit String-Objekten. Entweder sind die Quellen deiner Beispiele wirklich Grütze oder du liest nicht richtig oder ziehst voreilige Schlüsse. Vor allem könntest du viele deiner Fragen durch bloßes praktisches Ausprobieren selbst beantworten und würdest dabei viel mehr lernen, als wenn wir es dir hier vorkauen.
 
die Beispiele sind aus dem buhc C++ für Spieleprogrammierer , welches mir hier im forum glaube ich empfohlen wurde.

und ich habe es viel ausprobiert aber verstanden ebend nicht^^
also ist das os ähnliuch als wenn ich eine Variable deklariere z.B.
int Leben = 100

und die sich dann verändern kann im laufe des spiels?
 
So ähnlich, ja.
Ich kenne das Buch nicht, habe aber mal bei Amazon reingeschaut. Lies Ab Seite 129. Wenn du es nicht direkt verstehst, musst du es mehrmals lesen. Einfach überfliegen reicht nicht. Das geht mir heute noch so, dass ich in Fachbüchern manche Abschnitte mehrfach lesen muss, bis ich sie vollständig verstehe.
Falls du es damit wirklich nicht begreifst, kannst du immer noch eine Suchmaschine deiner Wahl anwerfen und nach c++ arrays suchen, bis du eine Art der Präsentation findest, die den Groschen zum Fallen bringt.
 
vielen dank an alle die mir geholfen haben! :)

fals ich später noch fragen haben sollte werde ich mich melden
 
Ich hab irgendwie immer noch das Gefühl, dass es hier am Verständnis mangelt, was den Unterschied zwischen Definierung und Benutzung einer Funktion bzw. Variablen betrifft. Du musst immer erst dem Compiler mitteilen, was du benutzen willst, bevor du es dann nutzt. Mit "nimm irgendwas und mach irgendwas damit" kann der Compiler eben nichts anfangen ;)

Erst legst du also eine Variable an: int x;
Hierbei wird also eine Speicherstelle für einen Integer-Datentyp freigemacht, die du anschließend mit x ansprechen kannst.

Dann kannst du ihr einen Wert zuweisen: x = 5;
Hier wird also in den Datentyp x die Zahl 5 gespeichert. Anschließend kannst du diesen Wert überall (nicht ganz richtig) im Code verwenden oder ändern.

Bei den Funktionen sieht es eigentlich genauso aus. Aber ich habe das Gefühl, dass es auch hier etwas mit dem Verständnis hapert. Da du ja ein Spiel programmieren willst nehmen wir mal an, dass du einen Spieler auf den Bildschirm zeichnen möchtest. Jetzt ist das bllöde, dass es recht viel Code bedeutet den Spieler zu zeichnen und du aber mehrere Spieler hast. Macht es jetzt Sinn jedesmal den ganzen Code zu kopieren und nur an ein paar Stellen zu ändern?
Dazu hat man dann Funktionen, in denen man einmal schreibt, was getan werden soll und dann öfter benutzen kann.

Code:
void ZeichneSpieler(Spieler x)
{
   // Viele Zeilen Code, um den Spieler zu zeichnen
}

int main()
{
  // ....
  ZeichneSpieler(Spieler1);
  ZeichneSpieler(Spieler2);
 // ...
 ZeichneSpieler(SpielerN);
 // ...
}

Statt also n-mal den Zeichencode zu schreiben rufst du nur die Funktion auf, in der das genau einmal steht.
 
asdfman schrieb:
Richtige Funktionen sind in der imperativen Programmierung eh nicht vorgesehen und eigentlich schon fast eine Seltenheit.

Ich sehe aber keinen Grund, weshalb man nicht auch in einer Sprache wie C++ über weite Strecken einen zumindest teilweise funktionalen Programmierstil verfolgen kann. Die sich daraus ergebenden Vorteile (bessere Nachverfolgbarkeit, geringere Fehleranfälligkeit, etc.) gelten in einer imperativen Programmiersprache doch genau so wie in einer rein funktionalen Sprache.
 
Code:
    void ZeichneSpieler(Spieler x)
    {
    // Viele Zeilen Code, um den Spieler zu zeichnen
    }
     
    int main()
    {
    // ....
    ZeichneSpieler(Spieler1);
    ZeichneSpieler(Spieler2);
    // ...
    ZeichneSpieler(SpielerN);
    // ...
    }

das kann man aber doch auch mit einer if schleife oder do-while schlecife machen?
 
Ja, könnte man auch (wenn man ein Array von Spieler-Objekten hätte). Und ich glaube, man hat dich schon mal darauf hingewiesen: es gibt keine "if-Schleife". ;)
 
antred schrieb:
Ich sehe aber keinen Grund, weshalb man nicht auch in einer Sprache wie C++ über weite Strecken einen zumindest teilweise funktionalen Programmierstil verfolgen kann. Die sich daraus ergebenden Vorteile (bessere Nachverfolgbarkeit, geringere Fehleranfälligkeit, etc.) gelten in einer imperativen Programmiersprache doch genau so wie in einer rein funktionalen Sprache.

Naja, man könnte vielleicht. Aber wer tut es und zieht es dann noch streng durch? Die übliche Art, in C++ zu programmieren folgt nun einmal dem imperativen Paradigma. So wird es auch in jedem Buch gelehrt und ich finde es auch völlig ok so. Man sollte sich nicht krampfhaft verbiegen um einem bestimmten Paradigma zu folgen, wenn einem ein anderes einfacher gemacht wird, oder es einfach angebracht ist. Dann endet man genauso mit Scheuklappen und guckt nicht über den Tellerrand, wie derjenige, der nun jeden noch so kleinen Furz in eine Klasse kapseln muss und lieber 890349834 Zeilen mehr schreibt, als ein böses goto zu verwenden, oder hirnlos EINE GLOBALE VARIABLE! DAS CONSIDERE ICH HARMFULL zu schreien, ohne sich einen Gedanken zu machen, ob das nicht vielleicht doch sinnvoll sein könnte.
 
ist eig bekannt was für spiele z.B. mit c++ geschrieben sind?

und wie programmiert man eig personen und landschaften?
 
Davon bist du noch tausende Lichtjahre entfernt. Nimms mir nicht übel, aber wenn bei dir an solch einfachsten Grundlagen schon scheitert, wirst du niemals so weit kommen.

Das ist ungefähr wie 2 und 2 nicht addieren können aber Mathe studieren wollen.
 
das ist mir klar das es wenn überhaupot noch lange dauert wollte ich nur aus reinem interesse wissen einfach in 2sätzen und nicht ausführlich erklärt wie es geht^^
 
Man bastelt sich eine adäquate Abstraktion (in C++ vorzugsweise mit Klassen) und dann benutzt man sie aus einer höheren Ebene als primitives Element.

Das ist die Antwort zu jeder Frage, wie man irgendetwas in irgendeiner Programmiersprache macht.

€: Aus meinem lieblingsbuch zur Programmierung:

1.1 The Elements of Programming

A powerful programming language is more than just a means for instructing a computer to perform tasks. The language also serves as a framework within which we organize our ideas about processes. Thus, when we describe a language, we should pay particular attention to the means that the language provides for combining simple ideas to form more complex ideas. Every powerful language has three mechanisms for accomplishing this:

primitive expressions, which represent the simplest entities the language is concerned with,

means of combination, by which compound elements are built from simpler ones, and

means of abstraction, by which compound elements can be named and manipulated as units.

In programming, we deal with two kinds of elements: procedures and data. (Later we will discover that they are really not so distinct.) Informally, data is ``stuff'' that we want to manipulate, and procedures are descriptions of the rules for manipulating the data. Thus, any powerful programming language should be able to describe primitive data and primitive procedures and should have methods for combining and abstracting procedures and data.
 
Zuletzt bearbeitet:
adeliiix schrieb:
das kann man aber doch auch mit einer [...] do-while schlecife machen?

In diesem einfachen Beispiel wäre das schon möglich, aber dennoch will man sein Programm in der Regel übersichtlich gestalten. Das bedeutet, dass eben so etwas wie Zeichencode auch dahinwandert, wo gezeichnet wird, und nicht mitten im Programm abgammelt. Es wäre auch möglich ein komplettes Betriebssystem ohne eine einzelne Funktion, if-Bedingung oder Ähnlichem zu schreiben aber wäre das sinnvoll? Ich behaupte mal, dass so ein Vorhaben von vorne herein zum Scheitern verurteilt ist.
Aber um nochmal den Sinn einer Funktion herauszustellen: was machst du, wenn du an 10 verschiedenen Stellen in deinem Programm die gleichen Operationen (zB eine Zahlenreihe sortieren) ausführen musst?


adeliiix schrieb:
ist eig bekannt was für spiele z.B. mit c++ geschrieben sind?

und wie programmiert man eig personen und landschaften?

Die meisten aufwendigen 3D-Spiele der Vergangenheit wurden in C oder C++ geschrieben. Früher hat man tatsächlich viele Berechnungen "in Software" vorgenommen, während man heute gerne die neu gewonne Hardware (Grafik-karte) nutzt. Hier gibt es Bibliotheken wie DirectX und OpenGL, die einem das etwas erleichtern.
In jedem Fall führt aber kein Weg daran vorbei, dass man sich eingehender mit 3D-Mathematik beschäftigt, wenn man das Thema ernsthaft verfolgen möchte. Alles Sichtbare (fast alles) in einem 3D-Spiel wird nämlich über Vektoren/Matrizen und co berechnet.
 
Zurück
Oben