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

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
powerschaf
Beiträge: 13
Registriert: Mi Dez 13, 2017 10:41 am

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

Beitrag von powerschaf » Fr Jan 05, 2018 10:17 pm

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!

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

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

Beitrag von nufan » Fr Jan 05, 2018 11:19 pm

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.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

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

Beitrag von cloidnerux » Fr Jan 05, 2018 11:23 pm

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?
Redundanz macht wiederholen unnötig.
quod erat expectandum

powerschaf
Beiträge: 13
Registriert: Mi Dez 13, 2017 10:41 am

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

Beitrag von powerschaf » Sa Jan 06, 2018 4:28 pm

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

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

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

Beitrag von nufan » Sa Jan 06, 2018 4:38 pm

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?

powerschaf
Beiträge: 13
Registriert: Mi Dez 13, 2017 10:41 am

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

Beitrag von powerschaf » Sa Jan 06, 2018 5:13 pm

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: ?

powerschaf
Beiträge: 13
Registriert: Mi Dez 13, 2017 10:41 am

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

Beitrag von powerschaf » Sa Jan 06, 2018 5:18 pm

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

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

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

Beitrag von nufan » Sa Jan 06, 2018 5:27 pm

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.

powerschaf
Beiträge: 13
Registriert: Mi Dez 13, 2017 10:41 am

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

Beitrag von powerschaf » Sa Jan 06, 2018 7:49 pm

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));\

powerschaf
Beiträge: 13
Registriert: Mi Dez 13, 2017 10:41 am

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

Beitrag von powerschaf » Sa Jan 06, 2018 7:54 pm

Ich glaub so ist es viel besser und der compiler meckert auch nicht :) Ohne dich nufan hätte ich es nie geschafft :) Tausend dank!!!!

Antworten