Betriebssystemerkennung durch Präprozessor (Split aus Dynamische Speicherallokation)



  • So habe nun ein neues Thema (Präprozessor) und auch eine neue Aufgabe:

    Entwickeln Sie eine C++-Anwendung, die den Anwender zur Eingabe zweier Ganzzahlen auffordert. Die beiden eingegebenen Zahlen sollen mit Hilfe einer Funktion addiert werden, die gleichzeitig die Summe auf den Bildschirm ausgibt. Das Programm soll auf den drei fiktiven Betriebssystemen Kuhnix BSE, Luxus und Hasta La Vista lauffähig sein. Kuhnix BSE bietet jedoch nur den Datentyp long an, um Ganzzahlen zu speichern. Luxus hingegen kennt nur den Datentyp char. Und Hasta La Vista kann Ganzzahlen nur in Variablen vom Typ short speichern. Verwenden Sie Präprozessor-Anweisungen in der Art, dass das Programm mit einer entsprechenden #define Anweisung jeweils so übersetzt wird, dass es unter dem jeweiligen Betriebssystem funktioniert. Falls das Programm unter dem nicht unterstützten Betriebssystem Banana Mac kompiliert wird, soll eine Fehlermeldung ausgegeben und die Kompilierung abgebrochen werden.

    Meine Lösung sieht so aus, aber der cmd-editor öffnet sich nicht einmal:

    #include <iostream>
    using namespace std;
    #define SUB(a, b) ((a) + (b))
    int main()
    {

    #if defined(__Kuhnix BSE__)
    long Ganzzahl1;
    long Ganzzahl2;
    cout <<"Geben sie eine Ganzzahlen ein!" <<endl;
    cin >> Ganzzahl1;
    cout <<"Geben sie noch eine Ganzzahl ein!" <<endl;
    cin >> Ganzzahl2;
    cout << SUB(Ganzzahl1,Ganzzahl2) <<endl;
    #elif defined(__Hasta La Vista__)
    short Ganzzahl1;
    short Ganzzahl2;
    cout <<"Geben sie eine Ganzzahlen ein!" <<endl;
    cin >> Ganzzahl1;
    cout <<"Geben sie noch eine Ganzzahl ein!" <<endl;
    cin >> Ganzzahl2;
    cout << SUB(Ganzzahl1,Ganzzahl2) <<endl;
    #elif defined(__Luxus__)
    char Ganzzahl1;
    char Ganzzahl2;
    cout <<"Geben sie eine Ganzzahlen ein!" <<endl;
    cin >> Ganzzahl1;
    cout <<"Geben sie noch eine Ganzzahl ein!" <<endl;
    cin >> Ganzzahl2;
    cout << SUB(Ganzzahl1,Ganzzahl2) <<endl;

    #elif defined (__Banana Mac__)
    #error Das Programm wird von Banana Mac nicht unterstützt.
    #endif

    system("Pause");
    }

    Grüße
    silent12



  • Ich würde mal sagen, da stören einige Leerzeichen in den Bezeichnern, die du für die verschiedenen Systeme verwendet hast - "__Kuhnix BSE__" ist kein gültiger Bezeichner (und selbst wenn, dann für Compiler-Zwecke reserviert).

    PS: Ich hätte ja nur den typedef für den Zahlentyp hinter der #ifdef-Auswahl versteckt, anstatt die komplette Funktion dreifach zu schreiben.



  • Danke für den Tipp, aber wie soll ich die Aufgabe lösen können ohne zu wissen wie ich es nennen soll ohne die Leerzeichen ?



  • In einem Bezeichner sind nur Buchstaben, Ziffern (nicht am Anfang) und der Unterstrich erlaubt - also mußt du dich auf diese Zeichen beschränken und die Werte z.B. Kuhnix_BSE und Hasta_La_Vista nennen.



  • Ja aber wie soll mein Programm erkennen welche Option ich nutze wenn ich da freie Wahl beim Namen habe. Da müsste es doch festgelegte Namen wie WIN32 geben oder ?
    Weil so öffnet sich der cmd-editor zwar, aber er gibt nichts aus



  • Bezeichner wie "WINVER" hat sich auch jemand ausgedacht - genauso mußt du auch selber festlegen, welche Makros deine erfundenen Betriebssysteme setzen werden. (und auch ein Compiler für Kuhnix BSE kann sich nicht über die C++ Namensregeln hinwegsetzen)



  • Zwei Dinge:

    1. du solltest du für jedes Problem einen neuen Thread aufmachen, statt Probleme und Fragen, die mit dem eigentlichen Thema nichts zu tun haben im gleichen Thread zu posten. Das Problem hier hat so mal gar nichts mit dynamischer Speicherallokation zu tun.

    2. wie man Syntaxcoloring/Code Formatting benutzt hat man dir ja schon erklärt. Dann tu´s bitte auch, denn unformatierter Code lässt sich schwer lesen -> Leute möchten sich wenig Arbeit machen und lesen´s auch nicht -> weniger Antworten -> möglicherweise keine Lösung

    Ansonsten hat CStoll eigentlich schon alles gesagt, was es zu dem Thema zu sagen gibt 👍



  • @CStoll:

    Makros ? Was heißt das in dem Zusammenhang ? 😕
    Wie soll ich dann eig auch eine Ausgabe bekommen, da ja nichts für Windows festgelegt wurde, sondern nur für die "erfundenen Betriebssysteme ?

    @DocShoe: Ok sorry hatte nicht drangedacht :-/.
    Werde ich beim nächsten Problem machen. 🙂



  • silent12 schrieb:

    @CStoll:

    Makros ? Was heißt das in dem Zusammenhang ? 😕
    Wie soll ich dann eig auch eine Ausgabe bekommen, da ja nichts für Windows festgelegt wurde, sondern nur für die "erfundenen Betriebssysteme ?

    Was der Präprozessor mit #if defined(...) überprüft, ist "nur" die Existenz eines Präprozessor-Makros. Das kann am Anfang des Quelltexts per #define passieren, per Compiler-Option "-DKuhnix_BSE" oder implizit durch den Compiler selbst.



  • Aber warum wird deshalb gar nichts ausgegeben ?


  • Mod

    silent12 schrieb:

    Aber warum wird deshalb gar nichts ausgegeben ?

    Nachdem der Präprozessor mit deinem Code durch ist, bleibt dies übrig:

    // [Inhalt von iostreasm]
    using namespace std;
    int main()
    {
    system("Pause");
    }
    

    Da weder __KuhnixBSE __ noch __HastaLaVista__ noch sonst einer der Bezeichner gesetzt wurden, ist alles was in einem #if defined Block stand gestrichen worden.



  • Achso, das heißt dass ich es nur ausgeben kann wenn ich es mit zB dem Datentyp int für Windows64bit schreibe oder ? Und was ist die von C++ definierte Abkürzung dafür ?


  • Mod

    silent12 schrieb:

    Achso, das heißt dass ich es nur ausgeben kann wenn ich es mit zB dem Datentyp int für Windows64bit schreibe oder ? Und was ist die von C++ definierte Abkürzung dafür ?

    😕 Sind dir die Grundprinzipien des Präprozessors vertraut? Ich habe den Eindruck, dir wurde 5x die gleiche richtige Antwort gegeben, die du aber einfach nicht verstehst.



  • So wie ich das verstehe wird erst geprüft welches Betriebssystem vorliegt und dann wird nur der Quellcode der in dem zugehörigen Absatz folgt an den Compiler weitergegeben, damit nicht unnötiger Quellcode compiliert wird.
    Und in meinem Fall wird alles gelöscht da keins der Betriebssysteme vorliegt und deshalb alles in den Absätzen danach nicht compiliert wird.
    Und deshalb wollte ich wissen wie die Abkürzung für Windows heißt. WIN32 ? oder ist das nur für Windows 32bit Systeme.


  • Mod

    silent12 schrieb:

    So wie ich das verstehe wird erst geprüft welches Betriebssystem vorliegt und dann wird nur der Quellcode der in dem zugehörigen Absatz folgt an den Compiler weitergegeben, damit nicht unnötiger Quellcode compiliert wird.
    Und in meinem Fall wird alles gelöscht da keins der Betriebssysteme vorliegt und deshalb alles in den Absätzen danach nicht compiliert wird.
    Und deshalb wollte ich wissen wie die Abkürzung für Windows heißt. WIN32 ? oder ist das nur für Windows 32bit Systeme.

    Das ist prinzipiell das was hier passiert. Aber nimm das nicht zu wörtlich, dass geprüft wird, welches Betriebssystem vorliegt. Es wird tatsächlich nur geprüft, ob ein Makro mit diesem Namen definiert ist. Viele Compiler setzen diese Makros in Abhängigkeit des Zielsystems. Leider ist nicht fest definiert, wie diese Makrobezeichenr lauten, aber wenn du keinen zu exotischen Compiler hast, dann lautet der Name _WIN32 .



  • Ah ok danke.



  • ... und als kleinen Präprozessortest, kannst du dir ja mal überlegen, was folgender Code so macht:

    #define TRUE  '/'/'/'
    #define FALSE '-'-'-'
    

Anmelden zum Antworten