Objektkoordinaten 2d Array
-
...
-
Ja so langsam kommt das verständnis und die denkweise danke leute.
Ich habe gerade schwierigkeiten mit structs und funktionen.#include <iostream> int h_generator(); struct hero {int dmg, def, hp;}; int h_generator(hero) // Welcher typ muss hier hin? { hero red = {5,3,10}; return (red); //Hier will ich hero red übergeben aber ich bekomme eine fehlermeldung. } int main() { h_generator(); std::cout << red; //Hier unten auch. Red ist nicht deklariert. return 0; }WAs mache ich noch flasch?

-
Deine Funktion "h_generator()" hat den Rückgabewert "int". Das du hier kein Object vom Typ "hero" zurückgeben kannst, sollte denke ich logisch sein. Auch macht der Parameter vom Typ "hero" keinen Sinn. Du solltest dir dringend nochmal Funktionen im Allgemeinen ansehen.
#include <iostream> struct hero {int dmg, def, hp;}; hero h_generator() { hero red = {5,3,10}; return red; } int main() { hero red = h_generator(); std::cout << "dmg: " << red.dmg << " def: " << red.def << " hp: " << red.hp << std::endl; return 0; }
-
...
-
ok leute nochmals danke langsam komm ich wirklich rein

#include <iostream> #include <stdlib.h> using namespace std; struct hero {int dmg, def, hp;}; hero h_generator() { int arr[3]; for(int i = 0; i<3;i++){ arr[i] = rand() % 10 + 1;} hero randy = {arr[0],arr[1],arr[2]}; //Hier sollten zufällige zahlen enstehen return randy; //aber es werden immer die gleichen generiert } hero showdown (hero a, hero b) { a.dmg -= b.def; if(a.dmg<0){a.dmg=0;} {b.hp -= a.dmg;} return a; } hero print_value(hero temp) { cout << "dmg: " << temp.dmg << " def: " << temp.def << " hp: " << temp.hp << endl << endl; } int main() { hero store; hero red = h_generator(); hero blue = h_generator(); store = red; cout << "red: \n"; print_value(red); cout << "blue: \n"; print_value(blue); cout << "\nSHOWDOWN!!!\n" << endl; red = showdown(red,blue); blue = showdown(blue,store); cout << "red: \n"; print_value(red); cout << "blue: \n"; print_value(blue); }Weis jemand warum diese random funktion nicht macht was ich will?
Und ist es möglich eine art funktion zu bauen die mehr als nur eine sache zurück gibt?
-
Photon schrieb:
Und ist es möglich eine art funktion zu bauen die mehr als nur eine sache zurück gibt?
Nein, das geht so erst einmal nicht. Du kannst allerdings Referenzen als Parameter übergeben, welche dann innerhalb der Funktion gesetzt werden.
Photon schrieb:
Weis jemand warum diese random funktion nicht macht was ich will?
Du musst random zuerst einmalig in deinem Programm seeden. Beim seeden übergibst du einen Wert, anhand dessen sich dann die zukünftigen Zufallszahlen berechnen lassen. Da du nicht seedest, ist dieser Wert immer 0. Würdest du jetzt einfach nur eine Zahl als seed übergeben, würde das gleiche passieren, nur mit anderen Zahlen. Sie wären bei jedem Programmstart identisch. Deswegen übergibt man die Systemzeit, um einen möglichst zufälligen Wert zu erhalten.
http://www.cplusplus.com/reference/cstdlib/rand/
demzufolge fehlt deinem Programm folgendes:
#include <time.h> ... /* initialize random seed: */ srand (time(NULL)); // natürlich innerhalb der main funktion, und das am besten ganz an den Anfang ...
-
...
-
danke anti-freak und danke swordfish für die erwiterung.

