Nächstes Problem =/



  • Guten Tag allerseits,
    Kann man den Datentyp "char" in der Größe ändern, evtl mit Zeigern auf Speicherplatz von anderen vordefinierten Variablen?

    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.

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    //#define __Kuhnix_BSE__
    #define __Luxus__
    //#define __Hasta_La_Vista__
    //#define __Banana_Mac__
    
    long func1(long* k1, long* k2)
    {
       return *k1 + *k2;
    }
    char func2(char* l1, char* l2)
    {
       return *l1 + *l2;
    }
    short func3(short* h1, short* h2)
    {
       return *h1 + *h2;
    }
    
    int main()
    {
    
        #if defined __Kuhnix_BSE__
                   long zahl1;
                   long zahl2;
                   long ergebnis1;
                   cout << "Geben Sie Zahl 1 ein: "; cin >> zahl1;
                   cout << "Geben Sie Zahl 2 ein: "; cin >> zahl2;
                   cout << endl;
                   ergebnis1 = func1(&zahl1, &zahl2);
                   cout << "Ergebnis auf Kuhnix BSE: " << ergebnis1 << endl;
                   getch();
        #elif defined __Luxus__
                   char zahl3;
                   char zahl4;
                   char ergebnis2;
                   cout << "Geben Sie Zahl 1 ein: "; cin >> zahl3;
                   cout << "Geben Sie Zahl 2 ein: "; cin >> zahl4;
                   cout << endl;
                   ergebnis2 = func2(&zahl3, &zahl4);
                   cout << "Ergebnis auf Luxus: " << static_cast<int>((ergebnis2)-96) << endl;
                   getch();
        #elif defined __Hasta_La_Vista__
                   short zahl5;
                   short zahl6;
                   short ergebnis3;
                   cout << "Geben Sie Zahl 1 ein: "; cin >> zahl5;
                   cout << "Geben Sie Zahl 2 ein: "; cin >> zahl6;
                   cout << endl;
                   ergebnis3 = func3(&zahl5, &zahl6);
                   cout << "Ergebnis auf Hasta La Vista: " << ergebnis3 << endl;
                   getch();
        #elif defined __Banana_Mac__
        #error Programm kann auf OS "Banana Mac" nicht kompiliert werden!
        #endif
    
    return 0;  
    }
    

    Bei aktivem (und fiktiven) System "Luxus" kommt das Programm immer durcheinander wenn man höhere Zahlen eintippt.

    Gibt es evtl Lösungen?

    Danke 🙂



  • Habt ihr denn noch nicht typedef gelernt?



  • Öhm ich lerne nur für mich selber.

    Das ist eine Aufgabe aus nem online Tutorial das ich im Moment durcharbeite und nein mir ist der Begriff "typedef" neu.



  • Blödes Tutorial.
    Mit typedef kannst du einem Typ einen neuen Namen geben.
    Das funktioniert so:

    typedef int number;
    

    Ab jetzt könnte man überall number schreiben, wo man auch int schreiben könnte. Vielleicht hilft dir das ja bei deinem Code weiter 😉


  • Mod

    Die Aufgabe möchte so etwas wie

    #ifdef KUHNIX
    #define DATENTYP long
    #endif
    

    Und dann benutzt du überall DATENTYP.

    Ganz schlechter Stil, wie bei vielen Online-Tutorials.



  • Ich werd dann auch mal die gestellte Frage beantworten...

    Hyrsch schrieb:

    Bei aktivem (und fiktiven) System "Luxus" kommt das Programm immer durcheinander wenn man höhere Zahlen eintippt.

    Gibt es evtl Lösungen?

    Nein. Die Eingabefunktion für char (d.h. die entsprechende Überladung von operator<<) interpretiert die Eingabe als Zeichen, nicht als Zahl. Wenn du eine Zahl einlesen willst, dann nimm einen Zahltypen, wie short, int oder long.
    Achso, auf Luxus gibts ja nur char -- die Prämisse ist komplett hirnrissig! Es gibt keine C++-Implementation, die nur char hat, es müssen immer alle Datentypen vorhanden sein. Solche Aufgaben zu lösen lehrt dich nichts, das ist reine Zeitverschwendung.
    Übrigens solltest du dir abgewöhnen, doppelte Unterstriche um Makros oder sonstige Bezeichner zu setzen. Doppelte Unterstriche sind der Implementation vorbehalten, führende Untstriche vor Großbuchstaben ebenfalls, und noch einige andere Fälle. Bei Kuhnix wird es da voraussichtlich keine Probleme geben, aber wenn du das immer so machst, gibt es früher oder später eine Kollision, die du vielleicht nichtmal bemerkst.



  • Was wäre ein "guter Stil" so ein Programm zu schreiben?

    Quellcode würde mich interessieren falls du Zeit hast einen zu coden.



  • Die doppelten Unterstriche habe ich nur verwendet da im Tutorial steht es gehöre zu Betriebssystemen. Das die Zeichenfolge somit reserviert ist ist damit ja klar, sonst wären ja keine Fantasienamen nötig.



  • da im Tutorial steht es gehöre zu Betriebssystemen

    Vom Betriebssystem wirst normalerweisse nicht viel sehen, weil der "Compiler" immer dazwischensitzt. Und erst recht bist du nicht der "Richtige" der Betriebssystem-Definitionen erzeugen sollte 🙂
    Also lass das einfach mit den Unterstrichen 🙂

    Die Eingabefunktion für char (d.h. die entsprechende Überladung von operator<<) interpretiert die Eingabe als Zeichen, nicht als Zahl.

    Richtig.
    Und genau deshalb sollte ein System nur funktionieren, wenn es datentypen fuer Zeichen und Integer zur Verfuegung stellt. Sonst funktionieren diese Operatoren gar nicht.
    also muss es neben char noch sowas wie "int8" geben, fuer den die Streamoperatoren entsprechend überladen sind, das sie als ints funktionieren.

    Was wäre ein "guter Stil" so ein Programm zu schreiben?

    Die Aufgabenstellung ist fiktiv ...
    Normal bietet jedes system (compiler auf entsprechenden Betriebssystem) entsprechende Datentypen an. Dabei gibt es folgende Kategorien:

    Sprachstandard: Datentypen die der C / C++ Standard in deinem Fall vorschreibt. Beispiel: int short char

    Betriebssystem: Datentypen die von der API zum Betriebssystem(WinAPI, Posix, SystemV) "vorgeschrieben" werden und vom Compiler entsprechend auf die richtigen internen typen umgesetzt werden.
    Beispiel: WORD DWORD __int8 time_t thread_t

    3d Party Libs: Von Bibliotheken die auf mehreren Plattformen zur verfuegung stehen, werden oft auch datentypen definiert, wo garentiert wird das die auf allen plattformen sich gleich verhalten, evtl die gleiche groesse haben.
    Beispiel: (Qt) qint32, qint64 ...

    Fazit: Die Aufgabenstellung ist ... naja zweifelhaft.

    Ich glaub man will Dir nur die Verwendung von typedef näherbringen, nur ist das Aufgabenstellung halt bescheuert gewaehlt 😃

    Ciao ...


  • Mod

    Hyrsch schrieb:

    Was wäre ein "guter Stil" so ein Programm zu schreiben?

    Ein großer Schritt vorwärts wäre ein typedef anstatt des hier anscheinend gefragten define.



  • Quelle: http://www.c-howto.de/tutorial-strukturierte-datentypen-strukturen-struct-synonyme-typedef.html

    Mit typedef können wir neue Datentyp-Namen entwerfen, was in Verbindung mit Strukturen Arbeit sparen kann. Folgendes Beispiel erstellt ein Synonym Integer für den Datentyp int. Danach können wir Integer exakt wie das Schlüsselwort int behandeln.

    typedef int Integer;
    float preis = 3.99;
    Integer zahl;
    zahl = (Integer) preis;
    printf("Integer-Zahl: %d\n", zahl);
    
    Integer-Zahl: 3
    

    Beim Erstellen von Struktur-Objekten ist immer das Schlüsselwort struct notwendig. Mit typedef können wir jedoch einen neuen Datentyp für eine Struktur erstellen, sodass das Erstellen von Objekten einfacher wird. Hierbei beginnt die Deklaration der Struktur mit typedef struct und der Name wird nicht mehr an den Anfang geschrieben, sondern zwischen Blockende und Strichpunkt. Danach kann man lediglich mit dem Namen der Struktur neue Objekte erzeugen.

    typedef struct {
    	char name[50];
    	int alter;
    }person;
    
    // Objekte erstellen
    person kurt, dieter, antonia;
    

    314159265358979 schrieb:

    Habt ihr denn noch nicht typedef gelernt?

    Das ist in dieser Stufe zu Hardcore. 😃


  • Mod

    Na, ob Zitate aus einem C-Tutorial hier so gut passen? Der zweite Teil ist in C++ zwar technisch möglich aber ziemlich überflüssig.



  • Der Post mit dem C-Tutorial hilft mir nicht viel weiter da ich keine lust hab 2 Sprachen parallel zu lernen (Syntax is in C ein wenig anders^^).

    Ich bin schon dabei mich in typedef einzuarbeiten vielen Dank für den Tipp 🙂



  • Hyrsch schrieb:

    Was wäre ein "guter Stil" so ein Programm zu schreiben?

    Es sein zu lassen. Das Tutorial was du da durcharbeitest ist offenbar ziemlich dämlich (versucht in so einem frühen Stadium, dich Implementierungen für nicht standardkonfomre Umgebungen programmieren zu lassen) und falsch aufgebaut (Abgesehen von include-guards braucht in deinem Lernstadium keiner #ifdef und Co, schon garnicht bevor du typedefs kennst).

    Mein Tip: Lass das Tutorial links liegen und beschäftige dich mit einem ordentlichen Buch.



  • Ich glaube hier sind die Leute schnell gereizt sobald man mal mit C statt C++ kommt 😉


Anmelden zum Antworten