Pointer auf Struct -> funktion
-
moin!
ich hab eine funktion die ich mit zwei Structs füttern muss. die Funktion soll aber auch variablen der structs verändern.
mit arrays ist das ja kein problem, aber wie schaut das bei structs aus?
Schemenhaft mein Vorhaben:
struct ship{ float vectorx; } ship1; berechnung(ship1); // die funktion macht jetzt iwas und ändert den wert von vectorx. (bitte nicht mit return kommen... es ist weit mehr als 1 wert^^) printf("%f", vectorx);
mfg Chris
-
struct foo { int bar; }; void berechnung(foo & f) { f.bar = 42; }
-
warum nicht return:
ship berechnung(ship s) { // mach was mit ship return s; }
Und mal als kleine Nebenfrage: Wäre dieser Code hier korrekt?
ship && berechnung(ship s) { return std::move(s); }
-
thx!
einfache schlichte antwort^^ so mag ich das
edit:
Return nicht weil es so ca. 7 werte sind. sagte ich auch
-
pyhax schrieb:
warum nicht return:
ship berechnung(ship s) { // mach was mit ship return s; }
Weil call-by-ref genau dafür gedacht ist: Eine Funktion X soll mit einem Original Y arbeiten. Außerdem erzeugst du bei deiner Variante Kopien, und das ist unnötig. Wenn du ein Original verändern willst, dann nimm call-by-ref.
-
pyhax schrieb:
Und mal als kleine Nebenfrage: Wäre dieser Code hier korrekt?
ship && berechnung(ship s) { return std::move(s); }
Nein, du gibst eine Referenz auf ein nicht mehr existentes Objekt zurück. Die Move-Semantik kommt bei return by value, indem du einen Move-Konstruktor definierst.
-
ok es ergibt sich doch noch ein problem...
ich deklariere meine funktionen immer über der Main und Definiere sie unter der main. zur übersichtlichkeit.
void movement(objects & obj);
jetzt mault mein programm rumm das "objects" nicht deklariert ist.
klar... das wird es ja auch erst in der main, die dadrunter kommt...
jemand eine idee?die fehler:
error C2065: 'objects': nichtdeklarierter Bezeichner error C2065: 'obj': nichtdeklarierter Bezeichner
-
pyhax schrieb:
Und mal als kleine Nebenfrage: Wäre dieser Code hier korrekt?
ship && berechnung(ship s) { return std::move(s); }
Das ist wohl der vermutlich am öftesten begangene Fehler bei den neuen Move-Semantiken. RValue-Referenzen sind auch nur Referenzen. Und Referenzen auf lokale Objekte zurückgeben ist sehr, sehr böse, wie du hoffentlich weißt. Wie Michael E. schon geschrieben hat, gibt man per Value zurück.
-
cl90 schrieb:
ich deklariere meine funktionen immer über der Main und Definiere sie unter der main. zur übersichtlichkeit.
cl90 schrieb:
void movement(objects & obj);
jetzt mault mein programm rumm das "objects" nicht deklariert ist.
klar... das wird es ja auch erst in der main, die dadrunter kommt...
jemand eine idee?Versuchs mal mit
class objects;
bevor dem Prototypen.
-
ok das behebt das porblem mit der deklaration.
muss ich bei "class: object" noch die bestandteile hinschreiben? weil jetzt krieg ich errors für die funktion. die jedes "obj.variable" bemängeln...
error C2228: Links von ".x" muss sich eine Klasse/Struktur/Union befinden. error C2027: Verwendung des undefinierten Typs "objects"
btw, ihr seid super!
Es ist einfach wirklich klasse wenn man Leute hat die man fragen kann.
Normalerweise ist man immer Raus auf dem Flow, weil man stundenlang nach einer lösung sucht.
-
Zur Deklaration von der Funktion brauchst du auch nur die Deklaration von objects. Aber zur Definition der Funktion brauchst du auch die Definition der Klasse, vor allem wenn du auf Teile zugreifst.
Dein Compiler liest von oben nach unten. Wenn du eine Funktion deklarierst, die ein objects-Objekt entgegennimmt, muss der Compiler nichts über diese Klasse wissen. Wenn du aber auf Member zugreifst, muss der Compiler wissen, dass es diese Member gibt, weshalb du eine Definition benötigst.
-
hm.... eigentlich hab ich es ja in der reihenfolge.
#include <SFML/Graphics.hpp> #include <windows.h> #include <math.h> class objects; void movement(objects & obj); int main(){ float mouse[3]; struct objects { int move; float vx, vy, targx, targy; float posx, posy, directionangel, mspeed, inact; } ship1; ... movement(objects); ... return 0; } void movement(objects & obj){ obj.vx = //what ever }
-
Das geht nicht, weil die struct lokal ist. Tu sie doch aus der main raus.
-
sind globale structs nicht böse?^^
zumindest wurde mir bei C mal gesagt das man globale variablen meiden sollte^^
-
Globale Variablen sollte man zwar grundsätzlich vermeiden, aber Structs sind keine Variablen :p
-
cl90 schrieb:
sind globale structs nicht böse?^^
zumindest wurde mir bei C mal gesagt das man globale variablen meiden sollte^^
Globale Variablen sind zu vermeiden. Eine struct/class ist keine Variable. Vielleicht solltest du dein Programm auch in Header und .cpp Files aufteilen.
-
ok gut zu wissen.
ja das aufteilen werde ich auch bald mal machen^^
aber vorerst zerlege ich meine programmteile immer nur in Funktionen.wie gesagt tausend dank euch!
ich schau mal das ich mich auch nützlich mach im forum. vlt kann ich ja irgendwo helfen^^