Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

10.02.2012, 23:02

Wieder da!!&&Frage zu Zeigern/Pointern

Hey Forum-Mitglieder,
ich war schon ewig nichtmehr auf dieser Seite, da mir das Konsolenzeugs zu langweilig war ;)
Dann bin ich zu Unity 3D gewechselt (kann ich sehr empfehlen die Engine).
Jetzt bin ich auf ner neuen Schule und dort proggen wir mit C/C++ und ich habe wieder Lust auf Konsole etc. gehabt.
Da wir in nächster Zeit auch mal ein größeres Projekt im Unterricht machen müssen(ein kleiens Konsolenspiel), hab ich jetzt einfach mir mal was zum programmieren gesucht und bin bei dem Contest mit "Game of Life" gelandet.
Da ich noch nicht so erfahren im proggen bin, hab ich erstmal versucht, das "Game of Life" Prinzip in die Konsole zu übertragen, und tada, es hat geklappt:
Game of Life
Da mir das Prinzip dann aber zu langweilig wurde hab ich es ein bisschen abgeändert:
Evolution
Evolution hab ich mir selbst ausgedacht. Irgendwo auf einem Quadrat wird eine Zelle gespawnt. Diese breitet sich dann durch Zellteilung aus, bis sie das ganze Quadrat füllt.
Bei beiden Programmen liegen die Codes bei (In der Schule benutzen wir DevC++, deshalb benutze ich es auch zuhause).
******
Eigentlich wollte ich jetzt in meinem Buch " C++ für Spieleprogrammierer" weitermachen, bin dort aber gerad bei Zeigern und die wollen mir einfach nicht klar werden, naja irgendwann muss ich dadurch, spätestens in der Schule ;)
Sind Zeiger echt so wichtig? Ich seh keinen praktischen Grund für sie...aber gut am Anfang hielt ich auch nichts von Array, aber jetzt...Schaut euch einfach mal meine Codes an ;)
******
Ich habe mir jetzt vorgenommen in nächster Zeit ein TicTacToe und PacMan für die Konsole zu machen, das Grundschema habe ich auch schon im Kopf.
Ist das gut als Zielsetzung??

Freue mich auf eure Antworten :)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

10.02.2012, 23:11

Zeiger und Referenzen sind sehr wichtige Themen. Ein Beispiel wäre eine Swap-Funktion, welche die Werte von zwei Variablen tauschen soll.
Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
void Swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
}



Ich denke die Funktion sollte relativ klar sein. Nun wenn du dir mal ein Testprogamm machst in dem du diese Funktion testest, dann wird dir sicherlich auffallen, dass da etwas nicht ganz so läuft wie man vielleicht erst erwarten würde. Probier es doch einfach mal aus. Dann überlegst du noch mal was Zeiger und Referenzen sind und was du damit machen kannst. Versuch dann mit dem Wissen die Funktion so umzuschreiben, dass sie das macht was du möchtest. Ist wirklich nicht schwer.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

10.02.2012, 23:30

so gings mir auch als ich das erste mal was über zeiger im buch gelesen hab, ich hab nichts verstanden und keinen sinn dahinter gesehen

aber dann habe ich gemerkt, dass zeiger sehr sinnvoll sind was im buch auch im kapitel über zeiger deutlich wird

wenn du nämlich über eine funktion eine variable verändern willst, indem du sie als parameter übergibst, hast du ohne zeiger ein problem, denn es wird nur eine kopie der variable erzeugt und du hast innerhalb der funktion keinen zugriff auf die originale variable. wenn du jedoch einen zeiger übergibst, der die adresse der variable gespeichert hat, kann man in der funktion auf die speicheradresse zugreifen, dort den wert auslesen und ihn verändern und somit die variable indirekt ändern.

jetzt könnte man ja auch denken, man könnte einfach die punktzahl zurückgeben, jedoch wird es dann problematisch, wenn man zwei variablen auf einmal verändern will.

4

10.02.2012, 23:49

Okay Danke schonmal für eure Antworten...werde mich die Tage mal an die Zeiger setzen...
Wie findet ihr die 2 Programme???
Will vorallem wissen ob das von Code so gut gelöst ist usw.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