Allerdings funktioniert das bei mir nicht mit nullptr und mit null auch nicht nur wenn ich 0 benutze. Ich verstehe die zeile auch nicht 100%
std::srand( std::time( nullptr ) );könnte jemand ein paar erklärende worte abgeben? Habe eben mal gegooglet zu 0 null und nullptr und ich weiss das es was mit zeigern zu tun hat ich blicke aber nicht ganz durch.
-
Photon schrieb:
Allerdings funktioniert das bei mir nicht mit nullptr und mit null auch nicht nur wenn ich 0 benutze. Ich verstehe die zeile auch nicht 100%
std::srand( std::time( nullptr ) );"Funktioniert nicht" ist keine Fehlerbeschreibung.
Bei uns funktioniert das.
Merk Dir diese Seite: http://en.cppreference.com/w/.
Dort wirst Du wahrscheinlich häufig vorbeischauen, wenn Du C++ lernst.Dort steht z.B. fuer
time()Defined in header <ctime>
time_t time( std::time_t *time );
Returns the current calendar time encoded as a std::time_t object.
Hast Du den Header <ctime> inkludiert?
Sonst: wie ist die Fehlermeldung?
-
...
-
Swordfish schrieb:
nullptr(C++11),NULLbzw.(void *) 0ist der Null Pointer.Nein,
nullptr(C++11),NULLaka0bzw.0List der Null Pointer.(void*)0ist in C++ nicht der Nullpointer (funktioniert nicht für Memberpointer).
-
So habe ich es genau gemacht:
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; struct hero {int dmg, def, hp;}; hero h_generator() { int arr[3]; for(int i = 0; i<3;i++){ arr[i] = rand() % 10 + 1;} hero randy = {arr[0],arr[1],arr[2]}; return randy; } hero showdown (hero a, hero b) { b.dmg -= a.def; if(b.dmg<0){b.dmg=0;} a.hp -= b.dmg; return a; } hero print_value(hero temp) { cout << "dmg: " << temp.dmg << " def: " << temp.def << " hp: " << temp.hp << endl << endl; } int main() { srand(time(nullptr)); hero red = h_generator(); hero blue = h_generator(); hero store = red; cout << "red: \n"; print_value(red); cout << "blue: \n"; print_value(blue); cout << "\nSHOWDOWN!!!\n" << endl; red = showdown(red,blue); blue = showdown(blue,store); cout << "red: \n"; print_value(red); cout << "blue: \n"; print_value(blue); }Also die beteffende zeile ist eine funktion die eine funktion aufruft die den wert auf den der 0 pointer zeigt behandelt?!
std::srand( std::time( nullptr ) );Soweit ich es verstanden habe sind structs wie klassen nur das alle sachen public sind. An welchen stellen macht es sinn richtige klassen anzulegen? Gibt es klassen die als "parameter"(ist das der richtige ausdruck?) structs besitzen?
-
Photon schrieb:
So habe ich es genau gemacht:
Und was funktioniert daran nicht?
Du wirst nicht um den Kauf eines C++-Buches herumkommen, wenn Du es ernsthaft meinst mit dem Lernen - ein Forum ist kein Ersatz für ein Buch
und die mir bekannten Online Quellen auch nicht.
Hier im Forum gibt es immer mal wieder Threads in denen nach Büchern gefragt wird, und in denen Empfehlungen ausgesprochen werden.Zum Thema Funktionen:
hero print_value(hero temp); hero showdown (hero a, hero b);Weisst Du, was das
herovor dem Funktionsnamen bedeutet?Kennst Du Übergabe per Wert/Übergabe per Referenz?
Wenn ja: welche Konsequenz hat dieses Wissen fürshowdown()?
Wenn nein: lies es nach.
-
Photon schrieb:
Soweit ich es verstanden habe sind structs wie klassen nur das alle sachen public sind. An welchen stellen macht es sinn richtige klassen anzulegen? Gibt es klassen die als "parameter"(ist das der richtige ausdruck?) structs besitzen?
Und Klassen können Memberfunktionen haben. Dein Code mit Klassen:
#include <cstdlib> #include <ctime> using namespace std; class hero { int dmg, def, hp; // private public: // öffentlich, alles sichtbar hero() // deine Funktion h_generator, erzeugt einen hero (an alle anderen: verzichte auf initiliste und so) { int arr[3]; for(int i = 0; i<3;i++) arr[i] = rand() % 10 + 1; dmg = arr[0]: def = arr[1]; hp = arr[2]; } void shutdown(hero other) // aktuelle objekt veränderbar in Memberfunktion { other.dmg -= other.def; if (other.dmg < 0) other.dmg = 0; hp -= other.dmg; } void print_value() { cout << "dmg: " << dmg << " def: " << def << " hp: " << hp << endl << endl; } }; int main() { srand(time(nullptr)); hero red; // automatischer aufruf des konstruktors hero blue; hero store; cout << "red: \n"; red.print_value(); //aufruf von memberfunktion cout << "blue: \n"; blueprint_value(); }
-
Nathan_logoff schrieb:
Und Klassen können Memberfunktionen haben.
structs auch

-
Ja, klar.
Aber ich meinte mit "Structs" C-Style Structs und mit "Klassen" C++ Klassen/Structs.
War ungünstig ausgedrückt, ja.Ich sollte mir aber mal mein Passwort merken, dass ist schlimm.

-
Ja du hast recht Furble ich kauf mir nächten monat ein buch

