Brauche Hilfe bei C++ Makro



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



  • Welche Funktion? Das ein Makro einfach nur Text ersetzt hast du ja schon mitbekommen. Wenn dir nicht ganz klar ist, wie das in der Praxis aussieht, dann starte einfach mal den Präprozessor von Hand.

    Linux (und alle anderen GCC):
    > cpp code.c

    Visual Studio:
    Visual Studio Eingabeaufforderung (im Startmenü)
    mit "> cd Verzeichnisname" ins richtige Verzeichnis wechseln
    > cl.exe /EP code.c

    Wenn du dir die Ausgabe in eine Datei speichern willst, hängst du an den Aufruf jeweils "> ausgabe.txt" an.


Anmelden zum Antworten