11.02.2012, 07:53

Der Code ist zweckmäßig, aber Verwendung von Funktionen wäre besser gewesen als Spaghetti-Code.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 7

Wohnort: Uchte

Beruf: Fachinformatiker in Anwendungsentwicklung

  • Private Nachricht senden

6

02.03.2012, 12:26

Eigentlich ist das mit den Zeigen und Referenzen gar nicht so schwer.

Je nachdem ob du für 64 oder 32 Bit Entwickelst können sich da schon extreme Performance unterschiede zeigen. Den sowohl eine Referenz als auch ein Zeige sind auf einen 32 Bit System auch 32 Bit sprich 4 Byte groß (ein Integer). Auf ein 64 Bit System halt doppelt so groß, 64 Bit sprich 8 Byte (ein Long). Außerdem bieten Referencen und Zeiger einen Vorteil wenn man mehr als einen Rückgabewert wünscht. Sowohl Zeiger als auch Referenz übergaben an Funktionen werden als Call by Reference bezeichnet. Die Methode die du ja schon kennst welche nur den Wert übergibt - oder viel mehr Kopiert - heißt Call by Value.

Wertübergabe (Call by Value):
Dies wird benutzt, wenn der zu übergebene Wert ein simpler Datentyp ist (char, bool, short, int, long, float, double, ...).

Zeiger (Call by Reference):
Zeiger werden verwendet, wenn der übergebene Wert geändert werden soll. Egal ob simpler Typ oder eigenes Struct / Klasse. Wenn man einen Zeiger an einer Funktion übergibt, muss man mit entsprechenden änderungen rechnen.

Referenzen (Call by Reference):
Die Referenzen werden sehr oft als Konstante Referenz benutzt. Anwendungsfälle sind z.B. wenn eigene Typen (Struct, Klasse, ...) übergeben werden sollen, diese jedoch nicht geändert werden von der Funktion.

Sowohl Zeiger als auch Referenzen können dafür benutzt werden, damit eine Funktion mehr als einen Wert zurückliefert (natürlich nur wenn diese nicht Konstant sind). Da es in der Spieleentwicklung auch um Performance geht ist das hier sogar recht wichtig ein wenig drauf zu achten.

Ich hoffe ich habe das nun korrekt wieder gegeben. ;) Die Regeln wann was und warum findet man auch am Ende des Zeiger Kapitels im Buch "C++ für Spieleprogrammierer".

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

02.03.2012, 14:53

Wenn du schon solche Leichen ausgräbst sollte es auch 100%ig stimmen :D

Also
Je nachdem ob du für 64 oder 32 Bit Entwickelst können sich da schon extreme Performance unterschiede zeigen

Das ist unabhängig vom System. Der Kopierkonstruktor von zusammengesetzten Datentypen muss aufgerufen werden, was unter umständen sehr lang dauert, Zeiger (und elementare Datentypen wie int, short, char) hingegen, werden meist in den sehr schnellen Registern abgelegt. Wenn du ein 64 Bit System hast sind zwar die Zeiger größer, aber auch die Register. Daher solltest du zusammengesetze Datentypen, wenn möglich, als konstante Referenz übergeben.

Das mit den mehreren Rückgabewerten wird recht selten genutzt, da man zusammengehörige Daten sowieso in einem Objekt zusammenfasst.

Zeiger werden verwendet wenn man auch NULL erwartet. Nimmt man einen Zeiger entgegen muss man mit NULL-Zeigern rechnen und diese behandeln(sie nur benutzen, wenn sie ungleich NULL sind). Tut man das nicht und wird der Code auch von anderen Programmierern(oder dir nach einer längerer Zeit) genutzt, kann man sich sicher sein, dass früher oder später Probleme auftreten.

Will man also in jedem Fall etwas am Objekt ändern erwartet man eine nicht-konstante Referenz.

Ansonsten verwendet man konstante Referenzen bzw. übergibt man elementare Datentypen als Wert.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (02.03.2012, 15:05)


Werbeanzeige