WAs genau nicht funktionert ist das wenn ich nullptr verwende mir der compiler sagt das nullptr nicht deklariert ist. Wenn ich 0 benutze geht es aber ich weiss jetzt nicht wie sich das verhält ist 0 = nullptr?
das hero vor der funktion ist glaube ich die typbezeichnung für den rückgabewert.
sowas wie
int funktion(int a){ a=a+10; return a;}hero ist ja mein eigener typ und weil ich den in die funktion reingebe oder ausgeben will muss vor der funktion hero stehen oder?
Ich hoffe ich liege jetzt nicht total daben.Nein ich weiss nicht so genau wie es sich mit referenz und wert verhält. Das
fällt unter das thema zeiger oder?
Werde mich mal informieren.Über Klassen auch nochmal ich verstehe nicht alles aus deinem code. Warum print_value void sein kann ist mir jetzt klar. Aber der showdown oder wie du ihn nennst shutdown ? Ich will doch da mit hero red und blue rechnen muss ich die dann nicht beide reingeben?
-
Photon schrieb:
WAs genau nicht funktionert ist das wenn ich nullptr verwende mir der compiler sagt das nullptr nicht deklariert ist. Wenn ich 0 benutze geht es aber ich weiss jetzt nicht wie sich das verhält ist 0 = nullptr?
Jein.
Aber bei dir ist das egal.das hero vor der funktion ist glaube ich die typbezeichnung für den rückgabewert.
Ja
hero ist ja mein eigener typ und weil ich den in die funktion reingebe oder ausgeben will muss vor der funktion hero stehen oder?
Ich hoffe ich liege jetzt nicht total daben.Das vor dem Funktionsnamen ist der Rückgabewert, die Argumente stehen in den Klammern.
Du musst das nur davor schreiben, wenn du hero zurückgeben willst.[quote}Über Klassen auch nochmal ich verstehe nicht alles aus deinem code. Warum print_value void sein kann ist mir jetzt klar. Aber der showdown oder wie du ihn nennst shutdown ? Ich will doch da mit hero red und blue rechnen muss ich die dann nicht beide reingeben?[/quote]
Das shutdown bei mir war ein Tippfehler.
Und die musst du nicht beide reingeben, bei Membefunktion kannst du immer implizit auf die aktuelle Instanz zugreifen.
Bei:red.print_value()ist die aktuelle Instanz red und du kannst auf die Variablen von red zugreifen.
Bei
blue.print_value();
blue und due kannst darauf zugreifen.
Aber warte einfach auf dein Buch.
-
Photon schrieb:
Nein ich weiss nicht so genau wie es sich mit referenz und wert verhält.
Ich hab da mal was vorbereitet. Auch wenn meine didaktischen Konzepte in diesem Thread schon kritisiert wurden.

Folgendes:
#include <iostream> #include <string> // Held mit Name struct hero { std::string name; int dmg, def, hp; }; bool is_alive(hero h) { bool alive = 0<h.hp; if(alive) std::cout << h.name << " is alive.\n"; else std::cout << h.name << " is dead.\n"; return alive; } // Uebergabe per Wert void break_neck(hero h){ // h ist eine Kopie des übergebenen Objekts std::cout << h.name << " slipped and broke his neck!\n"; h.hp=0; } // Uebergabe per Referenz void meet_dragon(hero& h){ // h ist ein Alias für das übergebene Objekt std::cout << h.name << " took a wrong turn and entered the dragon's lair.\n"; h.hp=0; } int main(){ hero red = { "red", 10, 10, 10 }; hero blue = { "blue", 8, 8, 8 }; break_neck(red); if(is_alive(red)) std::cout << "Impossibru!\n"; meet_dragon(blue); if(is_alive(blue)) std::cout << "goddammit!\n"; }Das spannende sind Zeile 27:
h wird als eine neue Variable vom Typ hero deklariert - das System initialisiert h beim Aufruf mit dem Funktionsargument. h ist also eine Kopie(!) des Arguments.Und im Gegensatz dazu Zeile 33:
h wird als Referenz auf ein hero Objekt (hero&) deklariert. h ist lediglich ein Aliasname für das Funktionsargument. Referenzen erkennst Du am & hinter der Typangabe.Lass das Programm laufen. Hast Du die Ausgabe erwartet?
Wenn ja: Übergabe per Wert/Referenz begriffen.
Wenn nein: nochmal drüber grübeln - ist ganz einfach. Ebenso einfach wie der Unterschied zwischen einer Kopie und einem Alias im echten Leben.Memberfunktionen habe ich bisher bewusst nicht erwähnt.
-
ok ich war das wochende weg aber ich hab mir die sache angeschaut. Ich habe jetzt verstanden wie das mit den referenzen funktioniert und warum es besser ist direkt auf den speicherplatz zuzugreifen anstatt immer neue variablen zu erzeugen und diese auch im speicher abzulegen.
Als nächstes werde ich mir wohl die pointer nochmal genauer ansehen die ja auch was damit zu tun haben. Hab da noch nicht so ganz den durchblick.
Danke furble das war ein gutes beispiel. Jetzt werde ich öfter mal void funktionen nutzen können.