Brauche Hilfe bei C++ Makro



  • Hallo,

    Ich bin neu hier und habe eine Frage.
    Ich habe vor kurzem angefangen, C++ zu lernen und habe eine Aufgabe gestellt bekommen, die ich schon gelöst habe aber jetzt soll ich die selbe Aufgabe mit Makro lösen, wo ich echt auf dem Schlauch stehe.

    Die Aufgabe lautet:
    Erstellen sie ein modifiziertes programm.
    Die Temperatur ist dabei von Fahrenheit in Celsius^
    °C= (5/9)(°F-32)
    ist dabei durch ein Makro zu realisieren!

    Die erste Aufgabe konnte ich sehr schnell lösen aber mit dem Makro klappt es nicht, bzw. ich stelle keinen Unterschied fest.

    Meine Aufgabe:

    #include<stdio.h>
    
    int main(void)
    
    {
    int max = 400;
    	int step = 40;
    
    	double celsius = 0;
    		double fahrenheit =0;
    
    	while(fahrenheit<=max)//solange wir nicht die obere grenze erreicht haben
    	{
    		celsius = (fahrenheit-32) * 5/9;
    		printf(" %0.0f F = %0.2f C \n",fahrenheit,celsius);//gibt eine flieskomma zahl aus mit 0 stellen nach dem komma und einmal mit 2 stelln nach dem komma
    		fahrenheit += step; //ist equivalent zu fahrenheit  = fahrenheit + step;
    
    	}
    
    return 0;
    }
    

    Nun habe ich es mit dem Makro versucht.
    Als erstes soll man ja ein Makro definieren:

    #define Makroname Ersatztext

    Wenn ich #define PSI 150 habe (als beispiel)
    Sobald irgendwoe PSI ausser im Printf steht, wird die durch die Zahl 150 ersetzt.

    Wie kann ich das aber auf meine Aufgabe anwenden?

    #define Celsius
    #define Fahrenheit

    Ich hoffe ihr könnt mir helfen.



  • 1. Ist das ein Fall fürs C Forum
    2. Macros werden mit vielen Einschränkungen so verwendet wie Funktionen:

    #define addition(a,b) a+b
    
    int a = addition(1,4); //a = 5
    


  • Weisst du schon, wie man dem Makro Parameter übergibt?

    #define FAHRENHEIT_ZU_CELSIUS(f) (5./9*((f)-32))
    

    Du wirst Makros lieben lernen. Irgendwann besteht dein C++-Code ausschliesslich aus Makros, weil ihre Syntax vollkommen ist und sie viel schneller ausgeführt werden als die ollen Funktionen.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn das Makro erst mal 5 nimmt und dann durch 9 teilt bleibt die Genauikeit auch erhalten wenn f ein int ist.

    #define FAHRENHEIT_ZU_CELSIUS(f) (((f)-32)*5/9)
    


  • Also ich habe es versucht mit

    #define FAHRENHEIT_ZU_CELSIUS(f) (5./9*((f)-32))
    

    Aber irgendwie funktioniert es nicht, dass er mir das von 0 bis 400 machen soll.
    Wie gibt man die Grenzen ein?



  • Du lernst die falsche Sprache, denn das ist -wie schon gesagt- C.

    Das gleiche Programm in C++ sieht ungefähr so aus:

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    static inline double fahrenheitToCelsius(double fahrenheit)
    {
      return (fahrenheit-32)*(5.0/9);
    }
    
    int main()
    {
      const int max=400;
      const int step=40;
    
      double fahrenheit=0;
      while(fahrenheit<=max) //warum keine for-Schleife?
      {
        const double celsius=fahrenheitToCelsius(fahrenheit);
        cout << " " << fixed << setprecision(0) << fahrenheit << " °F = " << setprecision(2) << celsius << " °C" << endl;
        fahrenheit += step;
      }
    }
    

    bahraimeter dürfte übrigens ein Troll sein, denn in C++ werden anders als in C keine Makros verwendet (außer für Includeguards und einige wenige Spielereien).

    Außerdem (gilt für C und C++):
    Die Ergebnis einer Division zweier Ganzzahlen ist wieder eine Ganzzahl, d.h. 5/9 ergibt 0 (in deinem Code ist das kein Problem, da (f-32) mit 5 multipliziert und das Ergebnis durch 9 geteilt wird - dein Whitespace lässt aber vermuten, dass das nicht so beabsichtigt war).
    Und Kommentare sollten immer beschreiben, warum etwas gemacht wird, niemals was gemacht wird (denn das sieht jeder selbst).



  • Ich dürfte auch ein Troll sein, denn ich bekomme das einfach nicht zum laufen:(



  • Athar schrieb:

    bahraimeter dürfte übrigens ein Troll sein, denn in C++ werden anders als in C keine Makros verwendet (außer für Includeguards und einige wenige Spielereien).

    Stimmt, der Satz war nicht allzu ernst gemeint.

    Aber dein Code sieht mir nicht nach C++ aus. static ist laut dem C++-Standard veraltet:

    Der <a href= schrieb:

    C++-Standard">The use of the static keyword is deprecated when declaring objects in namespace scope

    Man beachte die für Trolle untypische Quellenangabe.

    Echtes C++ sieht so aus:

    namespace {
      template <typename T>
      inline T fahrenheit_to_celsius(T f)
      {
        return (f - 32)*5./9;
      }
    }
    

    Und falsches C++ sieht so aus:

    using namespace std; // verrufen
    
    static inline double fahrenheitToCelsius(double fahrenheit) // veraltet
    
    const double celsius=fahrenheitToCelsius(fahrenheit); // falsch
    cout << " " << fixed << setprecision(0) << fahrenheit << " °F = " << setprecision(2) << celsius << " °C" << endl; // hässlich
    

    Falls du einmal schönes C++ sehen willst:

    #include <iostream>
    
    template <int preoffset, int num, int denum, int offset>
    struct unit_converter {
      template <typename T>
      inline T operator() (T from)
      {
        return (from + preoffset)*num/static_cast<T>(denum) + offset;
      }
    };
    unit_converter<-32, 5,9, 0> fahrenheit_to_celsius;
    
    int main()
    {
      std::cout << fahrenheit_to_celsius(0) << std::endl;
    }
    


  • könnte mir denn jemand mit C helfen?
    Ich kriege immernoch Fehler raus und weiß nicht warum 😞



  • 430scud schrieb:

    könnte mir denn jemand mit C helfen?
    Ich kriege immernoch Fehler raus und weiß nicht warum 😞

    Dann nenne sie doch mal und poste den Code.



  • 430scud schrieb:

    Also ich habe es versucht mit

    #define FAHRENHEIT_ZU_CELSIUS(f) (5./9*((f)-32))
    

    Aber irgendwie funktioniert es nicht, dass er mir das von 0 bis 400 machen soll.
    Wie gibt man die Grenzen ein?

    Das Makro ersetzt nur die Berechnung, nicht die Schleife.



  • asdfasd schrieb:

    1. Ist das ein Fall fürs C Forum
    2. Macros werden mit vielen Einschränkungen so verwendet wie Funktionen:

    #define addition(a,b) a+b
    
    int a = addition(1,4); //a = 5
    

    Besser:

    #define addition(a,b) ((a)+(b))
    


  • 430scud schrieb:

    könnte mir denn jemand mit C helfen?
    Ich kriege immernoch Fehler raus und weiß nicht warum 😞

    Die wenigsten können hier aus der Kristallkugel lesen.
    Aber wenn du den genauen (Compiler?-)Fehler postest, wird es evtl. jemand versuchen.



  • ----- schrieb:

    Besser:

    #define addition(a,b) ((a)+(b))
    

    Gibt es auch noch eine Begründung, warum es besser ist 🙂



  • Bedenke

    x = addition(1 << y, z);
    

    (Tipp: + vor <<)



  • Athar schrieb:

    Du lernst die falsche Sprache, denn das ist -wie schon gesagt- C

    Von jemandem, der von sich behauptet, C++ zu beherrschen, muss man aber auch
    mindestens verlangen können, sämtliche Sprachmittel von C ebensogut einsetzen
    zu können (wenn sie zur Lösung einer Aufgabe hilfreich erscheinen).
    Makros, static etc. fallen in diese Kategorie.
    Überhaupt ist es der völlig falsche Ansatz, beim Lernen sich mit Dingen wie
    'schönem' oder 'unschönenm' C++ - Programmierstil zu beschäftigen. Viel wich-
    tiger ist erstmal, dass die Aufgabe überhaupt gelöst wird.
    Was nützt mir der schönste C++ - Programmierstil, wenn eine Funktion, ein
    Modul oder eine Klasse im Quelltext zwar nett anzusehen sind, aber die gestellte
    Aufgabe nicht lösen ...
    Es ist doch viel wichter, dass das Programm in erster Linie funktionieren soll,
    und ob der C++-Quelltext jetzt schön oder mit C-Konstrukten unterwandert ist,
    interessiert doch niemanden. Jedem Anwender des Programms ist das doch schnurz-
    egal, und der wird in jedem Fall mit einem funktionierenden, (wenn auch im
    Quelltext hässlichen) C/C++-Misch-Program eher arbeiten wollen, als mit
    jeder (quelltextmäßig) noch so schönen, 'reinen' C++ Alternative, wenn die nicht
    tut, was sie soll.
    Also: In erster Linie sollte die Funktionalität im Vordergrund stehen!
    Und solange C weitestgehend auch in C++ verwendbar ist, sprechen höchstens
    die fadenscheinigen Argumente irgendwelcher, selbstgefälliger Quelltext-
    Ästheten gegen die (gelegentliche) Verwendung von C-Sprachmitteln in C++
    Quelltexten (soferne sie einer Sache dienlich erscheinen), aber ansonsten kein
    'vernünftiger' Grund.



  • #include<stdio.h>
    
    int main(void)
    
    {
    int max = 400;
    	int step = 40;
    
    	double celsius = 0;
    		double fahrenheit =0;
    
    	while(fahrenheit<=max)//solange wir nicht die obere grenze erreicht haben
    	{
    		celsius = (fahrenheit-32) * 5/9;
    		printf(" %0.0f F = %0.2f C \n",fahrenheit,celsius);//gibt eine flieskomma zahl aus mit 0 stellen nach dem komma und einmal mit 2 stelln nach dem komma
    		fahrenheit += step; //ist equivalent zu fahrenheit  = fahrenheit + step;
    
    	}
    
    return 0;
    }
    

    Das ist die Aufgabe, die ich mit einem Makro lösen soll.
    Das habe ich hier versucht:

    #include<stdio.h>
    
    #define FAHRENHEITZUCELSIUS  (( -32)*5/9)
    
    int main(void)
    
    {
    int max = 400;
    	int step = 40;
    
    	double celsius = 0;
    		double fahrenheit =0;
    
    	while(fahrenheit<=max)//solange wir nicht die obere grenze erreicht haben
    	{
    		celsius = FAHRNEHEITZUCELSIUS(fahrenheit);
    		printf(" %0.0f F = %0.2f C \n",fahrenheit,celsius);//gibt eine flieskomma zahl aus mit 0 stellen nach dem komma und einmal mit 2 stelln nach dem komma
    		fahrenheit += step; //ist equivalent zu fahrenheit  = fahrenheit + step;
    
    	}
    
    return 0;
    }
    

    Was habe ich falsch gemacht?



  • Das sollte eigentlich gar nicht kompilieren. Du hast hier schon Lösungen für das Makro bekommen, dennoch nimmt dein Makro keinen Parameter an.

    Du musst also schreiben:

    #define FAHRENHEITZUCELSIUS(anzahl_in_fahrenheit) ((5.0 / 9.0) * ((anzahl_in_fahrenheit) - 32))
    
    //...
    celsius = FAHRENHEITZUCELSIUS(fahrenheit)
    //...
    


  • jawoll danke es klappt nun!
    Jetzt verstehe ich eigentlich auch, was es macht.
    Bei Celsius= nimmt er die Funktion oder?


Anmelden zum Antworten