Strukturen an Funktionen übergeben
-
Hallo, seit einiger Zeit arbeite ich mit structs. Bin auch recht froh drüber, dass ich sie verstanden hab, da ich noch nicht lange programmiere. Doch beim übergeben eines structs an eine Funktion habe ich massive Probleme. Natürlich stehen in der main mehr Sachen als ich angebe.
Bisher siehts so aus:
main:
struct user { string name; int att; int def; int mana; int hp; int hp_max; }player; struct gegner { string name; string artikel; int att; int def; int hp; int hp_max; }goblin; zuweisen(&player, &goblin);
Funktion:
void zuweisen(struct *user player, struct *gegner goblin) { *player.name="Name"; *player.att=6; *player.def=6; *player.mana=25; *player.hp=50; *player.hp_max=50; *goblin.name="Goblin"; *goblin.artikel="Der "; *goblin.att=8; *goblin.def=4; *goblin.hp=35; *goblin.hp_max=35; return; }
Fehler die mir der Compiler ausgiebt sind zum Beispiel:
variable or field 'zuweisen' declared void
oder
zuweisen cannot be used as a functionHoffe, ihr könnt mir helfen=)
-
Ein Wunder, dass nur so ein Fehler kommt...
Dir ist schon klar, was *struct_instance.member macht?
Das ist member dereferenziert nicht struct_instance!
Du musst schreiben (*struct_instance).member oder struct_instance->member.
Und die * in der Funktionsdefinition sind glaube ich auch an der falschen Stelle...
-
Okay, danke für die Hilfe, ich werde mich nochmal ransetzen.
-
Punktrechnung geht vor Sternchenrechnung, daher versuchst du jeweils, die Attribute zu dereferenzieren, die aber keine Zeiger sind.
Daher:
(*player).name
bzw.:
player->name
Es gibt übrigens Konstruktoren, die genau das machen sollten, was im Moment deine zuweisen-Funktion erledigt.
Im übrigen ist es besser, Referenzen zu verwenden, falls die Argumente nicht null sein dürfen (wie hier).
Außerdem brauchst du kein return; am Ende, wenn die Funktion sowieso nichts zurück gibt.
-
Gut, die meisten Fehler sind weg. Jetzt taucht neben den Fehlern die ich kenne nurnoch folgender Fehler auf:
expected primary-expression before "struct"
dieser Fehler bezieht sich auf diese Zeile:
void zuweisen(struct *player, struct *goblin)
Zu meiner Entschuldigung muss ich sagen, dass ich mich im ersten Ausbildungsjahr befinde, im Unterricht unterfordert bin und deshalb vorgearbeitet hab. Deshalb besitze ich entsprechend wenig Hintergrundwissen zum Struct-Befehl.
-
function(struct foo *bar) anstatt function(struct *foo bar).
Schreibst du in C oder in C++? In letzterem musst du nur foo *bar schreiben (oder als Referenz übergeben, was besser ist).
-
Ich schreibe in c++.
Leider hat dein Vorschlag nichts gebracht Nathan. Es ist immernoch nicht ausführbar.
Außerdem war es mein Ziel, Referenzen zu übergeben.Hier nochmal der komplette Code in aktuell:
#include <iostream> #include <conio.h> #include <string> using namespace std; void zuweisen(struct *player, struct *goblin) { (*player).name="Tim"; (*player).att=6; (*player).def=6; (*player).mana=25; (*player).hp=50; (*player).hp_max=50; (*goblin).name="Goblin"; (*goblin).artikel="Der "; (*goblin).att=8; (*goblin).def=4; (*goblin).hp=35; (*goblin).hp_max=35; } int main() { struct user { string name; int att; int def; int mana; int hp; int hp_max; }player; struct gegner { string name; string artikel; int att; int def; int hp; int hp_max; }goblin; zuweisen(&player, &goblin); getch(); return 0; }
-
#include <iostream> #include <conio.h> #include <string> using namespace std; struct character { string name; int att; int def; int mana; int hp; int hp_max; }; void zuweisen(character *player, character *goblin) // Namen können beliebig gewählt werden { (*player).name="Tim"; (*player).att=6; (*player).def=6; (*player).mana=25; (*player).hp=50; (*player).hp_max=50; (*goblin).name="Goblin"; (*goblin).artikel="Der "; (*goblin).att=8; (*goblin).def=4; (*goblin).hp=35; (*goblin).hp_max=35; } int main() { character player, goblin; zuweisen(&player, &goblin); getch(); return 0;
-
Vielen Dank, das macht mir jetzt einiges klarer.
Edit:
Leider funktioniert es noch nicht. Ich hab alles gemacht wie in deinem Beispiel, Nathan. Die Namen habe ich natürlich angepasst. Als Fehler bekomme ich folgendes:variable 'zuweisen' declared void
'user' not declared in this scope
'player' not declared in this scope
'gegner' not declared in this scope
'goblin' not declared in this scope
initializer expression list treated as compound expression
expected ',' or ';' before '{' token
'zuweisen' cannot be used as a function
-
Mir ist gerade aufgefallen, dass ich ein vielleicht wichtiges Detail vergessen habe zu erwähnen. Die Werte versuche ich von einer selbst angelegten Bibliothek zuzuweisen. Falls das so wichtig ist, entschuldige ich mich dafür. Die Bibliothek habe ich natürlich vorher eingebunden.
-
Entweder so wie NAthan es gezeigt hat, oder du zeigst deinen aktuellen Code.
Sonst ist es nur rumgerate.Ist dir auch aufgefallen, dass Nathan nur eine struct definiert hat und in der Paramterliste der Funktion steht der Typ und der Variablenname.
-
#include <iostream> #include <conio.h> #include <string> using namespace std; //macht später probleme, besser using std::wasauchimmer; struct user{ string name; int att; int def; int mana; int hp; int hp_max; }player; struct gegner{ string name; string artikel; int att; int def; int hp; int hp_max; }goblin; //Typ von player und goblin muss angegeben werden. Daher müssen user und gegner vor zuweisen definiert sein void zuweisen(user &player, gegner &goblin){ player.name="Tim"; player.att=6; player.def=6; player.mana=25; player.hp=50; player.hp_max=50; goblin.name="Goblin"; goblin.artikel="Der "; goblin.att=8; goblin.def=4; goblin.hp=35; goblin.hp_max=35; } int main(){ zuweisen(player, goblin); getch(); return 0; }
-
Ja, das ist mir aufgefallen. Da der zweite Struct jedoch mit Artikel und ohne Mana ist kann ich das nicht machen.
#include <iostream.h> #include <conio.h> #include <string> #include "zuweisen.h" using namespace std; struct user { string name; int att; int def; int mana; int hp; int hp_max; }; struct gegner { string name; string artikel; int att; int def; int hp; int hp_max; }; int main() { user player; gegner goblin; zuweisen(&player, &goblin); getch(); return 0; }
In zuweisen.h:
void zuweisen(user *player, gegner *goblin) { (*player).name="Tim"; (*player).att=6; (*player).def=6; (*player).mana=25; (*player).hp=50; (*player).hp_max=50; (*goblin).name="Goblin"; (*goblin).artikel="Der "; (*goblin).att=8; (*goblin).def=4; (*goblin).hp=35; (*goblin).hp_max=35; }
-
Du includisionierst den Header bevor du die Strukturen definierst.
Also die Typen sind noch gar nicht definiert für die Definition der Funktion zuweisen.Nur um es nochmal zu verdeutlichen, für den Compiler steht da (mal von dem cut&paste der übrigen header abgesehen):
#include <iostream.h> #include <conio.h> #include <string> void zuweisen(user *player, gegner *goblin) { (*player).name="Tim"; (*player).att=6; (*player).def=6; (*player).mana=25; (*player).hp=50; (*player).hp_max=50; (*goblin).name="Goblin"; (*goblin).artikel="Der "; (*goblin).att=8; (*goblin).def=4; (*goblin).hp=35; (*goblin).hp_max=35; } using namespace std; struct user { string name; int att; int def; int mana; int hp; int hp_max; }; struct gegner { string name; string artikel; int att; int def; int hp; int hp_max; }; int main() { user player; gegner goblin; zuweisen(&player, &goblin); getch(); return 0; }
-
Okay, danke, das macht Sinn, dass das nicht funktioniert. Ich werde darauf mal meinen Lehrer ansprechen. Vielleicht kann der mir das ausführlich erklären. Scheinen ja noch einige Lücken zu sein.
Danke für eure Hilfe.
-
Die "normale Aufteilung" wäre folgende:
user_gegner_zuweisen.h
#ifndef USER_GEGNER_ZUWEISEN_GUARD #define USER_GEGNER_ZUWEISEN_GUARD struct user { string name; int att; int def; int mana; int hp; int hp_max; }; struct gegner { string name; string artikel; int att; int def; int hp; int hp_max; }; void zuweisen(user *player, gegner *goblin); #endif // include guard
user_gegner_zuweisen.cpp
#include "user_gegner_zuweisen.h" void zuweisen(user *player, gegner *goblin) { (*player).name="Tim"; (*player).att=6; (*player).def=6; (*player).mana=25; (*player).hp=50; (*player).hp_max=50; (*goblin).name="Goblin"; (*goblin).artikel="Der "; (*goblin).att=8; (*goblin).def=4; (*goblin).hp=35; (*goblin).hp_max=35; }
main.cpp
#include <iostream.h> #include <conio.h> #include <string> #include "user_gegner_zuweisen.h" using namespace std; int main() { user player; gegner goblin; zuweisen(&player, &goblin); getch(); return 0; }
-
Und dann um auf's "OOP"-Programmieren zurückzukommen.
Dann hat der Gegner halt immer 0 Mana und der Spieler einen leeren Artikel, schon hast Du nur noch eine Struktur, und die machst du dann in ein paar Tagen zu einer echten C++-Klasse, mit std::string usw. und einer schönen Schnittstelle.
Aber alles zu seiner Zeit.