Seite 1 von 1

HILFE Funktion als Makro definieren klappt nicht :(((((

Verfasst: Fr Jan 05, 2018 10:17 pm
von powerschaf
Einfache Geschichte und ich VERZWEIFLE
Ich will eine Funktion im Code als Makro (#define) definieren.

Hier einmal der komplette Code:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

/** Struktur des Vektors mit x,y,z**/
typedef struct s_vector3D
{
    float x, y, z;
} vector3D;

/** Erstellt Vektor**/
vector3D makeVector(float x, float y, float z)
{
    vector3D v;
    v.x = x;
    v.y = y;
    v.z = z;
    return v;
}

/**Errechnet das Kreuzprodukt von 2 Vektoren und gibt den Wert zurück**/
vector3D CROSS(vector3D a, vector3D b)
{
    vector3D c = makeVector(c.x,c.y,c.z);
    c.x = (a.y*b.z) - (a.z*b.y);
    c.y = (a.z*b.x) - (a.x*b.z);
    c.z = (a.x*b.y) - (a.y*b.x);
    printf("Kreuzprodukt :%1.f %1.f %1.f",c.x,c.y,c.z);
    return c;
}



int main()
{

    /**Beispiel in der Main, ich erstelle 2 Vektoren , a und b **/
    vector3D a = makeVector(1,2,3);
    vector3D b = makeVector(2,3,4);

    /** CROSS(a,b) errechnet Das Kreuzprodukt von Vektor a und Vektor b**/
    /** Neuer Vektor c hat nun die Werte des Kreuzprodukts von Vektor a und Vektor b **/
    vector3D c = CROSS(a,b);

}



HIER die Funktion, die ein Makro sein soll:

Code: Alles auswählen

/**Errechnet das Kreuzprodukt von 2 Vektoren und gibt den Wert zurück**/
vector3D CROSS(vector3D a, vector3D b)
{
    vector3D c = makeVector(c.x,c.y,c.z);
    c.x = (a.y*b.z) - (a.z*b.y);
    c.y = (a.z*b.x) - (a.x*b.z);
    c.z = (a.x*b.y) - (a.y*b.x);
    printf("Kreuzprodukt :%1.f %1.f %1.f",c.x,c.y,c.z);
    return c;
}

Sobald ich versuche die Funktion als Makro zu definieren klappt nix mehr und ich bekomme die unterschiedlichsten Fehler.

Wie kann man diese Funktion als Makro definieren?

Tausend Dank und Liebe Grüße. Schön das es euch gibt!

Re: HILFE Funktion als Makro definieren klappt nicht :(((((

Verfasst: Fr Jan 05, 2018 11:19 pm
von nufan
Hallo powerschaf!
Du findest in unserem Wiki eine Erklärung zu Makros, die dir bei der Lösung des Problems helfen sollte:
https://www.proggen.org/doku.php?id=c:pre:define
Falls du es so bereits versucht hast, würde ich dich bitten deinen Lösungsvorschlag (soweit möglich als kompilierbares Programm) zu posten.

Außerdem solltest du dir noch folgende Zeile ansehen:

Code: Alles auswählen

vector3D c = makeVector(c.x,c.y,c.z);
Abschließend sei noch angemerkt, dass Makros recht fehleranfällig sind und vermieden werden sollten.

Re: HILFE Funktion als Makro definieren klappt nicht :(((((

Verfasst: Fr Jan 05, 2018 11:23 pm
von cloidnerux
Hi,

erstmal stellt sich mir die Frage, warum du überhaupt die Funktion als Makro haben möchtest? Die sieht jetzt nicht so aus, als müsste sie ein Makro sein.
Falls du irgendwelche Performance Gedanken hast, es gibt auch das "inline" Schlüsselwort, dass eine ähnliche Funktion hat:

Code: Alles auswählen

http://www.cplusplus.com/articles/2LywvCM9/
Ansosnten, wie sieht der Code deines Makro aus?

Re: HILFE Funktion als Makro definieren klappt nicht :(((((

Verfasst: Sa Jan 06, 2018 4:28 pm
von powerschaf

Code: Alles auswählen

#define CROSS(a, b, c) do { \
    c.x = (a.y * b.z) - (a.z * b.y); \
    c.y = (a.z * b.x) - (a.x * b.z); \
    c.z = (a.x * b.y) - (a.y * b.x); \
} while (0)

aber ich wollte eigentlich nur ein CROSS(a,b) -.-*** sodas der Benutzer seine beiden definierten Vectoren x und y bei Cross(x,y) eingeben kann und dann das Kreuzprodukt einem neuen vector3D z zuweisen kann.


EDIT nufan: Code-Tags

Re: HILFE Funktion als Makro definieren klappt nicht :(((((

Verfasst: Sa Jan 06, 2018 4:38 pm
von nufan
Du willst also folgenden Aufruf erreichen:

Code: Alles auswählen

vector3D z = CROSS(x, y);
Das bedeutet CROSS muss einen vector3D ergeben. Was spricht dagegen, dass das Makro einfach deine makeVector() Funktion aufruft und die multiplizierten Werte übergibt?

Re: HILFE Funktion als Makro definieren klappt nicht :(((((

Verfasst: Sa Jan 06, 2018 5:13 pm
von powerschaf
Habe es jetzt folgendermaßen angepasst

Code: Alles auswählen

#define CROSS(a, b)\
    do { \
    a.x = (a.y * b.z) - (a.z * b.y); \
    a.y = (a.z * b.x) - (a.x * b.z); \
    a.z = (a.x * b.y) - (a.y * b.x);}while(0);\
   printf("Kreuzprodukt: %2.f %2.f %2.f",a.x,a.y,a.z); \


int main()
{
    /**Beispiel in der Main, ich erstelle 2 Vektoren, a und b **/
    vector3D a = makeVector(1, 2, 3);
    vector3D b = makeVector(2, 3, 4);

vector3D x = CROSS(a, b);
bekomme den Fehler "expected Expression before do" ... also beim Makro.
Hat jemand ne Iddee was für einen Ausdruck mein lieber Compiler da verlangt :mrgreen: ?

Re: HILFE Funktion als Makro definieren klappt nicht :(((((

Verfasst: Sa Jan 06, 2018 5:18 pm
von powerschaf
nufan hat geschrieben:Du willst also folgenden Aufruf erreichen:

Code: Alles auswählen

vector3D z = CROSS(x, y);
Das bedeutet CROSS muss einen vector3D ergeben. Was spricht dagegen, dass das Makro einfach deine makeVector() Funktion aufruft und die multiplizierten Werte übergibt?
Habs folgendermaßen gemacht :

Code: Alles auswählen

#define CROSS(a, b) makeVector(a.x,a.y,a.z);\
    do { \
    a.x = (a.y * b.z) - (a.z * b.y); \
    a.y = (a.z * b.x) - (a.x * b.z); \
    a.z = (a.x * b.y) - (a.y * b.x);}while(0);\
   printf("Kreuzprodukt: %2.f %2.f %2.f",a.x,a.y,a.z); \
UND ES GEHT :D:D:D

Ist das so denn richtig? ^^ es geht auf jeden Fall

Re: HILFE Funktion als Makro definieren klappt nicht :(((((

Verfasst: Sa Jan 06, 2018 5:27 pm
von nufan
powerschaf hat geschrieben:Ist das so denn richtig? ^^ es geht auf jeden Fall
Makros werden vom Präprozessor aufgelöst, sieh das als automatisches Copy-Paste bevor der Compiler das Programm übersetzt. Aufgelöst sieht dein Code also folgendermaßen aus:

Code: Alles auswählen

vector3D x = makeVector(a.x,a.y,a.z);
    do {
    a.x = (a.y * b.z) - (a.z * b.y);
    a.y = (a.z * b.x) - (a.x * b.z);
    a.z = (a.x * b.y) - (a.y * b.x);}while(0);
   printf("Kreuzprodukt: %2.f %2.f %2.f",a.x,a.y,a.z);
Syntaktisch korrekt, allerdings wohl nicht was du erreichen willst. Warum übergibst du nicht gleich die Multiplikationen an makeVector()? Abgesehen davon veränderst du in der Schleife "a", obwohl du eigentlich "x" initialisieren willst.

Re: HILFE Funktion als Makro definieren klappt nicht :(((((

Verfasst: Sa Jan 06, 2018 7:49 pm
von powerschaf
weil ich nicht weiß wie :( *beschämt zu Boden schau*
Kann ich die Multiplikation so übergeben?...

Code: Alles auswählen

#define CROSS(a, b) makeVector((a.y * b.z) - (a.z * b.y),(a.z * b.x) - (a.x * b.z),(a.x * b.y) - (a.y * b.x));\

Re: HILFE Funktion als Makro definieren klappt nicht :(((((

Verfasst: Sa Jan 06, 2018 7:54 pm
von powerschaf
Ich glaub so ist es viel besser und der compiler meckert auch nicht :) Ohne dich nufan hätte ich es nie geschafft :) Tausend dank!!!!