Rechnen mit Vektoren



  • Hallo,

    Ich habe im Moment Zeiger und Vektoren in der Schule. Mit beiden habe ich noch so meine Porbleme. Deshalb verzweifel ich gerade an meiner Hausaufgabe.
    Das ist Vorgegeben.

    #include <iostream>
    #include <math.h>
    
    typedef struct
    {
    	float X;
    	float Y;
    	float Z;
    } Vektor;
    
    Vektor Addieren(const Vektor* a, const Vektor* b)
    {
    	Vektor summe;
    	summe.X = (*a).X + (*b).X;
    	summe.Y = (*a).Y + (*b).Y;
    	summe.Z = (*a).Z + (*b).Z;
    	return summe;
    }
    
    int main(int argc, char** argv)
    	{
    		Vektor a = { 5, 2 , -1.3f };
    		Vektor b = { -1, 2.5f, 5.5f };
    
    			return 0;
    	}
    

    Die Aufgabe ist die "Addieren" Funktion von der "main" Funktion anzusprechen und das Ergebnis auszugeben.

    Das ausgeben der Werte bekomme ich hin. Nur habe ich Probleme die Funktion anzusprechen. Mit

    Addieren(Vektor a, Vektor b);
    

    funktioniert es nicht.

    Ich hoffe ihr könnt mir helfen.



  • xxMAXxx schrieb:

    Addieren(Vektor a, Vektor b);
    

    fast

    Vektor summe = Addieren(&a, &b);
    

    Du willst der Funktion ja die bereits existierenden übergeben und den Rückgabewert willst du natürlich auch noch verwenden.



  • typedef struct 
    { 
        float X; 
        float Y; 
        float Z; 
    } Vektor;
    

    Ist übrigens nur in C nötig, in C++ geht auch:

    struct Vektor 
    { 
        float X; 
        float Y; 
        float Z; 
    };
    

  • Mod

    Wenn wir schon bei C vs C++ sind, machen wir aus const Vektor* a nach const Vektor& a und sparen uns im Folgenden alle Klammern und Sternchen.



  • Bitmapper schrieb:

    typedef struct 
    { 
        float X; 
        float Y; 
        float Z; 
    } Vektor;
    

    Ist übrigens nur in C nötig, in C++ geht auch:

    struct Vektor 
    { 
        float X; 
        float Y; 
        float Z; 
    };
    

    Ich hatte mich schon gewundert, da beim googlen immer der Code so aussah wie deiner. Mein Lehrer unterrichtet irgendwie eine Gemisch aus C und C++



  • xxMAXxx schrieb:

    Ich hatte mich schon gewundert, da beim googlen immer der Code so aussah wie deiner. Mein Lehrer unterrichtet irgendwie eine Gemisch aus C und C++

    Das ist leider immer noch verbreitet. Die Welt wäre ein besserer Ort wenn Leute weniger von C/C++ sprechen würden, und mehr von der Sprache C und der Sprache C++. 😃



  • xxMAXxx schrieb:

    Ich hatte mich schon gewundert, da beim googlen immer der Code so aussah wie deiner. Mein Lehrer unterrichtet irgendwie eine Gemisch aus C und C++

    Schlecht, dann würde ich das was der Lehrer sagt auf jeden Fall nicht so ernst nehmen
    und wenn du wirklich daran interessiert bist C++ zu lernen ein gutes Buch kaufen (z.B. C++ Primer)



  • Erstmal danke für die Hilfe. Da ich das System der Funktionsaufrufe besser verstehen möchte habe ich die Aufgabe etwas erweitert.

    float leange(const Vektor* vek)
    {
    	vek = Addieren(summe.X+summe.Y+summe.Z)
    
    }
    

    Ich habe versucht die Ergebnisse der "Addieren" Funktion zu nehmen und sie in der "laenge" Funktion zu addieren. Leider funktionier das nicht. Es wäre schön wenn ihr mir helfen könntet.



  • xxMAXxx schrieb:

    Erstmal danke für die Hilfe. Da ich das System der Funktionsaufrufe besser verstehen möchte habe ich die Aufgabe etwas erweitert.

    float leange(const Vektor* vek)
    {
    	vek = Addieren(summe.X+summe.Y+summe.Z)
    
    }
    

    Ich habe versucht die Ergebnisse der "Addieren" Funktion zu nehmen und sie in der "laenge" Funktion zu addieren. Leider funktionier das nicht. Es wäre schön wenn ihr mir helfen könntet.

    Wo ist den summe definiert? Du musst es der Funktion übergeben (was du im Prinzip ja auch wahrscheinlich versuchst zu tun).
    Außerdem funktioniert der Aufruf von Addieren nicht mit einem Parameter (der zudem noch eine Kommazahl ist).
    Mach es in etwa so:

    float laenge(const Vektor *summe)
    {
        return summe->X + summe->Y + summe->Z;
    }
    

    Den Aufruf in der main machst du dann so:

    float wasauchimmer = laenge(&summe);
    

    (Ungetestet).



  • Also mir scheint, du musst mal ein gutes Buch zur Hand nehmen, sowohl für Mathematik, als auch für C++

    Was soll das denn da sein?

    eine Funktion mit dem Namen Laenge dürfte ja wohl den Betrag des jeweiligen Vektors berechnen. Das geschieht bei dir nirgendwo.

    "Summe" war eine lokale Variable in deiner Addieren Funktion und steht dir hier überhaupt nicht mehr zur Verfügung, außer du hast den return von der Addieren Funktion abgespeichert. Übergeben tust du das aber nirgendwo...

    Weiterhin seh ich bei dir keine überladene Funktion die ein Skalar bzw. einen einzigen float nimmt. Was also soll dein Funktion Call in laenge bewirken?

    Alles durcheinander bei Dir

    Eine Möglichkeit:

    float leange(const Vektor* vek)
    {
        return sqrt(pow(vek->X,2) + pow(vek->Y,2) + pow(vek->Z,2))
    
    }
    

    Wieso überhaupt pointer an dieser Stelle?



  • Sewing schrieb:

    Also mir scheint, du musst mal ein gutes Buch zur Hand nehmen, sowohl für Mathematik, als auch für C++

    Was soll das denn da sein?

    eine Funktion mit dem Namen Laenge dürfte ja wohl den Betrag des jeweiligen Vektors berechnen. Das geschieht bei dir nirgendwo.

    "Summe" war eine lokale Variable in deiner Addieren Funktion und steht dir hier überhaupt nicht mehr zur Verfügung, außer du hast den return von der Addieren Funktion abgespeichert. Übergeben tust du das aber nirgendwo...

    Weiterhin seh ich bei dir keine überladene Funktion die ein Skalar bzw. einen einzigen float nimmt. Was also soll dein Funktion Call in laenge bewirken?

    Alles durcheinander bei Dir

    Eine Möglichkeit:

    float leange(const Vektor* vek)
    {
        vek = sqrt(pow(vec->X,2) + pow(vec->Y,2) + pow(vec->Z,2))
     
    }
    

    Wieso überhaupt pointer an dieser Stelle?

    Ich schätze mit vec meinst du vek? Aber was soll dann die Zuweisung?



  • my bad. Ist korrigiert...



  • mal so ganz blöd gefragt: mit const Vektor* vek übergebe ich doch einen zeiger an eine funktion und mit vek = sqrt(pow(vec->X,2) + pow(vec->Y,2) + pow(vec->Z,2)) setze ich die adresse, auf die vek zeigt auf irgendeinen unmöglichen wert (außer ich möchte irgendwie vektoriell durch den speicher hüpfen, wo die speicherverwaltung des betriebssystemes bestimmt in jubel ausbricht 🙄 ) oder sehe ich das falsch?

    c++ ist schon ein bisschen her, aber trotzdem.

    davon mal ab verwendet man in c++ doch klassen mit methoden (was man natürlich nicht muss), sprich

    class Vektor
    {
    float x,y,z;
    
    //Konstruktor
    //Destruktor
    //getter/setter
    
    public float Laenge()
    {
    return sqrt(//blablubb
    }
    
    }
    
    int main()
    {
    Vektor vektor;
    
    cout<<"Der Vektor hat die Länge "<<vektor.Laenge;
    
    return 0;
    }
    


  • Hatte mich auf der vorherigen Seite schon korrigiert ; )

    float leange(const Vektor* vek) 
    { 
        return sqrt(pow(vek->X,2) + pow(vek->Y,2) + pow(vek->Z,2)) 
    
    }
    

Anmelden zum Antworten